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