1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20: #include <string.h>
21: #include <rpcsvc/nis.h>
22:
23:
24:
25:
26:
27: static int
28: internal_ismember (const_nis_name principal, const_nis_name group)
29: {
30: size_t grouplen = strlen (group);
31: char buf[grouplen + 50];
32: char leafbuf[grouplen + 2];
33: char domainbuf[grouplen + 2];
34: nis_result *res;
35: char *cp, *cp2;
36: u_int i;
37:
38: cp = stpcpy (buf, nis_leaf_of_r (group, leafbuf, sizeof (leafbuf) - 1));
39: cp = stpcpy (cp, ".groups_dir");
40: cp2 = nis_domain_of_r (group, domainbuf, sizeof (domainbuf) - 1);
41: if (cp2 != NULL && cp2[0] != '\0')
42: {
43: *cp++ = '.';
44: strcpy (cp, cp2);
45: }
46:
47: res = nis_lookup (buf, EXPAND_NAME|FOLLOW_LINKS);
48: if (res == NULL || NIS_RES_STATUS (res) != NIS_SUCCESS)
49: {
50: nis_freeresult (res);
51: return 0;
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 0;
59: }
60:
61:
62:
63: for (i = 0; i < NIS_RES_OBJECT(res)->GR_data.gr_members.gr_members_len; ++i)
64: {
65: cp = NIS_RES_OBJECT (res)->GR_data.gr_members.gr_members_val[i];
66: if (cp[0] == '-')
67: {
68: if (strcmp (&cp[1], principal) == 0)
69: {
70: nis_freeresult (res);
71: return -1;
72: }
73: if (cp[1] == '@')
74: switch (internal_ismember (principal, &cp[2]))
75: {
76: case -1:
77: nis_freeresult (res);
78: return -1;
79: case 1:
80: nis_freeresult (res);
81: return 1;
82: default:
83: break;
84: }
85: else
86: if (cp[1] == '*')
87: {
88: char buf1[strlen (principal) + 2];
89: char buf2[strlen (cp) + 2];
90:
91: if (strcmp (nis_domain_of_r (principal, buf1, sizeof buf1),
92: nis_domain_of_r (cp, buf2, sizeof buf2)) == 0)
93: {
94: nis_freeresult (res);
95: return -1;
96: }
97: }
98: }
99: }
100:
101: for (i = 0; i < NIS_RES_OBJECT (res)->GR_data.gr_members.gr_members_len; ++i)
102: {
103: cp = NIS_RES_OBJECT (res)->GR_data.gr_members.gr_members_val[i];
104: if (cp[0] != '-')
105: {
106: if (strcmp (cp, principal) == 0)
107: {
108: nis_freeresult (res);
109: return 1;
110: }
111: if (cp[0] == '@')
112: switch (internal_ismember (principal, &cp[1]))
113: {
114: case -1:
115: nis_freeresult (res);
116: return -1;
117: case 1:
118: nis_freeresult (res);
119: return 1;
120: default:
121: break;
122: }
123: else
124: if (cp[0] == '*')
125: {
126: char buf1[strlen (principal) + 2];
127: char buf2[strlen (cp) + 2];
128:
129: if (strcmp (nis_domain_of_r (principal, buf1, sizeof buf1),
130: nis_domain_of_r (cp, buf2, sizeof buf2)) == 0)
131: {
132: nis_freeresult (res);
133: return 1;
134: }
135: }
136: }
137: }
138: nis_freeresult (res);
139: return 0;
140: }
141:
142: bool_t
143: nis_ismember (const_nis_name principal, const_nis_name group)
144: {
145: if (group != NULL && group[0] != '\0' && principal != NULL)
146: return internal_ismember (principal, group) == 1 ? TRUE : FALSE;
147: else
148: return FALSE;
149: }