home *** CD-ROM | disk | FTP | other *** search
/ rtsi.com / 2014.01.www.rtsi.com.tar / www.rtsi.com / OS9 / OSK / EFFO / forum4.lzh / SPRACHEN / C / LP / lpsched.c < prev    next >
C/C++ Source or Header  |  1988-02-14  |  3KB  |  142 lines

  1. /* lpsched fuer os-9/68k         Uwe Simon  4.9.1987 */
  2.  
  3. #include <stdio.h>
  4. #include <modes.h>
  5. #include <module.h>
  6. #include <pwd.h>
  7. #include "lp.h"
  8.  
  9. int ev,active=0;
  10.  
  11.  
  12. mod_exec *module;
  13.  
  14. error()
  15.  
  16. {
  17.     fprintf(stderr,"Syntax: lpsched [-r] {<devname>}\n");
  18.     fprintf(stderr,"Function:  starts Printerspooler\n");    
  19.     fprintf(stderr,"Options:\n");
  20.     fprintf(stderr,"       -r    restarts spooler\n");
  21. }
  22.  
  23.  
  24. do_job(i)   /* starte job i */
  25. int i;
  26. {
  27.     char s[80];
  28.     sprintf(s,"%d\n",queue->jobs[i].spoolid);
  29.     if(os9forkc("prjob",strlen(s),s,0,0,0,0,3)==-1)
  30.         printf("can't fork prjob\n");
  31.     else { 
  32.         queue->busy[queue->jobs[i].dev]=BUSY;
  33.         active++;
  34.     }
  35. }
  36.  
  37.  
  38. new_job()  /* starte einen neuen Job */
  39. {
  40.     int i;
  41.     queue->command=NICHTS;
  42.     for(i=0;i<queue->spoolfiles;i++) {
  43.         if(queue->busy[queue->jobs[i].dev]=='\0') do_job(i);
  44.     }
  45. }
  46.  
  47.  
  48. printing()
  49. {
  50.     int files=0,h,com,weiter=1,jo,mesg=1;
  51.     char hs[300];
  52.     struct passwd *pwd;
  53.         
  54.     setuid(1);   /* printerdaemon muss user 0.1 sein !!! */
  55.     
  56.     freopen("/nil","w",stdout);
  57.     new_job();   /* bei restart alte files beginnen */
  58.     while(weiter||active) { 
  59.         _ev_wait(ev,1,1);   /* warte bis Spoolerqueue veraendert (wird von lprm und lp erzeugt */
  60.  
  61.         h=queue->parameter;
  62.         switch(queue->command) {  
  63.             case NICHTS: break;
  64.             case PRINT : 
  65.                 new_job();
  66.                 break;
  67.             case DELETE:
  68.                 jo=find_job(h);
  69.                 if(jo>=0) {
  70.                     if(queue->jobs[jo].status==BUSY) { /* prjob fuer diesen job muss gestoppt werden */
  71.                         queue->parameter=h;
  72.                         queue->command=STOP;
  73.                         _ev_set(ev,STOP,0);   /* gebe Stopstatus weiter */
  74.                         _ev_wait(ev,1,1);     /* warte bis killen fertig */
  75.                         queue->busy[queue->jobs[jo].dev]='\0'; /* gebe printer wieder frei */
  76.                     }
  77.                 }
  78.                 del_j(h);
  79.                 break;
  80.             case READY:
  81.                 active--;
  82.                 wait(0);   /* kein warten da ja ein Prozess beendet ist */
  83.                 jo=find_job(h);
  84.                 if(jo>=0) {
  85.                     queue->busy[queue->jobs[jo].dev]='\0';
  86.                     if(queue->jobs[jo].mesg[0]!='\0') {  /* Meldung, dass fertig */
  87.                         freopen(queue->jobs[jo].mesg,"a",stdout);
  88.                         printf(">>> Printerjob %d is ready\07   \n",queue->jobs[jo].spoolid);
  89.                         freopen("/nil","a",stdout);
  90.                     }
  91.                     if(queue->jobs[jo].options& MAILMODE) {  /* mail, dass fertig */
  92.                         if((pwd=getpwuid(queue->jobs[jo].user&&0xffff))!=NULL) {
  93.                             sprintf(hs,"echo Printerjob %d ( %s ) is ready!mail -s Printerjob %s\n",queue->jobs[jo].spoolid,queue->jobs[jo].titel,pwd->pw_name);
  94.                             system(hs);
  95.                         }
  96.                     }
  97.                     del_j(h);
  98.                 }
  99.                 new_job();
  100.                 break;
  101.             case CANCEL:
  102.                 weiter=0;
  103.                 break;
  104.         }
  105.         queue->command=NICHTS;
  106.         _ev_set(ev,0,0);
  107.     }
  108. }
  109.  
  110.  
  111. main(argc,argv)
  112. int argc;
  113. char **argv;
  114.  
  115. {
  116.     int i=0;
  117.     mod_exec *m;
  118.     char *h;
  119.     if(argc==1) {error(); exit(1);}
  120.     module=(mod_exec *)_mkdata_module("spoolqueue",sizeof(struct spoolqueue),0x8001,0x333);
  121.     if((int)module==-1) { exit(_errmsg(1,"can't create spoolerqueue\n")); }
  122.     queue=(struct spoolqueue *)((long)module+module->_mexec);
  123.     argv++;
  124.     if(strcmp(*argv,"-?")==0) {munlink(module); error(); exit(0); }
  125.     m=(mod_exec *)modloadp("prjob",1,h);    
  126.     for(i=0;i<7;i++) {
  127.         queue->busy[i]='\0';
  128.         if(--argc>0) strcpy(queue->printer[i],*argv++);
  129.         else queue->printer[i][0]='\0';
  130.     }
  131.     queue->printer[7][0]='\0';
  132.     queue->command=NICHTS;
  133.     queue->active=getpid();
  134.     if((ev=_ev_creat(0,2,-1,"spoolqueue"))==-1) prerr(NULL,errno);
  135.     else printing();
  136.     _ev_unlink(ev);   
  137.     munlink(module);   /* unlink spoolqueue */
  138.     munlink(m);        /* unlink "prjob" */
  139.     _ev_delete("spoolqueue");
  140.     munlink(module);   /* delete semaphor */
  141. }
  142.