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 / lp.h < prev    next >
Text File  |  1988-02-09  |  3KB  |  130 lines

  1. /* Includefile fuer Spoolerqueue */
  2.  
  3. #define MAXJOBS 50
  4. #define NICHTS 0
  5. #define PRINT  1
  6. #define DELETE 2
  7. #define READY  3
  8. #define CANCEL 4
  9. #define STOP   5
  10. #define BUSY  '*'
  11. #define MAILMODE 0x01
  12.  
  13. char spooltmp[100]= "/dd/SPOOL/";
  14.  
  15. struct spooljob {
  16.     int user, spoolid,copy,options,dev,size;
  17.     char mesg[8];
  18.     char filename[100],titel[100],status;
  19. };
  20.  
  21. struct spoolqueue {
  22.     int spoolnumber,spoolfiles,active,command,parameter;
  23.     char printer[8][32],busy[8];   /* printer[0] ist defaultdevice */
  24.                                    /* busy gibt an ob schon gedruckt wird */
  25.     struct spooljob jobs[MAXJOBS];    
  26. } *queue;
  27.  
  28.  
  29. int find_printer(s)  /* gibt nummer des Printers s zurueck */
  30. char *s;
  31. {
  32.     int i;
  33.     if(s[0]) {
  34.         for(i=0;i<8;i++) {
  35.             if(strcmp(s,queue->printer[i])==0) return(i);
  36.         }
  37.         return(-1);
  38.     } else return(0);
  39. }
  40.  
  41.  
  42. int find_job(j)   /* returns Position von Job j */
  43. int j;
  44. {
  45.     int i;
  46.     for(i=0;(i<queue->spoolfiles) && (queue->jobs[i].spoolid!=j);i++) ;
  47.     if(i>=queue->spoolfiles) return(-1);
  48.     return(i);
  49. }
  50.  
  51.  
  52. int del_j(j)  /* gibt 0 zurueck, wenn Job j geloescht wurde */
  53.               /* wird nur von lpsched aufgerufen !! ( also kein Semaphor) */
  54. {
  55.     int i;
  56.     if((i=find_job(j))==-1) return(-1);
  57.       
  58.     for(;i+1<queue->spoolfiles;i++)
  59.         _strass(&queue->jobs[i],&queue->jobs[i+1],sizeof(struct spooljob));
  60.     queue->command=NICHTS;
  61.     queue->spoolfiles--;
  62.     return(0);
  63. }
  64.  
  65.  
  66. int ins_job(ev,queue,dev,filename,titel,copy,mesg,opt,size)
  67.                 /* return spoolid or -1 on error */
  68. struct spoolqueue *queue;
  69. char *dev,*filename,*titel,*mesg;
  70. int copy,ev,opt;
  71. {
  72.     int h,pos;
  73.     
  74.     _ev_wait(ev,0,0);
  75.     pos=queue->spoolfiles;
  76.     if(pos>=MAXJOBS) return(-1);
  77.     if((queue->jobs[pos].dev=find_printer(dev))==-1) {
  78.         _ev_set(ev,0,0);    /* lpsched nicht starten */
  79.         return(-1);
  80.     }
  81.     h=++queue->spoolnumber;
  82.     queue->jobs[pos].spoolid=h;
  83.     queue->parameter=h;
  84.     strcpy(queue->jobs[pos].filename,filename);    
  85.     strcpy(queue->jobs[pos].titel,titel);    
  86.     queue->jobs[pos].copy=copy;
  87.     queue->jobs[pos].options=opt;
  88.     queue->jobs[pos].size=size;
  89.     queue->jobs[pos].user=getuid();
  90.     queue->jobs[pos].status=' ';
  91.     strcpy(queue->jobs[pos].mesg,mesg);    
  92.     queue->spoolfiles++;
  93.     queue->command=PRINT;
  94.     _ev_signal(ev,0);
  95.     return(h);
  96. }
  97.  
  98.  
  99. int del_job(ev,dev,job)
  100. char *dev;
  101. int job,ev;
  102. {
  103.     int i,found=0,dv;
  104.     long int user;
  105.     
  106.     _ev_wait(ev,0,0);
  107.     user=getuid();
  108.     dv=find_printer(dev);
  109.     for (i=0;i<queue->spoolfiles;i++){
  110.         if(((job>0)==(queue->jobs[i].spoolid==job))&&
  111.                 ((dv>=0)==(dv==queue->jobs[i].dev)) ) {
  112.             if((user!=0)<=(user==queue->jobs[i].user)) {
  113.                 found=1;                queue->command=DELETE;   /* veranlaesst lpsched den job zu loeschen */
  114.                 queue->parameter=queue->jobs[i].spoolid;
  115.                 _ev_signal(ev);  /* lpsched wird gestartet */
  116.                 _ev_wait(ev,0,0);/* warte bis fertig */
  117.                 i--;
  118.             }
  119.             else fprintf(stderr,"Spoolid %d: not owner\n",
  120.                     queue->jobs[i].spoolid);
  121.         }
  122.     }
  123.     queue->command=NICHTS;
  124.     _ev_signal(ev,0);
  125.     return(found);        
  126. }
  127.     
  128.  
  129.  
  130.