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