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