commit 4f3204e1e869ebdfaef91c36147660086a4848fc
parent c8e623e450e612d098f9801abe29b3bfba197afe
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:
2 files changed, 49 insertions(+), 20 deletions(-)
diff --git a/src/tomb b/src/tomb
@@ -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
@@ -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
@@ -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
@@ -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
@@ -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
@@ -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' -- "$@"`
@@ -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 "; " }
'`
@@ -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."
@@ -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 $?
diff --git a/src/tomb-status.c b/src/tomb-status.c
@@ -21,6 +21,7 @@
#include <stdlib.h>
#include <unistd.h>
#include <string.h>
+#include <errno.h>
#include <libgen.h>
#include <sys/types.h>
@@ -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 =
@@ -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();
@@ -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};
@@ -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;
}
+