Пример #1
0
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;
} 
Пример #2
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;
}