Annotation of researchv9/cmd/strip/symwrite.c, revision 1.1

1.1     ! root        1: #include "strip.h"
        !             2: #include "hash.h"
        !             3: 
        !             4: symwrite(a)
        !             5: register Adotout *a;
        !             6: {
        !             7:        int utmp;
        !             8:        struct stx {
        !             9:                char *lo, *hi;
        !            10:                int base;
        !            11:        } *stxtab, *stxend;
        !            12:        char *rindex(), *mktemp(), *strcpy();
        !            13: 
        !            14:        register struct nlist *sym;
        !            15:        register struct stx *stabx; register char *cp;
        !            16: 
        !            17:        struct st *stab; int strcount = 4;
        !            18:        int tofd, error = 0;
        !            19: 
        !            20:        mktemp(strcpy(tmpnam, "/tmp/stripXXXXXX"));
        !            21:        tofd = creat(tmpnam, 0666);
        !            22:        if (tofd < 0)
        !            23:                return failure("cannot creat ", tmpnam);
        !            24: 
        !            25:        lseek(a->fd, 0, 0);
        !            26:        error = fcopy(tofd, a->fd, N_SYMOFF(a->hd));
        !            27: 
        !            28:        if (a->symtab) {
        !            29:                stabx = stxtab = Malloc(struct stx, stcount);
        !            30:                stxend = stxtab + stcount;
        !            31:                for (stab = sroot; stab; stab = stab->next, stabx++) {
        !            32:                        stabx->lo = stab->strtab;
        !            33:                        stabx->hi = stabx->lo + stab->nused;
        !            34:                        stabx->base = (long)(stabx->lo) - strcount;
        !            35:                        strcount += stab->nused;
        !            36:                }
        !            37:                for (sym=a->symtab; sym<a->symend; sym++)
        !            38:                        if (cp = sym->n_un.n_name) {
        !            39:                                stabx = stxtab;
        !            40:                                while (cp < stabx->lo || cp >= stabx->hi) ++stabx;
        !            41:                                sym->n_un.n_name -= stabx->base;
        !            42:                        }
        !            43:                free(stxtab);
        !            44:                a->hd.a_syms = (char *)a->symend - (char *)a->symtab;
        !            45:        } else
        !            46:                a->hd.a_syms = 0;
        !            47: 
        !            48:        lseek(tofd, 0, 0);
        !            49:        error |= Write(tofd, (char *)&a->hd, sizeof(struct exec));
        !            50: 
        !            51:        if (a->symtab) {
        !            52:                lseek(tofd, N_SYMOFF(a->hd), 0);
        !            53:                error |= Write(tofd, a->symtab, a->hd.a_syms);
        !            54:                error |= Write(tofd, &strcount, 4);
        !            55:                for (stab = sroot; stab; stab = stab->next)
        !            56:                        error |= Write(tofd, stab->strtab, stab->nused);
        !            57:        }
        !            58:        error |= close(tofd);
        !            59:        close(a->fd);
        !            60:        if (error)
        !            61:                return failure("cannot write ", tmpnam);
        !            62:        if ((a->fd = open(tmpnam, 0)) < 0)
        !            63:                return failure("cannot reopen ", tmpnam);
        !            64:        fstat(a->fd, &a->filstat);
        !            65:        utmp = umask(0);
        !            66:        tofd = creat(a->name, a->filstat.st_mode);
        !            67:        (void)umask(utmp);
        !            68:        if (tofd < 0)
        !            69:                return failure("cannot creat ", a->name);
        !            70:        ++copyrace;
        !            71:        fcopy(tofd, a->fd, a->filstat.st_size);
        !            72:        close(tofd);
        !            73:        close(a->fd);
        !            74:        --copyrace;
        !            75:        if (unlink(tmpnam) < 0)
        !            76:                return failure("cannot unlink ", tmpnam);
        !            77:        return 0;
        !            78: }
        !            79: 
        !            80: failure(m1, m2)
        !            81: char *m1, *m2;
        !            82: {
        !            83:        if (m1)
        !            84:                fprintf(stderr,"%s: %s%s\n", prognam, m1, m2);
        !            85:        if (!copyrace && tmpnam[0])
        !            86:                unlink(tmpnam);
        !            87:        return 1;
        !            88: }

unix.superglobalmegacorp.com

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