|
DataMuseum.dkPresents historical artifacts from the history of: DKUUG/EUUG Conference tapes |
This is an automatic "excavation" of a thematic subset of
See our Wiki for more about DKUUG/EUUG Conference tapes Excavated with: AutoArchaeologist - Free & Open Source Software. |
top - metrics - downloadIndex: T k
Length: 2715 (0xa9b) Types: TextFile Names: »keyb.c«
└─⟦db229ac7e⟧ Bits:30007240 EUUGD20: SSBA 1.2 / AFW Benchmarks └─⟦this⟧ »EUUGD20/AFUU-ssba1.21/ssba1.21E/musbus/keyb.c« └─⟦this⟧ »EUUGD20/AFUU-ssba1.21/ssba1.21F/musbus/keyb.c«
/* * keyb -- emulate a user typing at a terminal * * keyb [ datafile ] * * standard input is copied to standard output at a rate not in excess * of "rate" characters per second, and optinally echoed to another * file/device. * * environment variables $rate and $tty control typing rate (characters * per second) and destination of echoed output. * * $Header: keyb.c,v 5.2 87/12/09 15:01:18 kenj Exp $ */ #include <stdio.h> #include "../install/signal.h" #define DEF_RATE 5 #define GRANULE 5 int thres; float est_rate = DEF_RATE; int sigpipe; /* pipe write error flag */ main(argc, argv) int argc; char *argv[]; { int i; int l; int fcopy = 0; /* fd for copy output */ int output; /* aggregate output char count */ int c; int nch; /* # characters read */ char buf[16]; /* the current glob of data */ int onalarm(); int pipeerr(); char *getenv(); int written; char *p; char *prog; /* my name */ double atof(); prog = argv[0]; if ((p = getenv("rate")) != (char *)0) { est_rate = (double) atof(p); if (est_rate <= 0) { fprintf(stderr, "%s: bad rate, reset to %.2f chars/sec\n", prog, DEF_RATE); est_rate = DEF_RATE; } } /* * No echoing if env var either undefined or a null string. */ if ((p = getenv("tty")) != (char *)0 && *p != '\0') { fcopy = open(p, 1); if (fcopy < 0) fcopy = creat(p, 0600); if (fcopy < 0) { fprintf(stderr, "%s: cannot open copy file '%s'\n", prog, p); exit(2); } lseek(fcopy, 0L, 2); /* append at end of file */ } if (argc == 2) { /* datafile argument specified */ close(0); if (open(argv[1], 0) < 0) { fprintf(stderr, "%s: Cannot open %s\n", prog, argv[1]); exit(4); } } srand(time(0)); thres = est_rate = est_rate * GRANULE; output = 0; signal(SIGPIPE, pipeerr); signal(SIGALRM, onalarm); alarm(GRANULE); while (1) { l = rand() % 15 + 1; /* 1-15 chars */ if (l == 0) continue; nch = read(0, buf, l); if (nch < 0) { perror("keyb: ** read error **"); exit(4); } else if (nch == 0) break; if ((written = write(1, buf, nch)) != nch) { /* argh! */ buf[nch] = '\0'; if (sigpipe) fprintf(stderr, "keyb: ** SIGPIPE error ** buf: %s\n", buf); else fprintf(stderr, "keyb: ** write error ** wrote %d of %d from buf: \"%s\"\n", written, nch, buf); perror("keyb is dying..."); exit(4); } if (fcopy) write(fcopy, buf, nch); output += nch; while (output > thres) pause(); } alarm(0); exit(0); } onalarm() { thres += est_rate; signal(SIGALRM, onalarm); alarm(GRANULE); } pipeerr() { sigpipe++; }