Annotation of 43BSDReno/bin/dd/dd.c, revision 1.1

1.1     ! root        1: #ifndef lint
        !             2: static char *sccsid = "@(#)dd.c        4.8 (Berkeley) 6/25/90";
        !             3: #endif
        !             4: 
        !             5: #include <sys/types.h>
        !             6: #include <sys/file.h>
        !             7: #include <sys/ioctl.h>
        !             8: #include <sys/mtio.h>
        !             9: #include <sys/stat.h>
        !            10: #include <stdio.h>
        !            11: #include <signal.h>
        !            12: 
        !            13: #define        BIG     2147483647
        !            14: #define        LCASE   01
        !            15: #define        UCASE   02
        !            16: #define        SWAB    04
        !            17: #define NERR   010
        !            18: #define SYNC   020
        !            19: int    cflag;
        !            20: int    fflag;
        !            21: int    skip;
        !            22: int    seekn;
        !            23: int    count;
        !            24: int    files   = 1;
        !            25: char   *string;
        !            26: char   *ifile;
        !            27: char   *ofile;
        !            28: char   *ibuf;
        !            29: char   *obuf;
        !            30: char   *sbrk();
        !            31: int    ibs     = 512;
        !            32: int    obs     = 512;
        !            33: int    bs;
        !            34: int    cbs;
        !            35: int    ibc;
        !            36: int    obc;
        !            37: int    cbc;
        !            38: int    nifr;
        !            39: int    nipr;
        !            40: int    nofr;
        !            41: int    nopr;
        !            42: int    ntrunc;
        !            43: int    ibf;
        !            44: int    obf;
        !            45: char   *op;
        !            46: int    nspace;
        !            47: char   etoa[] = {
        !            48:        0000,0001,0002,0003,0234,0011,0206,0177,
        !            49:        0227,0215,0216,0013,0014,0015,0016,0017,
        !            50:        0020,0021,0022,0023,0235,0205,0010,0207,
        !            51:        0030,0031,0222,0217,0034,0035,0036,0037,
        !            52:        0200,0201,0202,0203,0204,0012,0027,0033,
        !            53:        0210,0211,0212,0213,0214,0005,0006,0007,
        !            54:        0220,0221,0026,0223,0224,0225,0226,0004,
        !            55:        0230,0231,0232,0233,0024,0025,0236,0032,
        !            56:        0040,0240,0241,0242,0243,0244,0245,0246,
        !            57:        0247,0250,0133,0056,0074,0050,0053,0041,
        !            58:        0046,0251,0252,0253,0254,0255,0256,0257,
        !            59:        0260,0261,0135,0044,0052,0051,0073,0136,
        !            60:        0055,0057,0262,0263,0264,0265,0266,0267,
        !            61:        0270,0271,0174,0054,0045,0137,0076,0077,
        !            62:        0272,0273,0274,0275,0276,0277,0300,0301,
        !            63:        0302,0140,0072,0043,0100,0047,0075,0042,
        !            64:        0303,0141,0142,0143,0144,0145,0146,0147,
        !            65:        0150,0151,0304,0305,0306,0307,0310,0311,
        !            66:        0312,0152,0153,0154,0155,0156,0157,0160,
        !            67:        0161,0162,0313,0314,0315,0316,0317,0320,
        !            68:        0321,0176,0163,0164,0165,0166,0167,0170,
        !            69:        0171,0172,0322,0323,0324,0325,0326,0327,
        !            70:        0330,0331,0332,0333,0334,0335,0336,0337,
        !            71:        0340,0341,0342,0343,0344,0345,0346,0347,
        !            72:        0173,0101,0102,0103,0104,0105,0106,0107,
        !            73:        0110,0111,0350,0351,0352,0353,0354,0355,
        !            74:        0175,0112,0113,0114,0115,0116,0117,0120,
        !            75:        0121,0122,0356,0357,0360,0361,0362,0363,
        !            76:        0134,0237,0123,0124,0125,0126,0127,0130,
        !            77:        0131,0132,0364,0365,0366,0367,0370,0371,
        !            78:        0060,0061,0062,0063,0064,0065,0066,0067,
        !            79:        0070,0071,0372,0373,0374,0375,0376,0377,
        !            80: };
        !            81: char   atoe[] = {
        !            82:        0000,0001,0002,0003,0067,0055,0056,0057,
        !            83:        0026,0005,0045,0013,0014,0015,0016,0017,
        !            84:        0020,0021,0022,0023,0074,0075,0062,0046,
        !            85:        0030,0031,0077,0047,0034,0035,0036,0037,
        !            86:        0100,0117,0177,0173,0133,0154,0120,0175,
        !            87:        0115,0135,0134,0116,0153,0140,0113,0141,
        !            88:        0360,0361,0362,0363,0364,0365,0366,0367,
        !            89:        0370,0371,0172,0136,0114,0176,0156,0157,
        !            90:        0174,0301,0302,0303,0304,0305,0306,0307,
        !            91:        0310,0311,0321,0322,0323,0324,0325,0326,
        !            92:        0327,0330,0331,0342,0343,0344,0345,0346,
        !            93:        0347,0350,0351,0112,0340,0132,0137,0155,
        !            94:        0171,0201,0202,0203,0204,0205,0206,0207,
        !            95:        0210,0211,0221,0222,0223,0224,0225,0226,
        !            96:        0227,0230,0231,0242,0243,0244,0245,0246,
        !            97:        0247,0250,0251,0300,0152,0320,0241,0007,
        !            98:        0040,0041,0042,0043,0044,0025,0006,0027,
        !            99:        0050,0051,0052,0053,0054,0011,0012,0033,
        !           100:        0060,0061,0032,0063,0064,0065,0066,0010,
        !           101:        0070,0071,0072,0073,0004,0024,0076,0341,
        !           102:        0101,0102,0103,0104,0105,0106,0107,0110,
        !           103:        0111,0121,0122,0123,0124,0125,0126,0127,
        !           104:        0130,0131,0142,0143,0144,0145,0146,0147,
        !           105:        0150,0151,0160,0161,0162,0163,0164,0165,
        !           106:        0166,0167,0170,0200,0212,0213,0214,0215,
        !           107:        0216,0217,0220,0232,0233,0234,0235,0236,
        !           108:        0237,0240,0252,0253,0254,0255,0256,0257,
        !           109:        0260,0261,0262,0263,0264,0265,0266,0267,
        !           110:        0270,0271,0272,0273,0274,0275,0276,0277,
        !           111:        0312,0313,0314,0315,0316,0317,0332,0333,
        !           112:        0334,0335,0336,0337,0352,0353,0354,0355,
        !           113:        0356,0357,0372,0373,0374,0375,0376,0377,
        !           114: };
        !           115: char   atoibm[] =
        !           116: {
        !           117:        0000,0001,0002,0003,0067,0055,0056,0057,
        !           118:        0026,0005,0045,0013,0014,0015,0016,0017,
        !           119:        0020,0021,0022,0023,0074,0075,0062,0046,
        !           120:        0030,0031,0077,0047,0034,0035,0036,0037,
        !           121:        0100,0132,0177,0173,0133,0154,0120,0175,
        !           122:        0115,0135,0134,0116,0153,0140,0113,0141,
        !           123:        0360,0361,0362,0363,0364,0365,0366,0367,
        !           124:        0370,0371,0172,0136,0114,0176,0156,0157,
        !           125:        0174,0301,0302,0303,0304,0305,0306,0307,
        !           126:        0310,0311,0321,0322,0323,0324,0325,0326,
        !           127:        0327,0330,0331,0342,0343,0344,0345,0346,
        !           128:        0347,0350,0351,0255,0340,0275,0137,0155,
        !           129:        0171,0201,0202,0203,0204,0205,0206,0207,
        !           130:        0210,0211,0221,0222,0223,0224,0225,0226,
        !           131:        0227,0230,0231,0242,0243,0244,0245,0246,
        !           132:        0247,0250,0251,0300,0117,0320,0241,0007,
        !           133:        0040,0041,0042,0043,0044,0025,0006,0027,
        !           134:        0050,0051,0052,0053,0054,0011,0012,0033,
        !           135:        0060,0061,0032,0063,0064,0065,0066,0010,
        !           136:        0070,0071,0072,0073,0004,0024,0076,0341,
        !           137:        0101,0102,0103,0104,0105,0106,0107,0110,
        !           138:        0111,0121,0122,0123,0124,0125,0126,0127,
        !           139:        0130,0131,0142,0143,0144,0145,0146,0147,
        !           140:        0150,0151,0160,0161,0162,0163,0164,0165,
        !           141:        0166,0167,0170,0200,0212,0213,0214,0215,
        !           142:        0216,0217,0220,0232,0233,0234,0235,0236,
        !           143:        0237,0240,0252,0253,0254,0255,0256,0257,
        !           144:        0260,0261,0262,0263,0264,0265,0266,0267,
        !           145:        0270,0271,0272,0273,0274,0275,0276,0277,
        !           146:        0312,0313,0314,0315,0316,0317,0332,0333,
        !           147:        0334,0335,0336,0337,0352,0353,0354,0355,
        !           148:        0356,0357,0372,0373,0374,0375,0376,0377,
        !           149: };
        !           150: 
        !           151: enum ftype { unknown, reg, chr, tape, pipe } iftype;
        !           152: enum ftype checktype();
        !           153: 
        !           154: main(argc, argv)
        !           155: int    argc;
        !           156: char   **argv;
        !           157: {
        !           158:        int (*conv)();
        !           159:        register char *ip;
        !           160:        register c;
        !           161:        int ebcdic(), ibm(), ascii(), null(), cnull(), term(), block(), unblock();
        !           162:        int a;
        !           163: 
        !           164:        conv = null;
        !           165:        for(c=1; c<argc; c++) {
        !           166:                string = argv[c];
        !           167:                if(match("ibs=")) {
        !           168:                        ibs = number(BIG);
        !           169:                        continue;
        !           170:                }
        !           171:                if(match("obs=")) {
        !           172:                        obs = number(BIG);
        !           173:                        continue;
        !           174:                }
        !           175:                if(match("cbs=")) {
        !           176:                        cbs = number(BIG);
        !           177:                        continue;
        !           178:                }
        !           179:                if (match("bs=")) {
        !           180:                        bs = number(BIG);
        !           181:                        continue;
        !           182:                }
        !           183:                if(match("if=")) {
        !           184:                        ifile = string;
        !           185:                        continue;
        !           186:                }
        !           187:                if(match("of=")) {
        !           188:                        ofile = string;
        !           189:                        continue;
        !           190:                }
        !           191:                if(match("skip=")) {
        !           192:                        skip = number(BIG);
        !           193:                        continue;
        !           194:                }
        !           195:                if(match("seek=")) {
        !           196:                        seekn = number(BIG);
        !           197:                        continue;
        !           198:                }
        !           199:                if(match("count=")) {
        !           200:                        count = number(BIG);
        !           201:                        continue;
        !           202:                }
        !           203:                if(match("files=")) {
        !           204:                        files = number(BIG);
        !           205:                        continue;
        !           206:                }
        !           207:                if(match("conv=")) {
        !           208:                cloop:
        !           209:                        if(match(","))
        !           210:                                goto cloop;
        !           211:                        if(*string == '\0')
        !           212:                                continue;
        !           213:                        if(match("ebcdic")) {
        !           214:                                conv = ebcdic;
        !           215:                                goto cloop;
        !           216:                        }
        !           217:                        if(match("ibm")) {
        !           218:                                conv = ibm;
        !           219:                                goto cloop;
        !           220:                        }
        !           221:                        if(match("ascii")) {
        !           222:                                conv = ascii;
        !           223:                                goto cloop;
        !           224:                        }
        !           225:                        if(match("block")) {
        !           226:                                conv = block;
        !           227:                                goto cloop;
        !           228:                        }
        !           229:                        if(match("unblock")) {
        !           230:                                conv = unblock;
        !           231:                                goto cloop;
        !           232:                        }
        !           233:                        if(match("lcase")) {
        !           234:                                cflag |= LCASE;
        !           235:                                goto cloop;
        !           236:                        }
        !           237:                        if(match("ucase")) {
        !           238:                                cflag |= UCASE;
        !           239:                                goto cloop;
        !           240:                        }
        !           241:                        if(match("swab")) {
        !           242:                                cflag |= SWAB;
        !           243:                                goto cloop;
        !           244:                        }
        !           245:                        if(match("noerror")) {
        !           246:                                cflag |= NERR;
        !           247:                                goto cloop;
        !           248:                        }
        !           249:                        if(match("sync")) {
        !           250:                                cflag |= SYNC;
        !           251:                                goto cloop;
        !           252:                        }
        !           253:                }
        !           254:                fprintf(stderr,"bad arg: %s\n", string);
        !           255:                exit(1);
        !           256:        }
        !           257:        if(conv == null && cflag&(LCASE|UCASE))
        !           258:                conv = cnull;
        !           259:        if (ifile)
        !           260:                ibf = open(ifile, 0);
        !           261:        else
        !           262:                ibf = dup(0);
        !           263:        if(ibf < 0) {
        !           264:                perror(ifile);
        !           265:                exit(1);
        !           266:        }
        !           267:        iftype = checktype(ibf);
        !           268:        obf = ofile ? open(ofile, O_WRONLY|O_CREAT, 0666) : dup(1);
        !           269:        if(obf < 0) {
        !           270:                fprintf(stderr,"cannot create: %s\n", ofile);
        !           271:                exit(1);
        !           272:        }
        !           273:        if (bs) {
        !           274:                ibs = obs = bs;
        !           275:                if (conv == null && (cflag &~ (SYNC|NERR)) == 0)
        !           276:                        fflag++;
        !           277:        }
        !           278:        if(ibs == 0 || obs == 0) {
        !           279:                fprintf(stderr,"counts: cannot be zero\n");
        !           280:                exit(1);
        !           281:        }
        !           282:        ibuf = sbrk(ibs);
        !           283:        if (fflag)
        !           284:                obuf = ibuf;
        !           285:        else
        !           286:                obuf = sbrk(obs);
        !           287:        sbrk(64);       /* For good measure */
        !           288:        if(ibuf == (char *)-1 || obuf == (char *)-1) {
        !           289:                fprintf(stderr, "not enough memory\n");
        !           290:                exit(1);
        !           291:        }
        !           292:        ibc = 0;
        !           293:        obc = 0;
        !           294:        cbc = 0;
        !           295:        op = obuf;
        !           296: 
        !           297:        if (signal(SIGINT, SIG_IGN) != SIG_IGN)
        !           298:                signal(SIGINT, term);
        !           299:        if (skip)
        !           300:            switch (iftype) {
        !           301:                case tape: {
        !           302:                        struct mtop op;
        !           303: 
        !           304:                        op.mt_op = MTFSR;
        !           305:                        op.mt_count = skip;
        !           306:                        if (ioctl(ibf, MTIOCTOP, (char *)&op) < 0)
        !           307:                                perror("dd: skip: tape forward-space-record");
        !           308:                        }
        !           309:                        break;
        !           310:                case reg:
        !           311:                        lseek(ibf, skip*ibs, L_INCR);
        !           312:                        break;
        !           313:                default:
        !           314:                        while (skip--)
        !           315:                                read(ibf, ibuf, ibs);
        !           316:                        break;
        !           317:        }
        !           318:        if (seekn)
        !           319:            switch (checktype(obf)) {
        !           320:                case reg:
        !           321:                        lseek(obf, (long)obs*seekn, L_INCR);
        !           322:                        break;
        !           323:                case pipe:
        !           324:                        fprintf(stderr, "dd: can't seek on pipe\n");
        !           325:                        break;
        !           326:                default:
        !           327:                        while (seekn--)
        !           328:                                lseek(obf, (long)obs, L_INCR);
        !           329:                        break;
        !           330:        }
        !           331: 
        !           332: loop:
        !           333:        if(ibc-- == 0) {
        !           334:                ibc = 0;
        !           335:                if(count==0 || nifr+nipr!=count) {
        !           336:                        if (cflag&NERR)
        !           337:                                bzero((char *)ibuf, ibs);
        !           338:                        ibc = read(ibf, ibuf, ibs);
        !           339:                }
        !           340:                if(ibc == -1) {
        !           341:                        perror("read");
        !           342:                        if((cflag&NERR) == 0) {
        !           343:                                flsh();
        !           344:                                term();
        !           345:                        }
        !           346:                        /* guess actual read size; default still -1 */
        !           347:                        for(c=0; c<ibs; c++)
        !           348:                                if(ibuf[c] != 0)
        !           349:                                        ibc = c + 1;
        !           350:                        stats();
        !           351:                        advance(ibf, iftype, ibs);
        !           352:                }
        !           353:                if(ibc == 0 && --files<=0) {
        !           354:                        flsh();
        !           355:                        term();
        !           356:                }
        !           357:                if(ibc != ibs) {
        !           358:                        if (ibc == -1)
        !           359:                                ibc = 0;
        !           360:                        nipr++;
        !           361:                        if (cflag&SYNC) {
        !           362:                                bzero(ibuf + ibc, ibs - ibc);
        !           363:                                ibc = ibs;
        !           364:                        }
        !           365:                } else
        !           366:                        nifr++;
        !           367:                ip = ibuf;
        !           368:                c = ibc >> 1;
        !           369:                if(cflag&SWAB && c)
        !           370:                do {
        !           371:                        a = *ip++;
        !           372:                        ip[-1] = *ip;
        !           373:                        *ip++ = a;
        !           374:                } while(--c);
        !           375:                ip = ibuf;
        !           376:                if (fflag) {
        !           377:                        obc = ibc;
        !           378:                        flsh();
        !           379:                        ibc = 0;
        !           380:                }
        !           381:                goto loop;
        !           382:        }
        !           383:        c = 0;
        !           384:        c |= *ip++;
        !           385:        c &= 0377;
        !           386:        (*conv)(c);
        !           387:        goto loop;
        !           388: }
        !           389: 
        !           390: flsh()
        !           391: {
        !           392:        register c;
        !           393: 
        !           394:        if(obc) {
        !           395:                if(obc == obs)
        !           396:                        nofr++; else
        !           397:                        nopr++;
        !           398:                c = write(obf, obuf, obc);
        !           399:                if(c != obc) {
        !           400:                        perror("write");
        !           401:                        term();
        !           402:                }
        !           403:                obc = 0;
        !           404:        }
        !           405: }
        !           406: 
        !           407: match(s)
        !           408: char *s;
        !           409: {
        !           410:        register char *cs;
        !           411: 
        !           412:        cs = string;
        !           413:        while(*cs++ == *s)
        !           414:                if(*s++ == '\0')
        !           415:                        goto true;
        !           416:        if(*s != '\0')
        !           417:                return(0);
        !           418: 
        !           419: true:
        !           420:        cs--;
        !           421:        string = cs;
        !           422:        return(1);
        !           423: }
        !           424: 
        !           425: number(big)
        !           426: {
        !           427:        register char *cs;
        !           428:        long n;
        !           429: 
        !           430:        cs = string;
        !           431:        n = 0;
        !           432:        while(*cs >= '0' && *cs <= '9')
        !           433:                n = n*10 + *cs++ - '0';
        !           434:        for(;;)
        !           435:        switch(*cs++) {
        !           436: 
        !           437:        case 'k':
        !           438:                n *= 1024;
        !           439:                continue;
        !           440: 
        !           441:        case 'w':
        !           442:                n *= sizeof(int);
        !           443:                continue;
        !           444: 
        !           445:        case 'b':
        !           446:                n *= 512;
        !           447:                continue;
        !           448: 
        !           449:        case '*':
        !           450:        case 'x':
        !           451:                string = cs;
        !           452:                n *= number(BIG);
        !           453: 
        !           454:        case '\0':
        !           455:                if (n>=big || n<0) {
        !           456:                        fprintf(stderr, "dd: argument %ld out of range\n", n);
        !           457:                        exit(1);
        !           458:                }
        !           459:                return(n);
        !           460:        }
        !           461:        /* never gets here */
        !           462: }
        !           463: 
        !           464: cnull(cc)
        !           465: {
        !           466:        register c;
        !           467: 
        !           468:        c = cc;
        !           469:        if(cflag&UCASE && c>='a' && c<='z')
        !           470:                c += 'A'-'a';
        !           471:        if(cflag&LCASE && c>='A' && c<='Z')
        !           472:                c += 'a'-'A';
        !           473:        null(c);
        !           474: }
        !           475: 
        !           476: null(c)
        !           477: {
        !           478: 
        !           479:        *op = c;
        !           480:        op++;
        !           481:        if(++obc >= obs) {
        !           482:                flsh();
        !           483:                op = obuf;
        !           484:        }
        !           485: }
        !           486: 
        !           487: ascii(cc)
        !           488: {
        !           489:        register c;
        !           490: 
        !           491:        c = etoa[cc] & 0377;
        !           492:        if(cbs == 0) {
        !           493:                cnull(c);
        !           494:                return;
        !           495:        }
        !           496:        if(c == ' ') {
        !           497:                nspace++;
        !           498:                goto out;
        !           499:        }
        !           500:        while(nspace > 0) {
        !           501:                null(' ');
        !           502:                nspace--;
        !           503:        }
        !           504:        cnull(c);
        !           505: 
        !           506: out:
        !           507:        if(++cbc >= cbs) {
        !           508:                null('\n');
        !           509:                cbc = 0;
        !           510:                nspace = 0;
        !           511:        }
        !           512: }
        !           513: 
        !           514: unblock(cc)
        !           515: {
        !           516:        register c;
        !           517: 
        !           518:        c = cc & 0377;
        !           519:        if(cbs == 0) {
        !           520:                cnull(c);
        !           521:                return;
        !           522:        }
        !           523:        if(c == ' ') {
        !           524:                nspace++;
        !           525:                goto out;
        !           526:        }
        !           527:        while(nspace > 0) {
        !           528:                null(' ');
        !           529:                nspace--;
        !           530:        }
        !           531:        cnull(c);
        !           532: 
        !           533: out:
        !           534:        if(++cbc >= cbs) {
        !           535:                null('\n');
        !           536:                cbc = 0;
        !           537:                nspace = 0;
        !           538:        }
        !           539: }
        !           540: 
        !           541: ebcdic(cc)
        !           542: {
        !           543:        register c;
        !           544: 
        !           545:        c = cc;
        !           546:        if(cflag&UCASE && c>='a' && c<='z')
        !           547:                c += 'A'-'a';
        !           548:        if(cflag&LCASE && c>='A' && c<='Z')
        !           549:                c += 'a'-'A';
        !           550:        c = atoe[c] & 0377;
        !           551:        if(cbs == 0) {
        !           552:                null(c);
        !           553:                return;
        !           554:        }
        !           555:        if(cc == '\n') {
        !           556:                while(cbc < cbs) {
        !           557:                        null(atoe[' ']);
        !           558:                        cbc++;
        !           559:                }
        !           560:                cbc = 0;
        !           561:                return;
        !           562:        }
        !           563:        if(cbc == cbs)
        !           564:                ntrunc++;
        !           565:        cbc++;
        !           566:        if(cbc <= cbs)
        !           567:                null(c);
        !           568: }
        !           569: 
        !           570: ibm(cc)
        !           571: {
        !           572:        register c;
        !           573: 
        !           574:        c = cc;
        !           575:        if(cflag&UCASE && c>='a' && c<='z')
        !           576:                c += 'A'-'a';
        !           577:        if(cflag&LCASE && c>='A' && c<='Z')
        !           578:                c += 'a'-'A';
        !           579:        c = atoibm[c] & 0377;
        !           580:        if(cbs == 0) {
        !           581:                null(c);
        !           582:                return;
        !           583:        }
        !           584:        if(cc == '\n') {
        !           585:                while(cbc < cbs) {
        !           586:                        null(atoibm[' ']);
        !           587:                        cbc++;
        !           588:                }
        !           589:                cbc = 0;
        !           590:                return;
        !           591:        }
        !           592:        if(cbc == cbs)
        !           593:                ntrunc++;
        !           594:        cbc++;
        !           595:        if(cbc <= cbs)
        !           596:                null(c);
        !           597: }
        !           598: 
        !           599: block(cc)
        !           600: {
        !           601:        register c;
        !           602: 
        !           603:        c = cc;
        !           604:        if(cflag&UCASE && c>='a' && c<='z')
        !           605:                c += 'A'-'a';
        !           606:        if(cflag&LCASE && c>='A' && c<='Z')
        !           607:                c += 'a'-'A';
        !           608:        c &= 0377;
        !           609:        if(cbs == 0) {
        !           610:                null(c);
        !           611:                return;
        !           612:        }
        !           613:        if(cc == '\n') {
        !           614:                while(cbc < cbs) {
        !           615:                        null(' ');
        !           616:                        cbc++;
        !           617:                }
        !           618:                cbc = 0;
        !           619:                return;
        !           620:        }
        !           621:        if(cbc == cbs)
        !           622:                ntrunc++;
        !           623:        cbc++;
        !           624:        if(cbc <= cbs)
        !           625:                null(c);
        !           626: }
        !           627: 
        !           628: term()
        !           629: {
        !           630: 
        !           631:        stats();
        !           632:        exit(0);
        !           633: }
        !           634: 
        !           635: stats()
        !           636: {
        !           637: 
        !           638:        fprintf(stderr,"%u+%u records in\n", nifr, nipr);
        !           639:        fprintf(stderr,"%u+%u records out\n", nofr, nopr);
        !           640:        if(ntrunc)
        !           641:                fprintf(stderr,"%u truncated records\n", ntrunc);
        !           642: }
        !           643: 
        !           644: enum ftype
        !           645: checktype(fd)
        !           646:        int fd;
        !           647: {
        !           648:        struct stat st;
        !           649:        struct mtget mt;
        !           650: 
        !           651:        if (fstat(fd, &st) == -1)
        !           652:                return (unknown);
        !           653:        if (S_ISFIFO(st.st_mode))
        !           654:                return (pipe);
        !           655:        if (S_ISCHR(st.st_mode)) {
        !           656:                if (ioctl(fd, MTIOCGET, (char *)&mt) != -1)
        !           657:                        return (tape);
        !           658:                return (chr);
        !           659:        }
        !           660:        return (reg);   /* or dir, symlink, blk, or ??? */
        !           661: }
        !           662: 
        !           663: advance(fd, fdtype, count)
        !           664: {
        !           665: 
        !           666:        switch (fdtype) {
        !           667:        case reg:
        !           668:        case chr:
        !           669:                lseek(fd, count, L_INCR);
        !           670:                break;
        !           671:        case pipe:
        !           672:        case tape:
        !           673:                break;
        !           674:        default:
        !           675:                fprintf(stderr, "dd: unknown input type, can't resynchronize\n");
        !           676:                exit(99);
        !           677:        }
        !           678: }
        !           679: 

unix.superglobalmegacorp.com

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