/*
* CDDL HEADER START
*
* The contents of this file are subject to the terms of the
* Common Development and Distribution License (the "License").
* You may not use this file except in compliance with the License.
*
* You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
* See the License for the specific language governing permissions
* and limitations under the License.
*
* When distributing Covered Code, include this CDDL HEADER in each
* file and include the License file at usr/src/OPENSOLARIS.LICENSE.
* If applicable, add the following below this CDDL HEADER, with the
* fields enclosed by brackets "[]" replaced with your own identifying
* information: Portions Copyright [yyyy] [name of copyright owner]
*
* CDDL HEADER END
*/
/*
* Copyright 2009 Sun Microsystems, Inc. All rights reserved.
* Use is subject to license terms.
*/
/* Copyright (c) 1983, 1984, 1985, 1986, 1987, 1988, 1989 AT&T */
/* All Rights Reserved */
/*
* Portions of this source code were derived from Berkeley
* 4.3 BSD under license from the Regents of the University of
* California.
*/
/*
* ==== hack-attack: possibly MT-safe but definitely not MT-hot.
* ==== turn this into a real switch frontend and backends
*
* Well, at least the API doesn't involve pointers-to-static.
*/
/*
* netname utility routines (getnetname, user2netname, host2netname).
*
* Convert from unix names (uid, gid) to network wide names.
* This module is operating system dependent!
* What we define here will work with any unix system that has adopted
* the Sun NIS domain architecture.
*/
#include "mt.h"
#include "rpc_mt.h"
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <ctype.h>
#include <string.h>
#include <syslog.h>
#include <rpcsvc/nis_dhext.h>
#include <nsswitch.h>
#include <syslog.h>
#include <errno.h>
#ifndef MAXHOSTNAMELEN
#endif
#ifndef NGROUPS
#endif
/*
* the value for NOBODY_UID is set by the SVID. The following define also
* appears in netnamer.c
*/
extern int getdomainname();
extern int key_call();
/*
* default publickey policy:
* publickey: nis [NOTFOUND = return] files
*/
/* NSW_NOTSUCCESS NSW_NOTFOUND NSW_UNAVAIL NSW_TRYAGAIN */
/*
* Convert unix cred to network-name by concatenating the
* 3 pieces of information <opsys type> <uid> <domain>.
*/
static int
char *domain)
{
int i;
char *dfltdom;
if (__rpc_get_default_domain(&dfltdom) != 0) {
*err = __NSW_UNAVAIL;
return (0);
}
}
(size_t)MAXNETNAMELEN) {
*err = __NSW_UNAVAIL;
return (0);
}
*err = __NSW_SUCCESS;
return (1);
}
/*
* Figure out my fully qualified network name
*/
int
{
if (uid == 0)
}
/*
* Figure out the fully qualified network name for the given uid.
* This is a private interface.
*/
int
{
if (uid == 0)
}
/*
* Convert unix cred to network-name
*
* It uses the publickey policy in the /etc/nsswitch.conf file
* (Unless the netname is "nobody", which is special cased).
* If there is no publickey policy in /etc/nsswitch.conf,
* the default publickey policy is used, which is
* publickey: nis [NOTFOUND=return] files
* Note that for the non-nisplus case, there is no failover
* so only the first entry would be relevant for those cases.
*/
int
const char *domain)
{
int err;
/*
* Take care of the special case of "nobody". If the uid is
* the value assigned by the SVID for nobody, return the string
* "nobody".
*/
if (uid == NOBODY_UID) {
return (1);
}
/*
* This thread already holds this lock. This scenario
* occurs when a process requires a netname which
* itself requires a netname to look up. As we clearly
* can't continue like this we return 'nobody'.
*/
return (1);
}
if (!conf) {
needfree = 0;
}
/* ldap, nis, and files all do the same thing. */
else {
"user2netname: unknown nameservice \
for publickey info '%s'\n",
look->service_name);
err = __NSW_UNAVAIL;
}
case __NSW_CONTINUE :
break;
case __NSW_RETURN :
if (needfree)
(void) __nsw_freeconfig(conf);
(void) mutex_unlock(&serialize_netname);
return (res);
default :
"user2netname: Unknown action for nameservice '%s'",
look->service_name);
}
}
if (needfree)
(void) __nsw_freeconfig(conf);
(void) mutex_unlock(&serialize_netname);
return (0);
}
/*
* Convert host to network-name
* This routine returns following netnames given the host and domain
* arguments defined below: (domainname=y.z)
* Arguments
* host domain netname
* ---- ------ -------
* - - unix.m@y.z (hostname=m)
* - a.b unix.m@a.b (hostname=m)
* - - unix.m@y.z (hostname=m.w.x)
* - a.b unix.m@a.b (hostname=m.w.x)
* h - unix.h@y.z
* h a.b unix.h@a.b
* h.w.x - unix.h@w.x
* h.w.x a.b unix.h@a.b
*/
int
const char *domain)
{
char *p;
char *dot_in_host;
int i;
if (p) {
*p++ = '\0';
/* if no domain passed, use tail of nis_local_host() */
domain = p;
}
}
} else {
return (0);
}
}
p = dot_in_host;
if (p) {
p = (char *)nis_domain_of(hostname);
if (len >= sizeof (domainname)) {
return (0);
}
(void) strcpy(domainname, p);
} else {
domainname[0] = NULL;
return (0);
}
} else {
if (len >= sizeof (domainname)) {
return (0);
}
}
i = strlen(domainname);
if (i == 0)
/* No domainname */
return (0);
domainname[i - 1] = 0;
if (dot_in_host) { /* strip off rest of name */
*dot_in_host = '\0';
}
> (size_t)MAXNETNAMELEN) {
return (0);
}
return (1);
}