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