|
DataMuseum.dkPresents historical artifacts from the history of: DKUUG/EUUG Conference tapes |
This is an automatic "excavation" of a thematic subset of
See our Wiki for more about DKUUG/EUUG Conference tapes Excavated with: AutoArchaeologist - Free & Open Source Software. |
top - metrics - downloadIndex: T i
Length: 3000 (0xbb8) Types: TextFile Names: »initsymbols.c«
└─⟦a0efdde77⟧ Bits:30001252 EUUGD11 Tape, 1987 Spring Conference Helsinki └─⟦this⟧ »EUUGD11/euug-87hel/sec8/sps/initsymbols.c«
# include "sps.h" # include "flags.h" # ifdef BSD42 # include <sys/file.h> # endif # include <nlist.h> # include <stdio.h> /* INITSYMBOLS - Reads kmem values into the Info structure */ /* ** THIS CODE COPIES KMEM VALUES INTO THE INFO STRUCTURE ASSUMING THAT ** VALUES READ FROM THE KERNEL HAVE TYPE CADDR_T. THEREFORE, WE ARE ** MAKING THE DUBIOUS ASSUMPTION THAT INTS, POINTERS AND CADDR_T's ** HAVE IDENTICAL SIZES. */ initsymbols () { register struct nlist *np ; register struct symbol *s ; register struct nlist *np0 ; char *filesymbol ; extern int Flkmem ; extern struct flags Flg ; extern struct symbol Symbollist[] ; extern struct info Info ; char *getcore() ; char *strncpy() ; filesymbol = Flg.flg_s ? Flg.flg_s : FILE_SYMBOL ; /* Find the length of the symbol table */ for ( s = Symbollist ; s->s_kname ; s++ ) ; /* Construct an nlist structure by copying names from the symbol table*/ np0 = (struct nlist*)getcore( (s-Symbollist+1)*sizeof( struct nlist ) ); for ( s = Symbollist, np = np0 ; s->s_kname ; s++, np++ ) { np->n_name = s->s_kname ; np[1].n_name = (char*)0 ; np->n_value = 0 ; } # ifdef BSD42 if ( access( filesymbol, R_OK ) < 0 ) # else if ( access( filesymbol, 4 ) < 0 ) # endif { fprintf( stderr, "sps - Can't open symbol file %s", filesymbol); sysperror() ; } /* Get kernel addresses */ (void)nlist( filesymbol, np0 ) ; if ( np0[0].n_value == -1 ) { fprintf( stderr, "sps - Can't read symbol file %s", filesymbol); sysperror() ; } for ( s = Symbollist, np = np0 ; s->s_kname ; s++, np++ ) { if ( !np->n_value ) { fprintf( stderr, "sps - Can't find symbol %s in %s", np->n_name, filesymbol ) ; /* Assume this error to be unimportant if the address is only associated with a process wait state. This may happen if the system has been configured without a particular device. */ fprintf( stderr, &Info.i_waitstate[ 0 ] <= s->s_info && s->s_info < &Info.i_waitstate[ NWAITSTATE ] ? " (error is not serious)\n" : " (ERROR MAY BE SERIOUS)\n" ) ; *s->s_info = (caddr_t)0 ; continue ; } /* If no indirection is required, just copy the obtained value into the `Info' structure. */ if ( !s->s_indirect ) { /* DUBIOUS ASSUMPTION THAT KMEM VALUE HAS SIZE OF A CADDR_T */ *s->s_info = (caddr_t)np->n_value ; continue ; } /* Otherwise one level of indirection is required. Using the obtained address, look again in the kernel for the value */ memseek( Flkmem, (long)np->n_value ) ; /* DUBIOUS ASSUMPTION THAT KMEM VALUE HAS SIZE OF A CADDR_T */ (void)read( Flkmem, (char*)s->s_info, sizeof(caddr_t) ) ; } free( (char*)np0 ) ; }