home *** CD-ROM | disk | FTP | other *** search
/ Super Net 1 / SUPERNET_1.iso / PC / OTROS / MSDOS / WATTCP / PISA_TAR.TAR / tar / names.c < prev    next >
Encoding:
C/C++ Source or Header  |  1989-06-24  |  2.3 KB  |  114 lines

  1. /*
  2.  * Look up user and/or group names.
  3.  *
  4.  * This file should be modified for non-unix systems to do something
  5.  * reasonable.
  6.  *
  7.  * @(#)names.c 1.1 9/9/86 Public Domain - gnu
  8.  */ 
  9. #ifndef NONAMES
  10. #include <sys/types.h>
  11. #include <pwd.h>
  12. #include <grp.h>
  13. #include "tar.h"
  14.  
  15. static int    saveuid = -993;
  16. static char    saveuname[TUNMLEN];
  17. static int    my_uid = -993;
  18.  
  19. static int    savegid = -993;
  20. static char    savegname[TGNMLEN];
  21. static int    my_gid = -993;
  22.  
  23. #define myuid    ( my_uid < 0? my_uid = getuid(): my_uid )
  24. #define    mygid    ( my_gid < 0? my_gid = getgid(): my_gid )
  25.  
  26.  
  27. /*
  28.  * Look up a user or group name from a uid/gid, maintaining a cache.
  29.  * FIXME, for now it's a one-entry cache.
  30.  * FIXME2, the "-993" is to reduce the chance of a hit on the first lookup.
  31.  *
  32.  * This is ifdef'd because on Suns, it drags in about 38K of "yellow
  33.  * pages" code, roughly doubling the program size.  Thanks guys.
  34.  */
  35. void
  36. finduname(uname, uid)
  37.     char    uname[TUNMLEN];
  38.     int    uid;
  39. {
  40.     struct passwd    *pw;
  41.     extern struct passwd *getpwuid ();
  42.  
  43.     if (uid != saveuid) {
  44.         saveuid = uid;
  45.         saveuname[0] = '\0';
  46.         pw = getpwuid(uid); 
  47.         if (pw) 
  48.             strncpy(saveuname, pw->pw_name, TUNMLEN);
  49.     }
  50.     strncpy(uname, saveuname, TUNMLEN);
  51. }
  52.  
  53. int
  54. finduid(uname)
  55.     char    uname[TUNMLEN];
  56. {
  57.     struct passwd    *pw;
  58.     extern struct passwd *getpwnam();
  59.  
  60.     if (uname[0] != saveuname[0]    /* Quick test w/o proc call */
  61.         || 0!=strncmp(uname, saveuname, TUNMLEN)) {
  62.         strncpy(saveuname, uname, TUNMLEN);
  63.         pw = getpwnam(uname); 
  64.         if (pw) {
  65.             saveuid = pw->pw_uid;
  66.         } else {
  67.             saveuid = myuid;
  68.         }
  69.     }
  70.     return saveuid;
  71. }
  72.  
  73.  
  74. void
  75. findgname(gname, gid)
  76.     char    gname[TGNMLEN];
  77.     int    gid;
  78. {
  79.     struct group    *gr;
  80.     extern struct group *getgrgid ();
  81.  
  82.     if (gid != savegid) {
  83.         savegid = gid;
  84.         savegname[0] = '\0';
  85.         (void)setgrent();
  86.         gr = getgrgid(gid); 
  87.         if (gr) 
  88.             strncpy(savegname, gr->gr_name, TGNMLEN);
  89.     }
  90.     (void) strncpy(gname, savegname, TGNMLEN);
  91. }
  92.  
  93.  
  94. int
  95. findgid(gname)
  96.     char    gname[TUNMLEN];
  97. {
  98.     struct group    *gr;
  99.     extern struct group *getgrnam();
  100.  
  101.     if (gname[0] != savegname[0]    /* Quick test w/o proc call */
  102.         || 0!=strncmp(gname, savegname, TUNMLEN)) {
  103.         strncpy(savegname, gname, TUNMLEN);
  104.         gr = getgrnam(gname); 
  105.         if (gr) {
  106.             savegid = gr->gr_gid;
  107.         } else {
  108.             savegid = mygid;
  109.         }
  110.     }
  111.     return savegid;
  112. }
  113. #endif
  114.