-Helper handle wrapper
authorSree Harsha Totakura <totakura@in.tum.de>
Wed, 13 Jun 2012 16:30:48 +0000 (16:30 +0000)
committerSree Harsha Totakura <totakura@in.tum.de>
Wed, 13 Jun 2012 16:30:48 +0000 (16:30 +0000)
src/testbed/testbed_api.c
src/testbed/testbed_api_hosts.c
src/testbed/testbed_api_hosts.h

index 7d86d5fd5b62375a0231d136ebff2d0576b0f449..518fd309cdc3178b0691bb80fbbd3a79cc871f15 100644 (file)
@@ -82,7 +82,7 @@ struct GNUNET_TESTBED_Controller
   /**
    * The helper handle
    */
-  struct GNUNET_HELPER_Handle *helper;
+  struct GNUNET_TESTBED_HelperHandle *helper;
 
   /**
    * The controller callback
@@ -337,7 +337,7 @@ GNUNET_TESTBED_controller_stop (struct GNUNET_TESTBED_Controller *controller)
     GNUNET_free (mq_entry);
   }
   GNUNET_CLIENT_disconnect (controller->client);
-  GNUNET_HELPER_stop (controller->helper);
+  GNUNET_TESTBED_host_stop_ (controller->helper);
   GNUNET_CONFIGURATION_destroy (controller->cfg);
   GNUNET_free (controller);
 }
index ca7c44cd793c47ad3fcf70cab6595b67cdfdf221..a12d6ce11580f1c9c95a414c119bfd8bd28346c6 100644 (file)
@@ -213,10 +213,32 @@ void
 GNUNET_TESTBED_host_destroy (struct GNUNET_TESTBED_Host *host)
 {  
   GNUNET_CONTAINER_DLL_remove (host_list_head, host_list_tail, host);
-  GNUNET_free (host);  
+  GNUNET_free (host);
 }
 
 
+/**
+ * Wrapper around GNUNET_HELPER_Handle
+ */
+struct GNUNET_TESTBED_HelperHandle
+{
+  /**
+   * The helper handle
+   */
+  struct GNUNET_HELPER_Handle *handle;
+
+  /**
+   * The port number for ssh; used for helpers starting ssh
+   */
+  char *port;
+
+  /**
+   * The ssh destination string; used for helpers starting ssh
+   */
+  char *dst; 
+};
+
+
 /**
  * Run a given helper process at the given host.  Communication
  * with the helper will be via GNUnet messages on stdin/stdout.
@@ -229,33 +251,51 @@ GNUNET_TESTBED_host_destroy (struct GNUNET_TESTBED_Host *host)
  * @param cb_cls closure for cb
  * @return handle to terminate the command, NULL on error
  */
-struct GNUNET_HELPER_Handle *
+struct GNUNET_TESTBED_HelperHandle *
 GNUNET_TESTBED_host_run_ (struct GNUNET_TESTBED_Host *host,
                          char *const binary_argv[],
                          GNUNET_SERVER_MessageTokenizerCallback cb, void *cb_cls)
 {
   /* FIXME: decide on the SSH command line, prepend it and
      run GNUNET_HELPER_start with the modified binary_name and binary_argv! */
-  struct GNUNET_HELPER_Handle *h;
-  char *const local_args[] = {NULL};
-  char *port;
-  char *dst;
-  char *remote_args[] = {"ssh", "-p", port, "-q", dst,
-                         "gnunet-service-testbed", NULL};
+  struct GNUNET_TESTBED_HelperHandle *h;
+  char *const local_args[] = {NULL};  
 
+  h = GNUNET_malloc (sizeof (struct GNUNET_TESTBED_HelperHandle));
   if (0 == host->unique_id)
-    return GNUNET_HELPER_start ("gnunet-service-testbed", local_args,
-                                cb, cb_cls);
+  {
+    h->handle = GNUNET_HELPER_start ("gnunet-service-testbed", local_args,
+                                     cb, cb_cls);
+  }
   else
+  {    
+    GNUNET_asprintf (&h->port, "%d", host->port);
+    GNUNET_asprintf (&h->dst, "%s@%s", host->hostname, host->username);
+    char *remote_args[] = {"ssh", "-p", h->port, "-q", h->dst,
+                           "gnunet-service-testbed", NULL};
+    h->handle = GNUNET_HELPER_start ("ssh", remote_args, cb, cb_cls);
+  }
+  if (NULL == h->handle)
   {
-    GNUNET_asprintf (&port, "%d", host->port);
-    GNUNET_asprintf (&dst, "%s@%s", host->hostname, host->username);
-    h = GNUNET_HELPER_start ("ssh", remote_args, cb, cb_cls);
-    GNUNET_free (port);         /* FIXME: Can we free them? */
-    GNUNET_free (dst);
-    return h;
+    GNUNET_free (h);
+    return NULL;
   }
+  return h;
 }
 
 
+/**
+ * Stops a helper in the HelperHandle using GNUNET_HELPER_stop
+ *
+ * @param handle the handle returned from GNUNET_TESTBED_host_start_
+ */
+void
+GNUNET_TESTBED_host_stop_ (struct GNUNET_TESTBED_HelperHandle *handle)
+{
+  GNUNET_HELPER_stop (handle->handle);
+  GNUNET_free_non_null (handle->port);
+  GNUNET_free_non_null (handle->dst);
+  GNUNET_free (handle);
+}
+
 /* end of testbed_api_hosts.c */
index 835866653b29e939ff2143ba9987fae47dc28ef5..0c36da0eee90e5cca7018b358bb1f9c58860de06 100644 (file)
@@ -84,6 +84,12 @@ uint32_t
 GNUNET_TESTBED_host_get_id_ (const struct GNUNET_TESTBED_Host *host);
 
 
+/**
+ * Opaque wrapper around GNUNET_HELPER_Handle
+ */
+struct GNUNET_TESTBED_HelperHandle;
+
+
 /**
  * Run a given helper process at the given host.  Communication
  * with the helper will be via GNUnet messages on stdin/stdout.
@@ -96,10 +102,19 @@ GNUNET_TESTBED_host_get_id_ (const struct GNUNET_TESTBED_Host *host);
  * @param cb_cls closure for cb
  * @return handle to terminate the command, NULL on error
  */
-struct GNUNET_HELPER_Handle *
+struct GNUNET_TESTBED_HelperHandle *
 GNUNET_TESTBED_host_run_ (struct GNUNET_TESTBED_Host *host,
                          char *const binary_argv[],
                          GNUNET_SERVER_MessageTokenizerCallback cb, void *cb_cls);
 
+
+/**
+ * Stops a helper in the HelperHandle using GNUNET_HELPER_stop
+ *
+ * @param handle the handle returned from GNUNET_TESTBED_host_start_
+ */
+void
+GNUNET_TESTBED_host_stop_ (struct GNUNET_TESTBED_HelperHandle *handle);
+
 #endif
 /* end of testbed_api_hosts.h */