/* * netname2user_files() * * This routine fetches the netid information from the "files" nameservice. * ie /etc/netid. */ static int netname2user_files(int *err, char *netname, struct netid_userdata *argp) { char buf[512]; /* one line from the file */ char *name; char *value; char *res; FILE *fd; fd = fopen(NETIDFILE, "rF"); if (fd == NULL) { *err = __NSW_UNAVAIL; return (0); } /* * for each line in the file parse it appropriately * file format is : * netid uid:grp,grp,grp # for users * netid 0:hostname # for hosts */ while (!feof(fd)) { res = fgets(buf, 512, fd); if (res == NULL) break; /* Skip comments and blank lines */ if ((*res == '#') || (*res == '\n')) continue; name = &(buf[0]); while (isspace(*name)) name++; if (*name == '\0') /* blank line continue */ continue; value = name; /* will contain the value eventually */ while (!isspace(*value)) value++; if (*value == '\0') { syslog(LOG_WARNING, "netname2user: badly formatted line in %s.", NETIDFILE); continue; } *value++ = '\0'; /* nul terminate the name */ if (strcasecmp(name, netname) == 0) { (void) fclose(fd); while (isspace(*value)) value++; *err = parse_netid_str(value, argp); return (*err == __NSW_SUCCESS); } } (void) fclose(fd); *err = __NSW_NOTFOUND; return (0); }
enum nss_status _nss_nis_netname2user (char netname[MAXNETNAMELEN + 1], uid_t *uidp, gid_t *gidp, int *gidlenp, gid_t *gidlist, int *errnop) { char *domain; int yperr; char *lookup; int len; domain = strchr (netname, '@'); if (!domain) { *errnop = EINVAL; return NSS_STATUS_UNAVAIL; } /* Point past the '@' character */ ++domain; lookup = NULL; yperr = yp_match (domain, "netid.byname", netname, strlen (netname), &lookup, &len); switch (yperr) { case YPERR_SUCCESS: break; /* the successful case */ case YPERR_DOMAIN: case YPERR_KEY: *errnop = ENOENT; return NSS_STATUS_NOTFOUND; case YPERR_MAP: default: return NSS_STATUS_UNAVAIL; } if (lookup) { enum nss_status err; lookup[len] = '\0'; err = parse_netid_str (lookup, uidp, gidp, gidlenp, gidlist); free (lookup); return err; } else { *errnop = ENOENT; return NSS_STATUS_NOTFOUND; } return NSS_STATUS_SUCCESS; }
/* * netname2user_nis() * * This function reads the netid from the NIS (YP) nameservice. */ static int netname2user_nis(int *err, char *netname, struct netid_userdata *argp) { char *domain; int yperr; char *lookup; int len; domain = strchr(netname, '@'); if (!domain) { *err = __NSW_UNAVAIL; return (0); } /* Point past the '@' character */ domain++; lookup = NULL; yperr = yp_match(domain, (char *)NETID, netname, strlen(netname), &lookup, &len); switch (yperr) { case 0: break; /* the successful case */ default : /* * XXX not sure about yp_match semantics. * should err be set to NOTFOUND here? */ *err = __NSW_UNAVAIL; return (0); } if (lookup) { lookup[len] = '\0'; *err = parse_netid_str(lookup, argp); free(lookup); return (*err == __NSW_SUCCESS); } *err = __NSW_NOTFOUND; return (0); }