Annotation of researchv10no/cmd/odist/tar/tarhdr.c, revision 1.1.1.1

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

unix.superglobalmegacorp.com

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