/* Forward declarations */
static void redraw(char *path);
-static void spawn(char *file, char *arg1, char *arg2, const char *dir, uchar flag);
+static int spawn(char *file, char *arg1, char *arg2, const char *dir, uchar flag);
static int (*nftw_fn)(const char *fpath, const struct stat *sb, int typeflag, struct FTW *ftwbuf);
static int dentfind(const char *fname, int n);
return p;
}
-static void join(pid_t p, uchar flag)
+static int join(pid_t p, uchar flag)
{
- int status;
+ int status = 0xFFFF;
- if (!(flag & F_NOWAIT))
+ if (!(flag & F_NOWAIT)) {
/* wait for the child to exit */
do {
} while (waitpid(p, &status, 0) == -1);
+ if (WIFEXITED(status)) {
+ status = WEXITSTATUS(status);
+ DPRINTF_D(status);
+ }
+ }
+
/* restore parent's signal handling */
signal(SIGHUP, oldsighup);
signal(SIGTSTP, oldsigtstp);
+
+ return status;
}
/*
* Spawns a child process. Behaviour can be controlled using flag.
* Limited to 2 arguments to a program, flag works on bit set.
*/
-static void spawn(char *file, char *arg1, char *arg2, const char *dir, uchar flag)
+static int spawn(char *file, char *arg1, char *arg2, const char *dir, uchar flag)
{
pid_t pid;
- int status;
+ int status, retstatus = 0xFFFF;
char *argv[EXEC_ARGS_MAX] = {0};
char *cmd = NULL;
if (!file || !*file)
- return;
+ return retstatus;
/* Swap args if the first arg is NULL and second isn't */
if (!arg1 && arg2) {
cmd = (char *)malloc(len);
if (!cmd) {
DPRINTF_S("malloc()!");
- return;
+ return retstatus;
}
xstrlcpy(cmd, file, len);
if (status == -1 || status > (EXEC_ARGS_MAX - 3)) { /* arg1, arg2 and last NULL */
free(cmd);
DPRINTF_S("NULL or too many args");
- return;
+ return retstatus;
}
argv[status++] = arg1;
execvp(*argv, argv);
_exit(1);
} else {
- join(pid, flag);
+ retstatus = join(pid, flag);
DPRINTF_D(pid);
if (flag & F_NORMAL) {
free(cmd);
}
+
+ return retstatus;
}
/* Get program name from env var, else return fallback program */
tmp[r + 1] = '\0';
/* Connect to remote */
- spawn("sshfs", tmp, newpath, NULL, F_NORMAL);
+ if (spawn("sshfs", tmp, newpath, NULL, F_NORMAL)) {
+ printwait("mount failed", presel);
+ return FALSE;
+ }
return TRUE;
}
return FALSE;
}
- spawn(cmd, "-u", newpath, NULL, F_NORMAL);
+ if (spawn(cmd, "-u", newpath, NULL, F_NORMAL)) {
+ printwait("unmount failed", presel);
+ return FALSE;
+ }
return TRUE;
}