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; }