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 >
Wrap
Text File
|
1988-02-09
|
3KB
|
130 lines
/* Includefile fuer Spoolerqueue */
#define MAXJOBS 50
#define NICHTS 0
#define PRINT 1
#define DELETE 2
#define READY 3
#define CANCEL 4
#define STOP 5
#define BUSY '*'
#define MAILMODE 0x01
char spooltmp[100]= "/dd/SPOOL/";
struct spooljob {
int user, spoolid,copy,options,dev,size;
char mesg[8];
char filename[100],titel[100],status;
};
struct spoolqueue {
int spoolnumber,spoolfiles,active,command,parameter;
char printer[8][32],busy[8]; /* printer[0] ist defaultdevice */
/* busy gibt an ob schon gedruckt wird */
struct spooljob jobs[MAXJOBS];
} *queue;
int find_printer(s) /* gibt nummer des Printers s zurueck */
char *s;
{
int i;
if(s[0]) {
for(i=0;i<8;i++) {
if(strcmp(s,queue->printer[i])==0) return(i);
}
return(-1);
} else return(0);
}
int find_job(j) /* returns Position von Job j */
int j;
{
int i;
for(i=0;(i<queue->spoolfiles) && (queue->jobs[i].spoolid!=j);i++) ;
if(i>=queue->spoolfiles) return(-1);
return(i);
}
int del_j(j) /* gibt 0 zurueck, wenn Job j geloescht wurde */
/* wird nur von lpsched aufgerufen !! ( also kein Semaphor) */
{
int i;
if((i=find_job(j))==-1) return(-1);
for(;i+1<queue->spoolfiles;i++)
_strass(&queue->jobs[i],&queue->jobs[i+1],sizeof(struct spooljob));
queue->command=NICHTS;
queue->spoolfiles--;
return(0);
}
int ins_job(ev,queue,dev,filename,titel,copy,mesg,opt,size)
/* return spoolid or -1 on error */
struct spoolqueue *queue;
char *dev,*filename,*titel,*mesg;
int copy,ev,opt;
{
int h,pos;
_ev_wait(ev,0,0);
pos=queue->spoolfiles;
if(pos>=MAXJOBS) return(-1);
if((queue->jobs[pos].dev=find_printer(dev))==-1) {
_ev_set(ev,0,0); /* lpsched nicht starten */
return(-1);
}
h=++queue->spoolnumber;
queue->jobs[pos].spoolid=h;
queue->parameter=h;
strcpy(queue->jobs[pos].filename,filename);
strcpy(queue->jobs[pos].titel,titel);
queue->jobs[pos].copy=copy;
queue->jobs[pos].options=opt;
queue->jobs[pos].size=size;
queue->jobs[pos].user=getuid();
queue->jobs[pos].status=' ';
strcpy(queue->jobs[pos].mesg,mesg);
queue->spoolfiles++;
queue->command=PRINT;
_ev_signal(ev,0);
return(h);
}
int del_job(ev,dev,job)
char *dev;
int job,ev;
{
int i,found=0,dv;
long int user;
_ev_wait(ev,0,0);
user=getuid();
dv=find_printer(dev);
for (i=0;i<queue->spoolfiles;i++){
if(((job>0)==(queue->jobs[i].spoolid==job))&&
((dv>=0)==(dv==queue->jobs[i].dev)) ) {
if((user!=0)<=(user==queue->jobs[i].user)) {
found=1; queue->command=DELETE; /* veranlaesst lpsched den job zu loeschen */
queue->parameter=queue->jobs[i].spoolid;
_ev_signal(ev); /* lpsched wird gestartet */
_ev_wait(ev,0,0);/* warte bis fertig */
i--;
}
else fprintf(stderr,"Spoolid %d: not owner\n",
queue->jobs[i].spoolid);
}
}
queue->command=NICHTS;
_ev_signal(ev,0);
return(found);
}