Annotation of coherent/e/bin/pax/names.c, revision 1.1.1.1

1.1       root        1: /* $Source: /src386/usr/bin/pax/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 ([email protected])
                     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 MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
                     31:  *
                     32:  * $Log:       names.c,v $
                     33:  * Revision 1.1  92/08/28  08:02:21  bin
                     34:  * Initial revision
                     35:  * 
                     36:  * Revision 1.1  89/02/14  16:48:03  jep
                     37:  * Initial revision
                     38:  * 
                     39:  * Revision 1.1  88/12/23  18:02:19  mark
                     40:  * Initial revision
                     41:  * 
                     42:  */
                     43: 
                     44: #ifndef lint
                     45: static char *ident = "$Id: names.c,v 1.1 92/08/28 08:02:21 bin Exp Locker: bin $";
                     46: static char *copyright = "Copyright (c) 1989 Mark H. Colburn.\nAll rights reserved.\n";
                     47: #endif /* ! lint */
                     48: 
                     49: 
                     50: /* Headers */
                     51: 
                     52: #include "pax.h"
                     53: 
                     54: 
                     55: /* Defines */
                     56: 
                     57: #define myuid  ( my_uid < 0? (my_uid = getuid()): my_uid )
                     58: #define        mygid   ( my_gid < 0? (my_gid = getgid()): my_gid )
                     59: 
                     60: 
                     61: /* Internal Identifiers */
                     62: 
                     63: static int      saveuid = -993;
                     64: static char     saveuname[TUNMLEN];
                     65: static int      my_uid = -993;
                     66: 
                     67: static int      savegid = -993;
                     68: static char     savegname[TGNMLEN];
                     69: static int      my_gid = -993;
                     70: 
                     71: 
                     72: /* finduname - find a user or group name from a uid or gid
                     73:  *
                     74:  * DESCRIPTION
                     75:  *
                     76:  *     Look up a user name from a uid/gid, maintaining a cache. 
                     77:  *
                     78:  * PARAMETERS
                     79:  *
                     80:  *     char    uname[]         - name (to be returned to user)
                     81:  *     int     uuid            - id of name to find
                     82:  *
                     83:  *
                     84:  * RETURNS
                     85:  *
                     86:  *     Returns a name which is associated with the user id given.  If there
                     87:  *     is not name which corresponds to the user-id given, then a pointer
                     88:  *     to a string of zero length is returned.
                     89:  *     
                     90:  * FIXME
                     91:  *
                     92:  *     1. for now it's a one-entry cache. 
                     93:  *     2. The "-993" is to reduce the chance of a hit on the first lookup. 
                     94:  */
                     95: 
                     96: #if __STDC__
                     97: 
                     98: char *finduname(int uuid)
                     99: 
                    100: #else
                    101:     
                    102: char *finduname(uuid)
                    103: int             uuid;
                    104: 
                    105: #endif
                    106: {
                    107:     struct passwd  *pw;
                    108: 
                    109:     if (uuid != saveuid) {
                    110:        saveuid = uuid;
                    111:        saveuname[0] = '\0';
                    112:        pw = getpwuid(uuid);
                    113:        if (pw) {
                    114:            strncpy(saveuname, pw->pw_name, TUNMLEN);
                    115:        }
                    116:     }
                    117:     return(saveuname);
                    118: }
                    119: 
                    120: 
                    121: /* finduid - get the uid for a given user name
                    122:  *
                    123:  * DESCRIPTION
                    124:  *
                    125:  *     This does just the opposit of finduname.  Given a user name it
                    126:  *     finds the corresponding UID for that name.
                    127:  *
                    128:  * PARAMETERS
                    129:  *
                    130:  *     char    uname[]         - username to find a UID for
                    131:  *
                    132:  * RETURNS
                    133:  *
                    134:  *     The UID which corresponds to the uname given, if any.  If no UID
                    135:  *     could be found, then the UID which corrsponds the user running the
                    136:  *     program is returned.
                    137:  *
                    138:  */
                    139: 
                    140: #if __STDC__
                    141: 
                    142: int finduid(char *uname)
                    143: 
                    144: #else
                    145:     
                    146: int finduid(uname)
                    147: char            *uname;
                    148: 
                    149: #endif
                    150: {
                    151:     struct passwd  *pw;
                    152:     extern struct passwd *getpwnam();
                    153: 
                    154:     if (uname[0] != saveuname[0]/* Quick test w/o proc call */
                    155:        ||0 != strncmp(uname, saveuname, TUNMLEN)) {
                    156:        strncpy(saveuname, uname, TUNMLEN);
                    157:        pw = getpwnam(uname);
                    158:        if (pw) {
                    159:            saveuid = pw->pw_uid;
                    160:        } else {
                    161:            saveuid = myuid;
                    162:        }
                    163:     }
                    164:     return (saveuid);
                    165: }
                    166: 
                    167: 
                    168: /* findgname - look up a group name from a gid
                    169:  *
                    170:  * DESCRIPTION
                    171:  *
                    172:  *     Look up a group name from a gid, maintaining a cache.
                    173:  *     
                    174:  *
                    175:  * PARAMETERS
                    176:  *
                    177:  *     int     ggid            - goupid of group to find
                    178:  *
                    179:  * RETURNS
                    180:  *
                    181:  *     A string which is associated with the group ID given.  If no name
                    182:  *     can be found, a string of zero length is returned.
                    183:  */
                    184: 
                    185: #if __STDC__
                    186: 
                    187: char *findgname(int ggid)
                    188: 
                    189: #else
                    190:     
                    191: char *findgname(ggid)
                    192: int             ggid;
                    193: 
                    194: #endif
                    195: {
                    196:     struct group   *gr;
                    197: 
                    198:     if (ggid != savegid) {
                    199:        savegid = ggid;
                    200:        savegname[0] = '\0';
                    201:        setgrent();
                    202:        gr = getgrgid(ggid);
                    203:        if (gr) {
                    204:            strncpy(savegname, gr->gr_name, TGNMLEN);
                    205:        }
                    206:     }
                    207:     return(savegname);
                    208: }
                    209: 
                    210: 
                    211: 
                    212: /* findgid - get the gid for a given group name
                    213:  *
                    214:  * DESCRIPTION
                    215:  *
                    216:  *     This does just the opposit of finduname.  Given a group name it
                    217:  *     finds the corresponding GID for that name.
                    218:  *
                    219:  * PARAMETERS
                    220:  *
                    221:  *     char    uname[]         - groupname to find a GID for
                    222:  *
                    223:  * RETURNS
                    224:  *
                    225:  *     The GID which corresponds to the uname given, if any.  If no GID
                    226:  *     could be found, then the GID which corrsponds the group running the
                    227:  *     program is returned.
                    228:  *
                    229:  */
                    230: 
                    231: #if __STDC__
                    232: 
                    233: int findgid(char *gname)
                    234: 
                    235: #else
                    236:     
                    237: int findgid(gname)
                    238: char           *gname;
                    239: 
                    240: #endif
                    241: {
                    242:     struct group   *gr;
                    243: 
                    244:     /* Quick test w/o proc call */
                    245:     if (gname[0] != savegname[0] || strncmp(gname, savegname, TUNMLEN) != 0) {
                    246:        strncpy(savegname, gname, TUNMLEN);
                    247:        gr = getgrnam(gname);
                    248:        if (gr) {
                    249:            savegid = gr->gr_gid;
                    250:        } else {
                    251:            savegid = mygid;
                    252:        }
                    253:     }
                    254:     return (savegid);
                    255: }

unix.superglobalmegacorp.com

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