Commit | Line | Data |
---|---|---|
7d31005e SL |
1 | #ifndef lint |
2 | static char sccsid[] = "@(#)uucpname.c 5.1 (Berkeley) %G%"; | |
3 | #endif | |
4 | ||
5 | #include "uucp.h" | |
6 | #include <sys/types.h> | |
7 | #include <sys/stat.h> | |
8 | ||
9 | #ifdef GETMYHNAME | |
10 | #include <UNET/unetio.h> | |
11 | #endif | |
12 | ||
13 | #ifdef UNAME | |
14 | /* Use USG uname() library routine */ | |
15 | #include <sys/utsname.h> | |
16 | #endif | |
17 | ||
18 | #ifdef CCWHOAMI | |
19 | /* Compile in 'sysname' as found in standard(!) include file */ | |
20 | #include <whoami.h> | |
21 | #endif | |
22 | ||
23 | /******* | |
24 | * uucpname(name) get the uucp name | |
25 | * | |
26 | * return code - none | |
27 | */ | |
28 | ||
29 | uucpname(name) | |
30 | register char *name; | |
31 | { | |
32 | register char *s, *d; | |
33 | ||
34 | /* HUGE KLUDGE HERE! rti!trt | |
35 | * Since some UNIX systems do not honor the set-user-id bit | |
36 | * when the invoking user is root, we must change the uid here. | |
37 | * So uucp files are created with the correct owner. | |
38 | */ | |
39 | if (geteuid() == 0 && getuid() == 0) { | |
40 | struct stat stbuf; | |
41 | stbuf.st_uid = 0; /* In case the stat fails */ | |
42 | stbuf.st_gid = 0; | |
43 | stat(UUCICO, &stbuf); /* Assume uucico is correctly owned */ | |
44 | setgid(stbuf.st_gid); | |
45 | setuid(stbuf.st_uid); | |
46 | } | |
47 | ||
48 | s = NULL; /* system name unknown, so far */ | |
49 | ||
50 | #ifdef GETHOSTNAME | |
51 | /* Use 4.1a library routine */ | |
52 | if (s == NULL || *s == '\0') { | |
53 | char hostname[32]; | |
54 | ||
55 | s = hostname; | |
56 | if(gethostname(hostname, sizeof(hostname)) == -1) { | |
57 | DEBUG(1, "gethostname", "FAILED"); | |
58 | s = NULL; | |
59 | } | |
60 | } | |
61 | #endif | |
62 | ||
63 | #ifdef UNAME | |
64 | /* Use USG library routine */ | |
65 | if (s == NULL || *s == '\0') { | |
66 | struct utsname utsn; | |
67 | ||
68 | s = utsn.nodename; | |
69 | if (uname(&utsn) == -1) { | |
70 | DEBUG(1, "uname", "FAILED"); | |
71 | s = NULL; | |
72 | } | |
73 | } | |
74 | #endif | |
75 | ||
76 | #ifdef WHOAMI | |
77 | /* Use fake gethostname() routine */ | |
78 | if (s == NULL || *s == '\0') { | |
79 | char fakehost[32]; | |
80 | ||
81 | s = fakehost; | |
82 | if (fakegethostname(fakehost, sizeof(fakehost)) == -1) { | |
83 | DEBUG(1, "whoami search", "FAILED"); | |
84 | s = NULL; | |
85 | } | |
86 | } | |
87 | #endif | |
88 | ||
89 | #ifdef CCWHOAMI | |
90 | /* compile sysname right into uucp */ | |
91 | if (s == NULL || *s == '\0') { | |
92 | s = sysname; | |
93 | } | |
94 | #endif | |
95 | ||
96 | #ifdef UUNAME | |
97 | /* uucp name is stored in /etc/uucpname or /local/uucpname */ | |
98 | if (s == NULL || *s == '\0') { | |
99 | FILE *uucpf; | |
100 | char stmp[10]; | |
101 | ||
102 | s = stmp; | |
103 | if (((uucpf = fopen("/etc/uucpname", "r")) == NULL && | |
104 | (uucpf = fopen("/local/uucpname", "r")) == NULL) || | |
105 | fgets(s, 8, uucpf) == NULL) { | |
106 | DEBUG(1, "uuname search", "FAILED"); | |
107 | s = NULL; | |
108 | } else { | |
109 | for (d = stmp; *d && *d != '\n' && d < stmp + 8; d++) | |
110 | ; | |
111 | *d = '\0'; | |
112 | } | |
113 | if (uucpf != NULL) | |
114 | fclose(uucpf); | |
115 | } | |
116 | #endif | |
117 | ||
118 | #ifdef GETMYHNAME | |
119 | /* Use 3Com's getmyhname() routine */ | |
120 | if (s == NULL || *s == '\0') { | |
121 | if ((s == getmyhname()) == NULL) | |
122 | DEBUG(1, "getmyhname", "FAILED"); | |
123 | } | |
124 | #endif | |
125 | ||
126 | #ifdef MYNAME | |
127 | if (s == NULL || *s == '\0') { | |
128 | s = MYNAME; | |
129 | } | |
130 | #endif | |
131 | ||
132 | if (s == NULL || *s == '\0') { | |
133 | /* | |
134 | * As a last ditch thing, we *could* search Spool | |
135 | * for D.<uucpname> and use that, | |
136 | * but that is too much trouble, isn't it? | |
137 | */ | |
138 | logent("SYSTEM NAME", "CANNOT DETERMINE"); | |
139 | s = "unknown"; | |
140 | } | |
141 | ||
142 | /* | |
143 | * copy uucpname back to caller-supplied buffer, | |
144 | * truncating to 7 characters. | |
145 | * Also set up subdirectory names, if subdirs are being used. | |
146 | */ | |
147 | d = name; | |
148 | while ((*d = *s++) && d < name + 7) | |
149 | d++; | |
150 | *(name + 7) = '\0'; | |
151 | DEBUG(1, "My uucpname = %s\n", name); | |
152 | ||
153 | #ifdef UUDIR | |
154 | sprintf(DLocal, "D.%s", name); | |
155 | sprintf(DLocalX, "D.%sX", name); | |
156 | #endif | |
157 | } | |
158 | ||
159 | #ifdef WHOAMI | |
160 | /* | |
161 | * simulate the 4.1a bsd system call by reading /usr/include/whoami.h | |
162 | * and looking for the #define sysname | |
163 | * CHANGE NOTICE (rti!trt): returns -1 on failure, 0 on success. | |
164 | */ | |
165 | ||
166 | #define HDRFILE "/usr/include/whoami.h" | |
167 | ||
168 | fakegethostname(name, len) | |
169 | char *name; | |
170 | int len; | |
171 | { | |
172 | char buf[BUFSIZ]; | |
173 | char bname[32]; | |
174 | char hname[32]; | |
175 | char nname[128]; | |
176 | register char *p, *q, *nptr; | |
177 | int i; | |
178 | register FILE *fd; | |
179 | ||
180 | fd = fopen(HDRFILE, "r"); | |
181 | if (fd == NULL) | |
182 | return(-1); | |
183 | ||
184 | hname[0] = 0; /* rti!trt: was "hostunknown" */ | |
185 | nname[0] = 0; | |
186 | nptr = nname; | |
187 | ||
188 | while (fgets(buf, sizeof buf, fd) != NULL) { /* each line in the file */ | |
189 | if (sscanf(buf, "#define sysname \"%[^\"]\"", bname) == 1) { | |
190 | strcpy(hname, bname); | |
191 | } else if (sscanf(buf, "#define nickname \"%[^\"]\"", bname) == 1) { | |
192 | strcpy(nptr, bname); | |
193 | nptr += strlen(bname) + 1; | |
194 | } else if (sscanf(buf, "#define nickname%d \"%[^\"]\"", &i, bname) == 2) { | |
195 | strcpy(nptr, bname); | |
196 | nptr += strlen(bname) + 1; | |
197 | } | |
198 | } | |
199 | fclose(fd); | |
200 | if (hname[0] == 0) | |
201 | return(-1); /* added by rti!trt */ | |
202 | strncpy(name, hname, len); | |
203 | p = nname; | |
204 | i = strlen(hname) + 1; | |
205 | q = name + i; | |
206 | while (i < len && (p[0] != 0 || p[1] != 0)) { | |
207 | *q++ = *p++; | |
208 | i++; | |
209 | } | |
210 | *q++ = 0; | |
211 | return(0); | |
212 | } | |
213 | #endif |