Annotation of researchv8dc/cmd/tape.c, revision 1.1.1.1

1.1       root        1: #include "stdio.h"
                      2: #include "errno.h"
                      3: #include "signal.h"
                      4: 
                      5: extern int     errno;
                      6: char *tapes[] = {
                      7:        "/dev/rmt1",
                      8:        "/dev/rmt0",
                      9:        0
                     10: };
                     11: long recnum, reccnt;
                     12: int broken();
                     13: long filenum;
                     14: int eof;
                     15: unsigned recsz;
                     16: char buf[60*1024];
                     17: int fd;
                     18: 
                     19: timeout()
                     20: {
                     21:        fprintf(stdout, "timeout\n");
                     22: }
                     23: 
                     24: dens()
                     25: {      int fd, i, n;
                     26:        for(i = 0; tapes[i]; i++) {
                     27:                close(fd);
                     28:                errno = 0;
                     29:                alarm(60);
                     30:                fd = open(tapes[i], 0);
                     31:                alarm(0);
                     32:                if(fd < 0) {
                     33:                        perror(tapes[i]);
                     34:                        continue;
                     35:                }
                     36:                alarm(60);
                     37:                n = read(fd, buf, sizeof(buf));
                     38:                alarm(0);
                     39:                if( n >= 0) {
                     40:                        fprintf(stdout, "%s:\n", tapes[i]);
                     41:                        close(fd);
                     42:                        return(i);
                     43:                }
                     44:                if(errno == ENXIO) continue;
                     45:                else perror(tapes[i]);
                     46:        }
                     47:        fprintf(stdout, "I can't read anything from your tape\n");
                     48:        return(-1);
                     49: }
                     50: 
                     51: main()
                     52: {      int i;
                     53:        int n;
                     54:        signal(SIGALRM, timeout);
                     55:        signal(SIGINT, broken);
                     56:        i = dens();
                     57:        if(i == -1) exit(1);
                     58:        alarm(10);
                     59:        fd = open(tapes[i], 0);
                     60:        alarm(0);
                     61:        if(fd < 0) {
                     62:                perror("Where did your tape go?");
                     63:                exit(1);
                     64:        }
                     65:        newfile();
                     66:        for(;;) {
                     67:                alarm(5);
                     68:                n = read(fd, buf, sizeof(buf));
                     69:                alarm(0);
                     70:                if(n == -1) {
                     71:                        if(errno == 0) {
                     72:                                if(reccnt > 0) recdata();
                     73:                                if(eof == 2) {
                     74:                                        fprintf(stdout, "2 eofs read\n");
                     75:                                        exit(0);
                     76:                                }
                     77:                                filedata();
                     78:                                newfile();
                     79:                        }
                     80:                        else {
                     81:                                recdata();
                     82:                                filedata();
                     83:                                perror("Bailing out");
                     84:                                exit(1);
                     85:                        }
                     86:                }
                     87:                else if(n == 0) {
                     88:                        eof++;
                     89:                        if(eof == 2) {
                     90:                                fprintf(stdout, "2 eofs read\n");
                     91:                                exit(0);
                     92:                        }
                     93:                        if(reccnt > 0) recdata();
                     94:                        filedata();
                     95:                        newfile();
                     96:                }
                     97:                else {
                     98:                        eof = 0;
                     99:                        recnum++;
                    100:                        if(n == recsz) reccnt++;
                    101:                        else {
                    102:                                if(reccnt > 0) recdata();
                    103:                                recsz = n;
                    104:                                reccnt = 1;
                    105:                        }
                    106:                }
                    107:        }
                    108: }
                    109: 
                    110: newfile()
                    111: {
                    112:        filenum++;
                    113:        recnum = 0;
                    114:        reccnt = 0;
                    115:        recsz = 0;
                    116:        errno = 0;
                    117: }
                    118: 
                    119: filedata()
                    120: {
                    121:        fprintf(stdout, "file %ld had %ld records\n", filenum, recnum);
                    122: }
                    123: 
                    124: recdata()
                    125: {
                    126:        if(recsz < sizeof(buf))
                    127:                fprintf(stdout, "file %ld, %ld records of size %u\n", filenum, reccnt, recsz);
                    128:        else fprintf(stdout, "file %ld, %ld records of size %u (or larger)\n",
                    129:                filenum, reccnt, recsz);
                    130: }
                    131: 
                    132: broken()
                    133: {
                    134:        fprintf(stderr, "interrupted\n");
                    135:        recdata();
                    136:        filedata();
                    137:        exit(0);
                    138: }

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.