- Remove printf, use GNUNET_log INFO
[oweals/gnunet.git] / src / include / gnunet_helper_lib.h
index 7115748fc7be9af9df3d2bf1edf573b425e50cae..191d97b80e71b9d5bfd25df50ec3021ac63dd5dd 100644 (file)
@@ -24,6 +24,7 @@
  * @author Philipp Toelke
  * @author Christian Grothoff
  */
+
 #ifndef GNUNET_HELPER_LIB_H
 #define GNUNET_HELPER_LIB_H
 
@@ -37,24 +38,41 @@ struct GNUNET_HELPER_Handle;
 
 
 /**
- * @brief Starts a helper and begins reading from it
+ * Callback that will be called when the helper process dies. This is not called
+ * when the helper process is stoped using GNUNET_HELPER_stop()
+ *
+ * @param cls the closure from GNUNET_HELPER_start()
+ */
+typedef void (*GNUNET_HELPER_ExceptionCallback) (void *cls);
+
+
+/**
+ * Starts a helper and begins reading from it. The helper process is
+ * restarted when it dies except when it is stopped using GNUNET_HELPER_stop()
+ * or when the exp_cb callback is not NULL.
  *
+ * @param with_control_pipe does the helper support the use of a control pipe for signalling?
  * @param binary_name name of the binary to run
  * @param binary_argv NULL-terminated list of arguments to give when starting the binary (this
  *                    argument must not be modified by the client for
  *                     the lifetime of the helper handle)
  * @param cb function to call if we get messages from the helper
- * @param cb_cls Closure for the callback
+ * @param exp_cb the exception callback to call. Set this to NULL if the helper
+ *          process has to be restarted automatically when it dies/crashes
+ * @param cb_cls closure for the above callbacks
  * @return the new Handle, NULL on error
  */
 struct GNUNET_HELPER_Handle *
-GNUNET_HELPER_start (const char *binary_name,
+GNUNET_HELPER_start (int with_control_pipe,
+                    const char *binary_name,
                     char *const binary_argv[],
-                    GNUNET_SERVER_MessageTokenizerCallback cb, void *cb_cls);
+                    GNUNET_SERVER_MessageTokenizerCallback cb,
+                    GNUNET_HELPER_ExceptionCallback exp_cb,
+                    void *cb_cls);
 
 
 /**
- * @brief Kills the helper, closes the pipe and frees the handle
+ * Kills the helper, closes the pipe and frees the handle
  *
  * @param h handle to helper to stop
  */
@@ -62,6 +80,16 @@ void
 GNUNET_HELPER_stop (struct GNUNET_HELPER_Handle *h);
 
 
+/**
+ * Kills the helper by closing its stdin (the helper is expected to catch the
+ * resulting SIGPIPE and shutdown), closes the pipe and frees the handle
+ *
+ * @param h handle to helper to stop
+ */
+void
+GNUNET_HELPER_soft_stop (struct GNUNET_HELPER_Handle *h);
+
+
 /**
  * Continuation function.
  * 
@@ -74,6 +102,12 @@ typedef void (*GNUNET_HELPER_Continuation)(void *cls,
                                           int result);
 
 
+/**
+ * Handle to cancel 'send'
+ */
+struct GNUNET_HELPER_SendHandle;
+
+
 /**
  * Send an message to the helper.
  *
@@ -82,10 +116,11 @@ typedef void (*GNUNET_HELPER_Continuation)(void *cls,
  * @param can_drop can the message be dropped if there is already one in the queue?
  * @param cont continuation to run once the message is out
  * @param cont_cls closure for 'cont'
- * @return GNUNET_YES if the message will be sent
- *         GNUNET_NO if the message was dropped
+ * @return NULL if the message was dropped, 
+ *         otherwise handle to cancel *cont* (actual transmission may
+ *         not be abortable)
  */
-int
+struct GNUNET_HELPER_SendHandle *
 GNUNET_HELPER_send (struct GNUNET_HELPER_Handle *h, 
                    const struct GNUNET_MessageHeader *msg,
                    int can_drop,
@@ -93,4 +128,14 @@ GNUNET_HELPER_send (struct GNUNET_HELPER_Handle *h,
                    void *cont_cls);
 
 
+/**
+ * Cancel a 'send' operation.  If possible, transmitting the
+ * message is also aborted, but at least 'cont' won't be
+ * called.
+ *
+ * @param sh operation to cancel
+ */
+void
+GNUNET_HELPER_send_cancel (struct GNUNET_HELPER_SendHandle *sh);
+
 #endif /* end of include guard: GNUNET_HELPER_LIB_H */