home *** CD-ROM | disk | FTP | other *** search
/ Usenet 1994 October / usenetsourcesnewsgroupsinfomagicoctober1994disk2.iso / std_unix / pax / 2 / names.c < prev    next >
C/C++ Source or Header  |  1989-01-07  |  5KB  |  250 lines

  1. /* $Source: /u/mark/src/pax/RCS/names.c,v $
  2.  *
  3.  * $Revision: 1.1 $
  4.  *
  5.  * names.c - Look up user and/or group names. 
  6.  *
  7.  * DESCRIPTION
  8.  *
  9.  *    These functions support UID and GID name lookup.  The results are
  10.  *    cached to improve performance.
  11.  *
  12.  * AUTHOR
  13.  *
  14.  *    Mark H. Colburn, NAPS International (mark@jhereg.mn.org)
  15.  *
  16.  * Sponsored by The USENIX Association for public distribution. 
  17.  *
  18.  * Copyright (c) 1989 Mark H. Colburn.
  19.  * All rights reserved.
  20.  *
  21.  * Redistribution and use in source and binary forms are permitted
  22.  * provided that the above copyright notice is duplicated in all such 
  23.  * forms and that any documentation, advertising materials, and other 
  24.  * materials related to such distribution and use acknowledge that the 
  25.  * software was developed * by Mark H. Colburn and sponsored by The 
  26.  * USENIX Association. 
  27.  *
  28.  * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR
  29.  * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED
  30.  * WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE.
  31.  *
  32.  * $Log:    names.c,v $
  33.  * Revision 1.1  88/12/23  18:02:19  mark
  34.  * Initial revision
  35.  * 
  36.  */
  37.  
  38. #ifndef lint
  39. static char *ident = "$Id: names.c,v 1.1 88/12/23 18:02:19 mark Rel $";
  40. static char *copyright = "Copyright (c) 1989 Mark H. Colburn.\nAll rights reserved.\n";
  41. #endif /* ! lint */
  42.  
  43.  
  44. /* Headers */
  45.  
  46. #include "pax.h"
  47.  
  48.  
  49. /* Defines */
  50.  
  51. #define myuid    ( my_uid < 0? (my_uid = getuid()): my_uid )
  52. #define    mygid    ( my_gid < 0? (my_gid = getgid()): my_gid )
  53.  
  54.  
  55. /* Internal Identifiers */
  56.  
  57. static int      saveuid = -993;
  58. static char     saveuname[TUNMLEN];
  59. static int      my_uid = -993;
  60.  
  61. static int      savegid = -993;
  62. static char     savegname[TGNMLEN];
  63. static int      my_gid = -993;
  64.  
  65.  
  66. /* finduname - find a user or group name from a uid or gid
  67.  *
  68.  * DESCRIPTION
  69.  *
  70.  *     Look up a user name from a uid/gid, maintaining a cache. 
  71.  *
  72.  * PARAMETERS
  73.  *
  74.  *    char    uname[]        - name (to be returned to user)
  75.  *    int    uuid        - id of name to find
  76.  *
  77.  *
  78.  * RETURNS
  79.  *
  80.  *    Returns a name which is associated with the user id given.  If there
  81.  *    is not name which corresponds to the user-id given, then a pointer
  82.  *    to a string of zero length is returned.
  83.  *    
  84.  * FIXME
  85.  *
  86.  *     1. for now it's a one-entry cache. 
  87.  *    2. The "-993" is to reduce the chance of a hit on the first lookup. 
  88.  */
  89.  
  90. #ifdef __STDC__
  91.  
  92. char *finduname(int uuid)
  93.  
  94. #else
  95.     
  96. char *finduname(uuid)
  97. int             uuid;
  98.  
  99. #endif
  100. {
  101.     struct passwd  *pw;
  102.  
  103.     if (uuid != saveuid) {
  104.     saveuid = uuid;
  105.     saveuname[0] = '\0';
  106.     pw = getpwuid(uuid);
  107.     if (pw) {
  108.         strncpy(saveuname, pw->pw_name, TUNMLEN);
  109.     }
  110.     }
  111.     return(saveuname);
  112. }
  113.  
  114.  
  115. /* finduid - get the uid for a given user name
  116.  *
  117.  * DESCRIPTION
  118.  *
  119.  *    This does just the opposit of finduname.  Given a user name it
  120.  *    finds the corresponding UID for that name.
  121.  *
  122.  * PARAMETERS
  123.  *
  124.  *    char    uname[]        - username to find a UID for
  125.  *
  126.  * RETURNS
  127.  *
  128.  *    The UID which corresponds to the uname given, if any.  If no UID
  129.  *    could be found, then the UID which corrsponds the user running the
  130.  *    program is returned.
  131.  *
  132.  */
  133.  
  134. #ifdef __STDC__
  135.  
  136. int finduid(char *uname)
  137.  
  138. #else
  139.     
  140. int finduid(uname)
  141. char            *uname;
  142.  
  143. #endif
  144. {
  145.     struct passwd  *pw;
  146.     extern struct passwd *getpwnam();
  147.  
  148.     if (uname[0] != saveuname[0]/* Quick test w/o proc call */
  149.     ||0 != strncmp(uname, saveuname, TUNMLEN)) {
  150.     strncpy(saveuname, uname, TUNMLEN);
  151.     pw = getpwnam(uname);
  152.     if (pw) {
  153.         saveuid = pw->pw_uid;
  154.     } else {
  155.         saveuid = myuid;
  156.     }
  157.     }
  158.     return (saveuid);
  159. }
  160.  
  161.  
  162. /* findgname - look up a group name from a gid
  163.  *
  164.  * DESCRIPTION
  165.  *
  166.  *     Look up a group name from a gid, maintaining a cache.
  167.  *    
  168.  *
  169.  * PARAMETERS
  170.  *
  171.  *    int    ggid        - goupid of group to find
  172.  *
  173.  * RETURNS
  174.  *
  175.  *    A string which is associated with the group ID given.  If no name
  176.  *    can be found, a string of zero length is returned.
  177.  */
  178.  
  179. #ifdef __STDC__
  180.  
  181. char *findgname(int ggid)
  182.  
  183. #else
  184.     
  185. char *findgname(ggid)
  186. int             ggid;
  187.  
  188. #endif
  189. {
  190.     struct group   *gr;
  191.  
  192.     if (ggid != savegid) {
  193.     savegid = ggid;
  194.     savegname[0] = '\0';
  195.     setgrent();
  196.     gr = getgrgid(ggid);
  197.     if (gr) {
  198.         strncpy(savegname, gr->gr_name, TGNMLEN);
  199.     }
  200.     }
  201.     return(savegname);
  202. }
  203.  
  204.  
  205.  
  206. /* findgid - get the gid for a given group name
  207.  *
  208.  * DESCRIPTION
  209.  *
  210.  *    This does just the opposit of finduname.  Given a group name it
  211.  *    finds the corresponding GID for that name.
  212.  *
  213.  * PARAMETERS
  214.  *
  215.  *    char    uname[]        - groupname to find a GID for
  216.  *
  217.  * RETURNS
  218.  *
  219.  *    The GID which corresponds to the uname given, if any.  If no GID
  220.  *    could be found, then the GID which corrsponds the group running the
  221.  *    program is returned.
  222.  *
  223.  */
  224.  
  225. #ifdef __STDC__
  226.  
  227. int findgid(char *gname)
  228.  
  229. #else
  230.     
  231. int findgid(gname)
  232. char           *gname;
  233.  
  234. #endif
  235. {
  236.     struct group   *gr;
  237.  
  238.     /* Quick test w/o proc call */
  239.     if (gname[0] != savegname[0] || strncmp(gname, savegname, TUNMLEN) != 0) {
  240.     strncpy(savegname, gname, TUNMLEN);
  241.     gr = getgrnam(gname);
  242.     if (gr) {
  243.         savegid = gr->gr_gid;
  244.     } else {
  245.         savegid = mygid;
  246.     }
  247.     }
  248.     return (savegid);
  249. }
  250.