Research V7 development
authorKen Thompson <ken@research.uucp>
Wed, 10 Jan 1979 20:02:40 +0000 (15:02 -0500)
committerKen Thompson <ken@research.uucp>
Wed, 10 Jan 1979 20:02:40 +0000 (15:02 -0500)
Work on file usr/src/cmd/update.c
Work on file usr/src/cmd/wall.c
Work on file usr/src/cmd/vpr.c

Co-Authored-By: Dennis Ritchie <dmr@research.uucp>
Synthesized-from: v7

usr/src/cmd/update.c [new file with mode: 0644]
usr/src/cmd/vpr.c [new file with mode: 0644]
usr/src/cmd/wall.c [new file with mode: 0644]

diff --git a/usr/src/cmd/update.c b/usr/src/cmd/update.c
new file mode 100644 (file)
index 0000000..85c0540
--- /dev/null
@@ -0,0 +1,36 @@
+/*
+ * Update the file system every 30 seconds.
+ * For cache benefit, open certain system directories.
+ */
+
+#include <signal.h>
+
+char *fillst[] = {
+       "/bin",
+       "/usr",
+       "/usr/bin",
+       0,
+};
+
+main()
+{
+       char **f;
+
+       if(fork())
+               exit(0);
+       close(0);
+       close(1);
+       close(2);
+       for(f = fillst; *f; f++)
+               open(*f, 0);
+       dosync();
+       for(;;)
+               pause();
+}
+
+dosync()
+{
+       sync();
+       signal(SIGALRM, dosync);
+       alarm(30);
+}
diff --git a/usr/src/cmd/vpr.c b/usr/src/cmd/vpr.c
new file mode 100644 (file)
index 0000000..4a7e161
--- /dev/null
@@ -0,0 +1,332 @@
+/*
+ * vpr -- Versatek printer filter
+ */
+
+#include <stdio.h>
+
+#define        LINELN  132
+#define        EJLINE  63
+#define        SETSTATE (('v'<<8)+1)
+
+int    anydone;
+char   linebuf[LINELN+2];
+int    sppmode[]       = {0400, 0, 0};
+int    pltmode[]       = {0200, 0, 0};
+int    clrcom[]        = {0404, 0, 0};
+int    termcom[]       = {0240, 0, 0};
+int    prtmode[]       = {0100, 0, 0};
+int    ov;
+char   ovbuf[2*LINELN];
+FILE   *in     = stdin;
+FILE   *out;
+char   *ban;
+int    npages  = 1;
+char   chrtab[][16];
+int    lineno;
+char   *ctime();
+
+main(argc, argv)
+char **argv;
+{
+
+       if ((out = fopen("/dev/vp0", "w")) == NULL) {
+               fprintf(stderr, "Can't open printer\n");
+               exit(1);
+       }
+       if (argc > 2 && argv[1][0]=='-' && argv[1][1]=='b') {
+               argc -= 2;
+               banner(ban = argv[2]);
+               argv += 2;
+       }
+       if (argc<=1)
+               anydone |= send();
+       else while (argc>1) {
+               if ((in = fopen(argv[1], "r")) == NULL) {
+                       fprintf(stderr, "Can't find %s\n", argv[1]);
+                       argv++;
+                       argc--;
+                       anydone |= 01;
+                       continue;
+               }
+               anydone |= send();
+               argc--;
+               argv++;
+               fclose(in);
+               fprintf(out, "\014");
+       }
+       if (anydone==0)
+               exit(1);
+       fprintf(out, "\004");
+       if (ferror(out)) {
+               fprintf(out, "Printer IO error\n");
+               exit(1);
+       }
+       fclose(out);
+       if (ban && access("/usr/adm/vpacct", 02)>=0
+        && (out = fopen("/usr/adm/vpacct", "a"))!=NULL) {
+               fprintf(out, "%4d %s\n", npages, ban);
+       }
+       return(0);
+}
+
+send()
+{
+       register nskipped;
+
+       lineno = 0;
+       nskipped = 0;
+       while (getline()) {
+               if (lineno==0 && linebuf[0]==0 && nskipped<3) {
+                       nskipped ++;
+                       continue;
+               }
+               if (lineno >= EJLINE) {
+                       nskipped = 0;
+                       putline(1);
+                       lineno = 0;
+               } else {
+                       putline(0);
+                       lineno++;
+               }
+       }
+       if (lineno>0)
+               npages++;
+       return(1);
+}
+
+getline()
+{
+       register col, maxcol, c;
+
+       ov = 0;
+       for (col=0; col<LINELN; col++) {
+               linebuf[col] = ' ';
+               ovbuf[2*col] = ovbuf[2*col+1] = 0;
+       }
+       col = 8;
+       maxcol = 0;
+       for (;;) switch (c = getc(in)) {
+
+       case EOF:
+               return(0);
+
+       default:
+               if (c>=' ') {
+                       if (col < LINELN) {
+                               if (linebuf[col]=='_') {
+                                       ov++;
+                                       ovbuf[2*col] = 0377;
+                                       ovbuf[2*col+1] = 0377;
+                               }
+                               linebuf[col++] = c;
+                               if (col > maxcol)
+                                       maxcol = col;
+                       }
+               }
+               continue;
+
+       case '\f':
+               lineno = EJLINE;
+               continue;
+       case ' ':
+               col++;
+               continue;
+
+
+       case '\t':
+               col = (col|07) + 1;
+               if (col>maxcol)
+                       maxcol = col;
+               continue;
+
+       case '\r':
+               col = 0;
+               continue;
+
+       case '_':
+               if (col>=LINELN) {
+                       col++;
+                       continue;
+               }
+               if (linebuf[col]!=' ') {
+                       ovbuf[2*col] = 0377;
+                       ovbuf[2*col+1] = 0377;
+                       ov++;
+               } else
+                       linebuf[col] = c;
+               col++;
+               if (col>maxcol)
+                       maxcol = col;
+               continue;
+
+       case '\n':
+               if (maxcol>=LINELN)
+                       maxcol = LINELN;
+               linebuf[maxcol] = 0;
+               return(1);
+
+       case '\b':
+               if (col>0)
+                       col--;
+               continue;
+       }
+}
+
+putline(ff)
+{
+       register char *lp;
+       register c;
+       extern errno;
+
+       errno = 0;
+       lp = linebuf;
+       while (c = *lp++)
+               putc(c, out);
+       if (ov) {
+               putc('\n', out);
+               fflush(out);
+               ioctl(fileno(out), SETSTATE, pltmode);
+               for (lp=ovbuf; lp < &ovbuf[2*LINELN]; )
+                       putc(*lp++, out);
+               fflush(out);
+               ioctl(fileno(out), SETSTATE, prtmode);
+       }
+       if (ff) {
+               putc('\014', out);
+               npages++;
+       } else if (ov==0)
+               putc('\n', out);
+       if (ferror(out)) {
+               printf("Printer IO error\n");
+               exit(1);
+       }
+}
+
+banner(s)
+char *s;
+{
+       long timeb;
+       register char *sp;
+       int i, j, t;
+
+       fprintf(out, "\n\n\n\n\n\n\n\n");
+       for (i=0; i<16; i++) {
+               fprintf(out, "                ");
+               for (sp=s; *sp; sp++) {
+                       if (*sp<=' '|| *sp >'}')
+                               continue;
+                       fprintf(out, "  ");
+                       t = chrtab[*sp - ' '][i];
+                       for (j=7; j>=0; j--)
+                               if ((t>>j) & 01)
+                                       putc('X', out);
+                               else
+                                       putc(' ', out);
+               }
+               putc('\n', out);
+       }
+       fprintf(out, "\n\n\n\n\n\n\n\n");
+       time(&timeb);
+       fprintf(out, "                ");
+       fprintf(out, ctime(&timeb));
+       fprintf(out, "\014");
+}
+
+char   chrtab[][16] = {
+0000,0000,0000,0000,0000,0000,0000,0000,0000,0000,0000,0000,0000,0000,0000,0000, /*, sp, */
+0010,0010,0010,0010,0010,0010,0010,0010,0000,0000,0010,0000,0000,0000,0000,0000, /*, !, */
+0024,0024,0024,0000,0000,0000,0000,0000,0000,0000,0000,0000,0000,0000,0000,0000, /*, ", */
+0000,0000,0000,0044,0044,0176,0044,0044,0176,0044,0044,0000,0000,0000,0000,0000, /*, #, */
+0000,0010,0010,0010,0076,0101,0100,0076,0001,0101,0076,0010,0010,0000,0000,0000, /*, $, */
+0000,0000,0000,0141,0142,0004,0010,0010,0020,0043,0103,0000,0000,0000,0000,0000, /*, %, */
+0000,0000,0070,0104,0110,0060,0060,0111,0106,0106,0071,0000,0000,0000,0000,0000, /*, &, */
+0004,0010,0020,0040,0000,0000,0000,0000,0000,0000,0000,0000,0000,0000,0000,0000, /*, ', */
+0000,0004,0010,0020,0040,0040,0040,0040,0040,0040,0020,0010,0004,0000,0000,0000, /*, (, */
+0000,0040,0020,0010,0004,0004,0004,0004,0004,0004,0010,0020,0040,0000,0000,0000, /*, ), */
+0000,0000,0000,0010,0111,0052,0034,0177,0034,0052,0111,0010,0000,0000,0000,0000, /*, *, */
+0000,0000,0000,0000,0010,0010,0010,0177,0010,0010,0010,0000,0000,0000,0000,0000, /*, +, */
+0000,0000,0000,0000,0000,0000,0000,0000,0000,0030,0030,0010,0020,0000,0000,0000, /*, ,, */
+0000,0000,0000,0000,0000,0000,0000,0176,0000,0000,0000,0000,0000,0000,0000,0000, /*, -, */
+0000,0000,0000,0000,0000,0000,0000,0000,0000,0030,0030,0000,0000,0000,0000,0000, /*, ., */
+0000,0000,0001,0002,0004,0010,0010,0010,0020,0040,0100,0000,0000,0000,0000,0000, /*, /, */
+0000,0030,0044,0102,0102,0102,0102,0102,0102,0044,0030,0000,0000,0000,0000,0000, /*, 0, */
+0000,0010,0030,0010,0010,0010,0010,0010,0010,0010,0034,0000,0000,0000,0000,0000, /*, 1, */
+0000,0070,0104,0004,0004,0010,0020,0040,0100,0100,0174,0000,0000,0000,0000,0000, /*, 2, */
+0000,0176,0004,0004,0010,0014,0002,0002,0002,0104,0070,0000,0000,0000,0000,0000, /*, 3, */
+0000,0004,0014,0024,0044,0104,0176,0004,0004,0004,0004,0000,0000,0000,0000,0000, /*, 4, */
+0000,0174,0100,0100,0130,0144,0002,0002,0102,0044,0030,0000,0000,0000,0000,0000, /*, 5, */
+0000,0074,0102,0100,0130,0144,0102,0102,0102,0044,0030,0000,0000,0000,0000,0000, /*, 6, */
+0000,0176,0004,0004,0010,0010,0020,0020,0040,0040,0040,0000,0000,0000,0000,0000, /*, 7, */
+0000,0034,0042,0101,0042,0076,0101,0101,0101,0101,0076,0000,0000,0000,0000,0000, /*, 8, */
+0000,0034,0042,0101,0101,0101,0043,0036,0004,0010,0020,0040,0000,0000,0000,0000, /*, 9, */
+0000,0000,0000,0000,0000,0000,0030,0030,0000,0030,0030,0000,0000,0000,0000,0000, /*, :, */
+0000,0000,0000,0000,0000,0000,0030,0030,0000,0030,0030,0020,0040,0000,0000,0000, /*, ;, */
+0002,0004,0010,0020,0040,0100,0040,0020,0010,0004,0002,0000,0000,0000,0000,0000, /*, <, */
+0000,0000,0000,0000,0177,0000,0177,0000,0000,0000,0000,0000,0000,0000,0000,0000, /*, =, */
+0100,0040,0020,0010,0004,0002,0004,0010,0020,0040,0100,0000,0000,0000,0000,0000, /*, >, */
+0000,0030,0044,0102,0001,0002,0004,0010,0010,0000,0010,0000,0000,0000,0000,0000, /*, ?, */
+0000,0074,0102,0101,0115,0123,0121,0121,0121,0111,0046,0000,0000,0000,0000,0000, /*, @, */
+0000,0010,0024,0042,0101,0101,0177,0101,0101,0101,0101,0000,0000,0000,0000,0000, /*, A, */
+0000,0176,0101,0101,0101,0176,0101,0101,0101,0101,0176,0000,0000,0000,0000,0000, /*, B, */
+0000,0076,0101,0100,0100,0100,0100,0100,0100,0101,0076,0000,0000,0000,0000,0000, /*, C, */
+0000,0176,0101,0101,0101,0101,0101,0101,0101,0101,0176,0000,0000,0000,0000,0000, /*, D, */
+0000,0176,0100,0100,0100,0170,0100,0100,0100,0100,0177,0000,0000,0000,0000,0000, /*, E, */
+0000,0177,0100,0100,0100,0174,0100,0100,0100,0100,0100,0000,0000,0000,0000,0000, /*, F, */
+0000,0076,0101,0100,0100,0117,0101,0101,0101,0101,0076,0000,0000,0000,0000,0000, /*, G, */
+0000,0101,0101,0101,0101,0176,0101,0101,0101,0101,0101,0000,0000,0000,0000,0000, /*, H, */
+0000,0034,0010,0010,0010,0010,0010,0010,0010,0010,0034,0000,0000,0000,0000,0000, /*, I, */
+0000,0016,0004,0004,0004,0004,0004,0004,0104,0104,0070,0000,0000,0000,0000,0000, /*, J, */
+0000,0101,0102,0104,0110,0120,0160,0110,0104,0102,0101,0000,0000,0000,0000,0000, /*, K, */
+0000,0100,0100,0100,0100,0100,0100,0100,0100,0100,0177,0000,0000,0000,0000,0000, /*, L, */
+0000,0101,0143,0125,0111,0101,0101,0101,0101,0101,0101,0000,0000,0000,0000,0000, /*, M, */
+0000,0101,0141,0121,0111,0105,0103,0101,0101,0101,0101,0000,0000,0000,0000,0000, /*, N, */
+0000,0076,0101,0101,0101,0101,0101,0101,0101,0101,0076,0000,0000,0000,0000,0000, /*, O, */
+0000,0176,0101,0101,0101,0176,0100,0100,0100,0100,0100,0000,0000,0000,0000,0000, /*, P, */
+0000,0076,0101,0101,0101,0101,0101,0101,0131,0105,0076,0002,0001,0000,0000,0000, /*, Q, */
+0000,0176,0101,0101,0101,0176,0104,0102,0101,0101,0101,0000,0000,0000,0000,0000, /*, R, */
+0000,0076,0101,0100,0100,0076,0001,0001,0001,0101,0076,0000,0000,0000,0000,0000, /*, S, */
+0000,0177,0010,0010,0010,0010,0010,0010,0010,0010,0010,0000,0000,0000,0000,0000, /*, T, */
+0000,0101,0101,0101,0101,0101,0101,0101,0101,0101,0076,0000,0000,0000,0000,0000, /*, U, */
+0000,0101,0101,0101,0101,0101,0101,0101,0042,0024,0010,0000,0000,0000,0000,0000, /*, V, */
+0000,0101,0101,0101,0101,0111,0111,0125,0143,0101,0101,0000,0000,0000,0000,0000, /*, W, */
+0000,0101,0101,0042,0024,0010,0024,0042,0101,0101,0101,0000,0000,0000,0000,0000, /*, X, */
+0000,0101,0042,0024,0010,0010,0010,0010,0010,0010,0010,0000,0000,0000,0000,0000, /*, Y, */
+0000,0177,0001,0002,0004,0010,0020,0040,0100,0100,0177,0000,0000,0000,0000,0000, /*, Z, */
+0000,0034,0020,0020,0020,0020,0020,0020,0020,0020,0020,0034,0000,0000,0000,0000, /*, [, */
+0000,0000,0100,0040,0020,0010,0010,0010,0004,0002,0001,0000,0000,0000,0000,0000, /*, , \, */
+0000,0070,0010,0010,0010,0010,0010,0010,0010,0010,0010,0070,0000,0000,0000,0000, /*, ], */
+0010,0024,0042,0000,0000,0000,0000,0000,0000,0000,0000,0000,0000,0000,0000,0000, /*, ^, */
+0000,0000,0000,0000,0000,0000,0000,0000,0000,0000,0000,0000,0000,0377,0000,0000, /*, _, */
+0040,0020,0010,0004,0000,0000,0000,0000,0000,0000,0000,0000,0000,0000,0000,0000, /*, `, */
+0000,0000,0000,0000,0000,0074,0002,0076,0102,0102,0076,0000,0000,0000,0000,0000, /*, a, */
+0000,0100,0100,0100,0100,0174,0102,0102,0102,0102,0174,0000,0000,0000,0000,0000, /*, b, */
+0000,0000,0000,0000,0000,0074,0102,0100,0100,0102,0074,0000,0000,0000,0000,0000, /*, c, */
+0002,0002,0002,0002,0002,0076,0102,0102,0102,0102,0076,0000,0000,0000,0000,0000, /*, d, */
+0000,0000,0000,0000,0000,0074,0102,0174,0100,0102,0074,0000,0000,0000,0000,0000, /*, e, */
+0000,0016,0020,0020,0020,0176,0020,0020,0020,0020,0020,0000,0000,0000,0000,0000, /*, f, */
+0000,0000,0000,0000,0000,0076,0102,0102,0102,0102,0076,0002,0002,0102,0076,0000, /*, g, */
+0000,0100,0100,0100,0100,0174,0102,0102,0102,0102,0102,0000,0000,0000,0000,0000, /*, h, */
+0000,0000,0000,0010,0000,0030,0010,0010,0010,0010,0034,0000,0000,0000,0000,0000, /*, i, */
+0000,0000,0000,0010,0000,0030,0010,0010,0010,0010,0010,0010,0010,0050,0020,0000, /*, j, */
+0000,0100,0100,0100,0100,0106,0110,0120,0160,0110,0106,0000,0000,0000,0000,0000, /*, k, */
+0000,0030,0010,0010,0010,0010,0010,0010,0010,0010,0034,0000,0000,0000,0000,0000, /*, l, */
+0000,0000,0000,0000,0000,0166,0111,0111,0111,0111,0111,0000,0000,0000,0000,0000, /*, m, */
+0000,0000,0000,0000,0100,0174,0102,0102,0102,0102,0102,0000,0000,0000,0000,0000, /*, n, */
+0000,0000,0000,0000,0000,0074,0102,0102,0102,0102,0074,0000,0000,0000,0000,0000, /*, o, */
+0000,0000,0000,0000,0000,0174,0102,0102,0102,0102,0174,0100,0100,0100,0100,0000, /*, p, */
+0000,0000,0000,0000,0000,0076,0102,0102,0102,0102,0076,0002,0002,0002,0002,0000, /*, q, */
+0000,0000,0000,0000,0000,0134,0142,0100,0100,0100,0100,0000,0000,0000,0000,0000, /*, r, */
+0000,0000,0000,0000,0000,0076,0100,0074,0002,0102,0074,0000,0000,0000,0000,0000, /*, s, */
+0000,0020,0020,0020,0020,0176,0020,0020,0020,0020,0014,0000,0000,0000,0000,0000, /*, t, */
+0000,0000,0000,0000,0000,0102,0102,0102,0102,0102,0075,0000,0000,0000,0000,0000, /*, u, */
+0000,0000,0000,0000,0000,0101,0101,0101,0042,0024,0010,0000,0000,0000,0000,0000, /*, v, */
+0000,0000,0000,0000,0000,0111,0111,0111,0111,0111,0066,0000,0000,0000,0000,0000, /*, w, */
+0000,0000,0000,0000,0000,0102,0044,0030,0030,0044,0102,0000,0000,0000,0000,0000, /*, x, */
+0000,0000,0000,0000,0000,0102,0102,0102,0042,0024,0010,0020,0040,0100,0000,0000, /*, y, */
+0000,0000,0000,0000,0000,0176,0004,0010,0020,0040,0176,0000,0000,0000,0000,0000, /*, z, */
+0000,0014,0020,0020,0020,0020,0040,0020,0020,0020,0020,0014,0000,0000,0000,0000, /*, {, */
+0000,0010,0010,0010,0010,0000,0000,0010,0010,0010,0010,0000,0000,0000,0000,0000, /*, |, */
+0000,0030,0010,0010,0010,0010,0004,0010,0010,0010,0010,0030,0000,0000,0000,0000, /*, }, */
+0020,0052,0004,0000,0000,0000,0000,0000,0000,0000,0000,0000,0000,0000,0000,0000, /*, ~, */
+0000,0176,0176,0176,0176,0176,0176,0176,0176,0176,0176,0000,0000,0000,0000,0000, /*, del, */
+};
diff --git a/usr/src/cmd/wall.c b/usr/src/cmd/wall.c
new file mode 100644 (file)
index 0000000..003ff7c
--- /dev/null
@@ -0,0 +1,68 @@
+#include <stdio.h>
+#include <utmp.h>
+#define        USERS   50
+
+char   mesg[3000];
+int    msize;
+struct utmp utmp[USERS];
+char   *strcpy();
+char   *strcat();
+
+main(argc, argv)
+char *argv[];
+{
+       register i;
+       register struct utmp *p;
+       FILE *f;
+
+       if((f = fopen("/etc/utmp", "r")) == NULL) {
+               fprintf(stderr, "Cannot open /etc/utmp\n");
+               exit(1);
+       }
+       fread((char *)utmp, sizeof(struct utmp), USERS, f);
+       fclose(f);
+       f = stdin;
+       if(argc >= 2) {
+               if((f = fopen(argv[1], "r")) == NULL) {
+                       fprintf(stderr,"Cannot open %s\n", argv[1]);
+                       exit(1);
+               }
+       }
+       while((i = getc(f)) != EOF) mesg[msize++] = i;
+       fclose(f);
+       for(i=0; i<USERS; i++) {
+               p = &utmp[i];
+               if(p->ut_name[0] == 0)
+                       continue;
+               sleep(1);
+               sendmes(p->ut_line);
+       }
+       exit(0);
+}
+
+sendmes(tty)
+char *tty;
+{
+       register i;
+       char t[50], buf[BUFSIZ];
+       FILE *f;
+
+       i = fork();
+       if(i == -1) {
+               fprintf(stderr, "Try again\n");
+               return;
+       }
+       if(i)
+               return;
+       strcpy(t, "/dev/");
+       strcat(t, tty);
+
+       if((f = fopen(t, "w")) == NULL) {
+               fprintf(stderr,"cannot open %s\n", t);
+               exit(1);
+       }
+       setbuf(f, buf);
+       fprintf(f, "\a\a\aBroadcast Message ...\n\n");
+       fwrite(mesg, msize, 1, f);
+       exit(0);
+}