aboutsummaryrefslogtreecommitdiff
path: root/nis
diff options
context:
space:
mode:
authorUlrich Drepper <drepper@redhat.com>1998-06-16 11:43:48 +0000
committerUlrich Drepper <drepper@redhat.com>1998-06-16 11:43:48 +0000
commit91eee4dd69397fa6e7b328022670d459f582b047 (patch)
tree85ba752cb426bcfa60e04a2d5e88efae378bfd04 /nis
parentfed8f7f7aeb06dfae0dfbfb085c6857cc457c254 (diff)
downloadglibc-91eee4dd69397fa6e7b328022670d459f582b047.tar.xz
glibc-91eee4dd69397fa6e7b328022670d459f582b047.zip
Update.
1998-06-16 Thorsten Kukuk <kukuk@vt.uni-paderborn.de> * sunrpc/svc.c: Check for NULL pointer. * nis/libnsl.map: Add public NIS+ xdr functions. * nis/rpcsvc/nis_callback.h: New file. * nis/rpcsvc/nis.h: Move xdr_* functions from here ... * nis/nis_xdr.h: ... here. * nis/nis_add.c: Use internal _xdr_* functions, check for NULL pointers, use NIS+ defines where possible. * nis/nis_cache.c: Likewise. * nis/nis_cache2_xdr.c: Likewise. * nis/nis_call.c: Likewise. * nis/nis_checkpoint.c: Likewise. * nis/nis_clone_dir.c: Likewise. * nis/nis_clone_obj.c: Likewise. * nis/nis_clone_res.c: Likewise. * nis/nis_creategroup.c: Likewise. * nis/nis_file.c: Likewise. * nis/nis_free.c: Likewise. * nis/nis_getservlist.c: Likewise. * nis/nis_local_names.c: likewise. * nis/nis_lookup.c: Likewise. * nis/nis_mkdir.c: Likewise. * nis/nis_modify.c: Likewise. * nis/nis_ping.c: Likewise. * nis/nis_print.c: Likewise. * nis/nis_remove.c: Likewise. * nis/nis_removemember.c: Likewise. * nis/nis_rmdir.c: Likewise. * nis/nis_server.c: Likewise. * nis/nis_table.c: Likewise. * nis/nis_util.c: Likewise. * nis/nis_verifygroup.c: Likewise. * nis/nis_xdr.c: Likewise. * nis/nis_callback.c: Likewise, and move xdr functions from here ... * nis/nis_xdr.c: ... to here.
Diffstat (limited to 'nis')
-rw-r--r--nis/libnsl.map2
-rw-r--r--nis/nis_add.c51
-rw-r--r--nis/nis_cache.c5
-rw-r--r--nis/nis_cache2_xdr.c8
-rw-r--r--nis/nis_call.c10
-rw-r--r--nis/nis_callback.c67
-rw-r--r--nis/nis_checkpoint.c20
-rw-r--r--nis/nis_clone_dir.c10
-rw-r--r--nis/nis_clone_obj.c8
-rw-r--r--nis/nis_clone_res.c10
-rw-r--r--nis/nis_creategroup.c2
-rw-r--r--nis/nis_file.c11
-rw-r--r--nis/nis_free.c13
-rw-r--r--nis/nis_getservlist.c6
-rw-r--r--nis/nis_local_names.c4
-rw-r--r--nis/nis_lookup.c24
-rw-r--r--nis/nis_mkdir.c10
-rw-r--r--nis/nis_modify.c61
-rw-r--r--nis/nis_ping.c9
-rw-r--r--nis/nis_print.c2
-rw-r--r--nis/nis_remove.c11
-rw-r--r--nis/nis_removemember.c12
-rw-r--r--nis/nis_rmdir.c6
-rw-r--r--nis/nis_server.c10
-rw-r--r--nis/nis_table.c207
-rw-r--r--nis/nis_util.c6
-rw-r--r--nis/nis_verifygroup.c4
-rw-r--r--nis/nis_xdr.c274
-rw-r--r--nis/nis_xdr.h45
-rw-r--r--nis/rpcsvc/nis.h31
-rw-r--r--nis/rpcsvc/nis_callback.h71
31 files changed, 533 insertions, 477 deletions
diff --git a/nis/libnsl.map b/nis/libnsl.map
index 21c46747bc..9d0efd0567 100644
--- a/nis/libnsl.map
+++ b/nis/libnsl.map
@@ -51,6 +51,8 @@ GLIBC_2.1 {
nis_sperror; nis_sperror_r; nis_stats;
nis_verifygroup; nis_write_obj;
+ xdr_cback_data; xdr_obj_p;
+
# This functions are needed by the NIS+ tools and rpc.nisd,
# they should never be used in a normal user program !
__do_niscall2; __free_fdresult; __nis_default_access;
diff --git a/nis/nis_add.c b/nis/nis_add.c
index d30ccde2f6..07fa0fb1e9 100644
--- a/nis/nis_add.c
+++ b/nis/nis_add.c
@@ -1,4 +1,4 @@
-/* Copyright (C) 1997 Free Software Foundation, Inc.
+/* Copyright (C) 1997, 1998 Free Software Foundation, Inc.
This file is part of the GNU C Library.
Contributed by Thorsten Kukuk <kukuk@uni-paderborn.de>, 1997.
@@ -19,53 +19,52 @@
#include <rpcsvc/nis.h>
+#include "nis_xdr.h"
#include "nis_intern.h"
nis_result *
-nis_add (const_nis_name name, const nis_object *obj)
+nis_add (const_nis_name name, const nis_object *obj2)
{
+ nis_object obj;
nis_result *res;
nis_error status;
struct ns_request req;
- char *p1, *p2, *p3, *p4;
char buf1 [strlen (name) + 20];
char buf4 [strlen (name) + 20];
res = calloc (1, sizeof (nis_result));
+ if (res == NULL)
+ return NULL;
req.ns_name = (char *)name;
- req.ns_object.ns_object_len = 1;
- req.ns_object.ns_object_val = nis_clone_object (obj, NULL);
+ memcpy (&obj, obj2, sizeof (nis_object));
+
+ if (obj.zo_name == NULL || strlen (obj.zo_name) == 0)
+ obj.zo_name = nis_leaf_of_r (name, buf1, sizeof (buf1));
- p1 = req.ns_object.ns_object_val[0].zo_name;
- if (p1 == NULL || strlen (p1) == 0)
- req.ns_object.ns_object_val[0].zo_name =
- nis_leaf_of_r (name, buf1, sizeof (buf1));
+ if (obj.zo_owner == NULL || strlen (obj.zo_owner) == 0)
+ obj.zo_owner = nis_local_principal ();
- p2 = req.ns_object.ns_object_val[0].zo_owner;
- if (p2 == NULL || strlen (p2) == 0)
- req.ns_object.ns_object_val[0].zo_owner = nis_local_principal ();
+ if (obj.zo_group == NULL || strlen (obj.zo_group) == 0)
+ obj.zo_group = nis_local_group ();
- p3 = req.ns_object.ns_object_val[0].zo_group;
- if (p3 == NULL || strlen (p3) == 0)
- req.ns_object.ns_object_val[0].zo_group = nis_local_group ();
+ obj.zo_domain = nis_domain_of_r (name, buf4, sizeof (buf4));
- p4 = req.ns_object.ns_object_val[0].zo_domain;
- req.ns_object.ns_object_val[0].zo_domain =
- nis_domain_of_r (name, buf4, sizeof (buf4));
+ req.ns_object.ns_object_val = nis_clone_object (&obj, NULL);
+ if (req.ns_object.ns_object_val == NULL)
+ {
+ NIS_RES_STATUS (res) = NIS_NOMEMORY;
+ return res;
+ }
+ req.ns_object.ns_object_len = 1;
if ((status = __do_niscall (req.ns_object.ns_object_val[0].zo_domain,
- NIS_ADD, (xdrproc_t) xdr_ns_request,
- (caddr_t) &req, (xdrproc_t) xdr_nis_result,
+ NIS_ADD, (xdrproc_t) _xdr_ns_request,
+ (caddr_t) &req, (xdrproc_t) _xdr_nis_result,
(caddr_t) res, MASTER_ONLY,
NULL)) != RPC_SUCCESS)
- res->status = status;
-
- req.ns_object.ns_object_val[0].zo_name = p1;
- req.ns_object.ns_object_val[0].zo_owner = p2;
- req.ns_object.ns_object_val[0].zo_group = p3;
- req.ns_object.ns_object_val[0].zo_domain = p4;
+ NIS_RES_STATUS (res) = status;
nis_destroy_object (req.ns_object.ns_object_val);
diff --git a/nis/nis_cache.c b/nis/nis_cache.c
index 26cac675a5..9ee21b148d 100644
--- a/nis/nis_cache.c
+++ b/nis/nis_cache.c
@@ -20,8 +20,9 @@
#include <string.h>
#include <unistd.h>
#include <rpcsvc/nis.h>
-#include "nis_intern.h"
+#include "nis_xdr.h"
+#include "nis_intern.h"
#include "nis_cache2.h"
static struct timeval TIMEOUT = { 25, 0 };
@@ -85,7 +86,7 @@ __nis_cache_search (const_nis_name name, u_long flags, cache2_info *cinfo)
xdrmem_create (&xdrs, fsres.dir_data.dir_data_val,
fsres.dir_data.dir_data_len, XDR_DECODE);
- xdr_directory_obj (&xdrs, obj);
+ _xdr_directory_obj (&xdrs, obj);
xdr_destroy (&xdrs);
cinfo->server_used = fsres.server_used;
diff --git a/nis/nis_cache2_xdr.c b/nis/nis_cache2_xdr.c
index b988f3f973..caa3964bca 100644
--- a/nis/nis_cache2_xdr.c
+++ b/nis/nis_cache2_xdr.c
@@ -5,14 +5,16 @@
#include <rpc/types.h>
#include <rpc/xdr.h>
+#include <rpcsvc/nis.h>
+#include "nis_xdr.h"
#include "nis_cache2.h"
-#include <rpcsvc/nis.h>
+
bool_t
xdr_fs_result(XDR *xdrs, fs_result *objp)
{
- if (!xdr_nis_error(xdrs, &objp->status)) {
+ if (!_xdr_nis_error(xdrs, &objp->status)) {
return FALSE;
}
if (!xdr_long(xdrs, &objp->class)) {
@@ -33,7 +35,7 @@ xdr_fs_result(XDR *xdrs, fs_result *objp)
bool_t
xdr_fs_request(XDR *xdrs, fs_request *objp)
{
- if (!xdr_nis_name(xdrs, &objp->name)) {
+ if (!_xdr_nis_name(xdrs, &objp->name)) {
return FALSE;
}
if (!xdr_long(xdrs, &objp->old_class)) {
diff --git a/nis/nis_call.c b/nis/nis_call.c
index 957399ee98..ff9e768fe4 100644
--- a/nis/nis_call.c
+++ b/nis/nis_call.c
@@ -26,6 +26,8 @@
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
+
+#include "nis_xdr.h"
#include "nis_intern.h"
static struct timeval RPCTIMEOUT = {10, 0};
@@ -461,7 +463,7 @@ rec_dirsearch (const_nis_name name, directory_obj *dir, u_long flags,
obj = calloc(1, sizeof(directory_obj));
xdrmem_create(&xdrs, fd_res->dir_data.dir_data_val,
fd_res->dir_data.dir_data_len, XDR_DECODE);
- xdr_directory_obj(&xdrs, obj);
+ _xdr_directory_obj(&xdrs, obj);
xdr_destroy(&xdrs);
__free_fdresult (fd_res);
if (obj != NULL)
@@ -525,7 +527,7 @@ rec_dirsearch (const_nis_name name, directory_obj *dir, u_long flags,
obj = calloc(1, sizeof(directory_obj));
xdrmem_create(&xdrs, fd_res->dir_data.dir_data_val,
fd_res->dir_data.dir_data_len, XDR_DECODE);
- xdr_directory_obj(&xdrs, obj);
+ _xdr_directory_obj(&xdrs, obj);
xdr_destroy(&xdrs);
__free_fdresult (fd_res);
if (obj != NULL)
@@ -576,8 +578,8 @@ first_shoot (const_nis_name name, directory_obj *dir, u_long flags)
return NULL;
xdrmem_create(&xdrs, fd_res->dir_data.dir_data_val,
fd_res->dir_data.dir_data_len, XDR_DECODE);
- xdr_directory_obj(&xdrs, obj);
- xdr_destroy(&xdrs);
+ _xdr_directory_obj (&xdrs, obj);
+ xdr_destroy (&xdrs);
__free_fdresult (fd_res);
if (obj != NULL)
{
diff --git a/nis/nis_callback.c b/nis/nis_callback.c
index 9d138fde60..4c5693a3b5 100644
--- a/nis/nis_callback.c
+++ b/nis/nis_callback.c
@@ -31,8 +31,10 @@
#include <arpa/inet.h>
#include <rpc/key_prot.h>
#include <rpcsvc/nis.h>
+#include <rpcsvc/nis_callback.h>
#include <bits/libc-lock.h>
+#include "nis_xdr.h"
#include "nis_intern.h"
/* Sorry, we are not able to make this threadsafe. Stupid. But some
@@ -40,30 +42,12 @@
cookie. Maybe we could use keys for threads ? Have to learn more
about pthreads -- kukuk@vt.uni-paderborn.de */
-#define CB_PROG ((u_long)100302)
-#define CB_VERS ((u_long)1)
-#define CBPROC_RECEIVE ((u_long)1)
-#define CBPROC_FINISH ((u_long)2)
-#define CBPROC_ERROR ((u_long)3)
-
-typedef nis_object *obj_p;
-
-struct cback_data
- {
- struct
- {
- u_int entries_len;
- obj_p *entries_val;
- }
- entries;
- };
-typedef struct cback_data cback_data;
-
static nis_cb *data;
__libc_lock_define_initialized (static, callback)
+#if 0
static char *
__nis_getpkey(const char *sname)
{
@@ -91,7 +75,7 @@ __nis_getpkey(const char *sname)
if (res == NULL)
return NULL;
- if (res->status != NIS_SUCCESS)
+ if (NIS_RES_STATUS (res) != NIS_SUCCESS)
{
nis_freeresult (res);
return NULL;
@@ -108,9 +92,7 @@ __nis_getpkey(const char *sname)
return strdup (pkey);
}
-
-
-static bool_t xdr_cback_data (XDR *, cback_data *);
+#endif
static void
cb_prog_1 (struct svc_req *rqstp, SVCXPRT *transp)
@@ -181,7 +163,7 @@ cb_prog_1 (struct svc_req *rqstp, SVCXPRT *transp)
result = (char *) &bool_result;
break;
case CBPROC_ERROR:
- xdr_argument = (xdrproc_t) xdr_nis_error;
+ xdr_argument = (xdrproc_t) _xdr_nis_error;
xdr_result = (xdrproc_t) xdr_void;
memset (&argument, 0, sizeof (argument));
if (!svc_getargs (transp, xdr_argument, (caddr_t) & argument))
@@ -208,25 +190,6 @@ cb_prog_1 (struct svc_req *rqstp, SVCXPRT *transp)
return;
}
-static bool_t
-xdr_obj_p (XDR * xdrs, obj_p *objp)
-{
- if (!xdr_pointer (xdrs, (char **) objp, sizeof (nis_object),
- (xdrproc_t) xdr_nis_object))
- return FALSE;
- return TRUE;
-}
-
-static bool_t
-xdr_cback_data (XDR *xdrs, cback_data *objp)
-{
- if (!xdr_array (xdrs, (char **) &objp->entries.entries_val,
- (u_int *) & objp->entries.entries_len, ~0, sizeof (obj_p),
- (xdrproc_t) xdr_obj_p))
- return FALSE;
- return TRUE;
-}
-
static nis_error
internal_nis_do_callback (struct dir_binding *bptr, netobj *cookie,
struct nis_cb *cb)
@@ -319,7 +282,7 @@ __nis_create_callback (int (*callback) (const_nis_name, const nis_object *,
{
free (cb);
syslog (LOG_ERR, "NIS+: out of memory allocating callback");
- return (NULL);
+ return NULL;
}
cb->serv->name = strdup (nis_local_principal ());
cb->serv->ep.ep_val = (endpoint *) calloc (2, sizeof (endpoint));
@@ -328,7 +291,7 @@ __nis_create_callback (int (*callback) (const_nis_name, const nis_object *,
cb->callback = callback;
cb->userdata = userdata;
- if ((flags & NO_AUTHINFO) && key_secretkey_is_set ())
+ if ((flags & NO_AUTHINFO) || !key_secretkey_is_set ())
{
cb->serv->key_type = NIS_PK_NONE;
cb->serv->pkey.n_bytes = NULL;
@@ -336,6 +299,7 @@ __nis_create_callback (int (*callback) (const_nis_name, const nis_object *,
}
else
{
+#if 0
if ((cb->serv->pkey.n_bytes = __nis_getpkey (cb->serv->name)) == NULL)
{
cb->serv->pkey.n_len = 0;
@@ -346,6 +310,11 @@ __nis_create_callback (int (*callback) (const_nis_name, const nis_object *,
cb->serv->key_type = NIS_PK_DH;
cb->serv->pkey.n_len = strlen(cb->serv->pkey.n_bytes);
}
+#else
+ cb->serv->pkey.n_len =0;
+ cb->serv->pkey.n_bytes = NULL;
+ cb->serv->key_type = NIS_PK_DH;
+#endif
}
if (flags & USE_DGRAM)
@@ -363,7 +332,7 @@ __nis_create_callback (int (*callback) (const_nis_name, const nis_object *,
{
xprt_unregister (cb->xprt);
svc_destroy (cb->xprt);
- xdr_free ((xdrproc_t) xdr_nis_server, (char *) cb->serv);
+ xdr_free ((xdrproc_t) _xdr_nis_server, (char *) cb->serv);
free (cb->serv);
free (cb);
syslog (LOG_ERR, "NIS+: failed to register callback dispatcher");
@@ -374,11 +343,11 @@ __nis_create_callback (int (*callback) (const_nis_name, const nis_object *,
{
xprt_unregister (cb->xprt);
svc_destroy (cb->xprt);
- xdr_free ((xdrproc_t) xdr_nis_server, (char *) cb->serv);
+ xdr_free ((xdrproc_t) _xdr_nis_server, (char *) cb->serv);
free (cb->serv);
free (cb);
syslog (LOG_ERR, "NIS+: failed to read local socket info");
- return (NULL);
+ return NULL;
}
port = sin.sin_port;
get_myaddress (&sin);
@@ -395,7 +364,7 @@ __nis_destroy_callback (struct nis_cb *cb)
xprt_unregister (cb->xprt);
svc_destroy (cb->xprt);
close (cb->sock);
- xdr_free ((xdrproc_t) xdr_nis_server, (char *) cb->serv);
+ xdr_free ((xdrproc_t) _xdr_nis_server, (char *) cb->serv);
free (cb->serv);
free (cb);
diff --git a/nis/nis_checkpoint.c b/nis/nis_checkpoint.c
index 665dccba06..585214a3b4 100644
--- a/nis/nis_checkpoint.c
+++ b/nis/nis_checkpoint.c
@@ -18,6 +18,8 @@
Boston, MA 02111-1307, USA. */
#include <rpcsvc/nis.h>
+
+#include "nis_xdr.h"
#include "nis_intern.h"
nis_result *
@@ -26,10 +28,11 @@ nis_checkpoint(const_nis_name dirname)
nis_result *res;
res = calloc (1, sizeof (nis_result));
+ if (res == NULL)
+ return NULL;
if (dirname != NULL)
{
- cp_result *cpres = NULL;
nis_result *res2;
u_int i;
@@ -48,16 +51,19 @@ nis_checkpoint(const_nis_name dirname)
for (i = 0;
i < NIS_RES_OBJECT (res2)->DI_data.do_servers.do_servers_len; ++i)
{
+ cp_result cpres;
+
+ memset (&cpres, '\0', sizeof (cp_result));
if (__do_niscall2 (&NIS_RES_OBJECT(res2)->DI_data.do_servers.do_servers_val[i],
- 1, NIS_CHECKPOINT, (xdrproc_t) xdr_nis_name,
- (caddr_t) &dirname, (xdrproc_t) xdr_cp_result,
- (caddr_t) &cpres, 0, NULL, NULL) != RPC_SUCCESS)
+ 1, NIS_CHECKPOINT, (xdrproc_t) _xdr_nis_name,
+ (caddr_t) &dirname, (xdrproc_t) _xdr_cp_result,
+ (caddr_t) &cpres, 0, NULL, NULL) != NIS_SUCCESS)
NIS_RES_STATUS (res) = NIS_RPCERROR;
else
{
- res->status += cpres->cp_status;
- res->zticks += cpres->cp_zticks;
- res->dticks += cpres->cp_dticks;
+ NIS_RES_STATUS (res) = cpres.cp_status;
+ res->zticks += cpres.cp_zticks;
+ res->dticks += cpres.cp_dticks;
}
}
nis_freeresult (res2);
diff --git a/nis/nis_clone_dir.c b/nis/nis_clone_dir.c
index 4d641e58f7..a59bd78cdf 100644
--- a/nis/nis_clone_dir.c
+++ b/nis/nis_clone_dir.c
@@ -1,4 +1,4 @@
-/* Copyright (c) 1997 Free Software Foundation, Inc.
+/* Copyright (c) 1997, 1998 Free Software Foundation, Inc.
This file is part of the GNU C Library.
Contributed by Thorsten Kukuk <kukuk@vt.uni-paderborn.de>, 1997.
@@ -21,6 +21,8 @@
#include <rpc/rpc.h>
#include <rpcsvc/nis.h>
+#include "nis_xdr.h"
+
directory_obj *
nis_clone_directory (const directory_obj *src, directory_obj *dest)
{
@@ -32,7 +34,7 @@ nis_clone_directory (const directory_obj *src, directory_obj *dest)
if (src == NULL)
return (NULL);
- size = xdr_sizeof ((xdrproc_t)xdr_directory_obj, (char *)src);
+ size = xdr_sizeof ((xdrproc_t)_xdr_directory_obj, (char *)src);
if ((addr = calloc(1, size)) == NULL)
return NULL;
@@ -48,7 +50,7 @@ nis_clone_directory (const directory_obj *src, directory_obj *dest)
res = dest;
xdrmem_create(&xdrs, addr, size, XDR_ENCODE);
- if (!xdr_directory_obj (&xdrs, (directory_obj *)src))
+ if (!_xdr_directory_obj (&xdrs, (directory_obj *)src))
{
xdr_destroy (&xdrs);
free (addr);
@@ -56,7 +58,7 @@ nis_clone_directory (const directory_obj *src, directory_obj *dest)
}