#include #include #include #include #include #include #include #include #include #include #include static void filecopy (FILE *fin, FILE *fout) { char buf[10000]; int n; while ((n=fread(buf,1,10000,fin))>0){ fwrite (buf,1,n,fout); } } static void sendjob ( char *av[]) { int tb[2]; pipe(tb); if (fork()==0){ struct group *g = getgrnam("nobody"); if (g != NULL){ setgid (g->gr_gid); } syslog (LOG_ERR,"redirprint %p %d",g,getgid()); dup2 (tb[0],0); close (tb[1]); close (tb[0]); execv (av[0],av); syslog (LOG_ERR,"Ne peut exécuter %s",av[0]); _exit(-1); }else{ FILE *fout = fdopen (tb[1],"w"); if (fout != NULL){ filecopy (stdin,fout); fclose (fout); } } } int main (int argc, char *argv[]) { char *user = NULL,*printer=NULL,*filter=NULL; extern char *optarg; openlog (argv[0],LOG_PID,LOG_LPR); int opt; int skipargv = 0; { char opt[1000]; opt[0] = '\0'; for (int i=0; i 2 && strcmp(argv[1],"--pipe")==0){ filter = argv[2]; argc -= 2; skipargv = 2; } while ((opt=getopt(argc,argv+skipargv,"A:C:D:F:H:J:N:P:Q:a:b:d:e:f:h:i:j:k:l:n::s:t:x:y:w:"))!=-1){ switch (opt){ case 'f': break; case 'h': break; case 'i': break; case 'l': break; case 'n': user = strdup(optarg); break; case 'p': // printer = strdup(optarg); break; case 'P': printer = strdup(optarg); break; case 'w': break; } } syslog (LOG_ERR,"filter :%s: user :%s: printer :%s:",filter,user,printer); if (user == NULL){ syslog (LOG_ERR,"Usager inconnu: Document rejeté"); }else if (printer == NULL){ syslog (LOG_ERR,"Imprimante inconnue"); }else{ struct passwd *p = getpwnam (user); if (p == NULL){ syslog (LOG_ERR,"Usager %s inconnu",user); }else{ struct group *g = getgrgid(p->pw_gid); if (g != NULL && strncmp(g->gr_name,"etu",3)!=0){ if (filter != NULL){ sendjob (argv+2); }else{ // Transmet a l'imprimante reel char reel[PATH_MAX]; snprintf (reel,sizeof(reel)-1,"%s-reel",printer); char *av[4]; av[0] = "/usr/bin/lpr"; av[1] = "-P"; av[2] = reel; av[3] = NULL; sendjob (av); } }else{ const char *fullname = user; if (p->pw_gecos[0] != '\0') fullname = p->pw_gecos; char fullnameOK[strlen(fullname)+1]; { int i; for(i = 0 ; *fullname != '\0'; fullname++){ if(*fullname != '\''){ fullnameOK[i++] = *fullname; } } fullnameOK[i] = '\0'; } char spool[PATH_MAX]; mkdir ("/var/print",0775); snprintf (spool,sizeof(spool)-1,"/var/print/%s",printer); mkdir (spool,0775); snprintf (spool,sizeof(spool)-1,"/var/print/%s/%s-%d.ps" ,printer ,fullnameOK,getpid()); FILE *fout = fopen (spool,"w"); if (fout == NULL){ syslog (LOG_ERR,"Ne peut ouvrir %s(%m)",spool); }else{ filecopy (stdin,fout); fclose (fout); chmod (spool,0644); } } } } return 0; }