|
|
1.1 root 1: #ifndef lint
2: static char sccsid[] = "@(#)uucpname.c 5.1 (Berkeley) 7/2/83";
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
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.