Annotation of embedaddon/sudo/plugins/sudoers/tsgetgrpw.c, revision 1.1.1.1

1.1       misho       1: /*
                      2:  * Copyright (c) 2005, 2008, 2010-2011 Todd C. Miller <Todd.Miller@courtesan.com>
                      3:  *
                      4:  * Permission to use, copy, modify, and distribute this software for any
                      5:  * purpose with or without fee is hereby granted, provided that the above
                      6:  * copyright notice and this permission notice appear in all copies.
                      7:  *
                      8:  * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
                      9:  * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
                     10:  * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
                     11:  * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
                     12:  * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
                     13:  * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
                     14:  * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
                     15:  */
                     16: 
                     17: /*
                     18:  * Trivial replacements for the libc get{gr,pw}{uid,nam}() routines
                     19:  * for use by testsudoers in the sudo test harness.
                     20:  * We need our own since many platforms don't provide set{pw,gr}file().
                     21:  */
                     22: 
                     23: #include <config.h>
                     24: 
                     25: #include <sys/types.h>
                     26: #include <sys/param.h>
                     27: #include <stdio.h>
                     28: #ifdef STDC_HEADERS
                     29: # include <stdlib.h>
                     30: # include <stddef.h>
                     31: #else
                     32: # ifdef HAVE_STDLIB_H
                     33: #  include <stdlib.h>
                     34: # endif
                     35: #endif /* STDC_HEADERS */
                     36: #ifdef HAVE_STRING_H
                     37: # if defined(HAVE_MEMORY_H) && !defined(STDC_HEADERS)
                     38: #  include <memory.h>
                     39: # endif
                     40: # include <string.h>
                     41: #endif /* HAVE_STRING_H */
                     42: #ifdef HAVE_STRINGS_H
                     43: # include <strings.h>
                     44: #endif /* HAVE_STRINGS_H */
                     45: #include <fcntl.h>
                     46: #include <limits.h>
                     47: 
                     48: #include "tsgetgrpw.h"
                     49: #include "sudoers.h"
                     50: 
                     51: #ifndef LINE_MAX
                     52: # define LINE_MAX 2048
                     53: #endif
                     54: 
                     55: #undef GRMEM_MAX
                     56: #define GRMEM_MAX 200
                     57: 
                     58: static FILE *pwf;
                     59: static const char *pwfile = "/etc/passwd";
                     60: static int pw_stayopen;
                     61: 
                     62: static FILE *grf;
                     63: static const char *grfile = "/etc/group";
                     64: static int gr_stayopen;
                     65: 
                     66: void setgrfile(const char *);
                     67: void setgrent(void);
                     68: void endgrent(void);
                     69: struct group *getgrent(void);
                     70: struct group *getgrnam(const char *);
                     71: struct group *getgrgid(gid_t);
                     72: 
                     73: void setpwfile(const char *);
                     74: void setpwent(void);
                     75: void endpwent(void);
                     76: struct passwd *getpwent(void);
                     77: struct passwd *getpwnam(const char *);
                     78: struct passwd *getpwuid(uid_t);
                     79: 
                     80: void
                     81: setpwfile(const char *file)
                     82: {
                     83:     pwfile = file;
                     84:     if (pwf != NULL)
                     85:        endpwent();
                     86: }
                     87: 
                     88: void
                     89: setpwent(void)
                     90: {
                     91:     if (pwf == NULL) {
                     92:        pwf = fopen(pwfile, "r");
                     93:        if (pwf != NULL)
                     94:            fcntl(fileno(pwf), F_SETFD, FD_CLOEXEC);
                     95:     } else {
                     96:        rewind(pwf);
                     97:     }
                     98:     pw_stayopen = 1;
                     99: }
                    100: 
                    101: void
                    102: endpwent(void)
                    103: {
                    104:     if (pwf != NULL) {
                    105:        fclose(pwf);
                    106:        pwf = NULL;
                    107:     }
                    108:     pw_stayopen = 0;
                    109: }
                    110: 
                    111: struct passwd *
                    112: getpwent(void)
                    113: {
                    114:     static struct passwd pw;
                    115:     static char pwbuf[LINE_MAX];
                    116:     size_t len;
                    117:     char *cp, *colon;
                    118: 
                    119:     if ((colon = fgets(pwbuf, sizeof(pwbuf), pwf)) == NULL)
                    120:        return NULL;
                    121: 
                    122:     zero_bytes(&pw, sizeof(pw));
                    123:     if ((colon = strchr(cp = colon, ':')) == NULL)
                    124:        return NULL;
                    125:     *colon++ = '\0';
                    126:     pw.pw_name = cp;
                    127:     if ((colon = strchr(cp = colon, ':')) == NULL)
                    128:        return NULL;
                    129:     *colon++ = '\0';
                    130:     pw.pw_passwd = cp;
                    131:     if ((colon = strchr(cp = colon, ':')) == NULL)
                    132:        return NULL;
                    133:     *colon++ = '\0';
                    134:     pw.pw_uid = atoi(cp);
                    135:     if ((colon = strchr(cp = colon, ':')) == NULL)
                    136:        return NULL;
                    137:     *colon++ = '\0';
                    138:     pw.pw_gid = atoi(cp);
                    139:     if ((colon = strchr(cp = colon, ':')) == NULL)
                    140:        return NULL;
                    141:     *colon++ = '\0';
                    142:     pw.pw_gecos = cp;
                    143:     if ((colon = strchr(cp = colon, ':')) == NULL)
                    144:        return NULL;
                    145:     *colon++ = '\0';
                    146:     pw.pw_dir = cp;
                    147:     pw.pw_shell = colon;
                    148:     len = strlen(colon);
                    149:     if (len > 0 && colon[len - 1] == '\n')
                    150:        colon[len - 1] = '\0';
                    151:     return &pw;
                    152: }
                    153: 
                    154: struct passwd *
                    155: getpwnam(const char *name)
                    156: {
                    157:     struct passwd *pw;
                    158: 
                    159:     if (pwf == NULL) {
                    160:        if ((pwf = fopen(pwfile, "r")) == NULL)
                    161:            return NULL;
                    162:        fcntl(fileno(pwf), F_SETFD, FD_CLOEXEC);
                    163:     } else {
                    164:        rewind(pwf);
                    165:     }
                    166:     while ((pw = getpwent()) != NULL) {
                    167:        if (strcmp(pw->pw_name, name) == 0)
                    168:            break;
                    169:     }
                    170:     if (!pw_stayopen) {
                    171:        fclose(pwf);
                    172:        pwf = NULL;
                    173:     }
                    174:     return pw;
                    175: }
                    176: 
                    177: struct passwd *
                    178: getpwuid(uid_t uid)
                    179: {
                    180:     struct passwd *pw;
                    181: 
                    182:     if (pwf == NULL) {
                    183:        if ((pwf = fopen(pwfile, "r")) == NULL)
                    184:            return NULL;
                    185:        fcntl(fileno(pwf), F_SETFD, FD_CLOEXEC);
                    186:     } else {
                    187:        rewind(pwf);
                    188:     }
                    189:     while ((pw = getpwent()) != NULL) {
                    190:        if (pw->pw_uid == uid)
                    191:            break;
                    192:     }
                    193:     if (!pw_stayopen) {
                    194:        fclose(pwf);
                    195:        pwf = NULL;
                    196:     }
                    197:     return pw;
                    198: }
                    199: 
                    200: void
                    201: setgrfile(const char *file)
                    202: {
                    203:     grfile = file;
                    204:     if (grf != NULL)
                    205:        endgrent();
                    206: }
                    207: 
                    208: void
                    209: setgrent(void)
                    210: {
                    211:     if (grf == NULL) {
                    212:        grf = fopen(grfile, "r");
                    213:        if (grf != NULL)
                    214:            fcntl(fileno(grf), F_SETFD, FD_CLOEXEC);
                    215:     } else {
                    216:        rewind(grf);
                    217:     }
                    218:     gr_stayopen = 1;
                    219: }
                    220: 
                    221: void
                    222: endgrent(void)
                    223: {
                    224:     if (grf != NULL) {
                    225:        fclose(grf);
                    226:        grf = NULL;
                    227:     }
                    228:     gr_stayopen = 0;
                    229: }
                    230: 
                    231: struct group *
                    232: getgrent(void)
                    233: {
                    234:     static struct group gr;
                    235:     static char grbuf[LINE_MAX], *gr_mem[GRMEM_MAX+1];
                    236:     size_t len;
                    237:     char *cp, *colon;
                    238:     int n;
                    239: 
                    240:     if ((colon = fgets(grbuf, sizeof(grbuf), grf)) == NULL)
                    241:        return NULL;
                    242: 
                    243:     zero_bytes(&gr, sizeof(gr));
                    244:     if ((colon = strchr(cp = colon, ':')) == NULL)
                    245:        return NULL;
                    246:     *colon++ = '\0';
                    247:     gr.gr_name = cp;
                    248:     if ((colon = strchr(cp = colon, ':')) == NULL)
                    249:        return NULL;
                    250:     *colon++ = '\0';
                    251:     gr.gr_passwd = cp;
                    252:     if ((colon = strchr(cp = colon, ':')) == NULL)
                    253:        return NULL;
                    254:     *colon++ = '\0';
                    255:     gr.gr_gid = atoi(cp);
                    256:     len = strlen(colon);
                    257:     if (len > 0 && colon[len - 1] == '\n')
                    258:        colon[len - 1] = '\0';
                    259:     if (*colon != '\0') {
                    260:        gr.gr_mem = gr_mem;
                    261:        cp = strtok(colon, ",");
                    262:        for (n = 0; cp != NULL && n < GRMEM_MAX; n++) {
                    263:            gr.gr_mem[n] = cp;
                    264:            cp = strtok(NULL, ",");
                    265:        }
                    266:        gr.gr_mem[n++] = NULL;
                    267:     } else
                    268:        gr.gr_mem = NULL;
                    269:     return &gr;
                    270: }
                    271: 
                    272: struct group *
                    273: getgrnam(const char *name)
                    274: {
                    275:     struct group *gr;
                    276: 
                    277:     if (grf == NULL) {
                    278:        if ((grf = fopen(grfile, "r")) == NULL)
                    279:            return NULL;
                    280:        fcntl(fileno(grf), F_SETFD, FD_CLOEXEC);
                    281:     } else {
                    282:        rewind(grf);
                    283:     }
                    284:     while ((gr = getgrent()) != NULL) {
                    285:        if (strcmp(gr->gr_name, name) == 0)
                    286:            break;
                    287:     }
                    288:     if (!gr_stayopen) {
                    289:        fclose(grf);
                    290:        grf = NULL;
                    291:     }
                    292:     return gr;
                    293: }
                    294: 
                    295: struct group *
                    296: getgrgid(gid_t gid)
                    297: {
                    298:     struct group *gr;
                    299: 
                    300:     if (grf == NULL) {
                    301:        if ((grf = fopen(grfile, "r")) == NULL)
                    302:            return NULL;
                    303:        fcntl(fileno(grf), F_SETFD, FD_CLOEXEC);
                    304:     } else {
                    305:        rewind(grf);
                    306:     }
                    307:     while ((gr = getgrent()) != NULL) {
                    308:        if (gr->gr_gid == gid)
                    309:            break;
                    310:     }
                    311:     if (!gr_stayopen) {
                    312:        fclose(grf);
                    313:        grf = NULL;
                    314:     }
                    315:     return gr;
                    316: }

FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>