tsubstituted the fork with a pthread - tomb - the crypto undertaker
 (HTM) git clone git://parazyd.org/tomb.git
 (DIR) Log
 (DIR) Files
 (DIR) Refs
 (DIR) README
 (DIR) LICENSE
       ---
 (DIR) commit 5afeaac470002d05abd56e4809bdc7fcc5fd7060
 (DIR) parent 617b996865a2fc692da123a123d4292867dff5d0
 (HTM) Author: Jaromil <jaromil@dyne.org>
       Date:   Sun,  6 Feb 2011 17:02:28 +0100
       
       substituted the fork with a pthread
       
       fixes a bug in closing tombs from the status tray icon
       
       Diffstat:
         M src/tomb-status.c                   |      39 ++++++++++++++++++++++---------
       
       1 file changed, 28 insertions(+), 11 deletions(-)
       ---
 (DIR) diff --git a/src/tomb-status.c b/src/tomb-status.c
       t@@ -26,6 +26,8 @@
        #include <sys/types.h>
        #include <sys/wait.h>
        
       +#include <pthread.h>
       +
        #include <gtk/gtk.h>
        #include <libnotify/notify.h>
        
       t@@ -73,6 +75,7 @@ int main(int argc, char **argv) {
            snprintf(mapper,255, "%s", argv[1]);
          }
        
       +
          if(argc<3) sprintf(filename, "unknown");
          else snprintf(filename,255, "%s", argv[2]);
        
       t@@ -132,6 +135,7 @@ int main(int argc, char **argv) {
          
          notify_uninit();
        
       +
          exit(0);
          
        }
       t@@ -158,29 +162,42 @@ gboolean cb_view(GtkWidget *w, GdkEvent *e) {
            return FALSE;
          }
          if (cpid == 0) {    // Child
       -    execlp("tomb-open", "tomb-open", mountpoint ,(char*)NULL);
       +    execlp("tomb-open", "tomb-open", "-q", mountpoint ,(char*)NULL);
            exit(1);
          }
          return TRUE;
        }
        
       +void* thread_close(void *arg) {
       +  char *map = (char*)arg;
       +  execlp("tomb", "tomb", "-q", "close", map, (char*)NULL);
       +  return NULL;
       +}
       +
        gboolean cb_close(GtkWidget *w, GdkEvent *e) { 
       -  pid_t cpid = fork();
       -  int res;
       -  if (cpid == -1) {
       -    fprintf(stderr,"error: problem forking process\n");
       +  pthread_t thread;
       +  pthread_attr_t attr;
       +  int *res;
       +
       +  if(pthread_attr_init (&attr) == -1) {
       +    fprintf(stderr, "error initializing POSIX thread attribute\n");
            return FALSE;
          }
       -  if (cpid == 0) {    // Child
       -    execlp("tomb", "tomb", "close", mapper, (char*)NULL);
       -    exit(1);
       -  }
       -  waitpid(cpid, &res, 0);
       -  if(res==0) {
       +  pthread_attr_setdetachstate(&attr,PTHREAD_CREATE_JOINABLE);
       +
       +  pthread_create(&thread, &attr, thread_close, mapper);
       +
       +  pthread_join(thread,(void**)&res);
       +
       +  if(*res==0) {
       +    pthread_attr_destroy(&attr);
            gtk_main_quit();
            notify_uninit();
            exit(0);
          }
       +
       +  pthread_attr_destroy(&attr);
       +
          return TRUE;
        }