|
|
1.1 ! root 1: /* ! 2: * Copyright (c) 1985 Regents of the University of California. ! 3: * All rights reserved. The Berkeley software License Agreement ! 4: * specifies the terms and conditions for redistribution. ! 5: */ ! 6: ! 7: #ifndef lint ! 8: static char sccsid[] = "@(#)ruserpass.c 1.3 (Berkeley) 3/7/86"; ! 9: #endif not lint ! 10: ! 11: ! 12: struct macel { ! 13: char mac_name[9]; /* macro name */ ! 14: char *mac_start; /* start of macro in macbuf */ ! 15: char *mac_end; /* end of macro in macbuf */ ! 16: }; ! 17: ! 18: extern int macnum, proxy; /* number of defined macros */ ! 19: extern struct macel macros[16], *macpt; ! 20: extern char macbuf[4096]; ! 21: ! 22: #include <stdio.h> ! 23: #include <utmp.h> ! 24: #include <ctype.h> ! 25: #include <sys/types.h> ! 26: #include <sys/stat.h> ! 27: #include <errno.h> ! 28: ! 29: char *renvlook(), *malloc(), *index(), *getenv(), *getpass(), *getlogin(); ! 30: char *strcpy(); ! 31: struct utmp *getutmp(); ! 32: static FILE *cfile; ! 33: ! 34: ruserpass(host, aname, apass, aacct) ! 35: char *host, **aname, **apass, **aacct; ! 36: { ! 37: ! 38: /* renv(host, aname, apass, aacct); ! 39: if (*aname == 0 || *apass == 0) */ ! 40: return(rnetrc(host, aname, apass, aacct)); ! 41: } ! 42: ! 43: #define DEFAULT 1 ! 44: #define LOGIN 2 ! 45: #define PASSWD 3 ! 46: #define ACCOUNT 4 ! 47: #define MACDEF 5 ! 48: #define ID 10 ! 49: #define MACHINE 11 ! 50: ! 51: static char tokval[100]; ! 52: ! 53: static struct toktab { ! 54: char *tokstr; ! 55: int tval; ! 56: } toktab[]= { ! 57: "default", DEFAULT, ! 58: "login", LOGIN, ! 59: "password", PASSWD, ! 60: "account", ACCOUNT, ! 61: "machine", MACHINE, ! 62: "macdef", MACDEF, ! 63: 0, 0 ! 64: }; ! 65: ! 66: static ! 67: rnetrc(host, aname, apass, aacct) ! 68: char *host, **aname, **apass, **aacct; ! 69: { ! 70: char *hdir, buf[BUFSIZ], *tmp; ! 71: int t, i, c; ! 72: struct stat stb; ! 73: extern int errno; ! 74: ! 75: hdir = getenv("HOME"); ! 76: if (hdir == NULL) ! 77: hdir = "."; ! 78: (void) sprintf(buf, "%s/.netrc", hdir); ! 79: cfile = fopen(buf, "r"); ! 80: if (cfile == NULL) { ! 81: if (errno != ENOENT) ! 82: perror(buf); ! 83: return(0); ! 84: } ! 85: next: ! 86: while ((t = token())) switch(t) { ! 87: ! 88: case DEFAULT: ! 89: (void) token(); ! 90: continue; ! 91: ! 92: case MACHINE: ! 93: if (token() != ID || strcmp(host, tokval)) ! 94: continue; ! 95: while ((t = token()) && t != MACHINE) switch(t) { ! 96: ! 97: case LOGIN: ! 98: if (token()) ! 99: if (*aname == 0) { ! 100: *aname = malloc((unsigned) strlen(tokval) + 1); ! 101: (void) strcpy(*aname, tokval); ! 102: } else { ! 103: if (strcmp(*aname, tokval)) ! 104: goto next; ! 105: } ! 106: break; ! 107: case PASSWD: ! 108: if (fstat(fileno(cfile), &stb) >= 0 ! 109: && (stb.st_mode & 077) != 0) { ! 110: fprintf(stderr, "Error - .netrc file not correct mode.\n"); ! 111: fprintf(stderr, "Remove password or correct mode.\n"); ! 112: return(-1); ! 113: } ! 114: if (token() && *apass == 0) { ! 115: *apass = malloc((unsigned) strlen(tokval) + 1); ! 116: (void) strcpy(*apass, tokval); ! 117: } ! 118: break; ! 119: case ACCOUNT: ! 120: if (fstat(fileno(cfile), &stb) >= 0 ! 121: && (stb.st_mode & 077) != 0) { ! 122: fprintf(stderr, "Error - .netrc file not correct mode.\n"); ! 123: fprintf(stderr, "Remove account or correct mode.\n"); ! 124: return(-1); ! 125: } ! 126: if (token() && *aacct == 0) { ! 127: *aacct = malloc((unsigned) strlen(tokval) + 1); ! 128: (void) strcpy(*aacct, tokval); ! 129: } ! 130: break; ! 131: case MACDEF: ! 132: if (proxy) { ! 133: return(0); ! 134: } ! 135: while ((c=getc(cfile)) != EOF && c == ' ' || c == '\t'); ! 136: if (c == EOF || c == '\n') { ! 137: printf("Missing macdef name argument.\n"); ! 138: return(-1); ! 139: } ! 140: if (macnum == 16) { ! 141: printf("Limit of 16 macros have already been defined\n"); ! 142: return(-1); ! 143: } ! 144: tmp = macros[macnum].mac_name; ! 145: *tmp++ = c; ! 146: for (i=0; i < 8 && (c=getc(cfile)) != EOF && ! 147: !isspace(c); ++i) { ! 148: *tmp++ = c; ! 149: } ! 150: if (c == EOF) { ! 151: printf("Macro definition missing null line terminator.\n"); ! 152: return(-1); ! 153: } ! 154: *tmp = '\0'; ! 155: if (c != '\n') { ! 156: while ((c=getc(cfile)) != EOF && c != '\n'); ! 157: } ! 158: if (c == EOF) { ! 159: printf("Macro definition missing null line terminator.\n"); ! 160: return(-1); ! 161: } ! 162: if (macnum == 0) { ! 163: macros[macnum].mac_start = macbuf; ! 164: } ! 165: else { ! 166: macros[macnum].mac_start = macros[macnum-1].mac_end + 1; ! 167: } ! 168: tmp = macros[macnum].mac_start; ! 169: while (tmp != macbuf + 4096) { ! 170: if ((c=getc(cfile)) == EOF) { ! 171: printf("Macro definition missing null line terminator.\n"); ! 172: return(-1); ! 173: } ! 174: *tmp = c; ! 175: if (*tmp == '\n') { ! 176: if (*(tmp-1) == '\0') { ! 177: macros[macnum++].mac_end = tmp - 1; ! 178: break; ! 179: } ! 180: *tmp = '\0'; ! 181: } ! 182: tmp++; ! 183: } ! 184: if (tmp == macbuf + 4096) { ! 185: printf("4K macro buffer exceeded\n"); ! 186: return(-1); ! 187: } ! 188: break; ! 189: default: ! 190: fprintf(stderr, "Unknown .netrc keyword %s\n", tokval); ! 191: break; ! 192: } ! 193: goto done; ! 194: } ! 195: done: ! 196: (void) fclose(cfile); ! 197: return(0); ! 198: } ! 199: ! 200: static ! 201: token() ! 202: { ! 203: char *cp; ! 204: int c; ! 205: struct toktab *t; ! 206: ! 207: if (feof(cfile)) ! 208: return (0); ! 209: while ((c = getc(cfile)) != EOF && ! 210: (c == '\n' || c == '\t' || c == ' ' || c == ',')) ! 211: continue; ! 212: if (c == EOF) ! 213: return (0); ! 214: cp = tokval; ! 215: if (c == '"') { ! 216: while ((c = getc(cfile)) != EOF && c != '"') { ! 217: if (c == '\\') ! 218: c = getc(cfile); ! 219: *cp++ = c; ! 220: } ! 221: } else { ! 222: *cp++ = c; ! 223: while ((c = getc(cfile)) != EOF ! 224: && c != '\n' && c != '\t' && c != ' ' && c != ',') { ! 225: if (c == '\\') ! 226: c = getc(cfile); ! 227: *cp++ = c; ! 228: } ! 229: } ! 230: *cp = 0; ! 231: if (tokval[0] == 0) ! 232: return (0); ! 233: for (t = toktab; t->tokstr; t++) ! 234: if (!strcmp(t->tokstr, tokval)) ! 235: return (t->tval); ! 236: return (ID); ! 237: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.