tomb

the crypto undertaker
git clone git://parazyd.org/tomb.git
Log | Files | Refs | README | LICENSE

commit 5afeaac470002d05abd56e4809bdc7fcc5fd7060
parent 617b996865a2fc692da123a123d4292867dff5d0
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:
Msrc/tomb-status.c | 39++++++++++++++++++++++++++++-----------
1 file changed, 28 insertions(+), 11 deletions(-)

diff --git a/src/tomb-status.c b/src/tomb-status.c @@ -26,6 +26,8 @@ #include <sys/types.h> #include <sys/wait.h> +#include <pthread.h> + #include <gtk/gtk.h> #include <libnotify/notify.h> @@ -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]); @@ -132,6 +135,7 @@ int main(int argc, char **argv) { notify_uninit(); + exit(0); } @@ -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; }