URI: 
       tRevert "substituted the fork with a pthread" - tomb - the crypto undertaker
  HTML git clone git://parazyd.org/tomb.git
   DIR Log
   DIR Files
   DIR Refs
   DIR README
   DIR LICENSE
       ---
   DIR commit 2751d717088e0de9df3ba081a8de2a632e6ef329
   DIR parent cc9ecb9c20b50c57e0c7cc5b0d01d7d9e129a6c4
  HTML Author: Jaromil <jaromil@dyne.org>
       Date:   Mon,  7 Feb 2011 09:44:59 +0100
       
       Revert "substituted the fork with a pthread"
       
       This reverts commit 5afeaac470002d05abd56e4809bdc7fcc5fd7060.
       
       execve()  does  not  return on success, and the text, data, bss, and stack of the calling process are overwritten by
       tthat of the program loaded. means we cannot call exec() from a thread, we must use fork.
       
       next try i'll use environment vars to pass mountpoint to forked exec.
       
       Diffstat:
         M src/tomb-status.c                   |      39 +++++++++----------------------
       
       1 file changed, 11 insertions(+), 28 deletions(-)
       ---
   DIR diff --git a/src/tomb-status.c b/src/tomb-status.c
       t@@ -26,8 +26,6 @@
        #include <sys/types.h>
        #include <sys/wait.h>
        
       -#include <pthread.h>
       -
        #include <gtk/gtk.h>
        #include <libnotify/notify.h>
        
       t@@ -75,7 +73,6 @@ 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@@ -135,7 +132,6 @@ int main(int argc, char **argv) {
          
          notify_uninit();
        
       -
          exit(0);
          
        }
       t@@ -162,42 +158,29 @@ gboolean cb_view(GtkWidget *w, GdkEvent *e) {
            return FALSE;
          }
          if (cpid == 0) {    // Child
       -    execlp("tomb-open", "tomb-open", "-q", mountpoint ,(char*)NULL);
       +    execlp("tomb-open", "tomb-open", 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) { 
       -  pthread_t thread;
       -  pthread_attr_t attr;
       -  int *res;
       -
       -  if(pthread_attr_init (&attr) == -1) {
       -    fprintf(stderr, "error initializing POSIX thread attribute\n");
       +  pid_t cpid = fork();
       +  int res;
       +  if (cpid == -1) {
       +    fprintf(stderr,"error: problem forking process\n");
            return FALSE;
          }
       -  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);
       +  if (cpid == 0) {    // Child
       +    execlp("tomb", "tomb", "close", mapper, (char*)NULL);
       +    exit(1);
       +  }
       +  waitpid(cpid, &res, 0);
       +  if(res==0) {
            gtk_main_quit();
            notify_uninit();
            exit(0);
          }
       -
       -  pthread_attr_destroy(&attr);
       -
          return TRUE;
        }