/* * Convert host to network-name */ int host2netname( char netname[MAXNETNAMELEN + 1], const char *host, const char *domain) { char *dfltdom; char hostname[MAXHOSTNAMELEN+1]; if (domain == NULL) { if (_rpc_get_default_domain(&dfltdom) != 0) { return (0); } domain = dfltdom; } if (host == NULL) { (void) gethostname(hostname, sizeof(hostname)); host = hostname; } if (strlen(domain) + 1 + strlen(host) > MAXNETNAMELEN) { return (0); } (void) sprintf(netname, "%s.%s@%s", OPSYS, host, domain); return (1); }
/* * Convert network-name to hostname */ int netname2host( char netname[MAXNETNAMELEN + 1], char *hostname, int hostlen) { int err; char valbuf[1024]; char *val; char *val2; int vallen; char *domain; if (getnetid(netname, valbuf)) { val = valbuf; if ((*val == '0') && (val[1] == ':')) { (void) strncpy(hostname, val + 2, hostlen); return (1); } } val = strchr(netname, '.'); if (val == NULL) return (0); if (strncmp(netname, OPSYS, (val - netname))) return (0); val++; val2 = strchr(val, '@'); if (val2 == NULL) return (0); vallen = val2 - val; if (vallen > (hostlen - 1)) vallen = hostlen - 1; (void) strncpy(hostname, val, vallen); hostname[vallen] = 0; err = _rpc_get_default_domain(&domain); /* change to rpc */ if (err) return (0); if (strcmp(val2 + 1, domain)) return (0); /* wrong domain */ else return (1); }
/* * Convert unix cred to network-name */ int user2netname( char netname[MAXNETNAMELEN + 1], const uid_t uid, const char *domain) { char *dfltdom; #define MAXIPRINT (11) /* max length of printed integer */ if (domain == NULL) { if (_rpc_get_default_domain(&dfltdom) != 0) { return (0); } domain = dfltdom; } if (strlen(domain) + 1 + MAXIPRINT > MAXNETNAMELEN) { return (0); } (void) sprintf(netname, "%s.%ld@%s", OPSYS, (u_long)uid, domain); return (1); }
/* * Convert network-name into unix credential */ int netname2user( char netname[MAXNETNAMELEN + 1], uid_t *uidp, gid_t *gidp, int *gidlenp, gid_t *gidlist) { char *p; int gidlen; uid_t uid; long luid; struct passwd *pwd; char val[1024]; char *val1, *val2; char *domain; int vallen; int err; if (getnetid(netname, val)) { p = strtok(val, ":"); if (p == NULL) return (0); *uidp = (uid_t) atol(val); p = strtok(NULL, "\n,"); *gidp = (gid_t) atol(p); if (p == NULL) { return (0); } gidlen = 0; for (gidlen = 0; gidlen < NGROUPS; gidlen++) { p = strtok(NULL, "\n,"); if (p == NULL) break; gidlist[gidlen] = (gid_t) atol(p); } *gidlenp = gidlen; return (1); } val1 = strchr(netname, '.'); if (val1 == NULL) return (0); if (strncmp(netname, OPSYS, (val1-netname))) return (0); val1++; val2 = strchr(val1, '@'); if (val2 == NULL) return (0); vallen = val2 - val1; if (vallen > (1024 - 1)) vallen = 1024 - 1; (void) strncpy(val, val1, 1024); val[vallen] = 0; err = _rpc_get_default_domain(&domain); /* change to rpc */ if (err) return (0); if (strcmp(val2 + 1, domain)) return (0); /* wrong domain */ if (sscanf(val, "%ld", &luid) != 1) return (0); uid = luid; /* use initgroups method */ pwd = getpwuid(uid); if (pwd == NULL) return (0); *uidp = pwd->pw_uid; *gidp = pwd->pw_gid; *gidlenp = _getgroups(pwd->pw_name, gidlist); return (1); }