aboutsummaryrefslogtreecommitdiff
path: root/nis/nis_table.c
diff options
context:
space:
mode:
Diffstat (limited to 'nis/nis_table.c')
-rw-r--r--nis/nis_table.c207
1 files changed, 119 insertions, 88 deletions
diff --git a/nis/nis_table.c b/nis/nis_table.c
index 084ce68..70d2b80 100644
--- a/nis/nis_table.c
+++ b/nis/nis_table.c
@@ -19,6 +19,8 @@
#include <string.h>
#include <rpcsvc/nis.h>
+
+#include "nis_xdr.h"
#include "nis_intern.h"
static void
@@ -175,10 +177,12 @@ nis_list (const_nis_name name, u_long flags,
nis_cb *cb = NULL;
res = calloc (1, sizeof (nis_result));
+ if (res == NULL)
+ return NULL;
if (__create_ib_request (name, ibreq, flags) == NULL)
{
- res->status = NIS_BADNAME;
+ NIS_RES_STATUS (res) = NIS_BADNAME;
return res;
}
@@ -189,7 +193,7 @@ nis_list (const_nis_name name, u_long flags,
ibreq->ibr_name = NULL;
if (names == NULL)
{
- res->status = NIS_BADNAME;
+ NIS_RES_STATUS (res) = NIS_BADNAME;
return res;
}
ibreq->ibr_name = strdup (names[name_nr]);
@@ -210,14 +214,12 @@ nis_list (const_nis_name name, u_long flags,
char *ntable, *p;
u_long done = 0, failures = 0;
- memset (res, '\0', sizeof (nis_result));
-
while (names[name_nr] != NULL && !done)
{
lres = nis_lookup (names[name_nr], newflags);
- if (lres == NULL || lres->status != NIS_SUCCESS)
+ if (lres == NULL || NIS_RES_STATUS (lres) != NIS_SUCCESS)
{
- res->status = lres->status;
+ NIS_RES_STATUS (res) = NIS_RES_STATUS (lres);
nis_freeresult (lres);
++name_nr;
continue;
@@ -228,7 +230,7 @@ nis_list (const_nis_name name, u_long flags,
if (__type_of (NIS_RES_OBJECT (lres)) != NIS_TABLE_OBJ)
{
nis_freeresult (lres);
- res->status = NIS_INVALIDOBJ;
+ NIS_RES_STATUS (res) = NIS_INVALIDOBJ;
break;
}
@@ -263,7 +265,7 @@ nis_list (const_nis_name name, u_long flags,
res = nis_list (ntable, newflags, callback, userdata);
if (res == NULL)
return NULL;
- switch (res->status)
+ switch (NIS_RES_STATUS (res))
{
case NIS_SUCCESS:
case NIS_CBRESULTS:
@@ -281,10 +283,10 @@ nis_list (const_nis_name name, u_long flags,
break;
}
}
- if (res->status == NIS_SUCCESS && failures)
- res->status = NIS_S_SUCCESS;
- if (res->status == NIS_NOTFOUND && failures)
- res->status = NIS_S_NOTFOUND;
+ if (NIS_RES_STATUS (res) == NIS_SUCCESS && failures)
+ NIS_RES_STATUS (res) = NIS_S_SUCCESS;
+ if (NIS_RES_STATUS (res) == NIS_NOTFOUND && failures)
+ NIS_RES_STATUS (res) = NIS_S_NOTFOUND;
break;
}
}
@@ -302,13 +304,13 @@ nis_list (const_nis_name name, u_long flags,
memset (res, '\0', sizeof (nis_result));
status = __do_niscall (ibreq->ibr_name, NIS_IBLIST,
- (xdrproc_t) xdr_ib_request,
- (caddr_t) ibreq, (xdrproc_t) xdr_nis_result,
+ (xdrproc_t) _xdr_ib_request,
+ (caddr_t) ibreq, (xdrproc_t) _xdr_nis_result,
(caddr_t) res, flags, cb);
if (status != NIS_SUCCESS)
- res->status = status;
+ NIS_RES_STATUS (res) = status;
- switch (res->status)
+ switch (NIS_RES_STATUS (res))
{
case NIS_PARTIAL:
case NIS_SUCCESS:
@@ -319,7 +321,7 @@ nis_list (const_nis_name name, u_long flags,
/* If we hit the link limit, bail. */
if (count_links > NIS_MAXLINKS)
{
- res->status = NIS_LINKNAMEERROR;
+ NIS_RES_STATUS (res) = NIS_LINKNAMEERROR;
++done;
break;
}
@@ -344,7 +346,9 @@ nis_list (const_nis_name name, u_long flags,
++done;
break;
case NIS_CBRESULTS:
- /* Calback is handled in nis_call.c (__do_niscall2). */
+ /* Calback is handled in nis_call.c (__do_niscall2),
+ but we have to change the error code */
+ NIS_RES_STATUS (res) = cb->result;
++done;
break;
case NIS_UNAVAIL:
@@ -356,7 +360,7 @@ nis_list (const_nis_name name, u_long flags,
if (count_links)
{
free (ibreq->ibr_name);
- res->status = NIS_LINKNAMEERROR;
+ NIS_RES_STATUS (res) = NIS_LINKNAMEERROR;
++done;
break;
}
@@ -388,55 +392,58 @@ nis_list (const_nis_name name, u_long flags,
}
nis_result *
-nis_add_entry (const_nis_name name, const nis_object *obj,
- u_long flags)
+nis_add_entry (const_nis_name name, const nis_object *obj2, u_long flags)
{
+ nis_object obj;
nis_result *res;
nis_error status;
ib_request *ibreq = calloc (1, sizeof (ib_request));
- 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;
+
+ if (ibreq == NULL)
+ {
+ NIS_RES_STATUS (res) = NIS_NOMEMORY;
+ return res;
+ }
if (__create_ib_request (name, ibreq, flags) == NULL)
{
- res->status = NIS_BADNAME;
+ NIS_RES_STATUS (res) = NIS_BADNAME;
return res;
}
- ibreq->ibr_obj.ibr_obj_val = nis_clone_object (obj, NULL);
- ibreq->ibr_obj.ibr_obj_len = 1;
+ memcpy (&obj, obj2, sizeof (nis_object));
- p1 = ibreq->ibr_obj.ibr_obj_val->zo_name;
- if (p1 == NULL || strlen (p1) == 0)
- ibreq->ibr_obj.ibr_obj_val->zo_name =
- nis_leaf_of_r (name, buf1, sizeof (buf1));
+ if (obj.zo_name == NULL || strlen (obj.zo_name) == 0)
+ obj.zo_name = nis_leaf_of_r (name, buf1, sizeof (buf1));
- p2 = ibreq->ibr_obj.ibr_obj_val->zo_owner;
- if (p2 == NULL || strlen (p2) == 0)
- ibreq->ibr_obj.ibr_obj_val->zo_owner = nis_local_principal ();
+ if (obj.zo_owner == NULL || strlen (obj.zo_owner) == 0)
+ obj.zo_owner = nis_local_principal ();
- p3 = ibreq->ibr_obj.ibr_obj_val->zo_group;
- if (p3 == NULL || strlen (p3) == 0)
- ibreq->ibr_obj.ibr_obj_val->zo_group = nis_local_group ();
+ if (obj.zo_group == NULL || strlen (obj.zo_group) == 0)
+ obj.zo_group = nis_local_group ();
- p4 = ibreq->ibr_obj.ibr_obj_val->zo_domain;
- ibreq->ibr_obj.ibr_obj_val->zo_domain =
- nis_domain_of_r (name, buf4, sizeof (buf4));
+ obj.zo_domain = nis_domain_of_r (name, buf4, sizeof (buf4));
+
+ ibreq->ibr_obj.ibr_obj_val = nis_clone_object (&obj, NULL);
+ if (ibreq->ibr_obj.ibr_obj_val == NULL)
+ {
+ NIS_RES_STATUS (res) = NIS_NOMEMORY;
+ return res;
+ }
+ ibreq->ibr_obj.ibr_obj_len = 1;
if ((status = __do_niscall (ibreq->ibr_name, NIS_IBADD,
- (xdrproc_t) xdr_ib_request,
+ (xdrproc_t) _xdr_ib_request,
(caddr_t) ibreq,
- (xdrproc_t) xdr_nis_result,
+ (xdrproc_t) _xdr_nis_result,
(caddr_t) res, 0, NULL)) != NIS_SUCCESS)
- res->status = status;
-
- ibreq->ibr_obj.ibr_obj_val->zo_name = p1;
- ibreq->ibr_obj.ibr_obj_val->zo_owner = p2;
- ibreq->ibr_obj.ibr_obj_val->zo_group = p3;
- ibreq->ibr_obj.ibr_obj_val->zo_domain = p4;
+ NIS_RES_STATUS (res) = status;
nis_free_request (ibreq);
@@ -444,13 +451,12 @@ nis_add_entry (const_nis_name name, const nis_object *obj,
}
nis_result *
-nis_modify_entry (const_nis_name name, const nis_object *obj,
- u_long flags)
+nis_modify_entry (const_nis_name name, const nis_object *obj2, u_long flags)
{
+ nis_object obj;
nis_result *res;
nis_error status;
ib_request *ibreq = calloc (1, sizeof (ib_request));
- char *p1, *p2, *p3, *p4;
char buf1[strlen (name) + 20];
char buf4[strlen (name) + 20];
@@ -458,40 +464,36 @@ nis_modify_entry (const_nis_name name, const nis_object *obj,
if (__create_ib_request (name, ibreq, flags) == NULL)
{
- res->status = NIS_BADNAME;
+ NIS_RES_STATUS (res) = NIS_BADNAME;
return res;
}
- ibreq->ibr_obj.ibr_obj_val = nis_clone_object (obj, NULL);
- ibreq->ibr_obj.ibr_obj_len = 1;
+ memcpy (&obj, obj2, sizeof (nis_object));
- p1 = ibreq->ibr_obj.ibr_obj_val->zo_name;
- if (p1 == NULL || strlen (p1) == 0)
- ibreq->ibr_obj.ibr_obj_val->zo_name =
- nis_leaf_of_r (name, buf1, sizeof (buf1));
+ if (obj.zo_name == NULL || strlen (obj.zo_name) == 0)
+ obj.zo_name = nis_leaf_of_r (name, buf1, sizeof (buf1));
- p2 = ibreq->ibr_obj.ibr_obj_val->zo_owner;
- if (p2 == NULL || strlen (p2) == 0)
- ibreq->ibr_obj.ibr_obj_val->zo_owner = nis_local_principal ();
+ if (obj.zo_owner == NULL || strlen (obj.zo_owner) == 0)
+ obj.zo_owner = nis_local_principal ();
- p3 = ibreq->ibr_obj.ibr_obj_val->zo_group;
- if (p3 == NULL || strlen (p3) == 0)
- ibreq->ibr_obj.ibr_obj_val->zo_group = nis_local_group ();
+ if (obj.zo_group == NULL || strlen (obj.zo_group) == 0)
+ obj.zo_group = nis_local_group ();
- p4 = ibreq->ibr_obj.ibr_obj_val->zo_domain;
- ibreq->ibr_obj.ibr_obj_val->zo_domain =
- nis_domain_of_r (name, buf4, sizeof (buf4));
+ obj.zo_domain = nis_domain_of_r (name, buf4, sizeof (buf4));
+
+ ibreq->ibr_obj.ibr_obj_val = nis_clone_object (&obj, NULL);
+ if (ibreq->ibr_obj.ibr_obj_val == NULL)
+ {
+ NIS_RES_STATUS (res) = NIS_NOMEMORY;
+ return res;
+ }
+ ibreq->ibr_obj.ibr_obj_len = 1;
if ((status = __do_niscall (ibreq->ibr_name, NIS_IBMODIFY,
- (xdrproc_t) xdr_ib_request,
- (caddr_t) ibreq, (xdrproc_t) xdr_nis_result,
+ (xdrproc_t) _xdr_ib_request,
+ (caddr_t) ibreq, (xdrproc_t) _xdr_nis_result,
(caddr_t) res, 0, NULL)) != NIS_SUCCESS)
- res->status = status;
-
- ibreq->ibr_obj.ibr_obj_val->zo_name = p1;
- ibreq->ibr_obj.ibr_obj_val->zo_owner = p2;
- ibreq->ibr_obj.ibr_obj_val->zo_group = p3;
- ibreq->ibr_obj.ibr_obj_val->zo_domain = p4;
+ NIS_RES_STATUS (res) = status;
nis_free_request (ibreq);
@@ -507,24 +509,37 @@ nis_remove_entry (const_nis_name name, const nis_object *obj,
nis_error status;
res = calloc (1, sizeof (nis_result));
+ if (res == NULL)
+ return NULL;
+
+ if (ibreq == NULL)
+ {
+ NIS_RES_STATUS (res) = NIS_NOMEMORY;
+ return res;
+ }
if (__create_ib_request (name, ibreq, flags) == NULL)
{
- res->status = NIS_BADNAME;
+ NIS_RES_STATUS (res) = NIS_BADNAME;
return res;
}
if (obj != NULL)
{
ibreq->ibr_obj.ibr_obj_val = nis_clone_object (obj, NULL);
+ if (ibreq->ibr_obj.ibr_obj_val == NULL)
+ {
+ NIS_RES_STATUS (res) = NIS_NOMEMORY;
+ return res;
+ }
ibreq->ibr_obj.ibr_obj_len = 1;
}
if ((status = __do_niscall (ibreq->ibr_name, NIS_IBREMOVE,
- (xdrproc_t) xdr_ib_request,
- (caddr_t) ibreq, (xdrproc_t) xdr_nis_result,
+ (xdrproc_t) _xdr_ib_request,
+ (caddr_t) ibreq, (xdrproc_t) _xdr_nis_result,
(caddr_t) res, 0, NULL)) != NIS_SUCCESS)
- res->status = status;
+ NIS_RES_STATUS (res) = status;
nis_free_request (ibreq);
@@ -539,18 +554,26 @@ nis_first_entry (const_nis_name name)
nis_error status;
res = calloc (1, sizeof (nis_result));
+ if (res == NULL)
+ return NULL;
+
+ if (ibreq == NULL)
+ {
+ NIS_RES_STATUS (res) = NIS_NOMEMORY;
+ return res;
+ }
if (__create_ib_request (name, ibreq, 0) == NULL)
{
- res->status = NIS_BADNAME;
+ NIS_RES_STATUS (res) = NIS_BADNAME;
return res;
}
if ((status = __do_niscall (ibreq->ibr_name, NIS_IBFIRST,
- (xdrproc_t) xdr_ib_request,
- (caddr_t) ibreq, (xdrproc_t) xdr_nis_result,
+ (xdrproc_t) _xdr_ib_request,
+ (caddr_t) ibreq, (xdrproc_t) _xdr_nis_result,
(caddr_t) res, 0, NULL)) != NIS_SUCCESS)
- res->status = status;
+ NIS_RES_STATUS (res) = status;
nis_free_request (ibreq);
@@ -565,10 +588,18 @@ nis_next_entry (const_nis_name name, const netobj *cookie)
nis_error status;
res = calloc (1, sizeof (nis_result));
+ if (res == NULL)
+ return NULL;
+
+ if (ibreq == NULL)
+ {
+ NIS_RES_STATUS (res) = NIS_NOMEMORY;
+ return res;
+ }
if (__create_ib_request (name, ibreq, 0) == NULL)
{
- res->status = NIS_BADNAME;
+ NIS_RES_STATUS (res) = NIS_BADNAME;
return res;
}
@@ -577,19 +608,19 @@ nis_next_entry (const_nis_name name, const netobj *cookie)
ibreq->ibr_cookie.n_bytes = malloc (cookie->n_len);
if (ibreq->ibr_cookie.n_bytes == NULL)
{
- res->status = NIS_NOMEMORY;
- free (res);
- return NULL;
+ NIS_RES_STATUS (res) = NIS_NOMEMORY;
+ nis_free_request (ibreq);
+ return res;
}
memcpy (ibreq->ibr_cookie.n_bytes, cookie->n_bytes, cookie->n_len);
ibreq->ibr_cookie.n_len = cookie->n_len;
}
if ((status = __do_niscall (ibreq->ibr_name, NIS_IBNEXT,
- (xdrproc_t) xdr_ib_request,
- (caddr_t) ibreq, (xdrproc_t) xdr_nis_result,
+ (xdrproc_t) _xdr_ib_request,
+ (caddr_t) ibreq, (xdrproc_t) _xdr_nis_result,
(caddr_t) res, 0, NULL)) != NIS_SUCCESS)
- res->status = status;
+ NIS_RES_STATUS (res) = status;
nis_free_request (ibreq);