static boolean isdateformat(int wordc, char **wordv) { return ( (wordc == 5) && (instringset(wordv[0], Days)) && (instringset(wordv[1], Months)) && (alldigits(wordv[2])) && (alldigits(wordv[4]))); }
/* * This routine converts a name for a particular quota type to * an identifier. This routine must agree with the kernel routine * getinoquota as to the interpretation of quota types. */ int getentry(const char *name, int quotatype) { struct passwd *pw; struct group *gr; if (alldigits(name)) return (atoi(name)); switch(quotatype) { case USRQUOTA: if ((pw = getpwnam(name))) return (pw->pw_uid); warnx("%s: no such user", name); break; case GRPQUOTA: if ((gr = getgrnam(name))) return (gr->gr_gid); warnx("%s: no such group", name); break; default: warnx("%d: unknown quota type", quotatype); break; } sleep(1); return (-1); }
static uid_t getentry(char *name) { struct passwd *pw; uid_t uid; if (alldigits(name)) { errno = 0; uid = strtol(name, NULL, 10); if (errno == ERANGE) { /* name would cause overflow in uid */ (void) fprintf(stderr, "edquota: uid %s too large\n", name); (void) sleep(1); return (-1); } } else if (pw = getpwnam(name)) uid = pw->pw_uid; else { (void) fprintf(stderr, "%s: no such user\n", name); (void) sleep(1); return (-1); } return (uid); }
gid_t find_gid(const char *g) { struct group *gr; if (alldigits(g)) return atoi(g); if (!(gr = getgrnam(g))) errorf("Error finding group '%s': %s\n",g,strerror(errno)); return gr->gr_gid; }
uid_t find_uid(const char *u) { struct passwd *pw; if (alldigits(u)) return atoi(u); if (!(pw = getpwnam(u))) errorf("Error finding user '%s': %s\n",u,strerror(errno)); return pw->pw_uid; }
static bool integerq(char *p, unsigned int n) { if (n==0) return FALSE; if (p[0] == '0' && p[1] == 'x') { p+=2, n-=2; if (n==0) return FALSE; return allhexdigits(p,n); } else { if (*p == '-') p++, n--; if (n==0) return FALSE; return alldigits(p,n); } }
/* * This routine converts a name for a particular quota type to * an identifier. This routine must agree with the kernel routine * getinoquota as to the interpretation of quota types. */ int getentry(char *name, int quotatype, u_int *idp) { struct passwd *pw; struct group *gr; u_int id; switch(quotatype) { case USRQUOTA: if ((pw = getpwnam(name))) { *idp = pw->pw_uid; return 0; } else if (alldigits(name)) { if ((id = strtoul(name, NULL, 10)) <= UID_MAX) { *idp = id; return 0; } } warnx("%s: no such user", name); break; case GRPQUOTA: if ((gr = getgrnam(name))) { *idp = gr->gr_gid; return 0; } else if (alldigits(name)) { if ((id = strtoul(name, NULL, 10)) <= GID_MAX) { *idp = id; return (0); } } warnx("%s: no such group", name); break; default: warnx("%d: unknown quota type", quotatype); break; } sleep(1); return(-1); }
int main(int argc, char *argv[]) { int opt; int i; int status = 0; (void) setlocale(LC_ALL, ""); (void) textdomain(TEXT_DOMAIN); /* * PRIV_FILE_DAC_READ is needed to read the QFNAME file * Clear all other privleges from the limit set, and add * the required privilege to the bracketed set. */ if (__init_suid_priv(PU_CLEARLIMITSET, PRIV_FILE_DAC_READ, NULL) == -1) { (void) fprintf(stderr, gettext("Insufficient privileges, " "quota must be set-uid root or have " "file_dac_read privileges\n")); exit(1); } load_libzfs(); while ((opt = getopt(argc, argv, "vV")) != EOF) { switch (opt) { case 'v': vflag++; break; case 'V': /* Print command line */ { char *opt_text; int opt_count; (void) fprintf(stdout, "quota -F UFS "); for (opt_count = 1; opt_count < argc; opt_count++) { opt_text = argv[opt_count]; if (opt_text) (void) fprintf(stdout, " %s ", opt_text); } (void) fprintf(stdout, "\n"); } break; case '?': fprintf(stderr, "usage: quota [-v] [username]\n"); zexit(32); } } if (quotactl(Q_ALLSYNC, NULL, (uid_t)0, NULL) < 0 && errno == EINVAL) { if (vflag) fprintf(stderr, "There are no quotas on this system\n"); nolocalquota++; } if (argc == optind) { showuid(getuid()); zexit(0); } for (i = optind; i < argc; i++) { if (alldigits(argv[i])) { showuid((uid_t)atoi(argv[i])); } else status |= showname(argv[i]); } __priv_relinquish(); return (status); }
int match_datestamp( const char * dateexp, const char * datestamp) { char *dash; size_t len, len_suffix; size_t len_prefix; char firstdate[100], lastdate[100]; char mydateexp[100]; int match_exact; if(strlen(dateexp) >= 100 || strlen(dateexp) < 1) { goto illegal; } if (*dateexp == '=') { return strcmp(dateexp+1, datestamp) == 0; } /* strip and ignore an initial "^" */ if(dateexp[0] == '^') { strncpy(mydateexp, dateexp+1, sizeof(mydateexp)-1); mydateexp[sizeof(mydateexp)-1] = '\0'; } else { strncpy(mydateexp, dateexp, sizeof(mydateexp)-1); mydateexp[sizeof(mydateexp)-1] = '\0'; } if(strlen(dateexp) < 1) { goto illegal; } if(mydateexp[strlen(mydateexp)-1] == '$') { match_exact = 1; mydateexp[strlen(mydateexp)-1] = '\0'; /* strip the trailing $ */ } else match_exact = 0; /* a single dash represents a date range */ if((dash = strchr(mydateexp,'-'))) { if(match_exact == 1 || strchr(dash+1, '-')) { goto illegal; } /* format: XXXYYYY-ZZZZ, indicating dates XXXYYYY to XXXZZZZ */ len = (size_t)(dash - mydateexp); /* length of XXXYYYY */ len_suffix = strlen(dash) - 1; /* length of ZZZZ */ if (len_suffix > len) goto illegal; if (len < len_suffix) { goto illegal; } len_prefix = len - len_suffix; /* length of XXX */ dash++; strncpy(firstdate, mydateexp, len); firstdate[len] = '\0'; strncpy(lastdate, mydateexp, len_prefix); strncpy(&(lastdate[len_prefix]), dash, len_suffix); lastdate[len] = '\0'; if (!alldigits(firstdate) || !alldigits(lastdate)) goto illegal; if (strncmp(firstdate, lastdate, strlen(firstdate)) > 0) goto illegal; return ((strncmp(datestamp, firstdate, strlen(firstdate)) >= 0) && (strncmp(datestamp, lastdate , strlen(lastdate)) <= 0)); } else { if (!alldigits(mydateexp)) goto illegal; if(match_exact == 1) { return (g_str_equal(datestamp, mydateexp)); } else { return (g_str_has_prefix(datestamp, mydateexp)); } } illegal: error("Illegal datestamp expression %s", dateexp); /*NOTREACHED*/ }
int match_level( const char * levelexp, const char * level) { char *dash; long int low, hi, level_i; char mylevelexp[100]; int match_exact; if(strlen(levelexp) >= 100 || strlen(levelexp) < 1) { error("Illegal level expression %s", levelexp); /*NOTREACHED*/ } if (*levelexp == '=') { return strcmp(levelexp+1, level) == 0; } if(levelexp[0] == '^') { strncpy(mylevelexp, levelexp+1, strlen(levelexp)-1); mylevelexp[strlen(levelexp)-1] = '\0'; if (strlen(levelexp) == 0) { error("Illegal level expression %s", levelexp); /*NOTREACHED*/ } } else { strncpy(mylevelexp, levelexp, strlen(levelexp)); mylevelexp[strlen(levelexp)] = '\0'; } if(mylevelexp[strlen(mylevelexp)-1] == '$') { match_exact = 1; mylevelexp[strlen(mylevelexp)-1] = '\0'; } else match_exact = 0; if((dash = strchr(mylevelexp,'-'))) { if(match_exact == 1) { goto illegal; } *dash = '\0'; if (!alldigits(mylevelexp) || !alldigits(dash+1)) goto illegal; errno = 0; low = strtol(mylevelexp, (char **) NULL, 10); if (errno) goto illegal; hi = strtol(dash+1, (char **) NULL, 10); if (errno) goto illegal; level_i = strtol(level, (char **) NULL, 10); if (errno) goto illegal; return ((level_i >= low) && (level_i <= hi)); } else { if (!alldigits(mylevelexp)) goto illegal; if(match_exact == 1) { return (g_str_equal(level, mylevelexp)); } else { return (g_str_has_prefix(level, mylevelexp)); } } illegal: error("Illegal level expression %s", levelexp); /*NOTREACHED*/ }
Errorclass pi(void) { char **nwordv; nwordv = NULL; if (cur_wordc < 2) return (C_UNKNOWN); if (strlen(cur_wordv[1]) == 1 && ( cur_wordv[1][0] == 'e' || cur_wordv[1][0] == 'E') && piptr(cur_wordv[2]) ) { boolean longpiptr = 0; /* * We have recognized a first pass error of the form: * letter ------^---- message * * turn into an error message of the form: * * file line 'pascal errortype' letter \n |---- message * or of the form: * file line letter |---- message * when there are strlen("(*[pi]") or more * preceding '-' on the error pointer. * * Where the | is intended to be a down arrow, so that * the pi error messages can be inserted above the * line in error, instead of below. (All of the other * languages put their messages before the source line, * instead of after it as does pi.) * * where the pointer to the error has been truncated * by 6 characters to account for the fact that * the pointer points into a tab preceded input line. */ language = INPI; (void)substitute(cur_wordv[2], '^', '|'); longpiptr = position(cur_wordv[2],'|') > (6+8); nwordv = wordvsplice(longpiptr ? 2 : 4, cur_wordc, cur_wordv+1); nwordv[0] = strdup(currentfilename); nwordv[1] = strdup(c_linenumber); if (!longpiptr) { nwordv[2] = Strdup("pascal errortype"); /* XXX leaked */ nwordv[3] = cur_wordv[1]; nwordv[4] = strdup("%%%\n"); if (strlen(nwordv[5]) > (8-2)) /* this is the pointer */ nwordv[5] += (8-2); /* bump over 6 characters */ } cur_wordv = nwordv - 1; /* convert to 1 based */ cur_wordc += longpiptr ? 2 : 4; return (C_TRUE); } if (cur_wordc >= 4 && strlen(cur_wordv[1]) == 1 && (*cur_wordv[1] == 'E' || *cur_wordv[1] == 'w' || *cur_wordv[1] == 'e') && alldigits(cur_wordv[2]) && strlen(cur_wordv[3]) == 1 && cur_wordv[3][0] == '-' ) { /* * Message of the form: letter linenumber - message * Turn into form: filename linenumber letter - message */ language = INPI; nwordv = wordvsplice(1, cur_wordc, cur_wordv + 1); nwordv[0] = strdup(currentfilename); nwordv[1] = cur_wordv[2]; nwordv[2] = cur_wordv[1]; c_linenumber = cur_wordv[2]; cur_wordc += 1; cur_wordv = nwordv - 1; return (C_TRUE); } if (cur_wordc >= 3 && strlen(cur_wordv[1]) == 1 && (*cur_wordv[1] == 'E' || *cur_wordv[1] == 'w' || *cur_wordv[1] == 'e') && strlen(cur_wordv[2]) == 1 && cur_wordv[2][0] == '-' ) { /* * Message of the form: letter - message * * This happens only when we are traversing the tree * during the second pass of pi, and discover semantic * errors. * * We have already (presumably) saved the header message * and can now construct a nulled error message for the * current file. * * Turns into a message of the form: * filename (header) letter - message * * First, see if it is a message referring to more than * one line number. Only of the form: * %s undefined on line%s * %s improperly used on line%s */ boolean undefined = 0; int wordindex; language = INPI; if ((undefined = (wordvcmp(cur_wordv+2, 3, pi_und1) == 0)) || (undefined = (wordvcmp(cur_wordv+2, 3, pi_und2) == 0)) || wordvcmp(cur_wordv+2, 4, pi_imp1) == 0 || wordvcmp(cur_wordv+2, 4, pi_imp2) == 0 ) { for (wordindex = undefined ? 5 : 6; wordindex <= cur_wordc; wordindex++) { if (nwordv) { free(nwordv[0]); free(nwordv); } nwordv = wordvsplice(2, undefined ? 2 : 3, cur_wordv+1); nwordv[0] = strdup(currentfilename); nwordv[1] = cur_wordv[wordindex]; if (wordindex != cur_wordc) erroradd(undefined ? 4 : 5, nwordv, C_TRUE, C_UNKNOWN); } cur_wordc = undefined ? 4 : 5; cur_wordv = nwordv - 1; return (C_TRUE); } nwordv = wordvsplice(1+3, cur_wordc, cur_wordv+1); nwordv[0] = strdup(currentfilename); nwordv[1] = strdup(c_header[0]); nwordv[2] = strdup(c_header[1]); nwordv[3] = strdup(c_header[2]); cur_wordv = nwordv - 1; cur_wordc += 1 + 3; return (C_THISFILE); } if (strcmp(cur_wordv[1], "...") == 0 && c_linenumber && currentfilename != default_currentfilename) { /* * have a continuation error message * of the form: ... message * Turn into form : filename linenumber message */ language = INPI; nwordv = wordvsplice(1, cur_wordc, cur_wordv+1); nwordv[0] = strdup(currentfilename); nwordv[1] = strdup(c_linenumber); cur_wordv = nwordv - 1; cur_wordc += 1; return (C_TRUE); } if (cur_wordc == 6 && lastchar(cur_wordv[6]) == ':' && isdateformat(5, cur_wordv + 1) ) { /* * Have message that tells us we have changed files */ language = INPI; currentfilename = strdup(cur_wordv[6]); clob_last(currentfilename, '\0'); return (C_SYNC); } if (cur_wordc == 3 && strcmp(cur_wordv[1], "In") == 0 && lastchar(cur_wordv[3]) == ':' && instringset(cur_wordv[2], Piroutines) ) { language = INPI; c_header = wordvsplice(0, cur_wordc, cur_wordv+1); return (C_SYNC); } /* * now, check for just the line number followed by the text */ if (alldigits(cur_wordv[1])) { language = INPI; c_linenumber = cur_wordv[1]; return (C_IGNORE); } /* * Attempt to match messages refering to a line number * * Multiply defined label in case, lines %d and %d * Goto %s from line %d is into a structured statement * End matched %s on line %d * Inserted keyword end matching %s on line %d */ multiple = structured = 0; if ( (cur_wordc == 6 && wordvcmp(cur_wordv+1, 2, pi_Endmatched) == 0) || (cur_wordc == 8 && wordvcmp(cur_wordv+1, 4, pi_Inserted) == 0) || (multiple = (cur_wordc == 9 && wordvcmp(cur_wordv+1,6, pi_multiple) == 0)) || (structured = (cur_wordc == 10 && wordvcmp(cur_wordv+6,5, pi_structured) == 0)) ) { language = INPI; nwordv = wordvsplice(2, cur_wordc, cur_wordv+1); nwordv[0] = strdup(currentfilename); nwordv[1] = structured ? cur_wordv [5] : cur_wordv[cur_wordc]; cur_wordc += 2; cur_wordv = nwordv - 1; if (!multiple) return (C_TRUE); erroradd(cur_wordc, nwordv, C_TRUE, C_UNKNOWN); nwordv = wordvsplice(0, cur_wordc, nwordv); nwordv[1] = cur_wordv[cur_wordc - 2]; return (C_TRUE); } return (C_UNKNOWN); }
int main(int argc, char *argv[]) { int ngroups; gid_t mygid, gidset[NGROUPS]; int i, ch, gflag = 0, uflag = 0, errflag = 0; while ((ch = getopt(argc, argv, "f:ghlrquv")) != -1) { switch(ch) { case 'f': filename = optarg; break; case 'g': gflag++; break; case 'h': hflag++; break; case 'l': lflag++; break; case 'q': qflag++; break; case 'r': rflag++; break; case 'u': uflag++; break; case 'v': vflag++; break; default: usage(); } } argc -= optind; argv += optind; if (!uflag && !gflag) uflag++; if (argc == 0) { if (uflag) errflag += showuid(getuid()); if (gflag) { mygid = getgid(); ngroups = getgroups(NGROUPS, gidset); if (ngroups < 0) err(1, "getgroups"); errflag += showgid(mygid); for (i = 0; i < ngroups; i++) if (gidset[i] != mygid) errflag += showgid(gidset[i]); } return(errflag); } if (uflag && gflag) usage(); if (uflag) { for (; argc > 0; argc--, argv++) { if (alldigits(*argv)) errflag += showuid(atoi(*argv)); else errflag += showusrname(*argv); } return(errflag); } if (gflag) { for (; argc > 0; argc--, argv++) { if (alldigits(*argv)) errflag += showgid(atoi(*argv)); else errflag += showgrpname(*argv); } } return(errflag); }
/** * @brief Check the public key in the known host line matches the public key of * the currently connected server. * * @param[in] session The SSH session to use. * * @param[in] tokens A list of tokens in the known_hosts line. * * @returns 1 if the key matches, 0 if the key doesn't match and -1 * on error. */ static int check_public_key(ssh_session session, char **tokens) { ssh_string pubkey = session->current_crypto->server_pubkey; ssh_buffer pubkey_buffer; char *pubkey_64; /* ok we found some public key in known hosts file. now un-base64it */ if (alldigits(tokens[1])) { /* openssh rsa1 format */ bignum tmpbn; ssh_string tmpstring; unsigned int len; int i; pubkey_buffer = ssh_buffer_new(); if (pubkey_buffer == NULL) { return -1; } tmpstring = ssh_string_from_char("ssh-rsa1"); if (tmpstring == NULL) { ssh_buffer_free(pubkey_buffer); return -1; } if (buffer_add_ssh_string(pubkey_buffer, tmpstring) < 0) { ssh_buffer_free(pubkey_buffer); ssh_string_free(tmpstring); return -1; } ssh_string_free(tmpstring); for (i = 2; i < 4; i++) { /* e, then n */ tmpbn = NULL; bignum_dec2bn(tokens[i], &tmpbn); if (tmpbn == NULL) { ssh_buffer_free(pubkey_buffer); return -1; } /* for some reason, make_bignum_string does not work because of the padding which it does --kv */ /* tmpstring = make_bignum_string(tmpbn); */ /* do it manually instead */ len = bignum_num_bytes(tmpbn); tmpstring = malloc(4 + len); if (tmpstring == NULL) { ssh_buffer_free(pubkey_buffer); bignum_free(tmpbn); return -1; } /* TODO: fix the hardcoding */ tmpstring->size = htonl(len); #ifdef HAVE_LIBGCRYPT bignum_bn2bin(tmpbn, len, tmpstring->string); #elif defined HAVE_LIBCRYPTO bignum_bn2bin(tmpbn, tmpstring->string); #endif bignum_free(tmpbn); if (buffer_add_ssh_string(pubkey_buffer, tmpstring) < 0) { ssh_buffer_free(pubkey_buffer); ssh_string_free(tmpstring); bignum_free(tmpbn); return -1; } ssh_string_free(tmpstring); } } else { /* ssh-dss or ssh-rsa */ pubkey_64 = tokens[2]; pubkey_buffer = base64_to_bin(pubkey_64); } if (pubkey_buffer == NULL) { ssh_set_error(session, SSH_FATAL, "Verifying that server is a known host: base64 error"); return -1; } if (buffer_get_rest_len(pubkey_buffer) != ssh_string_len(pubkey)) { ssh_buffer_free(pubkey_buffer); return 0; } /* now test that they are identical */ if (memcmp(buffer_get_rest(pubkey_buffer), pubkey->string, buffer_get_rest_len(pubkey_buffer)) != 0) { ssh_buffer_free(pubkey_buffer); return 0; } ssh_buffer_free(pubkey_buffer); return 1; }
/* * Private interface used by nss_common.c, hence this function is not static */ struct __nsw_switchconfig * _nsw_getoneconfig(const char *name, char *linep, enum __nsw_parse_err *errp) /* linep Nota Bene: not const char * */ /* errp Meanings are abused a bit */ { struct __nsw_switchconfig *cfp; struct __nsw_lookup *lkp, **lkq; int end_crit, dup_fail = 0; action_t act; char *p, *tokenp; *errp = __NSW_CONF_PARSE_SUCCESS; if ((cfp = libc_malloc(sizeof (struct __nsw_switchconfig))) == NULL) { *errp = __NSW_CONF_PARSE_SYSERR; return (NULL); } LIBC_STRDUP(cfp->dbase, name); lkq = &cfp->lookups; /* linep points to a naming service name */ for (;;) { int i; /* white space following the last service */ if (*linep == '\0' || *linep == '\n') { return (cfp); } if ((lkp = libc_malloc(sizeof (struct __nsw_lookup))) == NULL) { *errp = __NSW_CONF_PARSE_SYSERR; freeconf(cfp); return (NULL); } *lkq = lkp; lkq = &lkp->next; for (i = 0; i < __NSW_STD_ERRS; i++) if (i == __NSW_SUCCESS) lkp->actions[i] = 1; else lkp->actions[i] = 0; /* get criteria for the naming service */ if (tokenp = skip(&linep, '[')) { /* got criteria */ /* premature end, illegal char following [ */ if (!islabel(*linep)) goto barf_line; LIBC_STRDUP(lkp->service_name, tokenp); cfp->num_lookups++; end_crit = 0; /* linep points to a switch_err */ for (;;) { if ((tokenp = skip(&linep, '=')) == NULL) { goto barf_line; } /* premature end, ill char following = */ if (!islabel(*linep)) goto barf_line; /* linep points to the string following '=' */ p = labelskip(linep); if (*p == ']') end_crit = 1; else if (*p != ' ' && *p != '\t') goto barf_line; *p++ = '\0'; /* null terminate linep */ p = spaceskip(p); if (!end_crit) { if (*p == ']') { end_crit = 1; *p++ = '\0'; } else if (*p == '\0' || *p == '\n') return (cfp); else if (!islabel(*p)) /* p better be the next switch_err */ goto barf_line; } if (strcasecmp(linep, __NSW_STR_RETURN) == 0) act = __NSW_RETURN; else if (strcasecmp(linep, __NSW_STR_CONTINUE) == 0) act = __NSW_CONTINUE; else if (strcasecmp(linep, __NSW_STR_FOREVER) == 0) /* * =forever or =N might be in conf file * but old progs won't expect it. */ act = __NSW_RETURN; else if (alldigits(linep)) act = __NSW_CONTINUE; else goto barf_line; if (strcasecmp(tokenp, __NSW_STR_SUCCESS) == 0) { lkp->actions[__NSW_SUCCESS] = act; } else if (strcasecmp(tokenp, __NSW_STR_NOTFOUND) == 0) { lkp->actions[__NSW_NOTFOUND] = act; } else if (strcasecmp(tokenp, __NSW_STR_UNAVAIL) == 0) { lkp->actions[__NSW_UNAVAIL] = act; } else if (strcasecmp(tokenp, __NSW_STR_TRYAGAIN) == 0) { lkp->actions[__NSW_TRYAGAIN] = act; } else { /*EMPTY*/ /* * convert string tokenp to integer * and put in long_errs */ } if (end_crit) { linep = spaceskip(p); if (*linep == '\0' || *linep == '\n') return (cfp); break; /* process next naming service */ } linep = p; } /* end of while loop for a name service's criteria */ } else { /* * no criteria for this naming service. * linep points to name service, but not null * terminated. */ p = labelskip(linep); if (*p == '\0' || *p == '\n') { *p = '\0'; LIBC_STRDUP(lkp->service_name, linep); cfp->num_lookups++; return (cfp); } if (*p != ' ' && *p != '\t') goto barf_line; *p++ = '\0'; LIBC_STRDUP(lkp->service_name, linep); cfp->num_lookups++; linep = spaceskip(p); } } /* end of while(1) loop for a name service */ barf_line: freeconf(cfp); *errp = dup_fail ? __NSW_CONF_PARSE_SYSERR : __NSW_CONF_PARSE_NOPOLICY; return (NULL); }
/* * Private interface used by nss_common.c, hence this function is not static */ struct __nsw_switchconfig_v1 * _nsw_getoneconfig_v1(const char *name, char *linep, enum __nsw_parse_err *errp) /* linep Nota Bene: not const char * */ /* errp Meanings are abused a bit */ { struct __nsw_switchconfig_v1 *cfp; struct __nsw_lookup_v1 *lkp, **lkq; int end_crit, dup_fail = 0; action_t act; char *p, *tokenp; *errp = __NSW_CONF_PARSE_SUCCESS; if ((cfp = libc_malloc(sizeof (struct __nsw_switchconfig_v1))) == NULL) { *errp = __NSW_CONF_PARSE_SYSERR; return (NULL); } LIBC_STRDUP(cfp->dbase, name); lkq = &cfp->lookups; /* linep points to a naming service name */ for (;;) { int i; /* white space following the last service */ if (*linep == '\0' || *linep == '\n') { return (cfp); } if ((lkp = libc_malloc(sizeof (struct __nsw_lookup_v1))) == NULL) { *errp = __NSW_CONF_PARSE_SYSERR; freeconf_v1(cfp); return (NULL); } *lkq = lkp; lkq = &lkp->next; for (i = 0; i < __NSW_STD_ERRS_V1; i++) if (i == __NSW_SUCCESS) lkp->actions[i] = __NSW_RETURN; else if (i == __NSW_TRYAGAIN) lkp->actions[i] = __NSW_TRYAGAIN_FOREVER; else lkp->actions[i] = __NSW_CONTINUE; /* get criteria for the naming service */ if (tokenp = skip(&linep, '[')) { /* got criteria */ /* premature end, illegal char following [ */ if (!islabel(*linep)) goto barf_line; LIBC_STRDUP(lkp->service_name, tokenp); cfp->num_lookups++; set_dns_default_lkp(lkp); end_crit = 0; /* linep points to a switch_err */ for (;;) { int ntimes = 0; /* try again max N times */ int dns_continue = 0; if ((tokenp = skip(&linep, '=')) == NULL) { goto barf_line; } /* premature end, ill char following = */ if (!islabel(*linep)) goto barf_line; /* linep points to the string following '=' */ p = labelskip(linep); if (*p == ']') end_crit = 1; else if (*p != ' ' && *p != '\t') goto barf_line; *p++ = '\0'; /* null terminate linep */ p = spaceskip(p); if (!end_crit) { if (*p == ']') { end_crit = 1; *p++ = '\0'; } else if (*p == '\0' || *p == '\n') { return (cfp); } else if (!islabel(*p)) /* p better be the next switch_err */ goto barf_line; } if (strcasecmp(linep, __NSW_STR_RETURN) == 0) act = __NSW_RETURN; else if (strcasecmp(linep, __NSW_STR_CONTINUE) == 0) { if (strcasecmp(lkp->service_name, "dns") == 0 && strcasecmp(tokenp, __NSW_STR_TRYAGAIN) == 0) { /* * Add one more condition * so it retries only if it's * "dns [TRYAGAIN=continue]" */ dns_continue = 1; act = __NSW_TRYAGAIN_NTIMES; } else act = __NSW_CONTINUE; } else if (strcasecmp(linep, __NSW_STR_FOREVER) == 0) act = __NSW_TRYAGAIN_FOREVER; else if (alldigits(linep)) { act = __NSW_TRYAGAIN_NTIMES; ntimes = atoi(linep); if (ntimes < 0 || ntimes > INT_MAX) ntimes = 0; } else goto barf_line; if (__NSW_SUCCESS_ACTION(act) && strcasecmp(tokenp, __NSW_STR_SUCCESS) == 0) { lkp->actions[__NSW_SUCCESS] = act; } else if (__NSW_NOTFOUND_ACTION(act) && strcasecmp(tokenp, __NSW_STR_NOTFOUND) == 0) { lkp->actions[__NSW_NOTFOUND] = act; } else if (__NSW_UNAVAIL_ACTION(act) && strcasecmp(tokenp, __NSW_STR_UNAVAIL) == 0) { lkp->actions[__NSW_UNAVAIL] = act; } else if (__NSW_TRYAGAIN_ACTION(act) && strcasecmp(tokenp, __NSW_STR_TRYAGAIN) == 0) { lkp->actions[__NSW_TRYAGAIN] = act; if (strcasecmp(lkp->service_name, "nis") == 0) lkp->actions[ __NSW_NISSERVDNS_TRYAGAIN] = act; if (act == __NSW_TRYAGAIN_NTIMES) lkp->max_retries = dns_continue ? dns_tryagain_retry : ntimes; } else { /*EMPTY*/ /* * convert string tokenp to integer * and put in long_errs */ } if (end_crit) { linep = spaceskip(p); if (*linep == '\0' || *linep == '\n') return (cfp); break; /* process next naming service */ } linep = p; } /* end of while loop for a name service's criteria */ } else { /* * no criteria for this naming service. * linep points to name service, but not null * terminated. */ p = labelskip(linep); if (*p == '\0' || *p == '\n') { *p = '\0'; LIBC_STRDUP(lkp->service_name, linep); set_dns_default_lkp(lkp); cfp->num_lookups++; return (cfp); } if (*p != ' ' && *p != '\t') goto barf_line; *p++ = '\0'; LIBC_STRDUP(lkp->service_name, linep); set_dns_default_lkp(lkp); cfp->num_lookups++; linep = spaceskip(p); } } /* end of while(1) loop for a name service */ barf_line: freeconf_v1(cfp); *errp = dup_fail ? __NSW_CONF_PARSE_SYSERR : __NSW_CONF_PARSE_NOPOLICY; return (NULL); }
int main(int argc, char *argv[]) { int ngroups; gid_t mygid, gidset[NGROUPS]; int i, gflag = 0, uflag = 0; int ch; extern char *optarg; extern int optind; while ((ch = getopt(argc, argv, "ugvq")) != -1) { switch(ch) { case 'g': gflag++; break; case 'u': uflag++; break; case 'v': vflag++; break; case 'q': qflag++; break; default: usage(); } } argc -= optind; argv += optind; if (!uflag && !gflag) uflag++; if (argc == 0) { if (uflag) showuid(getuid()); if (gflag) { mygid = getgid(); ngroups = getgroups(NGROUPS, gidset); if (ngroups < 0) err(1, "getgroups"); showgid(mygid); for (i = 0; i < ngroups; i++) if (gidset[i] != mygid) showgid(gidset[i]); } exit(0); } if (uflag && gflag) usage(); if (uflag) { for (; argc > 0; argc--, argv++) { if (alldigits(*argv)) showuid(atoi(*argv)); else showusrname(*argv); } exit(0); } if (gflag) { for (; argc > 0; argc--, argv++) { if (alldigits(*argv)) showgid(atoi(*argv)); else showgrpname(*argv); } exit(0); } /* NOTREACHED */ exit(1); }