ast@cs.vu.nl (Andy Tanenbaum) (07/14/88)
: This is a shar archive. Extract with sh, not csh. : This archive ends with exit, so do not worry about trailing junk. : --------------------------- cut here -------------------------- PATH=/bin:/usr/bin:/usr/ucb echo Extracting 'ar.c.cdif' sed 's/^X//' > 'ar.c.cdif' << '+ END-OF-FILE ''ar.c.cdif' X*** /local/ast/minix/tape3a/commands/ar.c Mon May 16 15:03:36 1988 X--- ar.c Wed Jul 13 13:10:39 1988 X*************** X*** 132,138 **** X /* forward declarations and external references */ X extern char *malloc(); X extern char *mktemp(), *rindex(); X! extern int strcmp(); X extern print_date(); X extern user_abort(), usage(); X extern long lseek(); X--- 132,138 ---- X /* forward declarations and external references */ X extern char *malloc(); X extern char *mktemp(), *rindex(); X! extern int strncmp(); X extern print_date(); X extern user_abort(), usage(); X extern long lseek(); X*************** X*** 473,487 **** X X if (major & EXTRACT) { X if ((outfd = creat(member->ar_name,0666)) < 0) { X! fprintf(stderr,"Error: %s could not creat %s\n",progname, member->ar_name); X quit(mypid,SIGINT); X } X if (verbose) X! fprintf(stdout,"x - %s\n",member->ar_name); X } X else { X if (verbose) { X! fprintf(stdout,"p - %s\n",member->ar_name); X fflush(stdout); X } X outfd = fileno(stdout); X--- 473,487 ---- X X if (major & EXTRACT) { X if ((outfd = creat(member->ar_name,0666)) < 0) { X! fprintf(stderr,"Error: %s could not creat %-14.14s\n",progname, member->ar_name); X quit(mypid,SIGINT); X } X if (verbose) X! fprintf(stdout,"x - %-14.14s\n",member->ar_name); X } X else { X if (verbose) { X! fprintf(stdout,"p - %-14.14s\n",member->ar_name); X fflush(stdout); X } X outfd = fileno(stdout); X*************** X*** 521,527 **** X for (; m > 0; m -= n) { X cnt = (m < BUFFERSIZE ? m : BUFFERSIZE); X if ((n = read(infd, buffer, cnt)) != cnt) { X! fprintf(stderr,"Error: %s - read error on %s\n",progname, member->ar_name); X quit(mypid, SIGINT); X } X mwrite(outfd, buffer, n); X--- 521,527 ---- X for (; m > 0; m -= n) { X cnt = (m < BUFFERSIZE ? m : BUFFERSIZE); X if ((n = read(infd, buffer, cnt)) != cnt) { X! fprintf(stderr,"Error: %s - read error on %-14.14s\n",progname, member->ar_name); X quit(mypid, SIGINT); X } X mwrite(outfd, buffer, n); X*************** X*** 550,556 **** X fprintf(stderr,"Error: %s cannot open file %s\n",progname,name); X quit(mypid,SIGINT); X } X! strcpy(member.ar_name, basename(name)); X member.ar_uid = status.st_uid; X member.ar_gid = status.st_gid; X member.ar_mode = status.st_mode & 07777; X--- 550,556 ---- X fprintf(stderr,"Error: %s cannot open file %s\n",progname,name); X quit(mypid,SIGINT); X } X! strncpy(member.ar_name, basename(name),14); X member.ar_uid = status.st_uid; X member.ar_gid = status.st_gid; X member.ar_mode = status.st_mode & 07777; X*************** X*** 560,572 **** X if (oldmember != (struct ar_hdr *)NULL) X if (member.ar_date <= oldmember->ar_date) { X close(in_fd); X! if (verbose) fprintf(stdout, "not %s - %s\n",mess, name); X return (-1); X } X X copy_member(in_fd, fd, &member); X if (verbose) X! fprintf(stdout, "%s - %s\n",mess, name); X close(in_fd); X return (1); X } X--- 560,572 ---- X if (oldmember != (struct ar_hdr *)NULL) X if (member.ar_date <= oldmember->ar_date) { X close(in_fd); X! if (verbose) fprintf(stdout, "not %-14.14s - %-14.14s\n",mess, name); X return (-1); X } X X copy_member(in_fd, fd, &member); X if (verbose) X! fprintf(stdout, "%s - %-14.14s\n",mess, name); X close(in_fd); X return (1); X } X*************** X*** 607,613 **** X if ((member = get_member(arfd)) != NULL) X copy_member(arfd, newfd, member); X mov = mov->next; X! if (verbose) fprintf(stdout, "m - %s\n", member->ar_name); X } X X /* copy rest of library into new tmp file */ X--- 607,613 ---- X if ((member = get_member(arfd)) != NULL) X copy_member(arfd, newfd, member); X mov = mov->next; X! if (verbose) fprintf(stdout, "m - %-14.14s\n", member->ar_name); X } X X /* copy rest of library into new tmp file */ X*************** X*** 687,693 **** X did_print = 0; X if (ac < argc) { X for (a = ac+1; a <= argc; ++a) { X! if (strcmp(basename(argv[a-1]),member->ar_name) == 0) { X if (major & TABLE) X print_header(member); X else if (major & (PRINT | EXTRACT)) { X--- 687,693 ---- X did_print = 0; X if (ac < argc) { X for (a = ac+1; a <= argc; ++a) { X! if (strncmp(basename(argv[a-1]),member->ar_name,14) == 0) { X if (major & TABLE) X print_header(member); X else if (major & (PRINT | EXTRACT)) { X*************** X*** 729,740 **** X X /* if posname specified check for our member */ X /* if our member save his starting pos in our working file*/ X! if (posname && strcmp(posname, member->ar_name) == 0) X pos_offset = tell(tempfd) - MAGICSIZE; X X if (ac < argc) { /* we have a list of members to check */ X for (a = ac+1; a <= argc; ++a) X! if (strcmp(basename(argv[a-1]),member->ar_name) == 0) { X if (major & REPLACE) { X if (insert(tempfd,argv[a-1],"r", member) < 0) X copy_member(fd, tempfd, member); X--- 729,740 ---- X X /* if posname specified check for our member */ X /* if our member save his starting pos in our working file*/ X! if (posname && strncmp(posname, member->ar_name, 14) == 0) X pos_offset = tell(tempfd) - MAGICSIZE; X X if (ac < argc) { /* we have a list of members to check */ X for (a = ac+1; a <= argc; ++a) X! if (strncmp(basename(argv[a-1]),member->ar_name,14) == 0) { X if (major & REPLACE) { X if (insert(tempfd,argv[a-1],"r", member) < 0) X copy_member(fd, tempfd, member); X*************** X*** 753,759 **** X if (ac >= argc || a > argc) /*nomatch on a member name */ X copy_member(fd, tempfd, member); X else if (major & DELETE) { X! if (verbose) fprintf(stdout,"d - %s\n",member->ar_name); X lseek(fd, (long)even(member->ar_size), 1); X } X } X--- 753,759 ---- X if (ac >= argc || a > argc) /*nomatch on a member name */ X copy_member(fd, tempfd, member); X else if (major & DELETE) { X! if (verbose) fprintf(stdout,"d - %-14.14s\n",member->ar_name); X lseek(fd, (long)even(member->ar_size), 1); X } X } X*************** X*** 761,767 **** X if (posname == NULL) X pos_offset = lseek(fd, 0l, 2); X else if (pos_offset == (-1)) { X! fprintf(stderr,"Error: %s cannot find file %s\n",progname,posname); X quit(mypid,SIGINT); X } X tempfd = ar_move(tempfd, fd, moves); X--- 761,767 ---- X if (posname == NULL) X pos_offset = lseek(fd, 0l, 2); X else if (pos_offset == (-1)) { X! fprintf(stderr,"Error: %s cannot find file %-14.14s\n",progname,posname); X quit(mypid,SIGINT); X } X tempfd = ar_move(tempfd, fd, moves); + END-OF-FILE ar.c.cdif chmod 'u=rw,g=r,o=r' 'ar.c.cdif' set `wc -c 'ar.c.cdif'` count=$1 case $count in 6569) :;; *) echo 'Bad character count in ''ar.c.cdif' >&2 echo 'Count should be 6569' >&2 esac echo Extracting 'at.c' sed 's/^X//' > 'at.c' << '+ END-OF-FILE ''at.c' X/* at - run commands at a specific time Author: Jan Looyen */ X X X/* Examples: at 2315 Jan 31 myfile # myfile executed Jan 31 at 11:15 pm X * at 0900 # job input read from stdin X * at 0711 4 29 # read from stdin, exec on April 29 X * X * To see output, commands must redirect it to e.g., >/dev/tty0. X */ X X X#define DIR "/usr/spool/at/ X#define STARTDAY 0 /* see ctime(3) */ X#define LEAPDAY STARTDAY+59 X#define MAXDAYNR STARTDAY+364 X#define NODAY -2 X X#include <stdio.h> X#include <sys/types.h> X#include <time.h> X Xmain(argc, argv, envp) Xint argc; Xchar **argv, **envp; X{ X int i, count, ltim, year, getltim(), getlday(); X int lday = NODAY; X char c, buf[10], job[30], *dp, *sp; X struct tm *p, *localtime(); X long clock; X FILE *fp, *pin, *popen(); X X/*-------------------------------------------------------------------------* X * check arguments * X *-------------------------------------------------------------------------*/ X if (argc < 2 || argc > 5) { X fprintf(stderr, "Usage: %s time [month day] [file]\n", argv[0]); X exit(0); X } X if ((ltim = getltim(argv[1])) == -1) { X fprintf(stderr, "%s: wrong time specification\n", argv[0]); X exit(0); X } X if ((argc==4 || argc==5) && (lday = getlday(argv[2], argv[3]))==-1) { X fprintf(stderr, "%s: wrong date specification\n", argv[0]); X exit(0); X } X if ((argc==3 || argc==5) && open(argv[argc-1], 0) == -1) { X fprintf(stderr, "%s: cannot find: %s\n", argv[0], argv[argc-1]); X exit(0); X } X/*-------------------------------------------------------------------------* X * determine execution time and create 'at' job file * X *-------------------------------------------------------------------------*/ X time(&clock); X p = localtime(&clock); X year = p->tm_year; X if (lday==NODAY) { /* no [month day] given */ X lday = p->tm_yday; X if (ltim <= (p->tm_hour*100 + p->tm_min)) { X lday++; X if (lday==MAXDAYNR && (year%4) || lday==MAXDAYNR+1) { X lday = STARTDAY; X year++; X } X } X } X else X switch (year%4) { X case 0: if (lday < p->tm_yday || lday == p->tm_yday && X ltim <= (p->tm_hour*100 + p->tm_min) ) { X year++; X if (lday > LEAPDAY) lday-- ; X } X break; X case 1: X case 2: if (lday > LEAPDAY) lday-- ; X if (lday < p->tm_yday || lday == p->tm_yday && X ltim <= (p->tm_hour*100 + p->tm_min) ) X year++; X break; X case 3: if (lday < ((lday > LEAPDAY) ? p->tm_yday+1 : p->tm_yday) || X lday== ((lday > LEAPDAY) ? p->tm_yday+1 : p->tm_yday) && X ltim <= (p->tm_hour*100 + p->tm_min) ) X year++; X else if (lday > LEAPDAY) lday--; X break; X } X if ((pin = popen("pwd", "r")) == NULL) X fprintf(stderr, "%s: cannot open pipe to cmd 'pwd'\n", argv[0]); X sprintf(job, DIR%02d.%03d.%04d.%02d", year%100, lday, ltim, getpid()%100); X if ((fp = fopen(job, "w")) == NULL) { X fprintf(stderr, "%s: cannot create %s\n", argv[0], job); X exit(0); X } X/*-------------------------------------------------------------------------* X * write environment and command(s) to 'at'job file * X *-------------------------------------------------------------------------*/ X while (envp[i] != NULL) { X count = 1; X dp = buf; X sp = envp[i]; X while ((*dp++ = *sp++) != '=') X count++; X *--dp = '\0'; X fprintf(fp, "export %s; %s='%s'\n", buf, buf, &envp[i++][count]); X } X fprintf(fp, "cd "); X while ((c = getc(pin)) != EOF) X putc(c, fp); X fprintf(fp, "umask %d\n", umask()); X if (argc==3 || argc==5) X fprintf(fp, "%s\n", argv[argc-1]); X else /* read from stdinput */ X while ((c = getchar()) != EOF) X putc(c, fp); X fclose(fp); X X printf("%s: %s created\n", argv[0], job); X} X X/*-------------------------------------------------------------------------* X * getltim() * X *-------------------------------------------------------------------------*/ X Xgetltim(t) /* return( (time OK) ? daytime : -1) */ Xchar *t; X{ X if (t[4] == '\0' && t[3] >= '0' && t[3] <= '9' && X t[2] >= '0' && t[2] <= '5' && t[1] >= '0' && t[1] <= '9' && X (t[0] == '0' || t[0] == '1' || t[1] <= '3' && t[0] == '2') ) X return(atoi(t)); X else X return(-1); X} X X/*-------------------------------------------------------------------------* X * getltday() * X *-------------------------------------------------------------------------*/ X Xgetlday(m, d) /* return ( (date OK) ? date number : -1 ) */ Xchar *m, *d; X{ X int month, day; X X month = 0; X if (m[1]=='\0') { X if ((month = atoi(m)) < 1 || month > 9) month = 0; X } X else if (m[2]=='\0') { X if ((month = atoi(m)) < 10 || month > 12) month = 0; X } X else if (m[3]=='\0') { X if (m[0]=='J' || m[0]=='j') { X if (m[1]=='a' && m[2]=='n') month = 1; X else if (m[1]=='u') { X if (m[2]=='n') month = 6; X else if (m[2]=='l') month = 7; X } X } X else if (m[0]=='M' || m[0]=='m') { X if (m[1]=='a') { X if (m[2]=='r') month = 3; X else if (m[2]=='y') month = 5; X } X } X else if (m[0]=='A' || m[0]=='a') { X if (m[1]=='p' && m[2]=='r') month = 4; X else if (m[1]=='u' && m[2]=='g') month = 8; X } X else if ((m[0]=='F' || m[0]=='f') && m[1]=='e' && m[2]=='b')month = 2; X else if ((m[0]=='S' || m[0]=='s') && m[1]=='e' && m[2]=='p')month = 9; X else if ((m[0]=='O' || m[0]=='o') && m[1]=='c' && m[2]=='t')month = 10; X else if ((m[0]=='N' || m[0]=='n') && m[1]=='o' && m[2]=='v')month = 11; X else if ((m[0]=='D' || m[0]=='d') && m[1]=='e' && m[2]=='c')month = 12; X } X if (!month) return (-1); X X X day = 0; X if (d[1] == '\0') { X if ((day = atoi(d)) <1 || day > 9) return(-1); X } X else if (d[2] == '\0') { X if ((day = atoi(d)) <10 || day > 31) return(-1); X else if (month==2 && day > 29) return(-1); X else if (day==31 && ( month==4 || month==6 || month==9 || month==11)) X return(-1); X } X X if (!STARTDAY)day--; X switch (month) { X case 1: return(day); X case 2: return(day + 31); X case 3: return(day + 60); X case 4: return(day + 91); X case 5: return(day + 121); X case 6: return(day + 152); X case 7: return(day + 182); X case 8: return(day + 213); X case 9: return(day + 244); X case 10: return(day + 274); X case 11: return(day + 305); X case 12: return(day + 335); X } X} + END-OF-FILE at.c chmod 'u=rw,g=r,o=r' 'at.c' set `wc -c 'at.c'` count=$1 case $count in 6373) :;; *) echo 'Bad character count in ''at.c' >&2 echo 'Count should be 6373' >&2 esac echo Extracting 'atrun.c' sed 's/^X//' > 'atrun.c' << '+ END-OF-FILE ''atrun.c' X/* atrun - perform the work 'at' has squirreled away Author: Jan Looyen */ X X/*-------------------------------------------------------------------------* X * atrun scans directory DIRNAME for 'at' jobs to be executed * X * finished jobs have been moved to directory DIRNAME/past * X *-------------------------------------------------------------------------*/ X#define DIRNAME "/usr/spool/at X#include <stdio.h> X#include <sys/types.h> X#include <sys/dir.h> X#include <time.h> X Xmain() X{ X int fd, nr; X char realtime[15], procname[35], procpast[35]; X struct direct dirbuf; X struct tm *p, *localtime(); X long clock; X X/*-------------------------------------------------------------------------* X * compute real time, move 'at' jobs whose filenames < real time to * X * DIRNAME/past and start a sh for each job * X *-------------------------------------------------------------------------*/ X time(&clock); X p = localtime(&clock); X sprintf(realtime, "%02d.%03d.%02d%02d.00", X p->tm_year%100, p->tm_yday, p->tm_hour, p->tm_min); X if ((fd = open(DIRNAME", 0)) > 0) X while (read(fd, (char *)&dirbuf, sizeof(dirbuf)) > 0) X if (dirbuf.d_ino > 0 && X dirbuf.d_name[0] != '.' && X dirbuf.d_name[0] != 'p' && X strncmp(dirbuf.d_name, realtime, 11) < 0 ) { X X sprintf(procname, DIRNAME/%.14s", dirbuf.d_name); X sprintf(procpast, DIRNAME/past/%.14s", dirbuf.d_name); X X if (fork() == 0) /* code for child */ X if (link(procname, procpast) == 0){ /* link ok? */ X unlink(procname); X execl("/bin/sh", "sh", procpast, 0); X fprintf(stderr,"proc %s can't start\n", procpast); X exit(1); X } X } X X} + END-OF-FILE atrun.c chmod 'u=rw,g=r,o=r' 'atrun.c' set `wc -c 'atrun.c'` count=$1 case $count in 1730) :;; *) echo 'Bad character count in ''atrun.c' >&2 echo 'Count should be 1730' >&2 esac echo Extracting 'date.c.cdif' sed 's/^X//' > 'date.c.cdif' << '+ END-OF-FILE ''date.c.cdif' X*** /local/ast/minix/tape3a/commands/date.c Mon May 16 15:03:48 1988 X--- date.c Wed Jul 13 13:10:50 1988 X*************** X*** 20,25 **** X--- 20,26 ---- X long s_p_hour; X long s_p_day; X long s_p_year; X+ char time_buf[15]; X X main(argc, argv) X int argc; X*************** X*** 35,55 **** X if (argc == 2) { X if (*argv[1] == '-' && (argv[1][1] | 0x60) == 'q') { X /* Query option. */ X- char time_buf[15]; X- X qflag = 1; X freopen(stdin, "/dev/tty0", "r"); X printf("\nPlease enter date (MMDDYYhhmmss). Then hit RETURN.\n"); X gets(time_buf); X- set_time(time_buf); X- exit(0); X } X! set_time(argv[1]); X! } else { X! time(&t); X! cv_time(t); X! printf("%s %s %d %02d:%02d:%02d %d\n", days[(t / s_p_day) % 7], months[tm.month], tm.day, tm.hour, tm.min, tm.sec, tm.year); X } X exit(0); X } X X--- 36,55 ---- X if (argc == 2) { X if (*argv[1] == '-' && (argv[1][1] | 0x60) == 'q') { X /* Query option. */ X qflag = 1; X freopen(stdin, "/dev/tty0", "r"); X printf("\nPlease enter date (MMDDYYhhmmss). Then hit RETURN.\n"); X gets(time_buf); X } X! if (qflag) X! set_time(time_buf); X! else X! set_time(argv[1]); X } X+ time(&t); X+ cv_time(t); X+ printf("%s %s %d %02d:%02d:%02d %d\n", days[(int) (t / s_p_day) % 7], X+ months[tm.month], tm.day, tm.hour, tm.min, tm.sec, tm.year); X exit(0); X } X X*************** X*** 69,75 **** X t -= s_p_year; X } X if (((tm.year + 2) % 4) == 0) X! days_per_month[1]++; X tm.year += 1970; X while ( t >= (days_per_month[tm.month] * s_p_day)) X t -= days_per_month[tm.month++] * s_p_day; X--- 69,75 ---- X t -= s_p_year; X } X if (((tm.year + 2) % 4) == 0) X! days_per_month[1] = 29; X tm.year += 1970; X while ( t >= (days_per_month[tm.month] * s_p_day)) X t -= days_per_month[tm.month++] * s_p_day; X*************** X*** 120,126 **** X ct = tm.year * s_p_year; X ct += ((tm.year + 1) / 4) * s_p_day; X if (((tm.year + 2) % 4) == 0) X! days_per_month[1]++; X len = 0; X tm.month--; X while (len < tm.month) X--- 120,126 ---- X ct = tm.year * s_p_year; X ct += ((tm.year + 1) / 4) * s_p_day; X if (((tm.year + 2) % 4) == 0) X! days_per_month[1] = 29; X len = 0; X tm.month--; X while (len < tm.month) + END-OF-FILE date.c.cdif chmod 'u=rw,g=r,o=r' 'date.c.cdif' set `wc -c 'date.c.cdif'` count=$1 case $count in 2227) :;; *) echo 'Bad character count in ''date.c.cdif' >&2 echo 'Count should be 2227' >&2 esac echo Extracting 'fgrep.c.cdif' sed 's/^X//' > 'fgrep.c.cdif' << '+ END-OF-FILE ''fgrep.c.cdif' X*** /local/ast/minix/tape3a/commands/fgrep.c Sun May 29 15:13:37 1988 X--- fgrep.c Wed Jul 13 13:10:55 1988 X*************** X*** 272,294 **** X X } /* exhausted buffer or found \n */ X X! if (endline) break; /* don't continue if \n found */ X status=read(infile,mybuf,2048); X! if (status==0) break; X X low=mybuf; X high= &mybuf[status]; X X } X X- if (endline) X- { X- *(p-1)='\0'; X- return (p-buf-1); X- } X- X /* empty line or a bit filled ? */ X *p='\0'; X if (p-buf) return(p-buf); X return(EOF); X X--- 272,298 ---- X X } /* exhausted buffer or found \n */ X X! /* don't continue if \n found */ X! if (endline) X! { X! *(p-1)='\0'; X! return (p-buf-1); X! } X! X status=read(infile,mybuf,2048); X! if (status<=0) break; X X low=mybuf; X high= &mybuf[status]; X X } X X /* empty line or a bit filled ? */ X *p='\0'; X+ if (status<0){ X+ perror("read error"); X+ return(EOF); X+ } X if (p-buf) return(p-buf); X return(EOF); X + END-OF-FILE fgrep.c.cdif chmod 'u=rw,g=r,o=r' 'fgrep.c.cdif' set `wc -c 'fgrep.c.cdif'` count=$1 case $count in 1045) :;; *) echo 'Bad character count in ''fgrep.c.cdif' >&2 echo 'Count should be 1045' >&2 esac echo Extracting 'libupack.c.cdif' sed 's/^X//' > 'libupack.c.cdif' << '+ END-OF-FILE ''libupack.c.cdif' X*** /local/ast/minix/tape3a/commands/libupack.c Mon May 16 15:03:59 1988 X--- libupack.c Wed Jul 13 13:10:58 1988 X*************** X*** 122,140 **** X X #define IBUFSIZE 10000 X #define OBUFSIZE 30000 X X char input[IBUFSIZE+1], output[OBUFSIZE+1]; X X main() X { X! int n, count; X X while (1) { X n = read(0, input,IBUFSIZE); X if (n <= 0) exit(1); X input[n] = 0; X count = unpack88(input, output); X! n = write(1, output, count); X } X } X X--- 122,147 ---- X X #define IBUFSIZE 10000 X #define OBUFSIZE 30000 X+ #define OUTMAX (7*1024) X X char input[IBUFSIZE+1], output[OBUFSIZE+1]; X X main() X { X! int n, count, bytes, cum; X X while (1) { X n = read(0, input,IBUFSIZE); X if (n <= 0) exit(1); X input[n] = 0; X count = unpack88(input, output); X! cum = 0; X! while (count > 0) { X! bytes = (count < OUTMAX ? count : OUTMAX); X! n = write(1, output+cum, bytes); X! count -= bytes; X! cum += bytes; X! } X } X } X + END-OF-FILE libupack.c.cdif chmod 'u=rw,g=r,o=r' 'libupack.c.cdif' set `wc -c 'libupack.c.cdif'` count=$1 case $count in 949) :;; *) echo 'Bad character count in ''libupack.c.cdif' >&2 echo 'Count should be 949' >&2 esac echo Extracting 'login.c.cdif' sed 's/^X//' > 'login.c.cdif' << '+ END-OF-FILE ''login.c.cdif' X*** /local/ast/minix/tape3a/commands/login.c Mon May 16 15:03:59 1988 X--- login.c Wed Jul 13 13:11:00 1988 X*************** X*** 3,27 **** X #include <signal.h> X #include <sgtty.h> X #include <pwd.h> X X! char home[100] = "HOME="; X! char *env[] = { home, 0 }; X X main() X { X! char buf[30], X! buf1[30], X! *crypt(); X! int n, n1, bad; X struct sgttyb args; X struct passwd *pwd, *getpwnam(); X X args.sg_kill = '@'; X args.sg_erase = '\b'; X! args.sg_flags = 06030; X! ioctl (0, TIOCSETP, &args); X X- X /* Get login name and passwd. */ X for (;;) { X bad = 0; X--- 3,41 ---- X #include <signal.h> X #include <sgtty.h> X #include <pwd.h> X+ #include <sys/stat.h> X X! #define NULL (char *) 0 X! #define WTMPSIZE 8 X! #define DIGIT 3 X X+ char user[32]; X+ char home[64]; X+ char ttyname[] = {"tty?"}; X+ char *wtmpfile = "/usr/adm/wtmp"; X+ char *env[] = {user, home, "TERM=minix", (char *)0 }; X+ X main() X { X! char buf[30], buf1[30], *crypt(), *p, *q; X! int n, n1, bad, oldflags, ttynr; X struct sgttyb args; X+ struct stat statbuf; X struct passwd *pwd, *getpwnam(); X X+ /* Look up /dev/tty number. */ X+ fstat(0, &statbuf); X+ ttynr = statbuf.st_rdev & 0377; X+ ttyname[DIGIT] = '0' + ttynr; X+ X+ /* Reset some of the line parameters in case they have been mashed. */ X+ ioctl(0, TIOCGETP, &args); X args.sg_kill = '@'; X args.sg_erase = '\b'; X! oldflags = args.sg_flags & 01700; /* save char len, parity */ X! args.sg_flags = oldflags | XTABS | CRMOD | ECHO; X! ioctl(0, TIOCSETP, &args); X X /* Get login name and passwd. */ X for (;;) { X bad = 0; X*************** X*** 32,65 **** X buf[n - 1] = 0; X X /* Look up login/passwd. */ X! if ((pwd = getpwnam (buf)) == 0) X! bad++; X X if (bad || strlen (pwd->pw_passwd) != 0) { X! args.sg_flags = 06020; X! ioctl (0, TIOCSETP, &args); X write(1,"Password: ",10); X n1 = read (0, buf1, 30); X buf1[n1 - 1] = 0; X write(1,"\n",1); X! args.sg_flags = 06030; X! ioctl (0, TIOCSETP, &args); X! if (bad) crypt(buf1, "*"); /* be as slow */ X! if (bad || strcmp (pwd->pw_passwd, crypt(buf1, pwd->pw_passwd))) { X write (1,"Login incorrect\n",16); X continue; X } X } X X! /* Successful login. */ X setgid (pwd->pw_gid); X setuid (pwd->pw_uid); X chdir (pwd->pw_dir); X! strcpy(pwd->pw_dir, home+5); X! if (pwd->pw_shell) { X! execle(pwd->pw_shell, "-", (char *) 0, env); X! } X! execle("/bin/sh", "-", (char *) 0, env); X! write(1,"exec failure\n",13); X } X } X--- 46,115 ---- X buf[n - 1] = 0; X X /* Look up login/passwd. */ X! if ((pwd = getpwnam (buf)) == 0) bad++; X X+ /* If login name wrong or password exists, ask for pw. */ X if (bad || strlen (pwd->pw_passwd) != 0) { X! args.sg_flags &= ~ECHO; X! ioctl(0, TIOCSETP, &args); X write(1,"Password: ",10); X n1 = read (0, buf1, 30); X buf1[n1 - 1] = 0; X write(1,"\n",1); X! args.sg_flags |= ECHO; X! ioctl(0, TIOCSETP, &args); X! if (bad || strcmp (pwd->pw_passwd, X! crypt(buf1, pwd->pw_passwd))) { X write (1,"Login incorrect\n",16); X continue; X } X } X X! /* Successful login. Set up environment. */ X setgid (pwd->pw_gid); X setuid (pwd->pw_uid); X chdir (pwd->pw_dir); X! strcpy(home, "HOME="); X! strcat(home, pwd->pw_dir); X! strcpy(user, "USER="); X! strcat(user, pwd->pw_name); X! X! /* Reset signals to default values. */ X! for(n = 1; n <= NR_SIGS; ++n) signal(n, SIG_DFL); X! X! /* Creat wmtp entry. */ X! wtmp(ttyname, pwd->pw_name); X! X! /* If shell has been specified, exec it, else use /bin/sh. */ X! if (pwd->pw_shell) X! execle(pwd->pw_shell, "-", NULL, env); X! execle("/bin/sh", "-", NULL, env); X! write(1,"login can't exec shell\n",23); X } X+ } X+ X+ X+ wtmp(tty, name) X+ { X+ /* Make an entry in /usr/adm/wtmp. */ X+ X+ int i, fd; X+ long t, time(); X+ char ttybuff[WTMPSIZE], namebuff[WTMPSIZE]; X+ X+ fd = open(wtmpfile, 2); X+ if (fd < 0) return; /* if wtmp does not exist, no accounting */ X+ lseek(fd, 0L, 2); /* append to file */ X+ X+ for (i = 0; i < WTMPSIZE; i++) { X+ ttybuff[i] = 0; X+ namebuff[i] = 0; X+ } X+ strncpy(ttybuff, tty, 8); X+ strncpy(namebuff, name, 8); X+ time(&t); X+ write(fd, ttybuff, WTMPSIZE); X+ write(fd, namebuff, WTMPSIZE); X+ write(fd, &t, sizeof(t)); X+ close(fd); X } + END-OF-FILE login.c.cdif chmod 'u=rw,g=r,o=r' 'login.c.cdif' set `wc -c 'login.c.cdif'` count=$1 case $count in 4326) :;; *) echo 'Bad character count in ''login.c.cdif' >&2 echo 'Count should be 4326' >&2 esac echo Extracting 'lorder.c.cdif' sed 's/^X//' > 'lorder.c.cdif' << '+ END-OF-FILE ''lorder.c.cdif' X*** /local/ast/minix/tape3a/commands/lorder.c Mon May 16 15:04:00 1988 X--- lorder.c Wed Jul 13 13:11:00 1988 X*************** X*** 18,23 **** X--- 18,25 ---- X * X * change log: X * corrected & rewrote scanner to avoid lex. - 2/22/88 - mrw X+ * oops reversed output filename order. 3/14/88 - mrw X+ * progname = argv[0] - should be first. 5/25/88 - mbeck X */ X X #include <stdio.h> X*************** X*** 30,36 **** X FILE *lexin; X char *yyfile; X char *tmpfile; X! char *progname = "lorder"; X char template[] = "lorder.XXXXXX"; X X struct filelist { X--- 32,38 ---- X FILE *lexin; X char *yyfile; X char *tmpfile; X! char *progname; X char template[] = "lorder.XXXXXX"; X X struct filelist { X*************** X*** 59,66 **** X int i; X char cmdstr[MAXLINE]; X X if (argc > 1) { X- progname = argv[0]; X signal(SIGINT, user_abort); X for (i = 1; argv[i] && *argv[i]; ++i ) { X /* the following code is caused by X--- 61,68 ---- X int i; X char cmdstr[MAXLINE]; X X+ progname = argv[0]; X if (argc > 1) { X signal(SIGINT, user_abort); X for (i = 1; argv[i] && *argv[i]; ++i ) { X /* the following code is caused by X*************** X*** 173,179 **** X if (t->file) { X for (fp = t->list; fp && fp->name; fp = fp->next) X if (t->file != fp->name) X! fprintf(stdout,"%s %s\n",fp->name,t->file); X } X printtree(t->right); X printtree(t->left); X--- 175,181 ---- X if (t->file) { X for (fp = t->list; fp && fp->name; fp = fp->next) X if (t->file != fp->name) X! fprintf(stdout,"%s %s\n",fp->name, t->file); X } X printtree(t->right); X printtree(t->left); X*************** X*** 402,404 **** X--- 404,407 ---- X */ X return (lastch); X } X+ + END-OF-FILE lorder.c.cdif chmod 'u=rw,g=r,o=r' 'lorder.c.cdif' set `wc -c 'lorder.c.cdif'` count=$1 case $count in 1697) :;; *) echo 'Bad character count in ''lorder.c.cdif' >&2 echo 'Count should be 1697' >&2 esac echo Extracting 'ls.c.cdif' sed 's/^X//' > 'ls.c.cdif' << '+ END-OF-FILE ''ls.c.cdif' X*** /local/ast/minix/tape3a/commands/ls.c Mon May 16 15:04:03 1988 X--- ls.c Wed Jul 13 13:11:02 1988 X*************** X*** 531,537 **** X /* At this point, 'year', 'month', 'day', 'hour', 'minute' ok */ X if (curtime == 0) curtime = time( (long*)0); /* approximate current time */ X fprintf(stdout, "%3s %2d ",moname[month], day+1); X! if (curtime - original >= YEAR/2L) { X fprintf(stdout, "%5d ",year); X } else { X if (hour < 10) X--- 531,537 ---- X /* At this point, 'year', 'month', 'day', 'hour', 'minute' ok */ X if (curtime == 0) curtime = time( (long*)0); /* approximate current time */ X fprintf(stdout, "%3s %2d ",moname[month], day+1); X! if (curtime - original >= YEAR/2L || curtime < original) { X fprintf(stdout, "%5d ",year); X } else { X if (hour < 10) + END-OF-FILE ls.c.cdif chmod 'u=rw,g=r,o=r' 'ls.c.cdif' set `wc -c 'ls.c.cdif'` count=$1 case $count in 791) :;; *) echo 'Bad character count in ''ls.c.cdif' >&2 echo 'Count should be 791' >&2 esac echo Extracting 'mknod.c.cdif' sed 's/^X//' > 'mknod.c.cdif' << '+ END-OF-FILE ''mknod.c.cdif' X*** /local/ast/minix/tape3a/commands/mknod.c Mon May 16 15:04:07 1988 X--- mknod.c Wed Jul 13 13:11:07 1988 X*************** X*** 19,38 **** X exit(0); X } X X- int atoi(p) X- char *p; X- { X- /* Ascii to integer conversion. */ X- int c, n; X- X- n = 0; X- while (c = *p++) { X- if (c < '0' || c > '9') return (-1); X- n = 10 * n + (c - '0'); X- } X- return(n); X- } X- X badcomm() X { X std_err("Usage: mknod name b/c major minor\n"); X--- 19,24 ---- + END-OF-FILE mknod.c.cdif chmod 'u=rw,g=r,o=r' 'mknod.c.cdif' set `wc -c 'mknod.c.cdif'` count=$1 case $count in 453) :;; *) echo 'Bad character count in ''mknod.c.cdif' >&2 echo 'Count should be 453' >&2 esac echo Extracting 'pwd.c.cdif' sed 's/^X//' > 'pwd.c.cdif' << '+ END-OF-FILE ''pwd.c.cdif' X*** /local/ast/minix/tape3a/commands/pwd.c Mon May 16 15:04:11 1988 X--- pwd.c Wed Jul 13 13:11:11 1988 X*************** X*** 58,63 **** X--- 58,64 ---- X prints("/"); X else X while (n = last_index(name, '/')) { X+ *(n+14) = 0; X prints(n); X *n = 0; X } + END-OF-FILE pwd.c.cdif chmod 'u=rw,g=r,o=r' 'pwd.c.cdif' set `wc -c 'pwd.c.cdif'` count=$1 case $count in 267) :;; *) echo 'Bad character count in ''pwd.c.cdif' >&2 echo 'Count should be 267' >&2 esac echo Extracting 'shar.c.cdif' sed 's/^X//' > 'shar.c.cdif' << '+ END-OF-FILE ''shar.c.cdif' X*** /local/ast/minix/tape3a/commands/shar.c Mon May 16 15:04:20 1988 X--- shar.c Wed Jul 13 13:11:15 1988 X*************** X*** 1,13 **** X /* shar - make a shell archive Author: Michiel Husijes */ X X! X #include <minix/blocksize.h> X X #define IO_SIZE (10 * BLOCK_SIZE) X X char input[IO_SIZE]; X char output[IO_SIZE]; X! int index = 0; X X main(argc, argv) X int argc; X--- 1,13 ---- X /* shar - make a shell archive Author: Michiel Husijes */ X X! #include <stdio.h> X #include <minix/blocksize.h> X X #define IO_SIZE (10 * BLOCK_SIZE) X X char input[IO_SIZE]; X char output[IO_SIZE]; X! int ind = 0; X X main(argc, argv) X int argc; X*************** X*** 25,37 **** X else { X print("echo x - "); X print(argv[i]); X! print("\ngres '^X' '' > "); X print(argv[i]); X print(" << '/'\n"); X cat(fd); X } X } X! if (index) write(1, output, index); X exit(0); X } X X--- 25,37 ---- X else { X print("echo x - "); X print(argv[i]); X! print("\nsed '/^X/s///' > "); X print(argv[i]); X print(" << '/'\n"); X cat(fd); X } X } X! if (ind) write(1, output, ind); X exit(0); X } X X*************** X*** 64,77 **** X { X while (*str) X putchar(*str++); X- } X- X- putchar(c) X- register char c; X- { X- output[index++] = c; X- if (index == IO_SIZE) { X- write(1, output, index); X- index = 0; X- } X } X--- 64,67 ---- + END-OF-FILE shar.c.cdif chmod 'u=rw,g=r,o=r' 'shar.c.cdif' set `wc -c 'shar.c.cdif'` count=$1 case $count in 1388) :;; *) echo 'Bad character count in ''shar.c.cdif' >&2 echo 'Count should be 1388' >&2 esac echo Extracting 'stty.c.cdif' sed 's/^X//' > 'stty.c.cdif' << '+ END-OF-FILE ''stty.c.cdif' X*** /local/ast/minix/tape3a/commands/stty.c Mon Jun 27 22:58:11 1988 X--- stty.c Wed Jul 13 13:11:18 1988 X*************** X*** 13,18 **** X--- 13,20 ---- X #define QUITC 034 /* CTRL-\ */ X #define EOFC 004 /* CTRL-D */ X #define DELC 0177 /* DEL */ X+ #define BYTE 0377 X+ #define FD 0 /* which file descriptor to use */ X X #define speed(s) args.sg_ispeed = s; args.sg_ospeed = s X #define clr1 args.sg_flags &= ~(BITS5 | BITS6 | BITS7 | BITS8) X*************** X*** 24,31 **** X { X X /* stty with no arguments just reports on current status. */ X! ioctl(0, TIOCGETP, &args); X! ioctl(0, TIOCGETC, &tch); X if (argc == 1) { X report(); X exit(0); X--- 26,33 ---- X { X X /* stty with no arguments just reports on current status. */ X! ioctl(FD, TIOCGETP, &args); X! ioctl(FD, TIOCGETC, &tch); X if (argc == 1) { X report(); X exit(0); X*************** X*** 37,44 **** X option(argv[k], k+1 < argc ? argv[k+1] : ""); X k++; X } X! ioctl(0, TIOCSETP, &args); X! ioctl(0, TIOCSETC, &tch); X exit(0); X } X X--- 39,46 ---- X option(argv[k], k+1 < argc ? argv[k+1] : ""); X k++; X } X! ioctl(FD, TIOCSETP, &args); X! ioctl(FD, TIOCSETC, &tch); X exit(0); X } X X*************** X*** 46,64 **** X X report() X { X! int mode; X X- X mode = args.sg_flags; X pr(mode&XTABS, 0); X pr(mode&CBREAK, 1); X pr(mode&RAW, 2); X pr(mode&CRMOD,3); X pr(mode&ECHO,4); X prints("\nkill = "); prctl(args.sg_kill); X prints("\nerase = "); prctl(args.sg_erase); X prints("\nint = "); prctl(tch.t_intrc); X prints("\nquit = "); prctl(tch.t_quitc); X prints("\n"); X } X X--- 48,80 ---- X X report() X { X! int mode, ispeed, ospeed; X X mode = args.sg_flags; X pr(mode&XTABS, 0); X pr(mode&CBREAK, 1); X pr(mode&RAW, 2); X pr(mode&CRMOD,3); X pr(mode&ECHO,4); X+ X+ ispeed = 100 * ((int) args.sg_ispeed & BYTE); X+ ospeed = 100 * ((int) args.sg_ospeed & BYTE); X prints("\nkill = "); prctl(args.sg_kill); X prints("\nerase = "); prctl(args.sg_erase); X prints("\nint = "); prctl(tch.t_intrc); X prints("\nquit = "); prctl(tch.t_quitc); X+ if (ispeed > 0) { X+ prints("\nspeed = "); X+ switch(ispeed) { X+ case 100: prints("110"); break; X+ case 300: prints("300"); break; X+ case 1200: prints("1200"); break; X+ case 2400: prints("2400"); break; X+ case 4800: prints("4800"); break; X+ case 9600: prints("9600"); break; X+ default: prints("unknown"); X+ } X+ } X prints("\n"); X } X + END-OF-FILE stty.c.cdif chmod 'u=rw,g=r,o=r' 'stty.c.cdif' set `wc -c 'stty.c.cdif'` count=$1 case $count in 2474) :;; *) echo 'Bad character count in ''stty.c.cdif' >&2 echo 'Count should be 2474' >&2 esac echo Extracting 'su.c.cdif' sed 's/^X//' > 'su.c.cdif' << '+ END-OF-FILE ''su.c.cdif' X*** /local/ast/minix/tape3a/commands/su.c Mon May 16 15:04:23 1988 X--- su.c Wed Jul 13 13:11:20 1988 X*************** X*** 48,54 **** X setuid (pwd->pw_uid); X if (pwd->pw_shell[0]) X shell = pwd->pw_shell; X! execl (shell, 0); X std_err("No shell\n"); X exit (3); X } X--- 48,54 ---- X setuid (pwd->pw_uid); X if (pwd->pw_shell[0]) X shell = pwd->pw_shell; X! execl (shell, "-i", 0); X std_err("No shell\n"); X exit (3); X } + END-OF-FILE su.c.cdif chmod 'u=rw,g=r,o=r' 'su.c.cdif' set `wc -c 'su.c.cdif'` count=$1 case $count in 435) :;; *) echo 'Bad character count in ''su.c.cdif' >&2 echo 'Count should be 435' >&2 esac echo Extracting 'sum.c.cdif' sed 's/^X//' > 'sum.c.cdif' << '+ END-OF-FILE ''sum.c.cdif' X*** /local/ast/minix/tape3a/commands/sum.c Mon May 16 15:04:24 1988 X--- sum.c Wed Jul 13 13:11:20 1988 X*************** X*** 21,27 **** X int argc; X char *argv[]; X { X! int fd; X X if (*++argv == 0) X argv = defargv; X--- 21,27 ---- X int argc; X char *argv[]; X { X! register int fd; X X if (*++argv == 0) X argv = defargv; X*************** X*** 58,64 **** X char *fname; X { X char buf[BUFSIZ]; X! int i,n; X long size = 0; X unsigned crc = 0; X unsigned tmp, blks; X--- 58,64 ---- X char *fname; X { X char buf[BUFSIZ]; X! register int i,n; X long size = 0; X unsigned crc = 0; X unsigned tmp, blks; + END-OF-FILE sum.c.cdif chmod 'u=rw,g=r,o=r' 'sum.c.cdif' set `wc -c 'sum.c.cdif'` count=$1 case $count in 627) :;; *) echo 'Bad character count in ''sum.c.cdif' >&2 echo 'Count should be 627' >&2 esac echo Extracting 'tar.c.cdif' sed 's/^X//' > 'tar.c.cdif' << '+ END-OF-FILE ''tar.c.cdif' X*** /local/ast/minix/tape3a/commands/tar.c Mon May 16 15:04:25 1988 X--- tar.c Wed Jul 13 13:11:21 1988 X*************** X*** 1,6 **** X /* tar - tape archiver Author: Michiel Huisjes */ X X! /* Usage: tar [cxt][v] tapefile [files] X * X * Bugs: X * This tape archiver should only be used as a program to read or make X--- 1,6 ---- X /* tar - tape archiver Author: Michiel Huisjes */ X X! /* Usage: tar [cxt] tapefile [files] X * X * Bugs: X * This tape archiver should only be used as a program to read or make X*************** X*** 57,62 **** X--- 57,63 ---- X char io_buffer[BLOCK_SIZE]; X char path[NAME_SIZE]; X char pathname[NAME_SIZE]; X+ extern printf(); X X int total_blocks; X long convert(); X*************** X*** 101,107 **** X if (creat_fl + ext_fl + show_fl != 1) X error(usage, NIL_PTR); X X! tar_fd = creat_fl ? creat(argv[2], 0644) : open(argv[2], 0); X X if (tar_fd < 0) X error("Cannot open ", argv[2]); X--- 102,112 ---- X if (creat_fl + ext_fl + show_fl != 1) X error(usage, NIL_PTR); X X! if (strcmp(argv[2], "-") != 0) { X! tar_fd = creat_fl ? creat(argv[2], 0644) : open(argv[2], 0); X! } else { X! tar_fd = (creat_fl ? 1 : 0); X! } X X if (tar_fd < 0) X error("Cannot open ", argv[2]); X*************** X*** 424,430 **** X static int index = 0; X X if (str == NIL_PTR) { X! write(1, output, index); X index = 0; X return; X } X--- 429,435 ---- X static int index = 0; X X if (str == NIL_PTR) { X! write(2, output, index); X index = 0; X return; X } X*************** X*** 432,438 **** X while (*str) { X output[index++] = *str++; X if (index == BLOCK_SIZE) { X! write(1, output, BLOCK_SIZE); X index = 0; X } X } X--- 437,443 ---- X while (*str) { X output[index++] = *str++; X if (index == BLOCK_SIZE) { X! write(2, output, BLOCK_SIZE); X index = 0; X } X } + END-OF-FILE tar.c.cdif chmod 'u=rw,g=r,o=r' 'tar.c.cdif' set `wc -c 'tar.c.cdif'` count=$1 case $count in 1841) :;; *) echo 'Bad character count in ''tar.c.cdif' >&2 echo 'Count should be 1841' >&2 esac echo Extracting 'term.c' sed 's/^X//' > 'term.c' << '+ END-OF-FILE ''term.c' X/* term - terminal simulator Author: Andy Tanenbaum */ X X/* This program allows the user to turn a MINIX system into a dumb X * terminal to communicate with a remote computer over a modem. It X * forks into two processes. The parent sits in a tight loop copying X * from the keyboard to the modem. The child sits in a tight loop X * copying from the modem to the screen. X * X * Example usage: X * term : 1200 baud, 8 bits/char, no parity X * term 9600 7 even : 9600 baud, 7 bits/char, even parity X * term odd 300 7 : 300 baud, 7 bits/char, odd parity X */ X X#include <signal.h> X#include <sgtty.h> X X#define MAXARGS 3 /* maximum number of uart params */ X#define NCHECKS 10 X#define BAD -1 X#define GOOD 1 X#define DEF_SPEED B1200 /* default baudrate */ X#define DEF_BITS BITS8 /* default bits/char */ X#define MODEM "/dev/tty1" /* special file attached to the modem */ X#define ESC 033 /* character to hit to leave simulator */ X#define LIMIT 3 /* how often do you have to hit ESC to exit*/ X Xint modem, pid; /* file descriptor for modem */ Xchar *pat[NCHECKS] = X {"5", "6", "7", "8", "110", "300", "1200", "2400", "4800", "9600"}; X Xint value[NCHECKS] = X {BITS5, BITS6, BITS7, BITS8, B110, B300, B1200, B2400, B4800, B9600}; X Xint hold[MAXARGS]; Xstruct sgttyb sgtty, sgsave1, sgsave2; X Xmain(argc, argv) Xint argc; Xchar *argv[]; X{ X X sync(); X modem = open(MODEM, 2); X if (modem < 0) { X printf("Can't open modem on %s\n", MODEM); X exit(1); X } X set_uart(argc, argv); X X /* Main body of the terminal simulator. */ X if ( (pid = fork())) X copy(0, modem, ESC); /* copy from stdin to modem */ X else X copy(modem, 1, -1); /* copy from modem to stdout */ X} X Xset_uart(argc, argv) Xint argc; Xchar *argv[]; X{ X/* Set up the UART parameters. */ X X int i, k, v, nspeeds = 0, speed, nbits = 0, bits, parity = 0; X X if (argc > MAXARGS + 1) X error("Usage: term [baudrate] [data_bits] [parity]\n"); X X /* Examine all the parameters and check for validity. */ X speed = DEF_SPEED; /* default line speed */ X bits = DEF_BITS; /* default bits/char */ X for (i = 1; i < argc; i++) { X if (strcmp(argv[i], "even") == 0) {parity = ODDP; continue;} X if (strcmp(argv[i], "odd") == 0) {parity = EVENP; continue;} X v = validity(argv[i]); X if (v == BAD) { X printf("Invalid parameter: %s\n", argv[i]); X exit(1); X } X k = atoi(argv[i]); X if (k > 100) { X speed = value[v]; X nspeeds++; X } X if ( k < 10) { X bits = value[v]; X nbits++; X } X if (nspeeds > 1) error("Too many speeds\n"); X if (nbits > 1) error("Too many character sizes\n"); X X } X X /* Fetch the modem parameters, save them, and set new ones. */ X ioctl(modem, TIOCGETP, &sgtty); X sgsave1 = sgtty; /* modem parameters */ X sgtty.sg_ispeed = speed; X sgtty.sg_ospeed = speed; X sgtty.sg_flags = RAW | parity | bits; X ioctl(modem, TIOCSETP, &sgtty); X X /* Fetch the keyboard parameters, save them, and set new ones. */ X ioctl(0, TIOCGETP, &sgtty); X sgsave2 = sgtty; /* modem parameters */ X sgtty.sg_flags = RAW; X ioctl(0, TIOCSETP, &sgtty); X} X X Xint validity(s) Xchar *s; X{ X/* Check parameter for legality. */ X X int i; X X for (i = 0; i < NCHECKS; i++) { X if (strcmp(s, pat[i]) == 0) return(i); X } X return(BAD); X} X X Xcopy(in, out, end) Xint in, out, end; X{ X/* Copy from the keyboard to the modem or vice versa. If the end character X * is seen LIMIT times in a row, quit. For the traffic from the modem, the X * end character is -1, which cannot occur since the characters from the X * modem are unsigned integers in the range 0 to 255. X */ X X int t, state = 0; X char c; X X while (1) { X if (read(in, &c, 1) != 1) { X printf("Can't read from modem\r\n"); X quit(); X } X t = c & 0377; /* note: t is unsigned int 0 - 255 */ X if (t == end) { X state++; X if (state == LIMIT) quit(); X } else { X state = 0; X } X write(out, &c, 1); X } X} X X Xerror(s) Xchar *s; X{ X printf("%s", s); X exit(1); X} X Xquit() X{ X ioctl(modem, TIOCSETP, &sgsave1); X ioctl(0, TIOCSETP, &sgsave2); X if (getpid() != pid) kill(pid, SIGINT); X exit(0); X} + END-OF-FILE term.c chmod 'u=rw,g=r,o=r' 'term.c' set `wc -c 'term.c'` count=$1 case $count in 3959) :;; *) echo 'Bad character count in ''term.c' >&2 echo 'Count should be 3959' >&2 esac echo Extracting 'uudecode.c.cdif' sed 's/^X//' > 'uudecode.c.cdif' << '+ END-OF-FILE ''uudecode.c.cdif' X*** /local/ast/minix/tape3a/commands/uudecode.c Mon May 16 15:04:29 1988 X--- uudecode.c Wed Jul 13 13:11:25 1988 X*************** X*** 185,204 **** X } X return (cnt); X } X- X- /* X- * Return the ptr in sp at which the character c appears; X- * NULL if not found X- */ X- X- X- char * X- index(sp, c) X- register char *sp, c; X- { X- do { X- if (*sp == c) X- return(sp); X- } while (*sp++); X- return(NULL); X- } X--- 185,187 ---- + END-OF-FILE uudecode.c.cdif chmod 'u=rw,g=r,o=r' 'uudecode.c.cdif' set `wc -c 'uudecode.c.cdif'` count=$1 case $count in 428) :;; *) echo 'Bad character count in ''uudecode.c.cdif' >&2 echo 'Count should be 428' >&2 esac exit 0