1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20: #include <assert.h>
21: #include <string.h>
22: #include <rpcsvc/nis.h>
23:
24: nis_error
25: nis_addmember (const_nis_name member, const_nis_name group)
26: {
27: if (group != NULL && group[0] != '\0')
28: {
29: size_t grouplen = strlen (group);
30: char buf[grouplen + 14 + NIS_MAXNAMELEN];
31: char domainbuf[grouplen + 2];
32: nis_result *res, *res2;
33: nis_error status;
34: char *cp, *cp2;
35:
36: cp = rawmemchr (nis_leaf_of_r (group, buf, sizeof (buf) - 1), '\0');
37: cp = stpcpy (cp, ".groups_dir");
38: cp2 = nis_domain_of_r (group, domainbuf, sizeof (domainbuf) - 1);
39: if (cp2 != NULL && cp2[0] != '\0')
40: {
41: *cp++ = '.';
42: stpcpy (cp, cp2);
43: }
44: res = nis_lookup (buf, FOLLOW_LINKS | EXPAND_NAME);
45: if (NIS_RES_STATUS (res) != NIS_SUCCESS)
46: {
47: status = NIS_RES_STATUS (res);
48: nis_freeresult (res);
49: return status;
50: }
51: if (NIS_RES_NUMOBJ (res) != 1
52: || __type_of (NIS_RES_OBJECT (res)) != NIS_GROUP_OBJ)
53: {
54: nis_freeresult (res);
55: return NIS_INVALIDOBJ;
56: }
57:
58: u_int gr_members_len
59: = NIS_RES_OBJECT(res)->GR_data.gr_members.gr_members_len;
60:
61: nis_name *new_gr_members_val
62: = realloc (NIS_RES_OBJECT (res)->GR_data.gr_members.gr_members_val,
63: (gr_members_len + 1) * sizeof (nis_name));
64: if (new_gr_members_val == NULL)
65: goto nomem_out;
66:
67: NIS_RES_OBJECT (res)->GR_data.gr_members.gr_members_val
68: = new_gr_members_val;
69:
70: new_gr_members_val[gr_members_len] = strdup (member);
71: if (new_gr_members_val[gr_members_len] == NULL)
72: {
73: nomem_out:
74: nis_freeresult (res);
75: return NIS_NOMEMORY;
76: }
77: ++NIS_RES_OBJECT (res)->GR_data.gr_members.gr_members_len;
78:
79:
80: assert (strlen (NIS_RES_OBJECT(res)->zo_name) + 1 < grouplen + 14);
81: cp = stpcpy (buf, NIS_RES_OBJECT(res)->zo_name);
82: *cp++ = '.';
83: strncpy (cp, NIS_RES_OBJECT (res)->zo_domain, NIS_MAXNAMELEN);
84: res2 = nis_modify (buf, NIS_RES_OBJECT (res));
85: status = NIS_RES_STATUS (res2);
86: nis_freeresult (res);
87: nis_freeresult (res2);
88:
89: return status;
90: }
91: else
92: return NIS_FAIL;
93: }