Revert "substituted the fork with a pthread"

This reverts commit 5afeaac470.

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.
This commit is contained in:
Jaromil 2011-02-07 09:44:59 +01:00
parent cc9ecb9c20
commit 2751d71708

View File

@ -26,8 +26,6 @@
#include <sys/types.h> #include <sys/types.h>
#include <sys/wait.h> #include <sys/wait.h>
#include <pthread.h>
#include <gtk/gtk.h> #include <gtk/gtk.h>
#include <libnotify/notify.h> #include <libnotify/notify.h>
@ -75,7 +73,6 @@ int main(int argc, char **argv) {
snprintf(mapper,255, "%s", argv[1]); snprintf(mapper,255, "%s", argv[1]);
} }
if(argc<3) sprintf(filename, "unknown"); if(argc<3) sprintf(filename, "unknown");
else snprintf(filename,255, "%s", argv[2]); else snprintf(filename,255, "%s", argv[2]);
@ -135,7 +132,6 @@ int main(int argc, char **argv) {
notify_uninit(); notify_uninit();
exit(0); exit(0);
} }
@ -162,42 +158,29 @@ gboolean cb_view(GtkWidget *w, GdkEvent *e) {
return FALSE; return FALSE;
} }
if (cpid == 0) { // Child if (cpid == 0) { // Child
execlp("tomb-open", "tomb-open", "-q", mountpoint ,(char*)NULL); execlp("tomb-open", "tomb-open", mountpoint ,(char*)NULL);
exit(1); exit(1);
} }
return TRUE; 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) { gboolean cb_close(GtkWidget *w, GdkEvent *e) {
pthread_t thread; pid_t cpid = fork();
pthread_attr_t attr; int res;
int *res; if (cpid == -1) {
fprintf(stderr,"error: problem forking process\n");
if(pthread_attr_init (&attr) == -1) {
fprintf(stderr, "error initializing POSIX thread attribute\n");
return FALSE; return FALSE;
} }
pthread_attr_setdetachstate(&attr,PTHREAD_CREATE_JOINABLE); if (cpid == 0) { // Child
execlp("tomb", "tomb", "close", mapper, (char*)NULL);
pthread_create(&thread, &attr, thread_close, mapper); exit(1);
}
pthread_join(thread,(void**)&res); waitpid(cpid, &res, 0);
if(res==0) {
if(*res==0) {
pthread_attr_destroy(&attr);
gtk_main_quit(); gtk_main_quit();
notify_uninit(); notify_uninit();
exit(0); exit(0);
} }
pthread_attr_destroy(&attr);
return TRUE; return TRUE;
} }