126053Sminshall /* 226053Sminshall * Copyright (c) 1985 Regents of the University of California. 326053Sminshall * All rights reserved. The Berkeley software License Agreement 426053Sminshall * specifies the terms and conditions for redistribution. 526053Sminshall */ 626053Sminshall 726053Sminshall #ifndef lint 8*26498Sminshall static char sccsid[] = "@(#)ruserpass.c 1.3 (Berkeley) 03/07/86"; 926053Sminshall #endif not lint 1026053Sminshall 1126053Sminshall 1226053Sminshall struct macel { 1326053Sminshall char mac_name[9]; /* macro name */ 1426053Sminshall char *mac_start; /* start of macro in macbuf */ 1526053Sminshall char *mac_end; /* end of macro in macbuf */ 1626053Sminshall }; 1726053Sminshall 1826053Sminshall extern int macnum, proxy; /* number of defined macros */ 1926053Sminshall extern struct macel macros[16], *macpt; 2026053Sminshall extern char macbuf[4096]; 2126053Sminshall 2226053Sminshall #include <stdio.h> 2326053Sminshall #include <utmp.h> 2426053Sminshall #include <ctype.h> 2526053Sminshall #include <sys/types.h> 2626053Sminshall #include <sys/stat.h> 2726053Sminshall #include <errno.h> 2826053Sminshall 2926053Sminshall char *renvlook(), *malloc(), *index(), *getenv(), *getpass(), *getlogin(); 30*26498Sminshall char *strcpy(); 3126053Sminshall struct utmp *getutmp(); 3226053Sminshall static FILE *cfile; 3326053Sminshall 3426053Sminshall ruserpass(host, aname, apass, aacct) 3526053Sminshall char *host, **aname, **apass, **aacct; 3626053Sminshall { 3726053Sminshall 3826053Sminshall /* renv(host, aname, apass, aacct); 3926053Sminshall if (*aname == 0 || *apass == 0) */ 4026053Sminshall return(rnetrc(host, aname, apass, aacct)); 4126053Sminshall } 4226053Sminshall 4326053Sminshall #define DEFAULT 1 4426053Sminshall #define LOGIN 2 4526053Sminshall #define PASSWD 3 4626053Sminshall #define ACCOUNT 4 4726053Sminshall #define MACDEF 5 4826053Sminshall #define ID 10 4926053Sminshall #define MACHINE 11 5026053Sminshall 5126053Sminshall static char tokval[100]; 5226053Sminshall 5326053Sminshall static struct toktab { 5426053Sminshall char *tokstr; 5526053Sminshall int tval; 5626053Sminshall } toktab[]= { 5726053Sminshall "default", DEFAULT, 5826053Sminshall "login", LOGIN, 5926053Sminshall "password", PASSWD, 6026053Sminshall "account", ACCOUNT, 6126053Sminshall "machine", MACHINE, 6226053Sminshall "macdef", MACDEF, 6326053Sminshall 0, 0 6426053Sminshall }; 6526053Sminshall 6626053Sminshall static 6726053Sminshall rnetrc(host, aname, apass, aacct) 6826053Sminshall char *host, **aname, **apass, **aacct; 6926053Sminshall { 70*26498Sminshall char *hdir, buf[BUFSIZ], *tmp; 71*26498Sminshall int t, i, c; 7226053Sminshall struct stat stb; 7326053Sminshall extern int errno; 7426053Sminshall 7526053Sminshall hdir = getenv("HOME"); 7626053Sminshall if (hdir == NULL) 7726053Sminshall hdir = "."; 78*26498Sminshall (void) sprintf(buf, "%s/.netrc", hdir); 7926053Sminshall cfile = fopen(buf, "r"); 8026053Sminshall if (cfile == NULL) { 8126053Sminshall if (errno != ENOENT) 8226053Sminshall perror(buf); 8326053Sminshall return(0); 8426053Sminshall } 8526053Sminshall next: 8626053Sminshall while ((t = token())) switch(t) { 8726053Sminshall 8826053Sminshall case DEFAULT: 8926053Sminshall (void) token(); 9026053Sminshall continue; 9126053Sminshall 9226053Sminshall case MACHINE: 9326053Sminshall if (token() != ID || strcmp(host, tokval)) 9426053Sminshall continue; 9526053Sminshall while ((t = token()) && t != MACHINE) switch(t) { 9626053Sminshall 9726053Sminshall case LOGIN: 9826053Sminshall if (token()) 9926053Sminshall if (*aname == 0) { 100*26498Sminshall *aname = malloc((unsigned) strlen(tokval) + 1); 101*26498Sminshall (void) strcpy(*aname, tokval); 10226053Sminshall } else { 10326053Sminshall if (strcmp(*aname, tokval)) 10426053Sminshall goto next; 10526053Sminshall } 10626053Sminshall break; 10726053Sminshall case PASSWD: 10826053Sminshall if (fstat(fileno(cfile), &stb) >= 0 10926053Sminshall && (stb.st_mode & 077) != 0) { 11026054Sminshall fprintf(stderr, "Error - .netrc file not correct mode.\n"); 11126053Sminshall fprintf(stderr, "Remove password or correct mode.\n"); 11226053Sminshall return(-1); 11326053Sminshall } 11426053Sminshall if (token() && *apass == 0) { 115*26498Sminshall *apass = malloc((unsigned) strlen(tokval) + 1); 116*26498Sminshall (void) strcpy(*apass, tokval); 11726053Sminshall } 11826053Sminshall break; 11926053Sminshall case ACCOUNT: 12026053Sminshall if (fstat(fileno(cfile), &stb) >= 0 12126053Sminshall && (stb.st_mode & 077) != 0) { 12226054Sminshall fprintf(stderr, "Error - .netrc file not correct mode.\n"); 12326053Sminshall fprintf(stderr, "Remove account or correct mode.\n"); 12426053Sminshall return(-1); 12526053Sminshall } 12626053Sminshall if (token() && *aacct == 0) { 127*26498Sminshall *aacct = malloc((unsigned) strlen(tokval) + 1); 128*26498Sminshall (void) strcpy(*aacct, tokval); 12926053Sminshall } 13026053Sminshall break; 13126053Sminshall case MACDEF: 13226053Sminshall if (proxy) { 13326053Sminshall return(0); 13426053Sminshall } 13526053Sminshall while ((c=getc(cfile)) != EOF && c == ' ' || c == '\t'); 13626053Sminshall if (c == EOF || c == '\n') { 13726053Sminshall printf("Missing macdef name argument.\n"); 13826053Sminshall return(-1); 13926053Sminshall } 14026053Sminshall if (macnum == 16) { 14126053Sminshall printf("Limit of 16 macros have already been defined\n"); 14226053Sminshall return(-1); 14326053Sminshall } 14426053Sminshall tmp = macros[macnum].mac_name; 14526053Sminshall *tmp++ = c; 14626053Sminshall for (i=0; i < 8 && (c=getc(cfile)) != EOF && 14726053Sminshall !isspace(c); ++i) { 14826053Sminshall *tmp++ = c; 14926053Sminshall } 15026053Sminshall if (c == EOF) { 15126053Sminshall printf("Macro definition missing null line terminator.\n"); 15226053Sminshall return(-1); 15326053Sminshall } 15426053Sminshall *tmp = '\0'; 15526053Sminshall if (c != '\n') { 15626053Sminshall while ((c=getc(cfile)) != EOF && c != '\n'); 15726053Sminshall } 15826053Sminshall if (c == EOF) { 15926053Sminshall printf("Macro definition missing null line terminator.\n"); 16026053Sminshall return(-1); 16126053Sminshall } 16226053Sminshall if (macnum == 0) { 16326053Sminshall macros[macnum].mac_start = macbuf; 16426053Sminshall } 16526053Sminshall else { 16626053Sminshall macros[macnum].mac_start = macros[macnum-1].mac_end + 1; 16726053Sminshall } 16826053Sminshall tmp = macros[macnum].mac_start; 16926053Sminshall while (tmp != macbuf + 4096) { 17026053Sminshall if ((c=getc(cfile)) == EOF) { 17126053Sminshall printf("Macro definition missing null line terminator.\n"); 17226053Sminshall return(-1); 17326053Sminshall } 17426053Sminshall *tmp = c; 17526053Sminshall if (*tmp == '\n') { 17626053Sminshall if (*(tmp-1) == '\0') { 17726053Sminshall macros[macnum++].mac_end = tmp - 1; 17826053Sminshall break; 17926053Sminshall } 18026053Sminshall *tmp = '\0'; 18126053Sminshall } 18226053Sminshall tmp++; 18326053Sminshall } 18426053Sminshall if (tmp == macbuf + 4096) { 18526053Sminshall printf("4K macro buffer exceeded\n"); 18626053Sminshall return(-1); 18726053Sminshall } 18826053Sminshall break; 18926053Sminshall default: 19026054Sminshall fprintf(stderr, "Unknown .netrc keyword %s\n", tokval); 19126053Sminshall break; 19226053Sminshall } 19326053Sminshall goto done; 19426053Sminshall } 19526053Sminshall done: 196*26498Sminshall (void) fclose(cfile); 197*26498Sminshall return(0); 19826053Sminshall } 19926053Sminshall 20026053Sminshall static 20126053Sminshall token() 20226053Sminshall { 20326053Sminshall char *cp; 20426053Sminshall int c; 20526053Sminshall struct toktab *t; 20626053Sminshall 20726053Sminshall if (feof(cfile)) 20826053Sminshall return (0); 20926053Sminshall while ((c = getc(cfile)) != EOF && 21026053Sminshall (c == '\n' || c == '\t' || c == ' ' || c == ',')) 21126053Sminshall continue; 21226053Sminshall if (c == EOF) 21326053Sminshall return (0); 21426053Sminshall cp = tokval; 21526053Sminshall if (c == '"') { 21626053Sminshall while ((c = getc(cfile)) != EOF && c != '"') { 21726053Sminshall if (c == '\\') 21826053Sminshall c = getc(cfile); 21926053Sminshall *cp++ = c; 22026053Sminshall } 22126053Sminshall } else { 22226053Sminshall *cp++ = c; 22326053Sminshall while ((c = getc(cfile)) != EOF 22426053Sminshall && c != '\n' && c != '\t' && c != ' ' && c != ',') { 22526053Sminshall if (c == '\\') 22626053Sminshall c = getc(cfile); 22726053Sminshall *cp++ = c; 22826053Sminshall } 22926053Sminshall } 23026053Sminshall *cp = 0; 23126053Sminshall if (tokval[0] == 0) 23226053Sminshall return (0); 23326053Sminshall for (t = toktab; t->tokstr; t++) 23426053Sminshall if (!strcmp(t->tokstr, tokval)) 23526053Sminshall return (t->tval); 23626053Sminshall return (ID); 23726053Sminshall } 238