home *** CD-ROM | disk | FTP | other *** search
/ Usenet 1994 October / usenetsourcesnewsgroupsinfomagicoctober1994disk2.iso / unix / volume26 / sps3 / part02 / initsymbols.c < prev    next >
C/C++ Source or Header  |  1992-05-08  |  4KB  |  115 lines

  1. # ifndef lint
  2. static char SccsId[] =    "@(#)initsymbols.c    1.4\t8/6/90" ;
  3. # endif lint
  4.  
  5. # include       "sps.h"
  6. # include       "flags.h"
  7. # ifdef BSD42
  8. #  include       <sys/file.h>
  9. # endif BSD42
  10. # ifdef KVM
  11. #  include       <kvm.h>
  12. # endif KVM
  13. # include       <nlist.h>
  14. # include       <stdio.h>
  15.  
  16. /* INITSYMBOLS - Reads kmem values into the Info structure */
  17. /*
  18. ** THIS CODE COPIES KMEM VALUES INTO THE INFO STRUCTURE ASSUMING THAT
  19. ** VALUES READ FROM THE KERNEL HAVE TYPE CADDR_T. THEREFORE, WE ARE
  20. ** MAKING THE DUBIOUS ASSUMPTION THAT INTS, POINTERS AND CADDR_T's
  21. ** HAVE IDENTICAL SIZES.
  22. */
  23. initsymbols ()
  24. {
  25.     register struct nlist   *np ;
  26.     register struct symbol  *s ;
  27.     register struct nlist   *np0 ;
  28.     char                    *filesymbol ;
  29. # ifdef KVM
  30.     extern kvm_t           *Flkvm ;
  31. # endif
  32.     extern struct flags     Flg ;
  33.     extern struct symbol    Symbollist[] ;
  34.     extern struct info      Info ;
  35.     char                    *getcore() ;
  36.     char                    *strncpy() ;
  37.  
  38.     filesymbol = Flg.flg_s ? Flg.flg_s : FILE_SYMBOL ;
  39.     /* Find the length of the symbol table */
  40.     for ( s = Symbollist ; s->s_kname ; s++ )
  41.         ;
  42.     /* Construct an nlist structure by copying names from the symbol table*/
  43.     np0 = (struct nlist*)getcore( (s-Symbollist+1)*sizeof( struct nlist ) );
  44.     for ( s = Symbollist, np = np0 ; s->s_kname ; s++, np++ )
  45.     {
  46. # ifdef SUN386I
  47.         /* Remove '_' prefix because 386i uses COFF format -
  48.            Provided by Martin Reed <mr@ritd.co.uk> */
  49.         np->n_name = &s->s_kname[1] ;       
  50. # else SUN386I
  51.                                      
  52.         np->n_name = s->s_kname ; 
  53. # endif SUN386I     
  54.         np[1].n_name = (char*)0 ;       
  55.         np->n_value = 0 ;
  56.     }
  57. # ifdef KVM
  58.     if ( kvm_nlist( Flkvm, np0 ) == -1 )
  59.     {
  60.         fprintf( stderr, "sps - Can't read symbol file %s", filesymbol);
  61.         sysperror() ;
  62.     }
  63.               
  64. # else KVM
  65. #  ifdef BSD42
  66.     if ( access( filesymbol, R_OK ) < 0 )
  67. #  else BSD42
  68.     if ( access( filesymbol, 4 ) < 0 )
  69. #  endif BSD42
  70.     {
  71.         fprintf( stderr, "sps - Can't open symbol file %s", filesymbol);
  72.         sysperror() ;
  73.     }
  74.     /* Get kernel addresses */
  75.     (void)nlist( filesymbol, np0 ) ;              
  76.     if ( np0[0].n_value == -1 )
  77.     {
  78.         fprintf( stderr, "sps - Can't read symbol file %s", filesymbol);
  79.         sysperror() ;
  80.     }
  81. # endif KVM
  82.     for ( s = Symbollist, np = np0 ; s->s_kname ; s++, np++ )
  83.     {                                       
  84.         if ( !np->n_value )             
  85.         {
  86.             fprintf( stderr, "sps - Can't find symbol %s in %s",
  87.                 np->n_name, filesymbol ) ;
  88.             /* Assume this error to be unimportant if the address
  89.                is only associated with a process wait state.
  90.                This may happen if the system has been configured
  91.                without a particular device. */
  92.             fprintf( stderr, &Info.i_waitstate[ 0 ] <= s->s_info
  93.                 && s->s_info < &Info.i_waitstate[ NWAITSTATE ]
  94.                 ? " (error is not serious)\n"
  95.                 : " (ERROR MAY BE SERIOUS)\n" ) ;
  96.             *s->s_info = (caddr_t)0 ;
  97.             continue ;
  98.         }
  99.         /* If no indirection is required, just copy the obtained value
  100.            into the `Info' structure. */
  101.         if ( !s->s_indirect )           
  102.         {                               
  103.         /* DUBIOUS ASSUMPTION THAT KMEM VALUE HAS SIZE OF A CADDR_T */
  104.             *s->s_info = (caddr_t)np->n_value ;
  105.             continue ;              
  106.         }                               
  107.         /* Otherwise one level of indirection is required. Using the
  108.            obtained address, look again in the kernel for the value */
  109.         /* DUBIOUS ASSUMPTION THAT KMEM VALUE HAS SIZE OF A CADDR_T */
  110.         (void)getkmem( (long)np->n_value, (char*)s->s_info,
  111.             sizeof(caddr_t) ) ;
  112.     }
  113.     free( (char*)np0 ) ;
  114. }
  115.