Annotation of researchv9/jerq/sgs/libld/ldgetname.c, revision 1.1.1.1

1.1       root        1: #include <stdio.h>
                      2: #include "filehdr.h"
                      3: #include "syms.h"
                      4: #include "ldfcn.h"
                      5: 
                      6: char *
                      7: ldgetname(ldptr, symentry)
                      8:        register LDFILE *ldptr;
                      9:        register SYMENT *symentry;
                     10: {
                     11:        static char buffer[BUFSIZ + SYMNMLEN];
                     12:        extern int vldldptr();
                     13:        extern char *strncpy();
                     14: #ifdef FLEXNAMES
                     15:        extern char *strcpy();
                     16:        extern char *malloc();
                     17:        extern void free();
                     18:        static char *strtab = NULL;
                     19:        static int last_fnum_ = 0;
                     20:        static long last_offset = -1L;
                     21:        static long length;
                     22: #endif
                     23: 
                     24:        if (vldldptr(ldptr) != SUCCESS)
                     25:                return (NULL);
                     26: #ifdef FLEXNAMES
                     27:        if (symentry->n_zeroes == 0L)   /* stored in string table */
                     28:        {
                     29:                /*
                     30:                * Different archive members are noted by the OFFSET change.
                     31:                * Otherwise, normal other ldptr's are distinguished by
                     32:                * the different _fnum_'s.
                     33:                */
                     34:                if (last_offset != OFFSET(ldptr) ||
                     35:                        last_fnum_ != ldptr->_fnum_)
                     36:                {
                     37:                        long string_begin, home;
                     38: 
                     39:                        if (strtab != NULL)
                     40:                                free(strtab);
                     41:                        string_begin = HEADER(ldptr).f_symptr +
                     42:                                HEADER(ldptr).f_nsyms * SYMESZ;
                     43:                        home = FTELL(ldptr);
                     44:                        if (FSEEK(ldptr, string_begin, BEGINNING) != OKFSEEK ||
                     45:                                FREAD((char *)&length, sizeof(long), 1, ldptr)
                     46:                                != 1 ||
                     47:                                (strtab = malloc((unsigned)length)) == NULL ||
                     48:                                FREAD(strtab + sizeof(long), sizeof(char),
                     49:                                length - sizeof(long), ldptr)
                     50:                                != length - sizeof(long) ||
                     51:                                fseek(IOPTR(ldptr), home, 0) != OKFSEEK ||
                     52:                                strtab[length - 1] != '\0')
                     53:                        {
                     54:                                /*
                     55:                                * Try to have no side effects if an error
                     56:                                * occurs somewhere...
                     57:                                */
                     58:                                (void)fseek(IOPTR(ldptr), home, 0);
                     59:                                return (NULL);
                     60:                        }
                     61:                        last_fnum_ = ldptr->_fnum_;
                     62:                        last_offset = OFFSET(ldptr);
                     63:                }
                     64:                if (length <= symentry->n_offset)
                     65:                        return (NULL);
                     66:                return (strcpy(buffer, strtab + symentry->n_offset));
                     67:        }
                     68:        else    /* still in old COFF location */
                     69: #endif
                     70:        {
                     71:                (void)strncpy(buffer, symentry->n_name, SYMNMLEN);
                     72:                buffer[SYMNMLEN] = '\0';
                     73:                return (buffer);
                     74:        }
                     75: }
                     76: 
                     77: static char ID[] = "@(#) ldgetname.c: 1.2 2/16/83";

unix.superglobalmegacorp.com

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