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 >
Wrap
C/C++ Source or Header
|
1988-02-14
|
3KB
|
142 lines
/* lpsched fuer os-9/68k Uwe Simon 4.9.1987 */
#include <stdio.h>
#include <modes.h>
#include <module.h>
#include <pwd.h>
#include "lp.h"
int ev,active=0;
mod_exec *module;
error()
{
fprintf(stderr,"Syntax: lpsched [-r] {<devname>}\n");
fprintf(stderr,"Function: starts Printerspooler\n");
fprintf(stderr,"Options:\n");
fprintf(stderr," -r restarts spooler\n");
}
do_job(i) /* starte job i */
int i;
{
char s[80];
sprintf(s,"%d\n",queue->jobs[i].spoolid);
if(os9forkc("prjob",strlen(s),s,0,0,0,0,3)==-1)
printf("can't fork prjob\n");
else {
queue->busy[queue->jobs[i].dev]=BUSY;
active++;
}
}
new_job() /* starte einen neuen Job */
{
int i;
queue->command=NICHTS;
for(i=0;i<queue->spoolfiles;i++) {
if(queue->busy[queue->jobs[i].dev]=='\0') do_job(i);
}
}
printing()
{
int files=0,h,com,weiter=1,jo,mesg=1;
char hs[300];
struct passwd *pwd;
setuid(1); /* printerdaemon muss user 0.1 sein !!! */
freopen("/nil","w",stdout);
new_job(); /* bei restart alte files beginnen */
while(weiter||active) {
_ev_wait(ev,1,1); /* warte bis Spoolerqueue veraendert (wird von lprm und lp erzeugt */
h=queue->parameter;
switch(queue->command) {
case NICHTS: break;
case PRINT :
new_job();
break;
case DELETE:
jo=find_job(h);
if(jo>=0) {
if(queue->jobs[jo].status==BUSY) { /* prjob fuer diesen job muss gestoppt werden */
queue->parameter=h;
queue->command=STOP;
_ev_set(ev,STOP,0); /* gebe Stopstatus weiter */
_ev_wait(ev,1,1); /* warte bis killen fertig */
queue->busy[queue->jobs[jo].dev]='\0'; /* gebe printer wieder frei */
}
}
del_j(h);
break;
case READY:
active--;
wait(0); /* kein warten da ja ein Prozess beendet ist */
jo=find_job(h);
if(jo>=0) {
queue->busy[queue->jobs[jo].dev]='\0';
if(queue->jobs[jo].mesg[0]!='\0') { /* Meldung, dass fertig */
freopen(queue->jobs[jo].mesg,"a",stdout);
printf(">>> Printerjob %d is ready\07 \n",queue->jobs[jo].spoolid);
freopen("/nil","a",stdout);
}
if(queue->jobs[jo].options& MAILMODE) { /* mail, dass fertig */
if((pwd=getpwuid(queue->jobs[jo].user&&0xffff))!=NULL) {
sprintf(hs,"echo Printerjob %d ( %s ) is ready!mail -s Printerjob %s\n",queue->jobs[jo].spoolid,queue->jobs[jo].titel,pwd->pw_name);
system(hs);
}
}
del_j(h);
}
new_job();
break;
case CANCEL:
weiter=0;
break;
}
queue->command=NICHTS;
_ev_set(ev,0,0);
}
}
main(argc,argv)
int argc;
char **argv;
{
int i=0;
mod_exec *m;
char *h;
if(argc==1) {error(); exit(1);}
module=(mod_exec *)_mkdata_module("spoolqueue",sizeof(struct spoolqueue),0x8001,0x333);
if((int)module==-1) { exit(_errmsg(1,"can't create spoolerqueue\n")); }
queue=(struct spoolqueue *)((long)module+module->_mexec);
argv++;
if(strcmp(*argv,"-?")==0) {munlink(module); error(); exit(0); }
m=(mod_exec *)modloadp("prjob",1,h);
for(i=0;i<7;i++) {
queue->busy[i]='\0';
if(--argc>0) strcpy(queue->printer[i],*argv++);
else queue->printer[i][0]='\0';
}
queue->printer[7][0]='\0';
queue->command=NICHTS;
queue->active=getpid();
if((ev=_ev_creat(0,2,-1,"spoolqueue"))==-1) prerr(NULL,errno);
else printing();
_ev_unlink(ev);
munlink(module); /* unlink spoolqueue */
munlink(m); /* unlink "prjob" */
_ev_delete("spoolqueue");
munlink(module); /* delete semaphor */
}