Annotation of 43BSDReno/sys/nfs/TEST/unix-tests/special/holey.c, revision 1.1

1.1     ! root        1: /*     @(#)holey.c     1.2 90/01/03 NFS Rev 2 Testsuite
        !             2:  *     1.3 Lachman ONC Test Suite source
        !             3:  *
        !             4:  * test read/write of holey files
        !             5:  */
        !             6: #include <sys/param.h>
        !             7: #ifndef major
        !             8: #include <sys/types.h>
        !             9: #endif
        !            10: #include <sys/stat.h>
        !            11: #include <stdio.h>
        !            12: #ifdef SVR3
        !            13: #include <fcntl.h>
        !            14: #else
        !            15: #include <sys/file.h>
        !            16: #endif
        !            17: 
        !            18: #ifndef L_INCR
        !            19: #define L_INCR 1
        !            20: #define L_SET  0
        !            21: #endif
        !            22: 
        !            23: #ifndef MIN
        !            24: #define MIN(a, b)      ((a) < (b) ? (a) : (b))
        !            25: #endif
        !            26: 
        !            27: #define BUFSZ   8192
        !            28: #define FILESZ 70000
        !            29: #define DATASZ 4321
        !            30: #define HOLESZ 9012
        !            31: #define FILENM  "holeyfile"
        !            32: int Debug = 0;
        !            33: char *Prog;
        !            34: 
        !            35: main(argc, argv)
        !            36: int argc;
        !            37: char *argv[];
        !            38: {
        !            39:        int fd, i, tot, ct, sz, bytes, ret;
        !            40:        char *filenm = FILENM;
        !            41:        char buf[BUFSZ];
        !            42:        extern int errno;
        !            43:        int filesz = FILESZ;
        !            44:        int datasz = DATASZ;
        !            45:        int holesz = HOLESZ;
        !            46:        extern long lseek();
        !            47: 
        !            48:        Prog = argv[0];
        !            49:        if (argc > 1 && !strcmp(argv[1], "-d")) {
        !            50:                Debug = 1;
        !            51:                argc--;
        !            52:                argv++;
        !            53:        }
        !            54:        if (argc > 5 || (argc > 1 && !strcmp(argv[1], "-h"))) {
        !            55:                fprintf(stderr, "\
        !            56: usage: %s [filename filesize datasize holesize]\n", Prog);
        !            57:                exit(1);
        !            58:        }
        !            59:        if (argc > 1 && strcmp(argv[1], "-"))
        !            60:                filenm =       argv[1];
        !            61:        if (argc > 2 && strcmp(argv[2], "-"))
        !            62:                filesz =  atoi(argv[2]);
        !            63:        if (argc > 3 && strcmp(argv[3], "-"))
        !            64:                datasz =  atoi(argv[3]);
        !            65:        if (argc > 4 && strcmp(argv[4], "-"))
        !            66:                holesz =  atoi(argv[4]);
        !            67: 
        !            68:        umask(0);
        !            69:        if (datasz > BUFSZ) {
        !            70:                fprintf(stderr, "%s: datasize (%d) greater than maximum (%d)\n",
        !            71:                        Prog, datasz, BUFSZ);
        !            72:                exit(1);
        !            73:        }
        !            74:        if ((fd = creat(filenm, 0666)) < 0) {
        !            75:                sprintf(buf, "%s: creat of %s", Prog, filenm);
        !            76:                perror(buf);
        !            77:                exit(1);
        !            78:        }
        !            79:        if (close(fd)) {
        !            80:                sprintf(buf, "%s: close of %s after creat", Prog, filenm);
        !            81:                perror(buf);
        !            82:                exit(1);
        !            83:        }
        !            84:        if ((fd = open(filenm, 2)) < 0) {
        !            85:                sprintf(buf, "%s: open of %s", Prog, filenm);
        !            86:                perror(buf);
        !            87:                exit(1);
        !            88:        }
        !            89:        for (i=0; i < BUFSZ / sizeof(int); i++)
        !            90:                ((int *)buf)[i] = i;
        !            91: 
        !            92:        for (sz = filesz; sz > 0; ) {
        !            93:                if (datasz || sz == 1) {
        !            94:                        bytes = MIN(sz, datasz);
        !            95:                        if (bytes == 0)
        !            96:                                bytes = 1;
        !            97:                        if ((ret = write(fd, buf, bytes)) != bytes) {
        !            98:                                fprintf(stderr, "write ret %d (expect %d)\n",
        !            99:                                        ret, bytes);
        !           100:                                if (errno) perror("write");
        !           101:                                exit(1);
        !           102:                        }
        !           103:                        sz -= bytes;
        !           104:                }
        !           105:                if (sz && holesz) {
        !           106:                        bytes = MIN(sz - 1, holesz);
        !           107:                        if (lseek(fd, bytes, L_INCR) == -1L) {
        !           108:                                perror("lseek (write)");
        !           109:                                exit(1);
        !           110:                        }
        !           111:                        sz -= bytes;
        !           112:                }
        !           113:        }
        !           114:        if (lseek(fd, 0, L_SET) == -1L) {
        !           115:                perror("lseek (rewind)");
        !           116:                exit(1);
        !           117:        }
        !           118: 
        !           119:        for (sz = filesz; sz > 0; ) {
        !           120:                if (datasz || sz == 1) {
        !           121:                        bytes = MIN(sz, datasz);
        !           122:                        if (bytes == 0)
        !           123:                                bytes = 1;
        !           124:                        sz -= bytes;
        !           125:                        for ( ; bytes > 0; bytes -= ret) {
        !           126:                                if (Debug) 
        !           127:                                        fprintf(stderr, "\
        !           128: --data read: offset %d, sz = %d, bytes = %d\n", filesz - sz - bytes, sz, bytes);
        !           129:                                if ((ret = read(fd, buf, bytes)) <= 0) {
        !           130:                                        fprintf(stderr, "\
        !           131: read (data) offset %d, sz = %d, bytes = %d (ret = %d), datasz = %d\n",
        !           132: filesz - sz - bytes, sz, bytes, ret, datasz);
        !           133:                                        if (ret < 0)
        !           134:                                                perror("read");
        !           135:                                        exit(1);
        !           136:                                }
        !           137:                                ct = bytes - (bytes % sizeof(int));
        !           138:                                if (Debug)
        !           139:                                        fprintf(stderr, "\
        !           140:   ret = %d, ct = %d\n", ret, ct);
        !           141:                                for (i=0; i < ct / sizeof(int); i++) {
        !           142:                                        if (((int *)buf)[i] != i) {
        !           143:                                                fprintf(stderr, "\
        !           144: bad data in %s\n", filenm);
        !           145:                                                exit(1);
        !           146:                                        }
        !           147:                                }
        !           148:                        }
        !           149:                }
        !           150:                if (sz && holesz) {
        !           151:                        tot   = MIN(holesz, sz - 1);
        !           152:                        sz -= tot;
        !           153:                        for (ct = 0; tot > 0; tot -= ret, ct += ret) {
        !           154:                                bytes = MIN(tot, BUFSZ);
        !           155:                                if (Debug)
        !           156:                                        fprintf(stderr, "\
        !           157: ++hole read: offset %d, sz = %d, tot = %d, bytes = %d\n",
        !           158:                                        filesz - sz - tot, sz, tot, bytes);
        !           159:                                if ((ret = read(fd, buf, bytes)) <= 0) {
        !           160:                                        fprintf(stderr, "\
        !           161: read (hole) offset %d, sz = %d, bytes = %d (ret %d), holesz = %d\n",
        !           162: filesz - sz - tot, sz, bytes, ret, holesz);
        !           163:                                        if (ret < 0)
        !           164:                                                perror("read");
        !           165:                                        exit(1);
        !           166:                                }
        !           167:                                if (Debug)
        !           168:                                        fprintf(stderr, "  ret = %d\n", ret);
        !           169:                                for (i = 0; i < ret; i++) {
        !           170:                                        if (buf[i] != '\0') {
        !           171:                                                fprintf(stderr, "\
        !           172: non-zero data read back from hole (offset %d)\n", filesz - sz + ct + i);
        !           173:                                                exit(1);
        !           174:                                        }
        !           175:                                }
        !           176:                        }
        !           177:                }
        !           178:        }
        !           179:        printf("\nHoley file test ok\n");
        !           180:        exit(0);
        !           181: }

unix.superglobalmegacorp.com

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