ast@cs.vu.nl (Andy Tanenbaum) (01/23/89)
: 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 'cc.c.cdif'
sed 's/^X//' > 'cc.c.cdif' << '+ END-OF-FILE ''cc.c.cdif'
X*** /local/ast/minix/tape3/commands/cc.c Sun Sep 25 15:24:45 1988
X--- cc.c Fri Jan 20 11:54:29 1989
X***************
X*** 161,169 ****
X
X ProgCall = *argv++;
X
X! signal(SIGHUP, trapcc);
X! signal(SIGINT, trapcc);
X! signal(SIGQUIT, trapcc);
X while (--argc > 0) {
X if (*(str = *argv++) != '-') {
X append(&SRCFILES, str);
X--- 161,169 ----
X
X ProgCall = *argv++;
X
X! if (signal(SIGHUP, SIG_IGN) != SIG_IGN) signal(SIGHUP, trapcc);
X! if (signal(SIGINT, SIG_IGN) != SIG_IGN) signal(SIGINT, trapcc);
X! if (signal(SIGQUIT, SIG_IGN) != SIG_IGN) signal(SIGQUIT, trapcc);
X while (--argc > 0) {
X if (*(str = *argv++) != '-') {
X append(&SRCFILES, str);
+ END-OF-FILE cc.c.cdif
chmod 'u=rw,g=r,o=r' 'cc.c.cdif'
set `wc -c 'cc.c.cdif'`
count=$1
case $count in
669) :;;
*) echo 'Bad character count in ''cc.c.cdif' >&2
echo 'Count should be 669' >&2
esac
echo Extracting 'crc.c.cdif'
sed 's/^X//' > 'crc.c.cdif' << '+ END-OF-FILE ''crc.c.cdif'
X*** /local/ast/minix/tape3/commands/crc.c Wed Sep 28 11:16:52 1988
X--- crc.c Fri Jan 20 11:54:33 1989
X***************
X*** 1,22 ****
X /* crc - list length and checksum Author: Johan W. Stevenson */
X
X-
X #include <stdio.h>
X
X int errs;
X
X main(argc,argv)
X char **argv;
X {
X
X if (argc <= 1)
X! crc((char *)0);
X else
X do {
X! if (freopen(argv[1], "r", stdin) == NULL)
X! error("cannot open %s", argv[1]);
X! else
X! crc(argv[1]);
X argv++;
X argc--;
X } while (argc > 1);
X--- 1,25 ----
X /* crc - list length and checksum Author: Johan W. Stevenson */
X
X #include <stdio.h>
X+ #include <string.h>
X
X int errs;
X+ char line[256];
X
X main(argc,argv)
X char **argv;
X {
X
X if (argc <= 1)
X! while (fgets(line, sizeof line, stdin) != NULL)
X! {
X! if (index(line, '\n') != NULL)
X! *index(line, '\n') = 0;
X! crc(line);
X! }
X else
X do {
X! crc(argv[1]);
X argv++;
X argc--;
X } while (argc > 1);
X***************
X*** 76,102 ****
X crc(fname)
X char *fname;
X {
X register int c;
X- register int i;
X register long len = 0;
X register unsigned short crc = 0;
X
X! while ((c = getc(stdin)) != EOF) {
X len++;
X crc = updcrc(c, crc);
X }
X! printf("%05u %6ld", crc, len, fname);
X! if (fname)
X! printf(" %s", fname);
X! printf("\n");
X! }
X!
X! error(s, a1, a2, a3, a4)
X! char *s;
X! {
X!
X! fprintf(stderr, "crc: ");
X! fprintf(stderr, s, a1, a2, a3, a4);
X! fprintf(stderr, "\n");
X! errs++;
X }
X--- 79,97 ----
X crc(fname)
X char *fname;
X {
X+ register FILE *fp;
X register int c;
X register long len = 0;
X register unsigned short crc = 0;
X
X! if ((fp = fopen(fname, "r")) == NULL) {
X! fprintf(stderr, "crc: cannot open %s\n", fname);
X! errs++;
X! }
X! while ((c = getc(fp)) != EOF) {
X len++;
X crc = updcrc(c, crc);
X }
X! fclose(fp);
X! printf("%05u %6ld %s\n", crc, len, fname);
X }
+ END-OF-FILE crc.c.cdif
chmod 'u=rw,g=r,o=r' 'crc.c.cdif'
set `wc -c 'crc.c.cdif'`
count=$1
case $count in
1881) :;;
*) echo 'Bad character count in ''crc.c.cdif' >&2
echo 'Count should be 1881' >&2
esac
echo Extracting 'df.c.cdif'
sed 's/^X//' > 'df.c.cdif' << '+ END-OF-FILE ''df.c.cdif'
X*** /local/ast/minix/tape3/commands/df.c Sun Sep 25 15:24:55 1988
X--- df.c Fri Jan 20 11:54:34 1989
X***************
X*** 177,191 ****
X getname(p)
X char *p;
X {
X! char c;
X! char ch;
X
X while (1) {
X! ch = getchar();
X! if (ch == EOF) exit(0);
X! c = (char) ch;
X if (c == ' ') c = 0;
X! *p++ = c;
X if (c == '\n') return;
X }
X }
X--- 177,189 ----
X getname(p)
X char *p;
X {
X! int c;
X
X while (1) {
X! c = getchar();
X! if (c == EOF) exit(0);
X if (c == ' ') c = 0;
X! *p++ = (char)c;
X if (c == '\n') return;
X }
X }
+ END-OF-FILE df.c.cdif
chmod 'u=rw,g=r,o=r' 'df.c.cdif'
set `wc -c 'df.c.cdif'`
count=$1
case $count in
540) :;;
*) echo 'Bad character count in ''df.c.cdif' >&2
echo 'Count should be 540' >&2
esac
echo Extracting 'dosread.c.cdif'
sed 's/^X//' > 'dosread.c.cdif' << '+ END-OF-FILE ''dosread.c.cdif'
X*** /local/ast/minix/tape3/commands/dosread.c Sun Sep 25 15:24:56 1988
X--- dosread.c Fri Jan 20 11:54:35 1989
X***************
X*** 25,30 ****
X--- 25,38 ----
X * properly then all the rest should be okay.
X * If there are any problems there is debugging information
X * in fdinit() -- please let me know of any problems
X+ *
X+ * Modified by Al Crew January 5, 1989
X+ * allow 720K (and when the kernel does 1.44M) diskettes
X+ * (for 1.44M the size of /dev/at[01] will have to
X+ * be changed or a new device name added)
X+ * adjusted MAX_FAT_SIZE and MAX_CLUSTER_SIZE to better
X+ * match my fixed disk (you may want to change them)
X+ * fixed bug in read_cluster (sbrk failures were not reported)
X */
X
X #include <sys/stat.h>
X***************
X*** 37,44 ****
X #define DDHD 0xF9
X #define DDFD 0xF8
X
X! #define MAX_CLUSTER_SIZE 4096
X! #define MAX_FAT_SIZE 23552 /* 46 sectoren */
X #define HMASK 0xFF00
X #define LMASK 0x00FF
X
X--- 45,52 ----
X #define DDHD 0xF9
X #define DDFD 0xF8
X
X! #define MAX_CLUSTER_SIZE 2048
X! #define MAX_FAT_SIZE 25600 /* 50 sectoren */
X #define HMASK 0xFF00
X #define LMASK 0x00FF
X
X***************
X*** 199,237 ****
X exit(1);
X }
X
X! if (fdisk) { /* fixed disk */
X! fdinit(dev_nr);
X! disk_read(f_start, &fat_type, sizeof(fat_type));
X! if (fat_type != DDFD) {
X! print_string(TRUE, "Fixed disk is not DOS\n");
X! leave(1);
X! }
X! }
X! else { /* use standard start for floppies */
X! f_start = FAT_START;
X! disk_read(f_start, &fat_type, sizeof(fat_type));
X! if (fat_type == DDDD) { /* Double-sided double-density 9 s/t */
X! total_clusters = 355; /* 720 - 7 - 2 - 2 - 1 */
X! cluster_size = 1024; /* 2 sectors per cluster */
X! fat_size = 1024; /* 2 sectors */
X! data_start = 6144L; /* Starts on sector #12 */
X! root_entries = 112;
X! sub_entries = 32; /* 1024 / 32 */
X! }
X! else if (fat_type == DDHD) { /* Double-sided high-density 15 s/t */
X! total_clusters = 2372; /* 2400 - 14 - 7 - 7 - 1 */
X! cluster_size = 512; /* 1 sector per cluster */
X! fat_size = 3584; /* 7 sectors */
X! data_start = 14848L; /* Starts on sector #29 */
X! root_entries = 224;
X! sub_entries = 16; /* 512 / 32 */
X! }
X! else {
X! print_string(TRUE, "Diskette is not DOS 2.0 360K or 1.2M\n");
X! leave(1);
X! }
X! }
X!
X disk_read(f_start + (long) fat_size, &fat_check, sizeof(fat_check));
X if (fat_check != fat_type) {
X print_string(TRUE, "Disk type in FAT copy differs from disk type in FAT original.\n");
X--- 207,214 ----
X exit(1);
X }
X
X! fdinit(dev_nr);
X! disk_read(f_start, &fat_type, sizeof(fat_type));
X disk_read(f_start + (long) fat_size, &fat_check, sizeof(fat_check));
X if (fat_check != fat_type) {
X print_string(TRUE, "Disk type in FAT copy differs from disk type in FAT original.\n");
X***************
X*** 328,334 ****
X leave(0);
X }
X
X! fdinit(part_nr) /* Fixed Disk Initializations */
X char part_nr;
X {
X
X--- 305,311 ----
X leave(0);
X }
X
X! fdinit(part_nr) /* Initializations */
X char part_nr;
X {
X
X***************
X*** 379,384 ****
X--- 356,365 ----
X pe = (struct part_entry *)&secbuf[TABLEOFFSET];
X /* get the proper partition */
X switch(part_nr) {
X+ case '0':
X+ case 'a':
X+ case '1':
X+ case 'b': boot_loc=0; break;
X case 'f': pe++;
X case 'e': pe++;
X case 'd': pe++;
X***************
X*** 412,418 ****
X (boot.hidden_sectors[1] << 8 & HMASK) + (boot.hidden_sectors[0] & LMASK));
X leave(1);
X /**************/
X! if (boot.media_type != DDFD) {
X printf("DISK is not DOS Format.\n");
X leave(1);
X }
X--- 393,400 ----
X (boot.hidden_sectors[1] << 8 & HMASK) + (boot.hidden_sectors[0] & LMASK));
X leave(1);
X /**************/
X! if (((boot.media_type & 0xf0) != 0xf0)
X! || (boot.jump[0] != 0xeb) || (boot.jump[2] != 0x90) ) {
X printf("DISK is not DOS Format.\n");
X leave(1);
X }
X***************
X*** 1050,1056 ****
X register DIRECTORY *sub_dir;
X extern char *sbrk();
X
X! if ((sub_dir = (DIRECTORY *) sbrk(cluster_size)) < 0) {
X print_string(TRUE, "Cannot set break!\n");
X leave(1);
X }
X--- 1032,1039 ----
X register DIRECTORY *sub_dir;
X extern char *sbrk();
X
X! if ((sub_dir = (DIRECTORY *) sbrk(cluster_size))
X! == ((DIRECTORY *)-1)) {
X print_string(TRUE, "Cannot set break!\n");
X leave(1);
X }
+ END-OF-FILE dosread.c.cdif
chmod 'u=rw,g=r,o=r' 'dosread.c.cdif'
set `wc -c 'dosread.c.cdif'`
count=$1
case $count in
4357) :;;
*) echo 'Bad character count in ''dosread.c.cdif' >&2
echo 'Count should be 4357' >&2
esac
echo Extracting 'fdisk.c.cdif'
sed 's/^X//' > 'fdisk.c.cdif' << '+ END-OF-FILE ''fdisk.c.cdif'
X*** /local/ast/minix/tape3/commands/fdisk.c Sun Sep 25 15:24:59 1988
X--- fdisk.c Sun Jan 22 12:32:17 1989
X***************
X*** 5,12 ****
X * puts the boot code in sector 0.
X * Then run fdisk
X *
X! * fdisk /dev/hdx (MINIX)
X! * fdisk x: (DOS)
X *
X * Compiling
X *
X--- 5,11 ----
X * puts the boot code in sector 0.
X * Then run fdisk
X *
X! * fdisk [-heads] [/dev/hdx] (MINIX)
X *
X * Compiling
X *
X***************
X*** 55,61 ****
X--- 54,63 ----
X char secbuf[SECSIZE];
X char *devname;
X char *dosstr = " DOS ";
X+ char *dosstr4 = " DOS 4";
X char *ndosstr = "Non-DOS";
X+ char *xenstr = " Xenix ";
X+ int heads;
X
X #ifdef DOS
X union REGS regs;
X***************
X*** 75,86 ****
X
X /* init */
X
X! if (argc != 2) {
X! printf("Usage: fdisk /dev/hdx\n");
X exit(1);
X }
X
X! devname = argv[1];
X getboot(secbuf); /* get boot sector */
X
X do {
X--- 77,98 ----
X
X /* init */
X
X! if ( argc > 1 && (*++argv)[0] == '-') /*flag*/
X! {heads = atoi( & (*argv)[1]);
X! printf("heads: %d ", heads);
X! argv++;
X! argc--;
X! }
X! else heads = NHEAD;
X!
X! if (argc > 2) {
X! printf("Usage: fdisk [-heads] [/dev/hdx]\n");
X exit(1);
X }
X
X! if ( argc == 1)
X! devname = "/dev/hd0";
X! else devname = *argv;
X getboot(secbuf); /* get boot sector */
X
X do {
X***************
X*** 339,346 ****
X
X if (entry->sysind == 0x01)
X typestring = dosstr;
X! else
X! typestring = ndosstr;
X printf("%5d %s ",number,typestring);
X temp = entry->start_sec & 0xc0;
X low_cyl = (entry->start_cyl & 0xff) + (temp << 2);
X--- 351,362 ----
X
X if (entry->sysind == 0x01)
X typestring = dosstr;
X! else if (entry->sysind == 0x02)
X! typestring = xenstr;
X! else if (entry->sysind == 0x04)
X! typestring = dosstr4;
X! else
X! typestring = ndosstr;
X printf("%5d %s ",number,typestring);
X temp = entry->start_sec & 0xc0;
X low_cyl = (entry->start_cyl & 0xff) + (temp << 2);
X***************
X*** 423,432 ****
X {
X int bigcyl;
X
X! bigcyl = logsec / (NHEAD * NSEC);
X *sec = (logsec % NSEC) + 1 + ((bigcyl >> 2) & 0xc0);
X *cyl = bigcyl & 0xff;
X! *hd = (logsec % (NHEAD * NSEC)) / NSEC;
X }
X
X /*
X--- 439,448 ----
X {
X int bigcyl;
X
X! bigcyl = logsec / (heads * NSEC);
X *sec = (logsec % NSEC) + 1 + ((bigcyl >> 2) & 0xc0);
X *cyl = bigcyl & 0xff;
X! *hd = (logsec % (heads * NSEC)) / NSEC;
X }
X
X /*
X***************
X*** 487,497 ****
X return;
X }
X low = first & 0xffff;
X! low = low * NSEC * NHEAD;
X if (low == 0)
X low = 1; /* sec0 is master boot record */
X high = last & 0xffff;
X! high = (high + 1)*NSEC*NHEAD - 1;
X entry->lowsec = low;
X entry->size = high - low + 1;
X sec_to_hst(low,
X--- 503,513 ----
X return;
X }
X low = first & 0xffff;
X! low = low * NSEC * heads;
X if (low == 0)
X low = 1; /* sec0 is master boot record */
X high = last & 0xffff;
X! high = (high + 1)*NSEC*heads - 1;
X entry->lowsec = low;
X entry->size = high - low + 1;
X sec_to_hst(low,
+ END-OF-FILE fdisk.c.cdif
chmod 'u=rw,g=r,o=r' 'fdisk.c.cdif'
set `wc -c 'fdisk.c.cdif'`
count=$1
case $count in
2961) :;;
*) echo 'Bad character count in ''fdisk.c.cdif' >&2
echo 'Count should be 2961' >&2
esac
echo Extracting 'lorder.c.cdif'
sed 's/^X//' > 'lorder.c.cdif' << '+ END-OF-FILE ''lorder.c.cdif'
X*** /local/ast/minix/tape3/commands/lorder.c Sun Sep 25 15:25:04 1988
X--- lorder.c Fri Jan 20 11:54:41 1989
X***************
X*** 237,243 ****
X
X if (n = finddef(s)) {
X if (n->file != NULL)
X! fprintf(stderr,"Error %s - %s defined twice in %s and %s", progname, s, n->file, yyfile);
X else
X n->file = yyfile;
X }
X--- 237,245 ----
X
X if (n = finddef(s)) {
X if (n->file != NULL)
X! fprintf(stderr,
X! "Error %s - %s defined twice in %s and %s\n",
X! progname, s, n->file, yyfile);
X else
X n->file = yyfile;
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
546) :;;
*) echo 'Bad character count in ''lorder.c.cdif' >&2
echo 'Count should be 546' >&2
esac
echo Extracting 'ls.c.cdif'
sed 's/^X//' > 'ls.c.cdif' << '+ END-OF-FILE ''ls.c.cdif'
X*** /local/ast/minix/tape3/commands/ls.c Sun Sep 25 15:25:05 1988
X--- ls.c Fri Jan 20 11:54:42 1989
X***************
X*** 402,408 ****
X }
X buf = getuidgid(xid);
X if (buf != 0)
X! fprintf(stdout, "%6s ",buf);
X else
X fprintf(stdout, "%6d ",xid);
X }
X--- 402,409 ----
X }
X buf = getuidgid(xid);
X if (buf != 0)
X! /* Assuming the number 8 is not a good idea. */
X! fprintf(stdout, "%-8.8s ",buf);
X else
X fprintf(stdout, "%6d ",xid);
X }
+ 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
458) :;;
*) echo 'Bad character count in ''ls.c.cdif' >&2
echo 'Count should be 458' >&2
esac
echo Extracting 'pr.c.cdif'
sed 's/^X//' > 'pr.c.cdif' << '+ END-OF-FILE ''pr.c.cdif'
X*** /local/ast/minix/tape3/commands/pr.c Sun Sep 25 15:25:10 1988
X--- pr.c Fri Jan 20 12:18:36 1989
X***************
X*** 86,91 ****
X--- 86,92 ----
X FILE *file;
X char *ptr;
X int index = 1; /* index is one ahead of argc */
X+ int line, col;
X
X setbuf(stdout, output);
X do {
X***************
X*** 146,151 ****
X--- 147,153 ----
X }
X continue; /* Scan for next flags */
X
X+
X /* ============== flags are read. Print the file(s) ========= */
X
X pr_files:
X***************
X*** 153,158 ****
X--- 155,163 ----
X if (!no_header)
X length -= 10;
X
X+ for(line=0; line < length; line++)
X+ for(col=0; col < columns; col++)
X+ L_BUF(line, col) = NIL_PTR;
X if (length <= 0 ) {
X fprintf(stderr,"Minimal length shuold be %d\n",no_header ?
X 1: 11);
+ END-OF-FILE pr.c.cdif
chmod 'u=rw,g=r,o=r' 'pr.c.cdif'
set `wc -c 'pr.c.cdif'`
count=$1
case $count in
781) :;;
*) echo 'Bad character count in ''pr.c.cdif' >&2
echo 'Count should be 781' >&2
esac
echo Extracting 'tar.c.cdif'
sed 's/^X//' > 'tar.c.cdif' << '+ END-OF-FILE ''tar.c.cdif'
X*** /local/ast/minix/tape3/commands/tar.c Mon Sep 26 15:01:28 1988
X--- tar.c Fri Jan 20 12:18:21 1989
X***************
X*** 39,44 ****
X--- 39,53 ----
X
X HEADER header;
X
X+ #define MAXLINKS 512
X+
X+ struct {
X+ unsigned short ino;
X+ unsigned short dev;
X+ char *path;
X+ } links[MAXLINKS];
X+ int nlinks = 0;
X+
X #define INT_TYPE (sizeof(header.member.m_uid))
X #define LONG_TYPE (sizeof(header.member.m_size))
X
X***************
X*** 185,190 ****
X--- 194,200 ----
X register char *file;
X {
X register int fd;
X+ struct stat st;
X
X if (header.member.m_linked == '1') {
X if (link(header.member.m_link, file) < 0)
X***************
X*** 205,210 ****
X--- 215,224 ----
X (void) close(fd);
X
X chmod(file, (int)convert(header.member.m_mode, INT_TYPE));
X+ st.st_mtime = convert(header.member.m_time, LONG_TYPE);
X+ st.st_atime = st.st_mtime;
X+ utime(file, &st.st_atime);
X+ chown(file, (int)convert(header.member.m_uid, INT_TYPE),(int)convert(header.member.m_gid, INT_TYPE));
X flush();
X }
X
X***************
X*** 329,334 ****
X--- 343,349 ----
X struct stat st;
X struct direct dir;
X register int fd;
X+ char *islink(), *link=NIL_PTR;
X
X if (stat(file, &st) < 0) {
X string_print(NIL_PTR, "Cannot find %s\n", file);
X***************
X*** 339,349 ****
X return;
X }
X
X! make_header(path_name(file), &st);
X mwrite(tar_fd, &header, sizeof(header));
X! if (st.st_mode & S_IFREG)
X! copy(path_name(file), fd, tar_fd, st.st_size);
X! else if (st.st_mode & S_IFDIR) {
X if (chdir(file) < 0)
X string_print(NIL_PTR, "Cannot chdir to %s\n", file);
X else {
X--- 354,371 ----
X return;
X }
X
X!
X! /* check for link */
X! if ((st.st_mode & S_IFMT)!=S_IFDIR && st.st_nlink>1)
X! link = islink (path_name(file), &st, header.member.m_link);
X!
X! make_header(path_name(file), &st ,link);
X mwrite(tar_fd, &header, sizeof(header));
X! if ((st.st_mode & S_IFMT) == S_IFREG)
X! {if (link == 0)
X! copy(path_name(file), fd, tar_fd, st.st_size);
X! }
X! else if ((st.st_mode & S_IFMT) == S_IFDIR) {
X if (chdir(file) < 0)
X string_print(NIL_PTR, "Cannot chdir to %s\n", file);
X else {
X***************
X*** 363,370 ****
X (void) close(fd);
X }
X
X! make_header(file, st)
X! char *file;
X register struct stat *st;
X {
X register char *ptr = header.member.m_name;
X--- 385,395 ----
X (void) close(fd);
X }
X
X! /* a new arg link is necessary because link must be written beetween
X! clear_header() and checksum() - calling islink in make_header isn't clean*/
X!
X! make_header(file, st,link)
X! char *file, *link;
X register struct stat *st;
X {
X register char *ptr = header.member.m_name;
X***************
X*** 384,392 ****
X string_print(header.member.m_gid, "%I ", st->st_gid);
X string_print(header.member.m_size, "%L ", st->st_size);
X string_print(header.member.m_time, "%L ", st->st_mtime);
X! header.member.m_linked = ' ';
X string_print(header.member.m_checksum, "%I", checksum());
X }
X
X clear_header()
X {
X--- 409,465 ----
X string_print(header.member.m_gid, "%I ", st->st_gid);
X string_print(header.member.m_size, "%L ", st->st_size);
X string_print(header.member.m_time, "%L ", st->st_mtime);
X! if (link != NIL_PTR)
X! {
X! header.member.m_linked = '1';
X! strncpy (header.member.m_link, link, NAME_SIZE);
X! }
X! else
X! header.member.m_linked = ' ';
X string_print(header.member.m_checksum, "%I", checksum());
X }
X+
X+ char *islink(file, st)
X+ struct stat *st;
X+ char *file;
X+ {
X+ /* Handle files that are links.
X+ * Returns 0 if file must be copied.
X+ * Returns 1 if file has been successfully linked.
X+ */
X+ int i;
X+ int linkent;
X+ char *malloc();
X+
X+ linkent = -1;
X+ for (i=0; i<nlinks; i++)
X+ {
X+ if (links[i].dev==st->st_dev
X+ && links[i].ino==st->st_ino)
X+ linkent=i;
X+ }
X+ if (linkent>=0) /* It's already in the link table */
X+ { /* we must have copied it earlier.
X+ * Don't copy it twice.
X+ */
X+
X+ return(links[linkent].path); /* Don't try to copy it */
X+
X+ } else { /* Make an entry in the link table */
X+ if (nlinks >= MAXLINKS)
X+ error("Too many links at %s\n",file);
X+ links[nlinks].dev = st->st_dev;
X+ links[nlinks].ino = st->st_ino;
X+ links[nlinks].path = malloc(strlen(file)+1);
X+ if (links[nlinks].path == 0)
X+ error("No more memory at %s\n",file);
X+ strcpy(links[nlinks].path,file);
X+ nlinks++;
X+ /* Go ahead and copy it the first time */
X+ return(NIL_PTR);
X+ }
X+ }
X+
X
X clear_header()
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
4478) :;;
*) echo 'Bad character count in ''tar.c.cdif' >&2
echo 'Count should be 4478' >&2
esac
echo Extracting 'tee.c.cdif'
sed 's/^X//' > 'tee.c.cdif' << '+ END-OF-FILE ''tee.c.cdif'
X*** /local/ast/minix/tape3/commands/tee.c Mon Sep 26 15:01:28 1988
X--- tee.c Fri Jan 20 12:18:22 1989
X***************
X*** 35,56 ****
X }
X fd[0] = 1; /* Always output to stdout. */
X for (s = 1; s < MAXFD && argc > 0; --argc, argv++) {
X! if ((fd[s] = open(*argv, 2)) < 0 &&
X! (fd[s] = creat(*argv, 0666)) < 0) {
X! std_err("Cannot open output file: ");
X! std_err(*argv);
X! std_err("\n");
X! exit(2);
X }
X! s++;
X }
X
X if (iflag)
X signal(SIGINT, SIG_IGN);
X- for (i = 1; i < s; i++) { /* Don't lseek stdout. */
X- if (aflag)
X- lseek(fd[i], 0L, 2);
X- }
X
X while ((n = read(0, buf, BLOCK_SIZE)) > 0) {
X for (i = 0; i < s; i++)
X--- 35,60 ----
X }
X fd[0] = 1; /* Always output to stdout. */
X for (s = 1; s < MAXFD && argc > 0; --argc, argv++) {
X! if (aflag) {
X! if ((fd[s] = open(*argv, 2)) >= 0) {
X! lseek(fd[s], 0L, 2);
X! s++;
X! continue;
X! }
X! } else {
X! if ((fd[s] = creat(*argv, 0666)) >= 0) {
X! s++;
X! continue;
X! }
X }
X! std_err("Cannot open output file: ");
X! std_err(*argv);
X! std_err("\n");
X! exit(2);
X }
X
X if (iflag)
X signal(SIGINT, SIG_IGN);
X
X while ((n = read(0, buf, BLOCK_SIZE)) > 0) {
X for (i = 0; i < s; i++)
+ END-OF-FILE tee.c.cdif
chmod 'u=rw,g=r,o=r' 'tee.c.cdif'
set `wc -c 'tee.c.cdif'`
count=$1
case $count in
1214) :;;
*) echo 'Bad character count in ''tee.c.cdif' >&2
echo 'Count should be 1214' >&2
esac
echo Extracting 'term.c.cdif'
sed 's/^X//' > 'term.c.cdif' << '+ END-OF-FILE ''term.c.cdif'
X*** /local/ast/minix/tape3/commands/term.c Mon Sep 26 15:01:29 1988
X--- term.c Fri Jan 20 12:18:22 1989
X***************
X*** 1,170 ****
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 #define CHUNK 1024 /* how much to read at once */
X
X! int modem, pid; /* file descriptor for modem */
X! char *pat[NCHECKS] =
X! {"5", "6", "7", "8", "110", "300", "1200", "2400", "4800", "9600"};
X
X! int value[NCHECKS] =
X! {BITS5, BITS6, BITS7, BITS8, B110, B300, B1200, B2400, B4800, B9600};
X
X! int hold[MAXARGS];
X! struct sgttyb sgtty, sgsave1, sgsave2;
X
X main(argc, argv)
X int argc;
X char *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
X set_uart(argc, argv)
X int argc;
X char *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 = EVENP; continue;}
X! if (strcmp(argv[i], "odd") == 0) {parity = ODDP; 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! /* 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 = (sgtty.sg_flags & 01700) + RAW;
X! ioctl(0, TIOCSETP, &sgtty);
X }
X
X
X! int validity(s)
X! char *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
X! copy(in, out, end)
X! int 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, count, state = 0;
X! char buf[CHUNK], *p;
X
X while (1) {
X! if ( (count = read(in, buf, CHUNK)) < 0) {
X! printf("Can't read from modem\r\n");
X quit();
X }
X!
X! if (end > 0) {
X! for (p = &buf[0]; p < &buf[count]; p++) {
X! t = *p & 0377; /* t is unsigned int 0 - 255 */
X! if (t == end) {
X! if (++state == LIMIT) quit();
X! } else {
X! state = 0;
X! }
X! }
X }
X- write(out, buf, count);
X }
X }
X
X
X! error(s)
X! char *s;
X {
X! printf("%s", s);
X exit(1);
X }
X
X! quit()
X {
X- ioctl(modem, TIOCSETP, &sgsave1);
X- ioctl(0, TIOCSETP, &sgsave2);
X- if (getpid() != pid) kill(pid, SIGINT);
X exit(0);
X }
X--- 1,313 ----
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 through one of the ttys.
X! * It forks into two processes. The parent sits in a tight loop copying
X! * from stdin to the tty. The child sits in a tight loop copying from
X! * the tty to stdout.
X *
X+ * 2 Sept 88 BDE (Bruce D. Evans): Massive changes to make current settings the
X+ * default, allow any file as the "tty", support fancy baud rates and remove
X+ * references to and dependencies on modems and keyboards, so (e.g.)
X+ * a local login on /dev/tty1 can do an external login on /dev/tty2.
X+ *
X+ * 3 Sept 88 BDE: Split parent again to main process copies from stdin to a
X+ * pipe which is copied to the tty. This stops a blocked write to the
X+ * tty from hanging the program.
X+ *
X+ * 11 Oct 88 BDE: Cleaned up baud rates and parity stripping.
X+ *
X * Example usage:
X! * term : baud, bits/char, parity from /dev/tty1
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+ * term /dev/tty2 : use /dev/tty2 rather than /dev/tty1
X+ * : Any argument starting with "/" is
X+ * : taken as the communication device.
X */
X
X #include <sgtty.h>
X+ #include <signal.h>
X
X! #define MAXARGS 3 /* maximum number of uart params */
X #define CHUNK 1024 /* how much to read at once */
X+ #define NULL 0
X
X! /* Hack some new baud rates for Minix. Minix uses a divide-by-100 encoding. */
X! #define B200 2
X! #define B600 6
X! #define B1800 18
X! #define B3600 36
X! #define B7200 72
X! #define B19200 192
X! #define EXTA 192
X! /* We can't handle some standard (slow) V7 speeds and speeds above 25500 since
X! * since the speed is packed into a char :-(. Trap them with an illegal value.
X! */
X! #define B50 0
X! #define B75 0
X! #define B134 0
X! #define EXTB 0
X! #define B38400 0
X! #define B57600 0
X! #define B115200 0
X
X! int commfd; /* open file no. for comm device */
X! int readpid; /* pid of child reading commfd */
X! struct sgttyb sgcommfd; /* saved terminal parameters for commfd */
X! struct sgttyb sgstdin; /* saved terminal parameters for stdin */
X! int writepid; /* pid of child writing commfd */
X
X! char endseq[] = "\033[G"; /* sequence to leave simulator */
X! /* keypad '5', and must arrive in 1 piece */
X! struct param_s
X! {
X! char *pattern;
X! int value;
X! char type;
X! #define BAD 0
X! #define BITS 1
X! #define NOSTRIP 2
X! #define PARITY 3
X! #define SPEED 4
X! }
X! params[] =
X! {
X! "5", BITS5, BITS,
X! "6", BITS6, BITS,
X! "7", BITS7, BITS,
X! "8", BITS8, BITS,
X
X+ "even", EVENP, PARITY,
X+ "odd", ODDP, PARITY,
X+ "nostrip", 0, NOSTRIP,
X+
X+ "50", B50, SPEED,
X+ "75", B75, SPEED,
X+ "110", B110, SPEED,
X+ "134", B134, SPEED,
X+ "200", B200, SPEED,
X+ "300", B300, SPEED,
X+ "600", B600, SPEED,
X+ "1200", B1200, SPEED,
X+ "1800", B1800, SPEED,
X+ "2400", B2400, SPEED,
X+ "3600", B3600, SPEED,
X+ "4800", B4800, SPEED,
X+ "7200", B7200, SPEED,
X+ "9600", B9600, SPEED,
X+ "19200", B19200, SPEED,
X+ "EXTA", EXTA, SPEED,
X+ "EXTB", EXTB, SPEED,
X+ "38400", B38400, SPEED,
X+ "57600", B57600, SPEED,
X+ "115200", B115200, SPEED,
X+ "", 0, BAD, /* BAD type to end list */
X+ };
X+ unsigned char strip_parity = 1; /* nonzero to strip high bits before output */
X+
X+ int quit(); /* forward declare signal handler */
X+
X main(argc, argv)
X int argc;
X char *argv[];
X {
X+ char *commdev = NULL;
X+ int i;
X+ int pipefd[2];
X
X sync();
X! for (i = 1; i < argc; ++i)
X! if ( argv[i][0] == '/') {
X! if (commdev != NULL)
X! error("Too may communication devices", "");
X! commdev = argv[i];
X! }
X! if (commdev == NULL) {
X! i = MAXARGS + 1;
X! commdev = "/dev/tty1";
X }
X+ else
X+ i = MAXARGS + 2;
X+ if (argc > i)
X+ error("Usage: term [baudrate] [data_bits] [parity]", "");
X+ commfd = open(commdev, 2);
X+ if (commfd < 0) error("Can't open ", commdev);
X+
X+ /* Save state of both devices before altering either (may be identical!). */
X+ ioctl(0, TIOCGETP, &sgstdin);
X+ ioctl(commfd, TIOCGETP, &sgcommfd);
X+ set_mode(0, -1, -1, -1, &sgstdin); /* RAW mode on stdin, others current */
X set_uart(argc, argv);
X
X /* Main body of the terminal simulator. */
X! signal(SIGINT, quit);
X! signal(SIGPIPE, quit);
X! if (pipe(pipefd) < 0)
X! error("Can't create pipe", "");
X! switch((writepid = fork()))
X! {
X! case -1:
X! error("Can't create process to write to comm device", "");
X! case 0:
X! /* piped stdin to tty */
X! close(pipefd[1]);
X! copy(pipefd[0], "piped stdin", commfd, commdev, "");
X! }
X! close(pipefd[0]);
X! switch((readpid = fork()))
X! {
X! case -1:
X! error("Can't create process to read from comm device", "");
X! case 0:
X! /* tty to stdout */
X! copy(commfd, commdev, 1, "stdout", "");
X! }
X! /* stdin to pipe */
X! copy(0, "stdin", pipefd[1], "redirect stdin", endseq);
X }
X
X+
X set_uart(argc, argv)
X int argc;
X char *argv[];
X {
X /* Set up the UART parameters. */
X
X! int i, j, bits, nbits, parity, nparities, speed, nspeeds;
X! char *arg;
X! register struct param_s *param;
X
X /* Examine all the parameters and check for validity. */
X! nspeeds = nparities = nbits = 0;
X! speed = parity = bits = -1; /* -1 means use current value */
X! for (i = 1; i < argc; ++i) {
X! if ((arg = argv[i])[0] == '/') continue;
X!
X! /* Check parameter for legality. */
X! for (j = 0, param = ¶ms[0];
X! param->type != BAD && strcmp(arg, param->pattern) != 0;
X! ++j, ++param)
X! ;
X! switch (param->type)
X! {
X! case BAD:
X! error("Invalid parameter: ", arg);
X! case BITS:
X! bits = param->value;
X! if (++nbits > 1) error("Too many character sizes", "");
X! break;
X! case PARITY:
X! parity = param->value;
X! if (++nparities > 1) error("Too many parities", "");
X! break;
X! case SPEED:
X! speed = param->value;
X! if (speed == 0)
X! error("Invalid speed: ", arg);
X! if (++nspeeds > 1) error("Too many speeds", "");
X! break;
X! case NOSTRIP:
X! strip_parity = 0;
X! break;
X }
X }
X! set_mode(commfd, speed, parity, bits, &sgcommfd);
X }
X
X
X! set_mode(fd, speed, parity, bits, sgsavep)
X! int speed;
X! int parity;
X! int bits;
X! struct sgttyb *sgsavep;
X {
X! /* Set open file fd to RAW mode with the given other modes.
X! * If fd is not a tty, this may do nothing but connecting ordinary files
X! * as ttys may have some use.
X! */
X
X! struct sgttyb sgtty;
X
X! sgtty = *sgsavep;
X! if (speed == -1) speed = sgtty.sg_ispeed;
X! if (parity == -1) parity = sgtty.sg_flags & (EVENP | ODDP);
X! if (bits == -1) bits = sgtty.sg_flags & BITS8; /* BITS8 is actually a mask */
X! sgtty.sg_ispeed = speed;
X! sgtty.sg_ospeed = speed;
X! sgtty.sg_flags = RAW | parity | bits;
X! ioctl(fd, TIOCSETP, &sgtty);
X }
X
X!
X! copy(in, inname, out, outname, end)
X! int in;
X! char *inname;
X! int out;
X! char *outname;
X! char *end;
X {
X! /* Copy from one open file to another. If the 'end' sequence is not "", and
X! * precisely matches the input, terminate the copy and various children.
X! * The end sequence is best provided by keyboard input from one of the
X! * special keys which always produces chars in a bunch. RAW mode almost
X! * guarantees exactly one keystroke's worth of input at a time.
X */
X
X! static char buf[CHUNK];
X! char *bufend;
X! register char *bufp;
X! int count;
X! int len;
X
X+ len = strlen(end);
X while (1) {
X! if ( (count = read(in, buf, CHUNK)) <= 0) {
X! write2sn("Can't read from ", inname);
X quit();
X }
X! if (count == len && strncmp(buf, end, count) == 0)
X! quit();
X! if (strip_parity)
X! for (bufp = buf, bufend = bufp + count;
X! bufp < bufend; ++bufp )
X! *bufp &= 0x7F;
X! if (write(out, buf, count) != count) {
X! write2sn("Can't write to ", outname);
X! quit();
X }
X }
X }
X
X
X! error(s1, s2)
X! char *s1;
X! char *s2;
X {
X! write2sn(s1, s2);
X exit(1);
X }
X
X!
X! nicequit()
X {
X exit(0);
X+ }
X+
X+
X+ quit()
X+ {
X+ ioctl(commfd, TIOCSETP, &sgcommfd);
X+ ioctl(0, TIOCSETP, &sgstdin);
X+ signal(SIGINT, nicequit); /* if not caught, sh prints extra newline */
X+ kill(0, SIGINT);
X+ nicequit();
X+ }
X+
X+
X+ write2sn(s1, s2)
X+ {
X+ write(1, s1, strlen(s1));
X+ write(1, s2, strlen(s2));
X+ write(1, "\r\n", 2);
X }
+ END-OF-FILE term.c.cdif
chmod 'u=rw,g=r,o=r' 'term.c.cdif'
set `wc -c 'term.c.cdif'`
count=$1
case $count in
13013) :;;
*) echo 'Bad character count in ''term.c.cdif' >&2
echo 'Count should be 13013' >&2
esac
echo Extracting 'test.c.cdif'
sed 's/^X//' > 'test.c.cdif' << '+ END-OF-FILE ''test.c.cdif'
X*** /local/ast/minix/tape3/commands/test.c Mon Sep 26 15:01:29 1988
X--- test.c Fri Jan 20 12:18:22 1989
X***************
X*** 1,4 ****
X! /* test(1); version 7-like -- author Erik Baalbergen */
X #include <sys/types.h>
X #include <sys/stat.h>
X #include <sgtty.h>
X--- 1,5 ----
X! /* test - test conditions Author: Erik Baalbergen */
X!
X #include <sys/types.h>
X #include <sys/stat.h>
X #include <sgtty.h>
X***************
X*** 85,93 ****
X main(argc, argv)
X char *argv[];
X {
X prog = argv[0];
X ip = &argv[1];
X! exit(!(expr(lex(*ip)) && *++ip == 0));
X }
X
X expr(n)
X--- 86,101 ----
X main(argc, argv)
X char *argv[];
X {
X+ int st;
X+
X+ if (argc == 1)
X+ exit(1);
X prog = argv[0];
X ip = &argv[1];
X! st = !expr(lex(*ip));
X! if (*++ip)
X! syntax();
X! exit(st);
X }
X
X expr(n)
+ END-OF-FILE test.c.cdif
chmod 'u=rw,g=r,o=r' 'test.c.cdif'
set `wc -c 'test.c.cdif'`
count=$1
case $count in
793) :;;
*) echo 'Bad character count in ''test.c.cdif' >&2
echo 'Count should be 793' >&2
esac
echo Extracting 'tsort.c.cdif'
sed 's/^X//' > 'tsort.c.cdif' << '+ END-OF-FILE ''tsort.c.cdif'
X*** /local/ast/minix/tape3/commands/tsort.c Mon Sep 26 15:01:33 1988
X--- tsort.c Fri Jan 20 12:18:22 1989
X***************
X*** 24,29 ****
X--- 24,31 ----
X * change log:
X * possible bug in ungetc(), fixed readone() to avoid - 2/19/88 - mrw
X * massive design error, rewrote dump logic - 3/15/88 - mrw
X+ * stupid error causing overlay of s1 & s2 in readnode - 9/12/88 - mrw
X+ *
X */
X
X #include <stdio.h>
X***************
X*** 89,99 ****
X struct node *
X readnode()
X {
X! char *s1, *s2;
X register struct node *n1, *n2;
X struct dependents *pd;
X
X! if ((s1 = readone()) != (char *)NULL) {
X if ((n1 = findnode(s1)) == (struct node *)NULL) {
X /* is a new node so build it */
X n1 = (struct node *)xalloc(sizeof(struct node));
X--- 91,101 ----
X struct node *
X readnode()
X {
X! static char s1[MAXNAMELEN], s2[MAXNAMELEN];
X register struct node *n1, *n2;
X struct dependents *pd;
X
X! if (readone(s1) != (char *)NULL) {
X if ((n1 = findnode(s1)) == (struct node *)NULL) {
X /* is a new node so build it */
X n1 = (struct node *)xalloc(sizeof(struct node));
X***************
X*** 107,113 ****
X n1->visited = 0;
X linknode(n1);
X }
X! if ((s2 = readone()) != (char *)NULL) {
X if ((n2 = findnode(s2)) == (struct node *)NULL) {
X /* is a new node so build it */
X n2 = (struct node *)xalloc(sizeof(struct node));
X--- 109,115 ----
X n1->visited = 0;
X linknode(n1);
X }
X! if (readone(s2) != (char *)NULL) {
X if ((n2 = findnode(s2)) == (struct node *)NULL) {
X /* is a new node so build it */
X n2 = (struct node *)xalloc(sizeof(struct node));
X***************
X*** 223,250 ****
X fprintf(stderr,"Error: %s - member queue overflow\n",progname);
X exit(1);
X }
X! else
X q[back] = t;
X }
X
X char *
X! readone()
X {
X register int c, n = 0;
X- static char name[MAXNAMELEN];
X
X /* eat up leading spaces */
X while ((c = getchar()) != EOF && isspace(c))
X ;
X
X if (c != EOF) {
X! name[n++] = c; /* save into name first non blank */
X while ((c = getchar()) != EOF && !isspace(c)) {
X if (n < MAXNAMELEN)
X! name[n++] = c;
X }
X! name[n] = '\0';
X! return (name);
X }
X else
X return ((char *)NULL);
X--- 225,253 ----
X fprintf(stderr,"Error: %s - member queue overflow\n",progname);
X exit(1);
X }
X! else {
X q[back] = t;
X+ }
X }
X
X char *
X! readone(str)
X! char str[]; /* of MAXNAMELEN length */
X {
X register int c, n = 0;
X
X /* eat up leading spaces */
X while ((c = getchar()) != EOF && isspace(c))
X ;
X
X if (c != EOF) {
X! str[n++] = c; /* save into name first non blank */
X while ((c = getchar()) != EOF && !isspace(c)) {
X if (n < MAXNAMELEN)
X! str[n++] = c;
X }
X! str[n] = '\0';
X! return (str);
X }
X else
X return ((char *)NULL);
+ END-OF-FILE tsort.c.cdif
chmod 'u=rw,g=r,o=r' 'tsort.c.cdif'
set `wc -c 'tsort.c.cdif'`
count=$1
case $count in
2775) :;;
*) echo 'Bad character count in ''tsort.c.cdif' >&2
echo 'Count should be 2775' >&2
esac
exit 0