cast (time_t) and lseek(fd,0L...) for pdp11s
[unix-history] / usr / src / usr.bin / uucp / libuu / uucpname.c
CommitLineData
7d31005e
SL
1#ifndef lint
2static 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
29uucpname(name)
30register 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
168fakegethostname(name, len)
169char *name;
170int 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