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_removemember (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 = stpcpy (cp, ".");
42: stpcpy (cp, cp2);
43: }
44: res = nis_lookup (buf, FOLLOW_LINKS | EXPAND_NAME);
45: if (res == NULL)
46: return NIS_NOMEMORY;
47: if (NIS_RES_STATUS (res) != NIS_SUCCESS)
48: {
49: status = NIS_RES_STATUS (res);
50: nis_freeresult (res);
51: return status;
52: }
53:
54: if (NIS_RES_NUMOBJ (res) != 1
55: || __type_of (NIS_RES_OBJECT (res)) != NIS_GROUP_OBJ)
56: {
57: nis_freeresult (res);
58: return NIS_INVALIDOBJ;
59: }
60:
61: nis_name *gr_members_val
62: = NIS_RES_OBJECT(res)->GR_data.gr_members.gr_members_val;
63: u_int gr_members_len
64: = NIS_RES_OBJECT(res)->GR_data.gr_members.gr_members_len;
65:
66: u_int j = 0;
67: for (u_int i = 0; i < gr_members_len; ++i)
68: if (strcmp (gr_members_val[i], member) != 0)
69: gr_members_val[j++] = gr_members_val[i];
70: else
71: free (gr_members_val[i]);
72:
73:
74:
75:
76:
77:
78: NIS_RES_OBJECT (res)->GR_data.gr_members.gr_members_len = j;
79:
80: cp = stpcpy (buf, NIS_RES_OBJECT (res)->zo_name);
81: *cp++ = '.';
82: strncpy (cp, NIS_RES_OBJECT (res)->zo_domain, NIS_MAXNAMELEN);
83: res2 = nis_modify (buf, NIS_RES_OBJECT (res));
84: status = NIS_RES_STATUS (res2);
85: nis_freeresult (res);
86: nis_freeresult (res2);
87:
88: return status;
89: }
90: else
91: return NIS_FAIL;
92: }