int main(int argc, char *argv[]) { char *user, *userdirname, *outfile, *cmdtitle; cp_string title=""; int size, job; struct passwd *passwd; if (setuid(0)) { fputs("pdfwriter cannot be called without root privileges!\n", stderr); return 0; } if (init()) return 5; log_event(CPDEBUG, "initialization finished", VERSION); if (argc==1) { printf("file pdfwriter:/ \"Virtual PDF Printer\" \"PDFwriter\" \"MFG:Lisanet;MDL:PDFwriter;DES:Lisanet PDFwriter - Print PDF into files;CLS:PRINTER;CMD:POSTSCRIPT;\"\n"); return 0; } if (argc<6 || argc>7) { fputs("Usage: pdfwriter job-id user title copies options [file]\n", stderr); log_event(CPERROR, "call contained illegal number of arguments", NULL); return 0; } user = argv[2]; passwd=getpwnam(user); if (passwd == NULL && conf.lowercase) { log_event(CPDEBUG, "unknown user", user); for (size=0;size<(int) strlen(argv[2]);size++) argv[2][size]=tolower(argv[2][size]); log_event(CPDEBUG, "trying lower case user name", argv[2]); passwd=getpwnam(user); } if (passwd == NULL) { passwd=getpwnam(conf.anonuser); if (passwd == NULL) { log_event(CPERROR, "username for anonymous access unknown", conf.anonuser); if (logfp!=NULL) fclose(logfp); return 5; } log_event(CPDEBUG, "unknown user", user); userdirname = conf.anondirname; } else { log_event(CPDEBUG, "user identified", passwd->pw_name); userdirname = user; } if (create_userdir(passwd, userdirname)) { if (logfp!=NULL) fclose(logfp); return 5; } log_event(CPDEBUG, "user information prepared", NULL); /* create title of outputfile * as this is a cups backend and it's appended after filtered pdf * by the PPD config *cupsFilter: application/vnd.cups-pdf * there's no filename, only cmdtitle is valid * Always use filename with a job id prefix. */ cmdtitle = argv[3]; job = atoi(argv[1]); if (!strcmp(cmdtitle, "(stdin)")) cmdtitle=""; if (!preparetitle(cmdtitle)) { snprintf(title, BUFSIZE, "job_%i untitled_document", job); log_event(CPDEBUG, "no title found - using default value", title); } else { snprintf(title, BUFSIZE, "job_%i %s", job, cmdtitle); log_event(CPDEBUG, "title successfully retrieved", title); } /* first create the output filename */ size = strlen(conf.outdir) + strlen(userdirname) + strlen(title) + 7; outfile=calloc(size, sizeof(char)); if (outfile == NULL) { fputs("PDFwriter: failed to allocate memory\n", stderr); if (logfp!=NULL) fclose(logfp); return 5; } snprintf(outfile, size, "%s/%s/%s.pdf", conf.outdir, userdirname, title); log_event(CPDEBUG, "output filename created", outfile); if (write_pdf(stdin, outfile, passwd)) { free(outfile); if (logfp != NULL) fclose(logfp); return 5; } log_event(CPDEBUG, "input data read from stdin", NULL); free(outfile); if (logfp!=NULL) { fflush(logfp); fclose(logfp); } log_event(CPDEBUG, "all memory has been freed", NULL); log_event(CPSTATUS, "PDF creation successfully finished", passwd->pw_name); return 0; }
static int preparespoolfile(FILE *fpsrc, char *spoolfile, char *title, char *cmdtitle, int job, struct passwd *passwd) { cp_string buffer; int rec_depth,is_title=0; FILE *fpdest; if (fpsrc == NULL) { log_event(CPERROR, "failed to open source stream"); return 1; } log_event(CPDEBUG, "source stream ready"); fpdest=fopen(spoolfile, "w"); if (fpdest == NULL) { log_event(CPERROR, "failed to open spoolfile: %s", spoolfile); (void) fclose(fpsrc); return 1; } log_event(CPDEBUG, "destination stream ready: %s", spoolfile); if (chown(spoolfile, passwd->pw_uid, -1)) { log_event(CPERROR, "failed to set owner for spoolfile: %s", spoolfile); return 1; } log_event(CPDEBUG, "owner set for spoolfile: %s", spoolfile); rec_depth=0; if (Conf_FixNewlines) log_event(CPSTATUS, "***Experimental Option: FixNewlines"); else log_event(CPDEBUG, "using traditional fgets"); while (fgets2(buffer, BUFSIZE, fpsrc) != NULL) { if (!strncmp(buffer, "%!", 2)) { if (!rec_depth++) log_event(CPDEBUG, "found beginning of postscript code: %s", buffer); else log_event(CPDEBUG, "found embedded (e)ps code: %s", buffer); } if (rec_depth > 0) { (void) fputs(buffer, fpdest); if (!is_title && rec_depth == 1 && sscanf(buffer, "%%%%Title: %"TBUFSIZE"c", title)==1) { log_event(CPDEBUG, "found title in ps code: %s", title); is_title=1; } if (!strncmp(buffer, "%%EOF", 5)) { if (!--rec_depth) log_event(CPDEBUG, "found end of postscript code: %s", buffer); else log_event(CPDEBUG, "found end of embedded (e)ps code: %s", buffer); } } } (void) fclose(fpdest); (void) fclose(fpsrc); log_event(CPDEBUG, "all data written to spoolfile: %s", spoolfile); if (cmdtitle == NULL || !strcmp(cmdtitle, "(stdin)")) buffer[0]='\0'; else strncpy(buffer, cmdtitle, BUFSIZE); if (title == NULL || !strcmp(title, "((stdin))")) title[0]='\0'; if (Conf_TitlePref) { log_event(CPDEBUG, "trying to use commandline title: %s", buffer); if (!preparetitle(buffer)) { log_event(CPDEBUG, "empty commandline title, using PS title: %s", title); if (!preparetitle(title)) log_event(CPDEBUG, "empty PS title"); } else snprintf(title, BUFSIZE, "%s", buffer); } else { log_event(CPDEBUG, "trying to use PS title: %s", title); if (!preparetitle(title)) { log_event(CPDEBUG, "empty PS title, using commandline title: %s", buffer); if (!preparetitle(buffer)) log_event(CPDEBUG, "empty commandline title"); else snprintf(title, BUFSIZE, "%s", buffer); } } if (!strcmp(title, "")) { if (Conf_Label == 2) snprintf(title, BUFSIZE, "untitled_document-job_%i", job); else snprintf(title, BUFSIZE, "job_%i-untitled_document", job); log_event(CPDEBUG, "no title found - using default value: %s", title); } else { if (Conf_Label) { strcpy(buffer, title); if (Conf_Label == 2) snprintf(title, BUFSIZE, "%s-job_%i", buffer, job); else snprintf(title, BUFSIZE, "job_%i-%s", job, buffer); } log_event(CPDEBUG, "title successfully retrieved: %s", title); } return 0; }