tusing fork() again and pipefd to pass it arguments it works now, also the parent process correctly reads the output - tomb - the crypto undertaker HTML git clone git://parazyd.org/tomb.git DIR Log DIR Files DIR Refs DIR README DIR LICENSE --- DIR commit 4f3204e1e869ebdfaef91c36147660086a4848fc DIR parent c8e623e450e612d098f9801abe29b3bfba197afe HTML Author: Jaromil <jaromil@dyne.org> Date: Mon, 7 Feb 2011 11:27:53 +0100 using fork() again and pipefd to pass it arguments it works now, also the parent process correctly reads the output Diffstat: M src/tomb | 33 +++++++++++++++++-------------- M src/tomb-status.c | 36 ++++++++++++++++++++++++++----- 2 files changed, 49 insertions(+), 20 deletions(-) --- DIR diff --git a/src/tomb b/src/tomb t@@ -20,7 +20,7 @@ # this source code; if not, write to: # Free Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. -VERSION=0.9.1 +VERSION=0.9.2 DATE=Feb/2011 # PATH=/usr/bin:/usr/sbin:/bin:/sbin t@@ -30,7 +30,7 @@ DATE=Feb/2011 notice() { if ! [ $QUIET ]; then echo "[*] $1"; fi } act() { if ! [ $QUIET ]; then echo " . $1"; fi } error() { if ! [ $QUIET ]; then echo "[!] $1"; fi } -func() { if [ $DEBUG ]; then echo "[D] $1"; fi } +func() { if [ $DEBUG ]; then echo "[D] $1"; fi } # which dd command to use which dcfldd > /dev/null t@@ -134,7 +134,7 @@ ask_password() { exec_as_user xhost 2>&1 >/dev/null if [ $? = 0 ]; then # we have access to the X display - exec_as_user which tomb-askpass # 2>&1 > /dev/null + exec_as_user which tomb-askpass > /dev/null if [ $? = 0 ]; then export scolopendro="`exec_as_user tomb-askpass ${1} 2>/dev/null`" return t@@ -192,10 +192,9 @@ exec_as_user() { return $? fi - func "executing as user '$SUDO_USER': ${(f)@}" + func "exec_as_user '$SUDO_USER': ${(f)@}" which sudo > /dev/null if [ $? = 0 ]; then - func "Using sudo for execution of '${(f)@}' as user $SUDO_USER" sudo -u $SUDO_USER "${@[@]}" return $? else t@@ -212,14 +211,14 @@ check_priv() { which gksu > /dev/null if [ $? = 0 ]; then func "Using gksu for root execution of 'tomb ${(f)ARGS}'" - gksu "tomb -q ${ARGS[@]}" - exit 0 + gksu "tomb ${ARGS[@]}" + exit $? fi which sudo > /dev/null if [ $? = 0 ]; then func "Using sudo for root execution of 'tomb ${(f)ARGS}'" - sudo "tomb -q ${ARGS[@]}" - exit 0 + sudo "tomb ${ARGS[@]}" + exit $? fi return 1 fi t@@ -236,8 +235,12 @@ if [ $? != 0 ]; then notice "Tomb - simple commandline tool for encrypted storage" act "version $VERSION ($DATE) by Jaromil @ dyne.org" fi -func "invoked with args \"${(f)@}\" " -func "running on `date`" +echo $@ | grep '\-D' 2>&1 > /dev/null +if [ $? = 0 ]; then + echo "[D] invoked with args \"${(f)@}\" " + echo "[D] running on `date`" +fi + ARGS=$@[@] OPTS=`getopt -o hvqDs:k: -n 'tomb' -- "$@"` t@@ -655,7 +658,7 @@ umount_tomb() { # check if there are binded dirs and close them first mount | grep "${tombmount}" | grep -v loop 2>&1 > /dev/null if [ $? = 0 ]; then - act "closing tomb $tombname binded directories" + act "closing bind hooks for tomb $tombname " unbind=`mount | grep ${tombmount} | grep -v loop | awk ' { print "umount " $3 "; " } '` t@@ -668,7 +671,7 @@ umount_tomb() { act "closing tomb $tombname on dm-crypt $basemap" mount | grep $mapper 2>&1 >/dev/null if [ $? = 0 ]; then # still mounted - errno=`umount ${mapper}` + umount ${mapper} if ! [ $? = 0 ]; then tomb-notify "Tomb '$tombname' is too busy." \ "Close all applications and file managers, then try again." t@@ -811,8 +814,8 @@ case "$CMD" in *) error "command \"$CMD\" not recognized" act "try -h for help" - exit 1 + return 1 ;; esac # return codes from called functions -exit $? +return $? DIR diff --git a/src/tomb-status.c b/src/tomb-status.c t@@ -21,6 +21,7 @@ #include <stdlib.h> #include <unistd.h> #include <string.h> +#include <errno.h> #include <libgen.h> #include <sys/types.h> t@@ -141,6 +142,7 @@ gboolean left_click(GtkWidget *w, GdkEvent *e) { gtk_menu_popup(menu_left, NULL, NULL, gtk_status_icon_position_menu, status_tomb, 1, gtk_get_current_event_time()); + return TRUE; } gboolean cb_view(GtkWidget *w, GdkEvent *e) { // GtkWidget *dialog = t@@ -165,17 +167,38 @@ gboolean cb_view(GtkWidget *w, GdkEvent *e) { } gboolean cb_close(GtkWidget *w, GdkEvent *e) { - pid_t cpid = fork(); - int res; + int pipefd[2]; + pid_t cpid; + char buf; + int c, res; + char map[256]; + + if (pipe(pipefd) <0) { + fprintf(stderr,"pipe creation error: %s\n", strerror(errno)); + return FALSE; + } + + + cpid = fork(); if (cpid == -1) { - fprintf(stderr,"error: problem forking process\n"); + fprintf(stderr,"fork error: %s\n", strerror(errno)); return FALSE; } if (cpid == 0) { // Child - execlp("tomb", "tomb", "close", mapper, (char*)NULL); - exit(1); + close(pipefd[1]); // close unused write end + for(c=0; read(pipefd[0], &buf, 1) > 0; c++) + map[c] = buf; + close(pipefd[0]); + map[c+1] = '\0'; + execlp("tomb", "tomb", "close", map, (char*)NULL); + _exit(1); } + close(pipefd[0]); // close unused read end + write(pipefd[1], mapper, strlen(mapper)); + close(pipefd[1]); // reader will see EOF + waitpid(cpid, &res, 0); + fprintf(stderr,"forked child returns %i",res); if(res==0) { gtk_main_quit(); notify_uninit(); t@@ -189,6 +212,7 @@ gboolean right_click(GtkWidget *w, GdkEvent *e) { gtk_menu_popup(menu_right, NULL, NULL, gtk_status_icon_position_menu, status_tomb, 1, gtk_get_current_event_time()); + return TRUE; } gboolean cb_about(GtkWidget *w, GdkEvent *e) { const gchar *authors[] = {"Tomb is written by Jaromil - http://jaromil.dyne.org",NULL}; t@@ -230,5 +254,7 @@ gboolean cb_about(GtkWidget *w, GdkEvent *e) { gtk_about_dialog_set_wrap_license(GTK_ABOUT_DIALOG(dialog), TRUE); gtk_dialog_run(GTK_DIALOG (dialog)); gtk_widget_destroy(dialog); + return TRUE; } +