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