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