int exec_command(FILE *in, FILE *out, void *cmd) { if (in && dup2(fileno(in), fileno(stdin)) < 0) rip_die(EXIT_PRNERR_NORETRY_BAD_SETTINGS, "%s: Could not dup stdin\n", (const char *)cmd); if (out && dup2(fileno(out), fileno(stdout)) < 0) rip_die(EXIT_PRNERR_NORETRY_BAD_SETTINGS, "%s: Could not dup stdout\n", (const char *)cmd); execl(get_modern_shell(), get_modern_shell(), "-c", (const char *)cmd, (char *)NULL); _log("Error: Executing \"%s -c %s\" failed (%s).\n", get_modern_shell(), (const char *)cmd, strerror(errno)); return EXIT_PRNERR_NORETRY_BAD_SETTINGS; }
const char * temp_dir() { static const char *tmpdir = NULL; if (!tmpdir) { const char *dirs[] = { getenv("TMPDIR"), P_tmpdir, "/tmp" }; int i; for (i = 0; i < (sizeof(dirs) / sizeof(dirs[0])); i++) { if (access(dirs[i], W_OK) == 0) { tmpdir = dirs[i]; break; } } if (tmpdir) { _log("Storing temporary files in %s\n", tmpdir); setenv("TMPDIR", tmpdir, 1); /* for child processes */ } else rip_die(EXIT_PRNERR_NORETRY_BAD_SETTINGS, "Cannot find a writable temp dir."); } return tmpdir; }
/* * This function is only used when the input data is not PostScript. Then it * runs a filter which converts non-PostScript files into PostScript. The user * can choose which filter he wants to use. The filter command line is * provided by 'fileconverter'. */ void get_fileconverter_handle(const char *alreadyread, FILE **fd, pid_t *pid) { pid_t kid1; FILE *kid1out; const char *pagesize; char *fileconv; kid1_userdata_t kid1_userdata; _log("\nStarting converter for non-PostScript files\n"); if (isempty(fileconverter) && !guess_fileconverter()) rip_die(EXIT_PRNERR_NORETRY_BAD_SETTINGS, "Cannot convert file to " "Postscript (missing fileconverter)."); /* Use wider margins so that the pages come out completely on every printer * model (especially HP inkjets) */ pagesize = option_get_value(find_option("PageSize"), optionset("header")); if (pagesize && startswith(fileconverter, "a2ps")) { if (!strcasecmp(pagesize, "letter")) pagesize = "Letterdj"; else if (!strcasecmp(pagesize, "a4")) pagesize = "A4dj"; } if (do_docs) snprintf(get_current_job()->title, 128, "Documentation for the %s", printer_model); fileconv = fileconverter_from_template(fileconverter, pagesize, get_current_job()->title); kid1_userdata.fileconv = fileconv; kid1_userdata.alreadyread = alreadyread; kid1 = start_process("kid1", exec_kid1, &kid1_userdata, NULL, &kid1out); if (kid1 < 0) rip_die(EXIT_PRNERR_NORETRY_BAD_SETTINGS, "Cannot convert file to " "Postscript (Cannot fork for kid1!)\n"); *fd = kid1out; *pid = kid1; free(fileconv); }
void add_process(const char *name, int pid, int isgroup) { int i; for (i = 0; i < MAX_CHILDS; i++) { if (procs[i].pid == -1) { strlcpy(procs[i].name, name, 64); procs[i].pid = pid; procs[i].isgroup = isgroup; return; } } rip_die(EXIT_PRNERR_NORETRY_BAD_SETTINGS, "Didn't think there would be that many child processes... Exiting.\n"); }