void nis_userdbInit(void) { char *data; int len, yperr; domainname=rcfg_lookup(conf.cf, "etc.nisdomain"); if(domainname==NULL) { yp_get_default_domain(&domainname); } yp_bind(domainname); yperr=yp_match(domainname, conf.userdb, "blah", 4, &data, &len); if(yperr==YPERR_MAP) { fprintf(stderr, "Warning, table %s not found in NIS, setting to %s\n", conf.userdb, NIS_DEFAULTUDB); conf.userdb=NIS_DEFAULTUDB; } conf.udb.u_exists=nis_u_exists; conf.udb.getuser=nis_getuser; conf.udb.listusers=nis_listusers; conf.udb.storeuser=nis_storeuser; conf.udb.deleteuser=nis_deleteuser; conf.udb.eraseuserdb=nis_eraseuserdb; conf.udb.parseusers=nis_parseusers; }
/*! @decl void create(string|void domain) *! @decl void bind(string domain) *! *! If @[domain] is not specified , the default domain will be used. *! (As returned by @[Yp.default_domain()]). *! *! If there is no YP server available for the domain, this *! function call will block until there is one. If no server appears *! in about ten minutes or so, an error will be returned. This timeout *! is not configurable. *! *! @seealso *! @[Yp.default_domain()] */ static void f_create(INT32 args) { int err; if(!args) { f_default_domain(0); args = 1; } check_all_args(NULL, args, BIT_STRING,0); if(this->domain) { yp_unbind( this->domain ); free(this->domain); } this->domain = strdup( sp[-args].u.string->str ); err = yp_bind( this->domain ); YPERROR( err ); }
int getgrouplist(const char *uname, gid_t agroup, gid_t *groups, int *grpcnt) { int i, ngroups = 0, ret = 0, maxgroups = *grpcnt, bail; int needyp = 0, foundyp = 0; int *skipyp = &foundyp; extern struct group *_getgrent_yp(int *); struct group *grp; /* * install primary group */ if (ngroups >= maxgroups) { *grpcnt = ngroups; return (-1); } groups[ngroups++] = agroup; /* * Scan the group file to find additional groups. */ setgrent(); while ((grp = _getgrent_yp(skipyp)) || foundyp) { if (foundyp) { if (foundyp > 0) needyp = 1; else skipyp = NULL; foundyp = 0; continue; } if (grp->gr_gid == agroup) continue; for (bail = 0, i = 0; bail == 0 && i < ngroups; i++) if (groups[i] == grp->gr_gid) bail = 1; if (bail) continue; for (i = 0; grp->gr_mem[i]; i++) { if (!strcmp(grp->gr_mem[i], uname)) { if (ngroups >= maxgroups) { ret = -1; goto out; } groups[ngroups++] = grp->gr_gid; break; } } } #ifdef YP /* * If we were told that there is a YP marker, look at netid data. */ if (skipyp && needyp) { char buf[MAXLINELENGTH], *ypdata = NULL, *key; static char *__ypdomain; struct passwd pwstore; int ypdatalen; /* Construct the netid key to look up. */ if (getpwnam_r(uname, &pwstore, buf, sizeof buf, NULL) || (!__ypdomain && yp_get_default_domain(&__ypdomain))) goto out; asprintf(&key, "unix.%u@%s", pwstore.pw_uid, __ypdomain); if (key == NULL) goto out; /* First scan the static netid file. */ switch (_read_netid(key, pwstore.pw_uid, groups, &ngroups, maxgroups)) { case -1: ret = -1; /* FALLTHROUGH */ case 1: free(key); goto out; default: break; } /* Only access YP when there is no static entry. */ if (!yp_bind(__ypdomain) && !yp_match(__ypdomain, "netid.byname", key, (int)strlen(key), &ypdata, &ypdatalen)) if (_parse_netid(ypdata, pwstore.pw_uid, groups, &ngroups, maxgroups) == -1) ret = -1; free(key); free(ypdata); } #endif /* YP */ out: endgrent(); *grpcnt = ngroups; return (ret); }
int main(int argc, char *argv[]) { char *domdot, *verstr, *vertmp; int ppid = 0; int error; char *progname = NULL; /* "amd" */ char hostname[MAXHOSTNAMELEN + 1] = "localhost"; /* Hostname */ /* * Make sure some built-in assumptions are true before we start */ assert(sizeof(nfscookie) >= sizeof(u_int)); assert(sizeof(int) >= 4); /* * Set processing status. */ amd_state = Start; /* * Determine program name */ if (argv[0]) { progname = strrchr(argv[0], '/'); if (progname && progname[1]) progname++; else progname = argv[0]; } if (!progname) progname = "amd"; am_set_progname(progname); /* * Initialize process id. This is kept * cached since it is used for generating * and using file handles. */ am_set_mypid(); /* * Get local machine name */ if (gethostname(hostname, sizeof(hostname)) < 0) { plog(XLOG_FATAL, "gethostname: %m"); going_down(1); } hostname[sizeof(hostname) - 1] = '\0'; /* * Check it makes sense */ if (!*hostname) { plog(XLOG_FATAL, "host name is not set"); going_down(1); } /* * Initialize global options structure. */ init_global_options(); /* * Partially initialize hostd[]. This * is completed in get_args(). */ if ((domdot = strchr(hostname, '.'))) { /* * Hostname already contains domainname. * Split out hostname and domainname * components */ *domdot++ = '\0'; hostdomain = domdot; } xstrlcpy(hostd, hostname, sizeof(hostd)); am_set_hostname(hostname); /* * Setup signal handlers */ /* SIGINT: trap interrupts for shutdowns */ setup_sighandler(SIGINT, sigterm); /* SIGTERM: trap terminate so we can shutdown cleanly (some chance) */ setup_sighandler(SIGTERM, sigterm); /* SIGHUP: hangups tell us to reload the cache */ setup_sighandler(SIGHUP, sighup); /* * SIGCHLD: trap Death-of-a-child. These allow us to pick up the exit * status of backgrounded mounts. See "sched.c". */ setup_sighandler(SIGCHLD, sigchld); #ifdef HAVE_SIGACTION /* construct global "masked_sigs" used in nfs_start.c */ sigemptyset(&masked_sigs); sigaddset(&masked_sigs, SIGINT); sigaddset(&masked_sigs, SIGTERM); sigaddset(&masked_sigs, SIGHUP); sigaddset(&masked_sigs, SIGCHLD); #endif /* HAVE_SIGACTION */ /* * Fix-up any umask problems. Most systems default * to 002 which is not too convenient for our purposes */ orig_umask = umask(0); /* * Figure out primary network name */ getwire(&PrimNetName, &PrimNetNum); /* * Determine command-line arguments */ get_args(argc, argv); /* * Log version information. */ vertmp = get_version_string(); verstr = strtok(vertmp, "\n"); plog(XLOG_INFO, "AM-UTILS VERSION INFORMATION:"); while (verstr) { plog(XLOG_INFO, "%s", verstr); verstr = strtok(NULL, "\n"); } XFREE(vertmp); /* * Get our own IP address so that we can mount the automounter. We pass * localhost_address which could be used as the default localhost * name/address in amu_get_myaddress(). */ amu_get_myaddress(&myipaddr, gopt.localhost_address); plog(XLOG_INFO, "My ip addr is %s", inet_ntoa(myipaddr)); /* avoid hanging on other NFS servers if started elsewhere */ if (chdir("/") < 0) plog(XLOG_INFO, "cannot chdir to /: %m"); /* * Now check we are root. */ if (geteuid() != 0) { plog(XLOG_FATAL, "Must be root to mount filesystems (euid = %ld)", (long) geteuid()); going_down(1); } #ifdef HAVE_MAP_NIS /* * If the domain was specified then bind it here * to circumvent any default bindings that may * be done in the C library. */ if (gopt.nis_domain && yp_bind(gopt.nis_domain)) { plog(XLOG_FATAL, "Can't bind to NIS domain \"%s\"", gopt.nis_domain); going_down(1); } #endif /* HAVE_MAP_NIS */ if (!amuDebug(D_DAEMON)) ppid = daemon_mode(); /* * Lock process text and data segment in memory. */ if (gopt.flags & CFM_PROCESS_LOCK) { do_memory_locking(); } do_mapc_reload = clocktime(NULL) + gopt.map_reload_interval; /* * Register automounter with system. */ error = mount_automounter(ppid); if (error && ppid) kill(ppid, SIGALRM); #ifdef HAVE_FS_AUTOFS /* * XXX this should be part of going_down(), but I can't move it there * because it would be calling non-library code from the library... ugh */ if (amd_use_autofs) destroy_autofs_service(); #endif /* HAVE_FS_AUTOFS */ going_down(error); abort(); return 1; /* should never get here */ }
static int grscan(int search, gid_t gid, const char *name, struct group *p_gr, struct group_storage *gs, int *foundyp) { char *cp, **m; char *bp, *endp; u_long ul; #ifdef YP char *key, *data; int keylen, datalen; int r; #endif char **members; char *line; int saved_errno; if (gs == NULL) return 0; members = gs->members; line = gs->line; saved_errno = errno; for (;;) { #ifdef YP if (__ypmode) { if (__ypcurrent) { r = yp_next(__ypdomain, "group.byname", __ypcurrent, __ypcurrentlen, &key, &keylen, &data, &datalen); free(__ypcurrent); __ypcurrent = key; __ypcurrentlen = keylen; } else { r = yp_first(__ypdomain, "group.byname", &__ypcurrent, &__ypcurrentlen, &data, &datalen); } if (r) { __ypmode = 0; __ypcurrent = NULL; if (r == YPERR_NOMORE) continue; else return 0; } bcopy(data, line, datalen); free(data); line[datalen] = '\0'; bp = line; goto parse; } #endif if (!fgets(line, sizeof(gs->line), _gr_fp)) { if (feof(_gr_fp) && !ferror(_gr_fp)) errno = saved_errno; return 0; } bp = line; /* skip lines that are too big */ if (!strchr(line, '\n')) { int ch; while ((ch = getc_unlocked(_gr_fp)) != '\n' && ch != EOF) ; continue; } #ifdef YP if (line[0] == '+' || line[0] == '-') { if (__ypdomain == NULL && yp_get_default_domain(&__ypdomain)) goto parse; switch (yp_bind(__ypdomain)) { case 0: break; case YPERR_BADARGS: case YPERR_YPBIND: goto parse; default: return 0; } } if (line[0] == '+') { switch (line[1]) { case ':': case '\0': case '\n': if (foundyp) { *foundyp = 1; errno = saved_errno; return 0; } if (!search) { __ypmode = 1; continue; } if (name) { r = yp_match(__ypdomain, "group.byname", name, strlen(name), &data, &datalen); } else { char buf[20]; snprintf(buf, sizeof buf, "%u", gid); r = yp_match(__ypdomain, "group.bygid", buf, strlen(buf), &data, &datalen); } switch (r) { case 0: break; case YPERR_KEY: continue; default: return 0; } bcopy(data, line, datalen); free(data); line[datalen] = '\0'; bp = line; p_gr->gr_name = strsep(&bp, ":\n"); if (__ypexclude_is(&__ypexhead, p_gr->gr_name)) continue; p_gr->gr_passwd = strsep(&bp, ":\n"); if (!(cp = strsep(&bp, ":\n"))) continue; if (name) { ul = strtoul(cp, &endp, 10); if (*endp != '\0' || endp == cp || ul >= GID_MAX) continue; p_gr->gr_gid = ul; } else p_gr->gr_gid = gid; goto found_it; default: bp = strsep(&bp, ":\n") + 1; if ((search && name && strcmp(bp, name)) || __ypexclude_is(&__ypexhead, bp)) continue; r = yp_match(__ypdomain, "group.byname", bp, strlen(bp), &data, &datalen); switch (r) { case 0: break; case YPERR_KEY: continue; default: return 0; } bcopy(data, line, datalen); free(data); line[datalen] = '\0'; bp = line; } } else if (line[0] == '-') { if (__ypexclude_add(&__ypexhead, strsep(&line, ":\n") + 1)) return 0; if (foundyp) { *foundyp = -1; errno = saved_errno; return 0; } continue; } parse: #endif p_gr->gr_name = strsep(&bp, ":\n"); if (search && name && strcmp(p_gr->gr_name, name)) continue; #ifdef YP if (__ypmode && __ypexclude_is(&__ypexhead, p_gr->gr_name)) continue; #endif p_gr->gr_passwd = strsep(&bp, ":\n"); if (!(cp = strsep(&bp, ":\n"))) continue; ul = strtoul(cp, &endp, 10); if (endp == cp || *endp != '\0' || ul >= GID_MAX) continue; p_gr->gr_gid = ul; if (search && name == NULL && p_gr->gr_gid != gid) continue; #ifdef YP found_it: #endif cp = NULL; if (bp == NULL) continue; for (m = p_gr->gr_mem = members;; bp++) { if (m == &members[MAXGRP - 1]) break; if (*bp == ',') { if (cp) { *bp = '\0'; *m++ = cp; cp = NULL; } } else if (*bp == '\0' || *bp == '\n' || *bp == ' ') { if (cp) { *bp = '\0'; *m++ = cp; } break; } else if (cp == NULL) cp = bp; } *m = NULL; errno = saved_errno; return 1; } /* NOTREACHED */ }
int main(int argc, char *argv[]) { struct ypall_callback ypcb; extern char *optarg; extern int optind; char *domain, *map, *hostname; int c, r, i; char *ypmap = "ypservers"; CLIENT *client; static char map_path[MAXPATHLEN]; struct stat finfo; DBM *yp_databas; char order_key[YP_LAST_LEN] = YP_LAST_KEY; datum o; yp_get_default_domain(&domain); hostname = NULL; while ((c=getopt(argc, argv, "d:h:v")) != -1) switch (c) { case 'd': domain = optarg; break; case 'h': hostname = optarg; break; case 'v': Verbose = 1; break; default: usage(); /*NOTREACHED*/ } if (optind + 1 != argc ) usage(); map = argv[optind]; strncpy(Domain, domain, sizeof(Domain)-1); Domain[sizeof(Domain)-1] = '\0'; strncpy(Map, map, sizeof(Map)-1); Map[sizeof(Map)-1] = '\0'; /* Check domain */ snprintf(map_path, sizeof map_path, "%s/%s", YP_DB_PATH, domain); if (!((stat(map_path, &finfo) == 0) && S_ISDIR(finfo.st_mode))) { fprintf(stderr, "yppush: Map does not exist.\n"); exit(1); } /* Check map */ snprintf(map_path, sizeof map_path, "%s/%s/%s%s", YP_DB_PATH, domain, Map, YPDB_SUFFIX); if (!(stat(map_path, &finfo) == 0)) { fprintf(stderr, "yppush: Map does not exist.\n"); exit(1); } snprintf(map_path, sizeof map_path, "%s/%s/%s", YP_DB_PATH, domain, Map); yp_databas = ypdb_open(map_path, 0, O_RDONLY); OrderNum=0xffffffff; if (yp_databas == 0) { fprintf(stderr, "yppush: %s%s: Cannot open database\n", map_path, YPDB_SUFFIX); } else { o.dptr = (char *) &order_key; o.dsize = YP_LAST_LEN; o = ypdb_fetch(yp_databas, o); if (o.dptr == NULL) { fprintf(stderr, "yppush: %s: Cannot determine order number\n", Map); } else { OrderNum=0; for (i=0; i<o.dsize-1; i++) { if (!isdigit(o.dptr[i])) OrderNum=0xffffffff; } if (OrderNum != 0) { fprintf(stderr, "yppush: %s: Invalid order number '%s'\n", Map, o.dptr); } else { OrderNum = atoi(o.dptr); } } } yp_bind(Domain); r = yp_master(Domain, ypmap, &master); if (r != 0) { fprintf(stderr, "yppush: could not get ypservers map\n"); exit(1); } if (hostname != NULL) { push(strlen(hostname), hostname); } else { if (Verbose) { printf("Contacting master for ypservers (%s).\n", master); } client = yp_bind_host(master, YPPROG, YPVERS, 0, 1); ypcb.foreach = pushit; ypcb.data = NULL; r = yp_all_host(client, Domain, ypmap, &ypcb); } exit(0); }
u_int32_t NIS_new(void **c, char *args, dynainfo *d) { agent_private *ap; dsrecord *r; dsattribute *a; dsdata *x; int status, didSetTTL; char *dn; if (c == NULL) return 1; rpcLock = syslock_get(RPCLockName); syslock_lock(rpcLock); if (args == NULL) yp_get_default_domain(&dn); else dn = args; syslock_unlock(rpcLock); if (dn == NULL) return 1; syslock_lock(rpcLock); status = yp_bind(dn); syslock_unlock(rpcLock); if (status != 0) return 1; ap = (agent_private *)malloc(sizeof(agent_private)); *c = ap; ap->nis_domain_name = copyString(dn); ap->dyna = d; system_log(LOG_DEBUG, "Allocated NIS 0x%08x\n", (int)ap); timeToLive = DefaultTimeToLive; r = NULL; didSetTTL = 0; if (ap->dyna != NULL) { if (ap->dyna->dyna_config_agent != NULL) { status = (ap->dyna->dyna_config_agent)(ap->dyna, -1, &r); if (status == 0) { x = cstring_to_dsdata("TimeToLive"); a = dsrecord_attribute(r, x, SELECT_ATTRIBUTE); dsdata_release(x); if (a != NULL) { x = dsattribute_value(a, 0); if (x != NULL) { timeToLive = atoi(dsdata_to_cstring(x)); dsdata_release(x); didSetTTL = 1; } dsattribute_release(a); } dsrecord_release(r); } } if ((didSetTTL == 0) && (ap->dyna->dyna_config_global != NULL)) { status = (ap->dyna->dyna_config_global)(ap->dyna, -1, &r); if (status == 0) { x = cstring_to_dsdata("TimeToLive"); a = dsrecord_attribute(r, x, SELECT_ATTRIBUTE); dsdata_release(x); if (a != NULL) { x = dsattribute_value(a, 0); if (x != NULL) { timeToLive = atoi(dsdata_to_cstring(x)); dsdata_release(x); didSetTTL = 1; } dsattribute_release(a); } dsrecord_release(r); } } } return 0; }