static bool startup(void *data) { bool finished = true; int result = EXIT_FAILURE; the_runner = runner_new(args.filename); if (!the_runner) goto end; if (args.check_only) { printf("file: '%s' - Syntax OK\n", args.filename); result = EXIT_SUCCESS; goto end; } if (runner_run(the_runner) < 0) { SOL_ERR("Failed to run"); goto end; } finished = false; end: if (finished) sol_quit_with_code(result); return false; }
/* Run the encfs tool. */ static gpg_error_t run_encfs_tool (ctrl_t ctrl, enum encfs_cmds cmd, const char *rawdir, const char *mountpoint, tupledesc_t tuples, unsigned int *r_id) { gpg_error_t err; encfs_parm_t parm; runner_t runner = NULL; int outbound[2] = { -1, -1 }; int inbound[2] = { -1, -1 }; const char *pgmname; const char *argv[10]; pid_t pid = (pid_t)(-1); int idx; (void)ctrl; parm = xtrycalloc (1, sizeof *parm); if (!parm) { err = gpg_error_from_syserror (); goto leave; } parm->cmd = cmd; parm->tuples = ref_tupledesc (tuples); parm->mountpoint = xtrystrdup (mountpoint); if (!parm->mountpoint) { err = gpg_error_from_syserror (); goto leave; } err = runner_new (&runner, "encfs"); if (err) goto leave; err = gnupg_create_inbound_pipe (inbound); if (!err) err = gnupg_create_outbound_pipe (outbound); if (err) { log_error (_("error creating a pipe: %s\n"), gpg_strerror (err)); goto leave; } pgmname = ENCFS; idx = 0; argv[idx++] = "-f"; if (opt.verbose) argv[idx++] = "-v"; argv[idx++] = "--stdinpass"; argv[idx++] = "--annotate"; argv[idx++] = rawdir; argv[idx++] = mountpoint; argv[idx++] = NULL; assert (idx <= DIM (argv)); err = gnupg_spawn_process_fd (pgmname, argv, outbound[0], -1, inbound[1], &pid); if (err) { log_error ("error spawning '%s': %s\n", pgmname, gpg_strerror (err)); goto leave; } close (outbound[0]); outbound[0] = -1; close ( inbound[1]); inbound[1] = -1; runner_set_fds (runner, inbound[0], outbound[1]); inbound[0] = -1; /* Now owned by RUNNER. */ outbound[1] = -1; /* Now owned by RUNNER. */ runner_set_handler (runner, encfs_handler, encfs_handler_cleanup, parm); parm = NULL; /* Now owned by RUNNER. */ runner_set_pid (runner, pid); pid = (pid_t)(-1); /* The process is now owned by RUNNER. */ err = runner_spawn (runner); if (err) goto leave; *r_id = runner_get_rid (runner); log_info ("running '%s' in the background\n", pgmname); leave: if (inbound[0] != -1) close (inbound[0]); if (inbound[1] != -1) close (inbound[1]); if (outbound[0] != -1) close (outbound[0]); if (outbound[1] != -1) close (outbound[1]); if (pid != (pid_t)(-1)) { gnupg_wait_process (pgmname, pid, 1, NULL); gnupg_release_process (pid); } runner_release (runner); encfs_handler_cleanup (parm); return err; }