|
|
1.1 root 1:
2: #include <stdio.h>
3: #include <sys/types.h>
4: #include <sys/stat.h>
5: #include <sys/vcmd.h>
6: #include <signal.h>
7: #include <errno.h>
8:
9: char * LOCK = "/usr/spool/vad/lock";
10: char * DEVICE = "/dev/va0";
11: char * DAEMON = "/usr/lib/vad";
12: char * NAME = "Varian";
13:
14: extern char *ctime(),*getlogin();
15:
16: #define BUFSIZE 16384
17: char vpbuf[BUFSIZE];
18:
19: extern int errno;
20: extern quit();
21:
22: int plotmd [] = { VPLOT, 0, 0 };
23: int prtmd [] = { VPRINT, 0, 0 };
24: int vp;
25: FILE *f;
26: struct stat stbuf;
27: long clock;
28: int running;
29: char *name;
30: char **argv;
31: int argc;
32: int offline = 0;
33:
34: main(count,v)
35: int count;
36: char **v;
37: {
38: int i,k;
39: argv = v;
40: argc = count;
41: name = argv[1];
42:
43: if(argc < 2) {
44: fprintf(stderr,"Usage: %s bit_file [banner [message]] [-W]\n",argv[0]);
45: exit(1);
46: }
47:
48: if( (f=fopen(argv[1],"r")) == NULL) {
49: fprintf(stderr,"Can't open %s\n",argv[1]);
50: exit(1);
51: }
52:
53: for(i=0;i<16;i++)
54: signal(i,quit);
55:
56: signal(SIGHUP,SIG_IGN);
57: signal(SIGINT,SIG_IGN);
58:
59: if( '-' == argv[argc-1][0]) {
60: switch(argv[argc-1][1]) {
61: case 'W':
62: LOCK = "/usr/spool/vpd/lock";
63: DEVICE = "/dev/vp0";
64: NAME = "Versatec";
65: DAEMON = "/usr/lib/vpd";
66: break;
67: case 'V':
68: break;
69: default:
70: fprintf(stderr,"%s: unknown option - quit\n",argv[argc-1]);
71: quit(0);
72: }
73: argc--;
74: }
75:
76: while( stat(LOCK, &stbuf) >= 0) {
77: sleep(30);
78: }
79:
80: if( creat(LOCK, 0666) < 0) {
81: fprintf(stderr,"Can't create %s\n",LOCK);
82: quit(0);
83: }
84:
85: while(1) {
86: if( (vp = open(DEVICE, 1)) >= 0) break;
87: if( errno != EIO ) {
88: perror(DEVICE);
89: quit(0);
90: }
91: if(offline == 0) {
92: fprintf(stderr,"%s is offline\n",NAME);
93: offline = 1;
94: }
95: sleep(30);
96: }
97:
98: /*
99: if( (vp = open(DEVICE, 1)) < 0) {
100: printf("Put the %s on line\n",NAME);
101: for( k=0; k<24 && vp == NULL; k++) {
102: sleep(10);
103: vp = open(DEVICE,1);
104: }
105: if( vp == NULL ) {
106: fprintf(stderr,"Can't open %s\n",NAME);
107: unlink(LOCK);
108: quit(0);
109: }
110: }
111: */
112:
113: ioctl(vp, VSETSTATE, prtmd);
114: running = 1;
115:
116: clock = time(0);
117: if(argc < 3)
118: sprintf(vpbuf, "%s: %s\n",getlogin(),ctime(&clock));
119: else
120: sprintf(vpbuf, "%s: %s%s\n",getlogin(),ctime(&clock),argv[2]);
121: write(vp, vpbuf, BUFSIZE);
122:
123: ioctl( vp, VSETSTATE, plotmd);
124: while( (i=read(fileno(f),vpbuf, BUFSIZE)) > 0)
125: write(vp,vpbuf,i);
126: quit(-1);
127: }
128:
129: quit(n)
130: int n;
131: {
132: if(running) {
133: ioctl(vp, VSETSTATE, prtmd);
134: write(vp, "\f\f", 2);
135: }
136: close(vp);
137: unlink(LOCK);
138: unlink(name);
139: if(n < 0) {
140: if(argc > 2) fprintf(stderr,"%s\n",argv[3]);
141: }
142: else fprintf(stderr,"Plotting Aborted\n");
143: execl( DAEMON, DAEMON, 0 );
144: exit(0);
145: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.