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