X-Git-Url: https://git.subgeniuskitty.com/unix-history/.git/blobdiff_plain/30c310a463ac3ce27e6ee6b9e7af4e44fb5cfba8..638231e6203d8d8447c87fcb959bb90da83f521f:/usr/src/usr.bin/ranlib/ranlib.c diff --git a/usr/src/usr.bin/ranlib/ranlib.c b/usr/src/usr.bin/ranlib/ranlib.c index fbf8cd8811..75635ce5a7 100644 --- a/usr/src/usr.bin/ranlib/ranlib.c +++ b/usr/src/usr.bin/ranlib/ranlib.c @@ -1,238 +1,89 @@ -#ifndef lint -static char sccsid[] = "@(#)ranlib.c 4.8 %G%"; -#endif -/* - * ranlib - create table of contents for archive; string table version +/*- + * Copyright (c) 1990 The Regents of the University of California. + * All rights reserved. + * + * This code is derived from software contributed to Berkeley by + * Hugh Smith at The University of Guelph. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. All advertising materials mentioning features or use of this software + * must display the following acknowledgement: + * This product includes software developed by the University of + * California, Berkeley and its contributors. + * 4. Neither the name of the University nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. */ -#include -#include -#include -#include -#include - -struct ar_hdr archdr; -#define OARMAG 0177545 -long arsize; -struct exec exp; -FILE *fi, *fo; -long off, oldoff; -long atol(), ftell(); -#define TABSZ 6000 -struct ranlib tab[TABSZ]; -int tnum; -#define STRTABSZ 75000 -char tstrtab[STRTABSZ]; -int tssiz; -char *strtab; -int ssiz; -int new; -char tempnm[] = "__.SYMDEF"; -char firstname[17]; - -main(argc, argv) -char **argv; -{ - char cmdbuf[BUFSIZ]; - /* magbuf must be an int array so it is aligned on an int-ish - boundary, so that we may access its first word as an int! */ - int magbuf[(SARMAG+sizeof(int))/sizeof(int)]; - register int just_touch = 0; - - /* check for the "-t" flag" */ - if (argc > 1 && strcmp(argv[1], "-t") == 0) { - just_touch++; - argc--; - argv++; - } - - --argc; - while(argc--) { - if (just_touch) { - fixdate(*++argv); - continue; - } - - fi = fopen(*++argv,"r"); - if (fi == NULL) { - fprintf(stderr, "ranlib: cannot open %s\n", *argv); - continue; - } - off = SARMAG; - fread((char *)magbuf, 1, SARMAG, fi); - if (strncmp((char *)magbuf, ARMAG, SARMAG)) { - if (magbuf[0] == OARMAG) - fprintf(stderr, "old format "); - else - fprintf(stderr, "not an "); - fprintf(stderr, "archive: %s\n", *argv); - continue; - } - fseek(fi, 0L, 0); - new = tnum = 0; - if (nextel(fi) == 0) { - fclose(fi); - continue; - } - do { - long o; - register n; - struct nlist sym; - fread((char *)&exp, 1, sizeof(struct exec), fi); - if (N_BADMAG(exp)) - continue; - if (!strncmp(tempnm, archdr.ar_name, sizeof(archdr.ar_name))) - continue; - if (exp.a_syms == 0) { - fprintf(stderr, "ranlib: warning: %s(%s): no symbol table\n", *argv, archdr.ar_name); - continue; - } - o = N_STROFF(exp) - sizeof (struct exec); - if (ftell(fi)+o+sizeof(ssiz) >= off) { - fprintf(stderr, "ranlib: warning: %s(%s): old format .o file\n", *argv, archdr.ar_name); - continue; - } - fseek(fi, o, 1); - fread((char *)&ssiz, 1, sizeof (ssiz), fi); - if (ssiz < sizeof ssiz){ - /* sanity check */ - fprintf(stderr, "ranlib: warning: %s(%s): mangled string table\n", *argv, archdr.ar_name); - continue; - } - strtab = (char *)calloc(1, ssiz); - if (strtab == 0) { - fprintf(stderr, "ranlib: ran out of memory\n"); - exit(1); - } - fread(strtab+sizeof(ssiz), ssiz - sizeof(ssiz), 1, fi); - fseek(fi, -(exp.a_syms+ssiz), 1); - n = exp.a_syms / sizeof(struct nlist); - while (--n >= 0) { - fread((char *)&sym, 1, sizeof(sym), fi); - if (sym.n_un.n_strx == 0) - continue; - sym.n_un.n_name = strtab + sym.n_un.n_strx; - if ((sym.n_type&N_EXT)==0) - continue; - switch (sym.n_type&N_TYPE) { - - case N_UNDF: - if (sym.n_value!=0) - stash(&sym); - continue; +#ifndef lint +char copyright[] = +"@(#) Copyright (c) 1990 The Regents of the University of California.\n\ + All rights reserved.\n"; +#endif /* not lint */ - default: - stash(&sym); - continue; - } - } - } while(nextel(fi)); - new = fixsize(); - fclose(fi); - fo = fopen(tempnm, "w"); - if(fo == NULL) { - fprintf(stderr, "can't create temporary\n"); - exit(1); - } - tnum *= sizeof (struct ranlib); - fwrite(&tnum, 1, sizeof (tnum), fo); - tnum /= sizeof (struct ranlib); - fwrite((char *)tab, tnum, sizeof(struct ranlib), fo); - fwrite(&tssiz, 1, sizeof (tssiz), fo); - fwrite(tstrtab, tssiz, 1, fo); - fclose(fo); - if(new) - sprintf(cmdbuf, "ar rlb %s %s %s\n", firstname, *argv, tempnm); - else - sprintf(cmdbuf, "ar rl %s %s\n", *argv, tempnm); - if(system(cmdbuf)) - fprintf(stderr, "ranlib: ``%s'' failed\n", cmdbuf); - else - fixdate(*argv); - unlink(tempnm); - } - exit(0); -} +#ifndef lint +static char sccsid[] = "@(#)ranlib.c 5.6 (Berkeley) 2/26/91"; +#endif /* not lint */ -nextel(af) -FILE *af; -{ - register r; - register char *cp; +#include +#include +#include +#include +#include - oldoff = off; - fseek(af, off, 0); - r = fread((char *)&archdr, 1, sizeof(struct ar_hdr), af); - if (r != sizeof(struct ar_hdr)) - return(0); - for (cp=archdr.ar_name; cp < & archdr.ar_name[sizeof(archdr.ar_name)]; cp++) - if (*cp == ' ') - *cp = '\0'; - arsize = atol(archdr.ar_size); - if (arsize & 1) - arsize++; - off = ftell(af) + arsize; - return(1); -} +CHDR chdr; +u_int options; /* UNUSED -- keep open_archive happy */ +char *archive; -stash(s) - struct nlist *s; +main(argc, argv) + int argc; + char **argv; { - int i; - register char *cp; - - if(tnum >= TABSZ) { - fprintf(stderr, "ranlib: symbol table overflow\n"); - exit(1); - } - tab[tnum].ran_un.ran_strx = tssiz; - tab[tnum].ran_off = oldoff; - for (cp = s->n_un.n_name; tstrtab[tssiz++] = *cp++;) - if (tssiz > STRTABSZ) { - fprintf(stderr, "ranlib: string table overflow\n"); - exit(1); + extern int optind; + int ch, eval, tflag; + + tflag = 0; + while ((ch = getopt(argc, argv, "t")) != EOF) + switch(ch) { + case 't': + tflag = 1; + break; + case '?': + default: + usage(); } - tnum++; -} + argc -= optind; + argv += optind; -fixsize() -{ - int i; - off_t offdelta; + if (!*argv) + usage(); - if (tssiz&1) - tssiz++; - offdelta = sizeof(archdr) + sizeof (tnum) + tnum * sizeof(struct ranlib) + - sizeof (tssiz) + tssiz; - off = SARMAG; - nextel(fi); - if(strncmp(archdr.ar_name, tempnm, sizeof (archdr.ar_name)) == 0) { - new = 0; - offdelta -= sizeof(archdr) + arsize; - } else { - new = 1; - strncpy(firstname, archdr.ar_name, sizeof(archdr.ar_name)); - } - for(i=0; i