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