xref: /csrg-svn/usr.bin/uucp/libuu/uucpname.c (revision 17844)
113679Ssam #ifndef lint
2*17844Sralph static char sccsid[] = "@(#)uucpname.c	5.2 (Berkeley) 01/22/85";
313679Ssam #endif
413679Ssam 
513679Ssam #include "uucp.h"
613679Ssam #include <sys/types.h>
713679Ssam #include <sys/stat.h>
813679Ssam 
913679Ssam #ifdef	GETMYHNAME
1013679Ssam #include <UNET/unetio.h>
1113679Ssam #endif
1213679Ssam 
1313679Ssam #ifdef	UNAME
1413679Ssam /* Use USG uname() library routine */
1513679Ssam #include <sys/utsname.h>
1613679Ssam #endif
1713679Ssam 
1813679Ssam #ifdef	CCWHOAMI
1913679Ssam /* Compile in 'sysname' as found in standard(!) include file */
2013679Ssam #include <whoami.h>
2113679Ssam #endif
2213679Ssam 
23*17844Sralph /*
2413679Ssam  *	uucpname(name)		get the uucp name
2513679Ssam  *
2613679Ssam  *	return code - none
2713679Ssam  */
2813679Ssam uucpname(name)
2913679Ssam register char *name;
3013679Ssam {
3113679Ssam 	register char *s, *d;
3213679Ssam 
33*17844Sralph 	/*
3413679Ssam 	 * Since some UNIX systems do not honor the set-user-id bit
3513679Ssam 	 * when the invoking user is root, we must change the uid here.
3613679Ssam 	 * So uucp files are created with the correct owner.
3713679Ssam 	 */
3813679Ssam 	if (geteuid() == 0 && getuid() == 0) {
3913679Ssam 		struct stat stbuf;
4013679Ssam 		stbuf.st_uid = 0;	/* In case the stat fails */
4113679Ssam 		stbuf.st_gid = 0;
4213679Ssam 		stat(UUCICO, &stbuf);	/* Assume uucico is correctly owned */
4313679Ssam 		setgid(stbuf.st_gid);
4413679Ssam 		setuid(stbuf.st_uid);
4513679Ssam 	}
4613679Ssam 
4713679Ssam 	s = NULL;	/* system name unknown, so far */
4813679Ssam 
49*17844Sralph #ifdef GETHOSTNAME
5013679Ssam 	if (s == NULL || *s == '\0') {
5113679Ssam 		char hostname[32];
52*17844Sralph #ifdef VMS
53*17844Sralph 		int i = sizeof(hostname);
54*17844Sralph #endif VMS
5513679Ssam 
5613679Ssam 		s = hostname;
57*17844Sralph #ifdef VMS
58*17844Sralph 		if(gethostname(hostname, &i) == -1) {
59*17844Sralph #else !VMS
6013679Ssam 		if(gethostname(hostname, sizeof(hostname)) == -1) {
61*17844Sralph #endif !VMS
62*17844Sralph 			DEBUG(1, "gethostname", _FAILED);
6313679Ssam 			s = NULL;
6413679Ssam 		}
6513679Ssam 	}
66*17844Sralph #endif GETHOSTNAME
6713679Ssam 
6813679Ssam #ifdef	UNAME
6913679Ssam 	/* Use USG library routine */
7013679Ssam 	if (s == NULL || *s == '\0') {
7113679Ssam 		struct utsname utsn;
7213679Ssam 
7313679Ssam 		s = utsn.nodename;
7413679Ssam 		if (uname(&utsn) == -1) {
75*17844Sralph 			DEBUG(1, "uname", _FAILED);
7613679Ssam 			s = NULL;
7713679Ssam 		}
7813679Ssam 	}
7913679Ssam #endif
8013679Ssam 
8113679Ssam #ifdef	WHOAMI
8213679Ssam 	/* Use fake gethostname() routine */
8313679Ssam 	if (s == NULL || *s == '\0') {
8413679Ssam 		char fakehost[32];
8513679Ssam 
8613679Ssam 		s = fakehost;
8713679Ssam 		if (fakegethostname(fakehost, sizeof(fakehost)) == -1) {
88*17844Sralph 			DEBUG(1, "whoami search", _FAILED);
8913679Ssam 			s = NULL;
9013679Ssam 		}
9113679Ssam 	}
9213679Ssam #endif
9313679Ssam 
9413679Ssam #ifdef	CCWHOAMI
9513679Ssam 	/* compile sysname right into uucp */
9613679Ssam 	if (s == NULL || *s == '\0') {
9713679Ssam 		s = sysname;
9813679Ssam 	}
9913679Ssam #endif
10013679Ssam 
10113679Ssam #ifdef	UUNAME
10213679Ssam 	/* uucp name is stored in /etc/uucpname or /local/uucpname */
10313679Ssam 	if (s == NULL || *s == '\0') {
10413679Ssam 		FILE *uucpf;
10513679Ssam 		char stmp[10];
10613679Ssam 
10713679Ssam 		s = stmp;
10813679Ssam 		if (((uucpf = fopen("/etc/uucpname", "r")) == NULL &&
10913679Ssam 		     (uucpf = fopen("/local/uucpname", "r")) == NULL) ||
11013679Ssam 			fgets(s, 8, uucpf) == NULL) {
111*17844Sralph 				DEBUG(1, "uuname search", _FAILED);
11213679Ssam 				s = NULL;
11313679Ssam 		} else {
11413679Ssam 			for (d = stmp; *d && *d != '\n' && d < stmp + 8; d++)
11513679Ssam 				;
11613679Ssam 			*d = '\0';
11713679Ssam 		}
11813679Ssam 		if (uucpf != NULL)
11913679Ssam 			fclose(uucpf);
12013679Ssam 	}
12113679Ssam #endif
12213679Ssam 
12313679Ssam #ifdef	GETMYHNAME
12413679Ssam 	/* Use 3Com's getmyhname() routine */
12513679Ssam 	if (s == NULL || *s == '\0') {
12613679Ssam 		if ((s == getmyhname()) == NULL)
127*17844Sralph 			DEBUG(1, "getmyhname", _FAILED);
12813679Ssam 	}
12913679Ssam #endif
13013679Ssam 
13113679Ssam #ifdef	MYNAME
13213679Ssam 	if (s == NULL || *s == '\0') {
13313679Ssam 		s = MYNAME;
13413679Ssam 	}
13513679Ssam #endif
13613679Ssam 
13713679Ssam 	if (s == NULL || *s == '\0') {
13813679Ssam 		/*
13913679Ssam 		 * As a last ditch thing, we *could* search Spool
14013679Ssam 		 * for D.<uucpname> and use that,
14113679Ssam 		 * but that is too much trouble, isn't it?
14213679Ssam 		 */
14313679Ssam 		logent("SYSTEM NAME", "CANNOT DETERMINE");
14413679Ssam 		s = "unknown";
14513679Ssam 	}
14613679Ssam 
14713679Ssam 	/*
148*17844Sralph 	 * save entire name for TCP/IP verification
149*17844Sralph 	 */
150*17844Sralph 
151*17844Sralph 	strcpy(Myfullname, s);
152*17844Sralph 
153*17844Sralph 	/*
15413679Ssam 	 * copy uucpname back to caller-supplied buffer,
15513679Ssam 	 * truncating to 7 characters.
15613679Ssam 	 * Also set up subdirectory names, if subdirs are being used.
15713679Ssam 	 */
15813679Ssam 	d = name;
15913679Ssam 	while ((*d = *s++) && d < name + 7)
16013679Ssam 		d++;
16113679Ssam 	*(name + 7) = '\0';
16213679Ssam 	DEBUG(1, "My uucpname = %s\n", name);
16313679Ssam 
16413679Ssam 	sprintf(DLocal, "D.%s", name);
16513679Ssam 	sprintf(DLocalX, "D.%sX", name);
16613679Ssam }
16713679Ssam 
16813679Ssam #ifdef	WHOAMI
16913679Ssam /*
170*17844Sralph  * simulate the 4.2 bsd system call by reading /usr/include/whoami.h
17113679Ssam  * and looking for the #define sysname
17213679Ssam  */
17313679Ssam 
17413679Ssam #define	HDRFILE "/usr/include/whoami.h"
17513679Ssam 
17613679Ssam fakegethostname(name, len)
17713679Ssam char *name;
17813679Ssam int len;
17913679Ssam {
18013679Ssam 	char buf[BUFSIZ];
18113679Ssam 	char bname[32];
18213679Ssam 	char hname[32];
18313679Ssam 	char nname[128];
18413679Ssam 	register char *p, *q, *nptr;
18513679Ssam 	int i;
18613679Ssam 	register FILE *fd;
18713679Ssam 
18813679Ssam 	fd = fopen(HDRFILE, "r");
18913679Ssam 	if (fd == NULL)
19013679Ssam 		return(-1);
19113679Ssam 
19213679Ssam 	hname[0] = 0;	/* rti!trt: was "hostunknown" */
19313679Ssam 	nname[0] = 0;
19413679Ssam 	nptr = nname;
19513679Ssam 
19613679Ssam 	while (fgets(buf, sizeof buf, fd) != NULL) { /* each line in the file */
19713679Ssam 		if (sscanf(buf, "#define sysname \"%[^\"]\"", bname) == 1) {
19813679Ssam 			strcpy(hname, bname);
19913679Ssam 		} else if (sscanf(buf, "#define nickname \"%[^\"]\"", bname) == 1) {
20013679Ssam 			strcpy(nptr, bname);
20113679Ssam 			nptr += strlen(bname) + 1;
20213679Ssam 		} else if (sscanf(buf, "#define nickname%d \"%[^\"]\"", &i, bname) == 2) {
20313679Ssam 			strcpy(nptr, bname);
20413679Ssam 			nptr += strlen(bname) + 1;
20513679Ssam 		}
20613679Ssam 	}
20713679Ssam 	fclose(fd);
20813679Ssam 	if (hname[0] == 0)
209*17844Sralph 		return FAIL;
21013679Ssam 	strncpy(name, hname, len);
21113679Ssam 	p = nname;
21213679Ssam 	i = strlen(hname) + 1;
21313679Ssam 	q = name + i;
21413679Ssam 	while (i < len && (p[0] != 0 || p[1] != 0)) {
21513679Ssam 		*q++ = *p++;
21613679Ssam 		i++;
21713679Ssam 	}
21813679Ssam 	*q++ = 0;
219*17844Sralph 	return SUCCESS;
22013679Ssam }
22113679Ssam #endif
222