Annotation of embedaddon/sudo/plugins/sample_group/getgrent.c, revision 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 getgr{uid,nam}() routines.
! 19: */
! 20:
! 21: #include <config.h>
! 22:
! 23: #include <sys/types.h>
! 24: #include <sys/param.h>
! 25: #include <stdio.h>
! 26: #ifdef STDC_HEADERS
! 27: # include <stdlib.h>
! 28: # include <stddef.h>
! 29: #else
! 30: # ifdef HAVE_STDLIB_H
! 31: # include <stdlib.h>
! 32: # endif
! 33: #endif /* STDC_HEADERS */
! 34: #ifdef HAVE_STRING_H
! 35: # if defined(HAVE_MEMORY_H) && !defined(STDC_HEADERS)
! 36: # include <memory.h>
! 37: # endif
! 38: # include <string.h>
! 39: #endif /* HAVE_STRING_H */
! 40: #ifdef HAVE_STRINGS_H
! 41: # include <strings.h>
! 42: #endif /* HAVE_STRINGS_H */
! 43: #include <fcntl.h>
! 44: #include <limits.h>
! 45: #include <pwd.h>
! 46: #include <grp.h>
! 47:
! 48: #include "missing.h"
! 49:
! 50: #ifndef LINE_MAX
! 51: # define LINE_MAX 2048
! 52: #endif
! 53:
! 54: #undef GRMEM_MAX
! 55: #define GRMEM_MAX 200
! 56:
! 57: static FILE *grf;
! 58: static const char *grfile = "/etc/group";
! 59: static int gr_stayopen;
! 60:
! 61: void mysetgrfile(const char *);
! 62: void mysetgrent(void);
! 63: void myendgrent(void);
! 64: struct group *mygetgrent(void);
! 65: struct group *mygetgrnam(const char *);
! 66: struct group *mygetgrgid(gid_t);
! 67:
! 68: void
! 69: mysetgrfile(const char *file)
! 70: {
! 71: grfile = file;
! 72: if (grf != NULL)
! 73: myendgrent();
! 74: }
! 75:
! 76: void
! 77: mysetgrent(void)
! 78: {
! 79: if (grf == NULL) {
! 80: grf = fopen(grfile, "r");
! 81: if (grf != NULL)
! 82: fcntl(fileno(grf), F_SETFD, FD_CLOEXEC);
! 83: } else {
! 84: rewind(grf);
! 85: }
! 86: gr_stayopen = 1;
! 87: }
! 88:
! 89: void
! 90: myendgrent(void)
! 91: {
! 92: if (grf != NULL) {
! 93: fclose(grf);
! 94: grf = NULL;
! 95: }
! 96: gr_stayopen = 0;
! 97: }
! 98:
! 99: struct group *
! 100: mygetgrent(void)
! 101: {
! 102: static struct group gr;
! 103: static char grbuf[LINE_MAX], *gr_mem[GRMEM_MAX+1];
! 104: size_t len;
! 105: char *cp, *colon;
! 106: int n;
! 107:
! 108: if ((colon = fgets(grbuf, sizeof(grbuf), grf)) == NULL)
! 109: return NULL;
! 110:
! 111: memset(&gr, 0, sizeof(gr));
! 112: if ((colon = strchr(cp = colon, ':')) == NULL)
! 113: return NULL;
! 114: *colon++ = '\0';
! 115: gr.gr_name = cp;
! 116: if ((colon = strchr(cp = colon, ':')) == NULL)
! 117: return NULL;
! 118: *colon++ = '\0';
! 119: gr.gr_passwd = cp;
! 120: if ((colon = strchr(cp = colon, ':')) == NULL)
! 121: return NULL;
! 122: *colon++ = '\0';
! 123: gr.gr_gid = atoi(cp);
! 124: len = strlen(colon);
! 125: if (len > 0 && colon[len - 1] == '\n')
! 126: colon[len - 1] = '\0';
! 127: if (*colon != '\0') {
! 128: gr.gr_mem = gr_mem;
! 129: cp = strtok(colon, ",");
! 130: for (n = 0; cp != NULL && n < GRMEM_MAX; n++) {
! 131: gr.gr_mem[n] = cp;
! 132: cp = strtok(NULL, ",");
! 133: }
! 134: gr.gr_mem[n++] = NULL;
! 135: } else
! 136: gr.gr_mem = NULL;
! 137: return &gr;
! 138: }
! 139:
! 140: struct group *
! 141: mygetgrnam(const char *name)
! 142: {
! 143: struct group *gr;
! 144:
! 145: if (grf == NULL) {
! 146: if ((grf = fopen(grfile, "r")) == NULL)
! 147: return NULL;
! 148: fcntl(fileno(grf), F_SETFD, FD_CLOEXEC);
! 149: } else {
! 150: rewind(grf);
! 151: }
! 152: while ((gr = mygetgrent()) != NULL) {
! 153: if (strcmp(gr->gr_name, name) == 0)
! 154: break;
! 155: }
! 156: if (!gr_stayopen) {
! 157: fclose(grf);
! 158: grf = NULL;
! 159: }
! 160: return gr;
! 161: }
! 162:
! 163: struct group *
! 164: mygetgrgid(gid_t gid)
! 165: {
! 166: struct group *gr;
! 167:
! 168: if (grf == NULL) {
! 169: if ((grf = fopen(grfile, "r")) == NULL)
! 170: return NULL;
! 171: fcntl(fileno(grf), F_SETFD, FD_CLOEXEC);
! 172: } else {
! 173: rewind(grf);
! 174: }
! 175: while ((gr = mygetgrent()) != NULL) {
! 176: if (gr->gr_gid == gid)
! 177: break;
! 178: }
! 179: if (!gr_stayopen) {
! 180: fclose(grf);
! 181: grf = NULL;
! 182: }
! 183: return gr;
! 184: }
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>