Annotation of researchv10no/cmd/dist/lib/tarhdr.c, revision 1.1

1.1     ! root        1: #include <stdio.h>
        !             2: #include <string.h>
        !             3: #include <time.h>
        !             4: #include "lib.h"
        !             5: 
        !             6: static int
        !             7: chksum(struct tarbuf *buf)
        !             8: {
        !             9:        char *p;
        !            10:        int sum;
        !            11: 
        !            12:        p = (char *) buf;
        !            13:        for (sum = 0; p < buf->chksum; ++p)
        !            14:                sum += *(unsigned char *) p;
        !            15:        sum += ' ' * sizeof buf->chksum;
        !            16:        for (p = buf->chksum + sizeof buf->chksum; p < (char *) (buf + 1); ++p)
        !            17:                sum += *(unsigned char *) p;
        !            18:        return sum;
        !            19: }
        !            20: 
        !            21: /* opposite of strncpy */
        !            22: static void
        !            23: cpystrn(char *dst, char *src, int n)
        !            24: {
        !            25:        while (n-- && (*dst++ = *src++))
        !            26:                ;
        !            27:        *dst = '\0';
        !            28: }
        !            29: 
        !            30: static int
        !            31: getoct(unsigned long *dst, char *src, int n)
        !            32: {
        !            33:        *dst = 0;
        !            34:        while (n && *src == ' ')
        !            35:                ++src, --n;
        !            36:        while (n && *src >= '0' && *src <= '7') {
        !            37:                *dst = 8 * *dst + *src - '0';
        !            38:                ++src, --n;
        !            39:        }
        !            40:        while (n) {
        !            41:                if (*src && *src != ' ')
        !            42:                        return 1;
        !            43:                ++src, --n;
        !            44:        }
        !            45:        return 0;
        !            46: }
        !            47: 
        !            48: static void
        !            49: putoct(char *dst, unsigned long val, int n)
        !            50: {
        !            51:        char temp[24], *sp;
        !            52: 
        !            53:        sp = temp;
        !            54:        do {    /* at least one digit */
        !            55:                *sp++ = val % 8 + '0';
        !            56:                val /= 8;
        !            57:        } while (val);
        !            58:        while ((n - 1) - (sp - temp))
        !            59:                *dst++ = ' ', --n;
        !            60:        while (sp > temp)
        !            61:                *dst++ = *--sp, --n;
        !            62:        while (n--)
        !            63:                *dst++ = ' ';
        !            64: }
        !            65: 
        !            66: int
        !            67: thdrget(struct tarhdr *hdr, struct tarbuf *buf)
        !            68: {
        !            69:        int nerr, len, id, bufsum, mysum;
        !            70:        char name[sizeof buf->uname], *np;
        !            71:        unsigned long otmp;
        !            72: 
        !            73:        nerr = 0;
        !            74:        memset(hdr, 0, sizeof *hdr);
        !            75:        cpystrn(hdr->name, buf->prefix, sizeof buf->prefix);
        !            76:        if (len = strlen(hdr->name))
        !            77:                hdr->name[len++] = '/';
        !            78:        cpystrn(hdr->name + len, buf->name, sizeof buf->name);
        !            79: #define OCT(V, S) nerr += getoct(&otmp, S, sizeof S), V = otmp
        !            80:        OCT(hdr->mode, buf->mode);
        !            81:        OCT(hdr->uid, buf->uid);
        !            82:        OCT(hdr->gid, buf->gid);
        !            83:        OCT(hdr->size, buf->size);
        !            84:        OCT(hdr->mtime, buf->mtime);
        !            85:        OCT(bufsum, buf->chksum);
        !            86:        mysum = chksum(buf);
        !            87:        nerr += bufsum != mysum;
        !            88:        hdr->typeflag = buf->typeflag[0];
        !            89:        cpystrn(hdr->linkname, buf->linkname, sizeof buf->linkname);
        !            90:        len = strlen(hdr->name);
        !            91:        if (memcmp(buf->magic, TMAGIC, TMAGLEN) == 0
        !            92:        && memcmp(buf->version, TVERSION, TVERSLEN) == 0) {
        !            93:                if (hdr->typeflag == DIRTYPE && hdr->name[len - 1] != '/')
        !            94:                        hdr->name[len++] = '/', hdr->name[len] = '\0';
        !            95:                cpystrn(name, buf->uname, sizeof buf->uname - 1);
        !            96:                id = uidnum(name);
        !            97:                if (id != -1)
        !            98:                        hdr->uid = id;
        !            99:                cpystrn(name, buf->gname, sizeof buf->gname - 1);
        !           100:                id = gidnum(name);
        !           101:                if (id != -1)
        !           102:                        hdr->gid = id;
        !           103:                OCT(hdr->devmajor, buf->devmajor);
        !           104:                OCT(hdr->devminor, buf->devminor);
        !           105:        } else {
        !           106:                if (hdr->name[len - 1] == '/')
        !           107:                        hdr->typeflag = DIRTYPE;
        !           108:                np = uidstr(hdr->uid);
        !           109:                if (np)
        !           110:                        cpystrn(hdr->uname, np, sizeof buf->uname - 1);
        !           111:                np = gidstr(hdr->gid);
        !           112:                if (np)
        !           113:                        cpystrn(hdr->gname, np, sizeof buf->gname - 1);
        !           114:                hdr->devmajor = 0;
        !           115:                hdr->devminor = 0;
        !           116:        }
        !           117:        if (hdr->typeflag == AREGTYPE)
        !           118:                hdr->typeflag = REGTYPE;
        !           119: #undef OCT
        !           120:        return nerr;
        !           121: }
        !           122: 
        !           123: int
        !           124: thdrput(struct tarbuf *buf, struct tarhdr *hdr)
        !           125: {
        !           126:        int npref, mysum;
        !           127:        char *slash, *s;
        !           128: 
        !           129:        memset(buf, 0, sizeof *buf);
        !           130:        if (strlen(hdr->name) > sizeof buf->name) {
        !           131:                /* split on a '/' */
        !           132:                npref = 0;
        !           133:                while (slash = strchr(hdr->name + npref + 1, '/')) {
        !           134:                        npref = slash - hdr->name;
        !           135:                        if (strlen(slash + 1) <= sizeof buf->name)
        !           136:                                break;
        !           137:                }
        !           138:                if (!slash || npref > sizeof buf->prefix)
        !           139:                        return 1;
        !           140:                strncpy(buf->name, slash + 1, sizeof buf->name);
        !           141:                *slash = '\0';          /* evil */
        !           142:                strncpy(buf->prefix, hdr->name, sizeof buf->prefix);
        !           143:                *slash = '/';
        !           144:        } else
        !           145:                strncpy(buf->name, hdr->name, sizeof buf->name);
        !           146:        if (hdr->uname[0])
        !           147:                hdr->uid = uidnum(hdr->uname);
        !           148:        else if (s = uidstr(hdr->uid)) {
        !           149:                hdr->uname[TUGNAMEMAX] = '\0';
        !           150:                strncpy(hdr->uname, s, TUGNAMEMAX);
        !           151:        }
        !           152:        if (hdr->gname[0])
        !           153:                hdr->gid = gidnum(hdr->gname);
        !           154:        else if (s = gidstr(hdr->gid)) {
        !           155:                hdr->gname[TUGNAMEMAX] = '\0';
        !           156:                strncpy(hdr->gname, s, TUGNAMEMAX);
        !           157:        }
        !           158: #define OCT(S, V) putoct(S, V, sizeof S)
        !           159:        OCT(buf->mode, hdr->mode);
        !           160:        OCT(buf->uid, hdr->uid);
        !           161:        OCT(buf->gid, hdr->gid);
        !           162:        OCT(buf->size, hdr->size);
        !           163:        OCT(buf->mtime, hdr->mtime);
        !           164:        buf->typeflag[0] = hdr->typeflag;
        !           165:        strncpy(buf->linkname, hdr->linkname, sizeof buf->linkname);
        !           166:        strncpy(buf->magic, TMAGIC, TMAGLEN);
        !           167:        strncpy(buf->version, TVERSION, TVERSLEN);
        !           168:        strncpy(buf->uname, hdr->uname, TUGNAMEMAX);
        !           169:        strncpy(buf->gname, hdr->gname, TUGNAMEMAX);
        !           170:        if (hdr->typeflag == BLKTYPE || hdr->typeflag == CHRTYPE) {
        !           171:                OCT(buf->devmajor, hdr->devmajor);
        !           172:                OCT(buf->devminor, hdr->devminor);
        !           173:        }
        !           174:        mysum = chksum(buf);
        !           175:        OCT(buf->chksum, mysum);
        !           176:        return 0;
        !           177: #undef OCT
        !           178: }

unix.superglobalmegacorp.com

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