1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20: #include <errno.h>
21: #include <string.h>
22: #include <unistd.h>
23: #include <libintl.h>
24: #include <rpcsvc/nis.h>
25:
26: nis_name
27: nis_local_group (void)
28: {
29: static char __nisgroup[NIS_MAXNAMELEN + 1];
30:
31: char *cptr;
32: if (__nisgroup[0] == '\0'
33: && (cptr = getenv ("NIS_GROUP")) != NULL
34: && strlen (cptr) < NIS_MAXNAMELEN)
35: {
36: char *cp = stpcpy (__nisgroup, cptr);
37:
38: if (cp[-1] != '.')
39: {
40: cptr = nis_local_directory ();
41: if ((cp - __nisgroup) + strlen (cptr) + 1 < NIS_MAXNAMELEN)
42: {
43: *cp++ = '.';
44: strcpy (cp, cptr);
45: }
46: else
47: __nisgroup[0] = '\0';
48: }
49: }
50:
51: return __nisgroup;
52: }
53: libnsl_hidden_def (nis_local_group)
54:
55: nis_name
56: nis_local_directory (void)
57: {
58: static char __nisdomainname[NIS_MAXNAMELEN + 1];
59:
60: if (__nisdomainname[0] == '\0')
61: {
62: if (getdomainname (__nisdomainname, NIS_MAXNAMELEN) < 0)
63: __nisdomainname[0] = '\0';
64: else
65: {
66: char *cp = rawmemchr (__nisdomainname, '\0');
67:
68:
69: if (cp[-1] != '.')
70: {
71: *cp++ = '.';
72: *cp = '\0';
73: }
74: }
75: }
76:
77: return __nisdomainname;
78: }
79: libnsl_hidden_def (nis_local_directory)
80:
81: nis_name
82: nis_local_principal (void)
83: {
84: static char __principal[NIS_MAXNAMELEN + 1];
85:
86: if (__principal[0] == '\0')
87: {
88: char buf[NIS_MAXNAMELEN + 1];
89: nis_result *res;
90: uid_t uid = geteuid ();
91:
92: if (uid != 0)
93: {
94: int len = snprintf (buf, NIS_MAXNAMELEN - 1,
95: "[auth_name=%d,auth_type=LOCAL],cred.org_dir.%s",
96: uid, nis_local_directory ());
97:
98: if (len >= NIS_MAXNAMELEN - 1)
99: nobody:
100:
101: return strcpy (__principal, "nobody");
102:
103: if (buf[len - 1] != '.')
104: {
105: buf[len++] = '.';
106: buf[len] = '\0';
107: }
108:
109: res = nis_list (buf, USE_DGRAM + NO_AUTHINFO + FOLLOW_LINKS +
110: FOLLOW_PATH, NULL, NULL);
111:
112: if (res == NULL)
113: goto nobody;
114:
115: if (NIS_RES_STATUS (res) == NIS_SUCCESS)
116: {
117: if (res->objects.objects_len > 1)
118: {
119:
120:
121:
122: printf (_("\
123: LOCAL entry for UID %d in directory %s not unique\n"),
124: uid, nis_local_directory ());
125: }
126: strcpy (__principal, ENTRY_VAL (res->objects.objects_val, 0));
127: nis_freeresult (res);
128: return __principal;
129: }
130: else
131: {
132: nis_freeresult (res);
133: goto nobody;
134: }
135: }
136: else
137: return strcpy (__principal, nis_local_host ());
138:
139:
140: goto nobody;
141: }
142: return __principal;
143: }
144: libnsl_hidden_def (nis_local_principal)
145:
146: nis_name
147: nis_local_host (void)
148: {
149: static char __nishostname[NIS_MAXNAMELEN + 1];
150:
151: if (__nishostname[0] == '\0')
152: {
153: if (gethostname (__nishostname, NIS_MAXNAMELEN) < 0)
154: __nishostname[0] = '\0';
155: else
156: {
157: char *cp = rawmemchr (__nishostname, '\0');
158: int len = cp - __nishostname;
159:
160:
161: if (cp[-1] == '.')
162: return __nishostname;
163:
164: if (len + strlen (nis_local_directory ()) + 1 > NIS_MAXNAMELEN)
165: {
166: __nishostname[0] = '\0';
167: return __nishostname;
168: }
169:
170: *cp++ = '.';
171: strncpy (cp, nis_local_directory (), NIS_MAXNAMELEN - len -1);
172: __nishostname[NIS_MAXNAMELEN] = '\0';
173: }
174: }
175:
176: return __nishostname;
177: }
178: libnsl_hidden_def (nis_local_host)