From c27fc7dd968447fc78f7274603ce60b4a5666575 Mon Sep 17 00:00:00 2001 From: Ken Thompson Date: Wed, 10 Jan 1979 15:02:40 -0500 Subject: [PATCH] Research V7 development 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 Synthesized-from: v7 --- usr/src/cmd/update.c | 36 +++++ usr/src/cmd/vpr.c | 332 +++++++++++++++++++++++++++++++++++++++++++ usr/src/cmd/wall.c | 68 +++++++++ 3 files changed, 436 insertions(+) create mode 100644 usr/src/cmd/update.c create mode 100644 usr/src/cmd/vpr.c create mode 100644 usr/src/cmd/wall.c diff --git a/usr/src/cmd/update.c b/usr/src/cmd/update.c new file mode 100644 index 0000000000..85c05404f0 --- /dev/null +++ b/usr/src/cmd/update.c @@ -0,0 +1,36 @@ +/* + * Update the file system every 30 seconds. + * For cache benefit, open certain system directories. + */ + +#include + +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 index 0000000000..4a7e161b46 --- /dev/null +++ b/usr/src/cmd/vpr.c @@ -0,0 +1,332 @@ +/* + * vpr -- Versatek printer filter + */ + +#include + +#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=' ') { + 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 index 0000000000..003ff7c0c8 --- /dev/null +++ b/usr/src/cmd/wall.c @@ -0,0 +1,68 @@ +#include +#include +#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; iut_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, "Broadcast Message ...\n\n"); + fwrite(mesg, msize, 1, f); + exit(0); +} -- 2.20.1