tomb

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

commit 2751d717088e0de9df3ba081a8de2a632e6ef329
parent cc9ecb9c20b50c57e0c7cc5b0d01d7d9e129a6c4
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
that 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:
Msrc/tomb-status.c | 39+++++++++++----------------------------
1 file changed, 11 insertions(+), 28 deletions(-)

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