aboutsummaryrefslogtreecommitdiff
path: root/nis/ypclnt.c
diff options
context:
space:
mode:
Diffstat (limited to 'nis/ypclnt.c')
-rw-r--r--nis/ypclnt.c311
1 files changed, 121 insertions, 190 deletions
diff --git a/nis/ypclnt.c b/nis/ypclnt.c
index ae04ee9212..85292b62d9 100644
--- a/nis/ypclnt.c
+++ b/nis/ypclnt.c
@@ -1,5 +1,4 @@
-/* Copyright (C) 1996-2001, 2002, 2003, 2004, 2005, 2006
- Free Software Foundation, Inc.
+/* Copyright (C) 1996-2001, 2002, 2003, 2004 Free Software Foundation, Inc.
This file is part of the GNU C Library.
Contributed by Thorsten Kukuk <kukuk@suse.de>, 1996.
@@ -46,12 +45,12 @@ struct dom_binding
};
typedef struct dom_binding dom_binding;
-static const struct timeval RPCTIMEOUT = {25, 0};
-static const struct timeval UDPTIMEOUT = {5, 0};
+static struct timeval RPCTIMEOUT = {25, 0};
+static struct timeval UDPTIMEOUT = {5, 0};
static int const MAXTRIES = 2;
-static char ypdomainname[NIS_MAXNAMELEN + 1];
+static char __ypdomainname[NIS_MAXNAMELEN + 1] = "\0";
__libc_lock_define_initialized (static, ypbindlist_lock)
-static dom_binding *ypbindlist = NULL;
+static dom_binding *__ypbindlist = NULL;
static void
@@ -111,8 +110,8 @@ yp_bind_ypbindprog (const char *domain, dom_binding *ysd)
int clnt_sock;
CLIENT *client;
+ memset (&clnt_saddr, '\0', sizeof clnt_saddr);
clnt_saddr.sin_family = AF_INET;
- clnt_saddr.sin_port = 0;
clnt_saddr.sin_addr.s_addr = htonl (INADDR_LOOPBACK);
clnt_sock = RPC_ANYSOCK;
client = clnttcp_create (&clnt_saddr, YPBINDPROG, YPBINDVERS,
@@ -142,7 +141,7 @@ yp_bind_ypbindprog (const char *domain, dom_binding *ysd)
if (ypbr.ypbind_status != YPBIND_SUCC_VAL)
{
- fprintf (stderr, "YPBINDPROC_DOMAIN: %s\n",
+ fprintf (stderr, _("YPBINDPROC_DOMAIN: %s\n"),
ypbinderr_string (ypbr.ypbind_resp_u.ypbind_error));
return YPERR_DOMAIN;
}
@@ -225,7 +224,7 @@ yp_bind (const char *indomain)
__libc_lock_lock (ypbindlist_lock);
- status = __yp_bind (indomain, &ypbindlist);
+ status = __yp_bind (indomain, &__ypbindlist);
__libc_lock_unlock (ypbindlist_lock);
@@ -239,7 +238,7 @@ yp_unbind_locked (const char *indomain)
dom_binding *ydbptr, *ydbptr2;
ydbptr2 = NULL;
- ydbptr = ypbindlist;
+ ydbptr = __ypbindlist;
while (ydbptr != NULL)
{
@@ -249,7 +248,7 @@ yp_unbind_locked (const char *indomain)
work = ydbptr;
if (ydbptr2 == NULL)
- ypbindlist = ypbindlist->dom_pnext;
+ __ypbindlist = __ypbindlist->dom_pnext;
else
ydbptr2 = ydbptr->dom_pnext;
__yp_unbind (work);
@@ -306,7 +305,7 @@ do_ypcall (const char *domain, u_long prog, xdrproc_t xargs,
status = YPERR_YPERR;
__libc_lock_lock (ypbindlist_lock);
- ydb = ypbindlist;
+ ydb = __ypbindlist;
while (ydb != NULL)
{
if (strcmp (domain, ydb->dom_domain) == 0)
@@ -349,7 +348,7 @@ do_ypcall (const char *domain, u_long prog, xdrproc_t xargs,
if (status != YPERR_SUCCESS)
{
ydb = calloc (1, sizeof (dom_binding));
- if (ydb != NULL && yp_bind_ypbindprog (domain, ydb) == YPERR_SUCCESS)
+ if (yp_bind_ypbindprog (domain, ydb) == YPERR_SUCCESS)
{
status = __ypclnt_call (domain, prog, xargs, req, xres,
resp, &ydb, 1);
@@ -365,21 +364,6 @@ do_ypcall (const char *domain, u_long prog, xdrproc_t xargs,
return status;
}
-/* Like do_ypcall, but translate the status value if necessary. */
-static int
-do_ypcall_tr (const char *domain, u_long prog, xdrproc_t xargs,
- caddr_t req, xdrproc_t xres, caddr_t resp)
-{
- int status = do_ypcall (domain, prog, xargs, req, xres, resp);
- if (status == YPERR_SUCCESS)
- /* We cast to ypresp_val although the pointer could also be of
- type ypresp_key_val or ypresp_master or ypresp_order or
- ypresp_maplist. But the stat element is in a common prefix so
- this does not matter. */
- status = ypprot_err (((struct ypresp_val *) resp)->stat);
- return status;
-}
-
__libc_lock_define_initialized (static, domainname_lock)
@@ -391,21 +375,21 @@ yp_get_default_domain (char **outdomain)
__libc_lock_lock (domainname_lock);
- if (ypdomainname[0] == '\0')
+ if (__ypdomainname[0] == '\0')
{
- if (getdomainname (ypdomainname, NIS_MAXNAMELEN))
+ if (getdomainname (__ypdomainname, NIS_MAXNAMELEN))
result = YPERR_NODOM;
- else if (strcmp (ypdomainname, "(none)") == 0)
+ else if (strcmp (__ypdomainname, "(none)") == 0)
{
/* If domainname is not set, some systems will return "(none)" */
- ypdomainname[0] = '\0';
+ __ypdomainname[0] = '\0';
result = YPERR_NODOM;
}
else
- *outdomain = ypdomainname;
+ *outdomain = __ypdomainname;
}
else
- *outdomain = ypdomainname;
+ *outdomain = __ypdomainname;
__libc_lock_unlock (domainname_lock);
@@ -418,14 +402,14 @@ __yp_check (char **domain)
{
char *unused;
- if (ypdomainname[0] == '\0')
+ if (__ypdomainname[0] == '\0')
if (yp_get_default_domain (&unused))
return 0;
if (domain)
- *domain = ypdomainname;
+ *domain = __ypdomainname;
- if (yp_bind (ypdomainname) == 0)
+ if (yp_bind (__ypdomainname) == 0)
return 1;
return 0;
}
@@ -452,26 +436,25 @@ yp_match (const char *indomain, const char *inmap, const char *inkey,
*outvallen = 0;
memset (&resp, '\0', sizeof (resp));
- result = do_ypcall_tr (indomain, YPPROC_MATCH, (xdrproc_t) xdr_ypreq_key,
- (caddr_t) &req, (xdrproc_t) xdr_ypresp_val,
- (caddr_t) &resp);
+ result = do_ypcall (indomain, YPPROC_MATCH, (xdrproc_t) xdr_ypreq_key,
+ (caddr_t) & req, (xdrproc_t) xdr_ypresp_val,
+ (caddr_t) & resp);
if (result != YPERR_SUCCESS)
return result;
+ if (resp.stat != YP_TRUE)
+ return ypprot_err (resp.stat);
*outvallen = resp.val.valdat_len;
*outval = malloc (*outvallen + 1);
- int status = YPERR_RESRC;
- if (__builtin_expect (*outval != NULL, 1))
- {
- memcpy (*outval, resp.val.valdat_val, *outvallen);
- (*outval)[*outvallen] = '\0';
- status = YPERR_SUCCESS;
- }
+ if (__builtin_expect (*outval == NULL, 0))
+ return YPERR_RESRC;
+ memcpy (*outval, resp.val.valdat_val, *outvallen);
+ (*outval)[*outvallen] = '\0';
xdr_free ((xdrproc_t) xdr_ypresp_val, (char *) &resp);
- return status;
+ return YPERR_SUCCESS;
}
int
@@ -494,38 +477,30 @@ yp_first (const char *indomain, const char *inmap, char **outkey,
memset (&resp, '\0', sizeof (resp));
result = do_ypcall (indomain, YPPROC_FIRST, (xdrproc_t) xdr_ypreq_nokey,
- (caddr_t) &req, (xdrproc_t) xdr_ypresp_key_val,
- (caddr_t) &resp);
+ (caddr_t) & req, (xdrproc_t) xdr_ypresp_key_val,
+ (caddr_t) & resp);
if (result != RPC_SUCCESS)
return YPERR_RPC;
if (resp.stat != YP_TRUE)
return ypprot_err (resp.stat);
- int status;
- if (__builtin_expect ((*outkey = malloc (resp.key.keydat_len + 1)) != NULL
- && (*outval = malloc (resp.val.valdat_len
- + 1)) != NULL, 1))
- {
- *outkeylen = resp.key.keydat_len;
- memcpy (*outkey, resp.key.keydat_val, *outkeylen);
- (*outkey)[*outkeylen] = '\0';
-
- *outvallen = resp.val.valdat_len;
- memcpy (*outval, resp.val.valdat_val, *outvallen);
- (*outval)[*outvallen] = '\0';
-
- status = YPERR_SUCCESS;
- }
- else
- {
- free (*outkey);
- status = YPERR_RESRC;
- }
+ *outkeylen = resp.key.keydat_len;
+ *outkey = malloc (*outkeylen + 1);
+ if (__builtin_expect (*outkey == NULL, 0))
+ return YPERR_RESRC;
+ memcpy (*outkey, resp.key.keydat_val, *outkeylen);
+ (*outkey)[*outkeylen] = '\0';
+ *outvallen = resp.val.valdat_len;
+ *outval = malloc (*outvallen + 1);
+ if (__builtin_expect (*outval == NULL, 0))
+ return YPERR_RESRC;
+ memcpy (*outval, resp.val.valdat_val, *outvallen);
+ (*outval)[*outvallen] = '\0';
xdr_free ((xdrproc_t) xdr_ypresp_key_val, (char *) &resp);
- return status;
+ return YPERR_SUCCESS;
}
int
@@ -551,37 +526,31 @@ yp_next (const char *indomain, const char *inmap, const char *inkey,
*outkeylen = *outvallen = 0;
memset (&resp, '\0', sizeof (resp));
- result = do_ypcall_tr (indomain, YPPROC_NEXT, (xdrproc_t) xdr_ypreq_key,
- (caddr_t) &req, (xdrproc_t) xdr_ypresp_key_val,
- (caddr_t) &resp);
+ result = do_ypcall (indomain, YPPROC_NEXT, (xdrproc_t) xdr_ypreq_key,
+ (caddr_t) & req, (xdrproc_t) xdr_ypresp_key_val,
+ (caddr_t) & resp);
if (result != YPERR_SUCCESS)
return result;
+ if (resp.stat != YP_TRUE)
+ return ypprot_err (resp.stat);
- int status;
- if (__builtin_expect ((*outkey = malloc (resp.key.keydat_len + 1)) != NULL
- && (*outval = malloc (resp.val.valdat_len
- + 1)) != NULL, 1))
- {
- *outkeylen = resp.key.keydat_len;
- memcpy (*outkey, resp.key.keydat_val, *outkeylen);
- (*outkey)[*outkeylen] = '\0';
-
- *outvallen = resp.val.valdat_len;
- memcpy (*outval, resp.val.valdat_val, *outvallen);
- (*outval)[*outvallen] = '\0';
-
- status = YPERR_SUCCESS;
- }
- else
- {
- free (*outkey);
- status = YPERR_RESRC;
- }
+ *outkeylen = resp.key.keydat_len;
+ *outkey = malloc (*outkeylen + 1);
+ if (__builtin_expect (*outkey == NULL, 0))
+ return YPERR_RESRC;
+ memcpy (*outkey, resp.key.keydat_val, *outkeylen);
+ (*outkey)[*outkeylen] = '\0';
+ *outvallen = resp.val.valdat_len;
+ *outval = malloc (*outvallen + 1);
+ if (__builtin_expect (*outval == NULL, 0))
+ return YPERR_RESRC;
+ memcpy (*outval, resp.val.valdat_val, *outvallen);
+ (*outval)[*outvallen] = '\0';
xdr_free ((xdrproc_t) xdr_ypresp_key_val, (char *) &resp);
- return status;
+ return YPERR_SUCCESS;
}
int
@@ -600,12 +569,13 @@ yp_master (const char *indomain, const char *inmap, char **outname)
memset (&resp, '\0', sizeof (ypresp_master));
- result = do_ypcall_tr (indomain, YPPROC_MASTER, (xdrproc_t) xdr_ypreq_nokey,
- (caddr_t) &req, (xdrproc_t) xdr_ypresp_master,
- (caddr_t) &resp);
+ result = do_ypcall (indomain, YPPROC_MASTER, (xdrproc_t) xdr_ypreq_nokey,
+ (caddr_t) & req, (xdrproc_t) xdr_ypresp_master, (caddr_t) & resp);
if (result != YPERR_SUCCESS)
return result;
+ if (resp.stat != YP_TRUE)
+ return ypprot_err (resp.stat);
*outname = strdup (resp.peer);
xdr_free ((xdrproc_t) xdr_ypresp_master, (char *) &resp);
@@ -622,7 +592,7 @@ yp_order (const char *indomain, const char *inmap, unsigned int *outorder)
enum clnt_stat result;
if (indomain == NULL || indomain[0] == '\0' ||
- inmap == NULL || inmap[0] == '\0')
+ inmap == NULL || inmap == '\0')
return YPERR_BADARGS;
req.domain = (char *) indomain;
@@ -630,17 +600,18 @@ yp_order (const char *indomain, const char *inmap, unsigned int *outorder)
memset (&resp, '\0', sizeof (resp));
- result = do_ypcall_tr (indomain, YPPROC_ORDER, (xdrproc_t) xdr_ypreq_nokey,
- (caddr_t) &req, (xdrproc_t) xdr_ypresp_order,
- (caddr_t) &resp);
+ result = do_ypcall (indomain, YPPROC_ORDER, (xdrproc_t) xdr_ypreq_nokey,
+ (caddr_t) & req, (xdrproc_t) xdr_ypresp_order, (caddr_t) & resp);
- if (result == YPERR_SUCCESS)
+ if (result != YPERR_SUCCESS)
return result;
+ if (resp.stat != YP_TRUE)
+ return ypprot_err (resp.stat);
*outorder = resp.ordernum;
xdr_free ((xdrproc_t) xdr_ypresp_order, (char *) &resp);
- return result;
+ return YPERR_SUCCESS;
}
struct ypresp_all_data
@@ -686,10 +657,10 @@ __xdr_ypresp_all (XDR *xdrs, struct ypresp_all_data *objp)
if we don't modify the length. So add an extra NUL
character to avoid trouble with broken code. */
objp->status = YP_TRUE;
- *((char *) __mempcpy (key, resp.ypresp_all_u.val.key.keydat_val,
- keylen)) = '\0';
- *((char *) __mempcpy (val, resp.ypresp_all_u.val.val.valdat_val,
- vallen)) = '\0';
+ memcpy (key, resp.ypresp_all_u.val.key.keydat_val, keylen);
+ key[keylen] = '\0';
+ memcpy (val, resp.ypresp_all_u.val.val.valdat_val, vallen);
+ val[vallen] = '\0';
xdr_free ((xdrproc_t) xdr_ypresp_all, (char *) &resp);
if ((*objp->foreach) (objp->status, key, keylen,
val, vallen, objp->data))
@@ -700,7 +671,7 @@ __xdr_ypresp_all (XDR *xdrs, struct ypresp_all_data *objp)
objp->status = resp.ypresp_all_u.val.stat;
xdr_free ((xdrproc_t) xdr_ypresp_all, (char *) &resp);
/* Sun says we don't need to make this call, but must return
- immediately. Since Solaris makes this call, we will call
+ immediatly. Since Solaris makes this call, we will call
the callback function, too. */
(*objp->foreach) (objp->status, NULL, 0, NULL, 0, objp->data);
return TRUE;
@@ -722,8 +693,8 @@ yp_all (const char *indomain, const char *inmap,
int clnt_sock;
int saved_errno = errno;
- if (indomain == NULL || indomain[0] == '\0'
- || inmap == NULL || inmap[0] == '\0')
+ if (indomain == NULL || indomain[0] == '\0' ||
+ inmap == NULL || inmap == '\0')
return YPERR_BADARGS;
try = 0;
@@ -761,9 +732,9 @@ yp_all (const char *indomain, const char *inmap,
(caddr_t) &req, (xdrproc_t) __xdr_ypresp_all,
(caddr_t) &data, RPCTIMEOUT);
- if (__builtin_expect (result != RPC_SUCCESS, 0))
+ if (result != RPC_SUCCESS)
{
- /* Print the error message only on the last try. */
+ /* Print the error message only on the last try */
if (try == MAXTRIES - 1)
clnt_perror (clnt, "yp_all: clnt_call");
res = YPERR_RPC;
@@ -787,7 +758,6 @@ yp_all (const char *indomain, const char *inmap,
}
int
-
yp_maplist (const char *indomain, struct ypmaplist **outmaplist)
{
struct ypresp_maplist resp;
@@ -798,92 +768,67 @@ yp_maplist (const char *indomain, struct ypmaplist **outmaplist)
memset (&resp, '\0', sizeof (resp));
- result = do_ypcall_tr (indomain, YPPROC_MAPLIST, (xdrproc_t) xdr_domainname,
- (caddr_t) &indomain, (xdrproc_t) xdr_ypresp_maplist,
- (caddr_t) &resp);
+ result = do_ypcall (indomain, YPPROC_MAPLIST, (xdrproc_t) xdr_domainname,
+ (caddr_t) & indomain, (xdrproc_t) xdr_ypresp_maplist, (caddr_t) & resp);
- if (__builtin_expect (result == YPERR_SUCCESS, 1))
- {
- *outmaplist = resp.maps;
- /* We don't free the list, this will be done by ypserv
- xdr_free((xdrproc_t)xdr_ypresp_maplist, (char *)&resp); */
- }
+ if (result != YPERR_SUCCESS)
+ return result;
+ if (resp.stat != YP_TRUE)
+ return ypprot_err (resp.stat);
- return result;
+ *outmaplist = resp.maps;
+ /* We give the list not free, this will be done by ypserv
+ xdr_free((xdrproc_t)xdr_ypresp_maplist, (char *)&resp); */
+
+ return YPERR_SUCCESS;
}
const char *
yperr_string (const int error)
{
- const char *str;
switch (error)
{
case YPERR_SUCCESS:
- str = N_("Success");
- break;
+ return _("Success");
case YPERR_BADARGS:
- str = N_("Request arguments bad");
- break;
+ return _("Request arguments bad");
case YPERR_RPC:
- str = N_("RPC failure on NIS operation");
- break;
+ return _("RPC failure on NIS operation");
case YPERR_DOMAIN:
- str = N_("Can't bind to server which serves this domain");
- break;
+ return _("Can't bind to server which serves this domain");
case YPERR_MAP:
- str = N_("No such map in server's domain");
- break;
+ return _("No such map in server's domain");
case YPERR_KEY:
- str = N_("No such key in map");
- break;
+ return _("No such key in map");
case YPERR_YPERR:
- str = N_("Internal NIS error");
- break;
+ return _("Internal NIS error");
case YPERR_RESRC:
- str = N_("Local resource allocation failure");
- break;
+ return _("Local resource allocation failure");
case YPERR_NOMORE:
- str = N_("No more records in map database");
- break;
+ return _("No more records in map database");
case YPERR_PMAP:
- str = N_("Can't communicate with portmapper");
- break;
+ return _("Can't communicate with portmapper");
case YPERR_YPBIND:
- str = N_("Can't communicate with ypbind");
- break;
+ return _("Can't communicate with ypbind");
case YPERR_YPSERV:
- str = N_("Can't communicate with ypserv");
- break;
+ return _("Can't communicate with ypserv");
case YPERR_NODOM:
- str = N_("Local domain name not set");
- break;
+ return _("Local domain name not set");
case YPERR_BADDB:
- str = N_("NIS map database is bad");
- break;
+ return _("NIS map database is bad");
case YPERR_VERS:
- str = N_("NIS client/server version mismatch - can't supply service");
- break;
+ return _("NIS client/server version mismatch - can't supply service");
case YPERR_ACCESS:
- str = N_("Permission denied");
- break;
+ return _("Permission denied");
case YPERR_BUSY:
- str = N_("Database is busy");
- break;
- default:
- str = N_("Unknown NIS error code");
- break;
+ return _("Database is busy");
}
- return _(str);
+ return _("Unknown NIS error code");
}
static const int8_t yp_2_yperr[] =
{
#define YP2YPERR(yp, yperr) [YP_##yp - YP_VERS] = YPERR_##yperr
- YP2YPERR (TRUE, SUCCESS),
- YP2YPERR (NOMORE, NOMORE),
- YP2YPERR (FALSE, YPERR),
- YP2YPERR (NOMAP, MAP),
- YP2YPERR (NODOM, DOMAIN),
YP2YPERR (NOKEY, KEY),
YP2YPERR (BADOP, YPERR),
YP2YPERR (BADDB, BADDB),
@@ -894,7 +839,7 @@ static const int8_t yp_2_yperr[] =
int
ypprot_err (const int code)
{
- if (code < YP_VERS || code > YP_NOMORE)
+ if (code < YP_VERS || code > YP_NOKEY)
return YPERR_YPERR;
return yp_2_yperr[code - YP_VERS];
}
@@ -903,26 +848,19 @@ libnsl_hidden_def (ypprot_err)
const char *
ypbinderr_string (const int error)
{
- const char *str;
switch (error)
{
case 0:
- str = N_("Success");
- break;
+ return _("Success");
case YPBIND_ERR_ERR:
- str = N_("Internal ypbind error");
- break;
+ return _("Internal ypbind error");
case YPBIND_ERR_NOSERV:
- str = N_("Domain not bound");
- break;
+ return _("Domain not bound");
case YPBIND_ERR_RESC:
- str = N_("System resource allocation failure");
- break;
+ return _("System resource allocation failure");
default:
- str = N_("Unknown ypbind error");
- break;
+ return _("Unknown ypbind error");
}
- return _(str);
}
libnsl_hidden_def (ypbinderr_string)
@@ -955,22 +893,16 @@ yp_update (char *domain, char *map, unsigned ypop,
args.update_args.datum.yp_buf_len = datalen;
args.update_args.datum.yp_buf_val = data;
- if ((r = yp_master (domain, map, &master)) != YPERR_SUCCESS)
+ if ((r = yp_master (domain, map, &master)) != 0)
return r;
if (!host2netname (servername, master, domain))
{
fputs (_("yp_update: cannot convert host to netname\n"), stderr);
- free (master);
return YPERR_YPERR;
}
- clnt = clnt_create (master, YPU_PROG, YPU_VERS, "tcp");
-
- /* We do not need the string anymore. */
- free (master);
-
- if (clnt == NULL)
+ if ((clnt = clnt_create (master, YPU_PROG, YPU_VERS, "tcp")) == NULL)
{
clnt_pcreateerror ("yp_update: clnt_create");
return YPERR_RPC;
@@ -1010,7 +942,6 @@ again:
{
if (clnt->cl_auth->ah_cred.oa_flavor == AUTH_DES)
{
- auth_destroy (clnt->cl_auth);
clnt->cl_auth = authunix_create_default ();
goto again;
}