126053Sminshall /* 226053Sminshall * Copyright (c) 1985 Regents of the University of California. 3*33737Sbostic * All rights reserved. 4*33737Sbostic * 5*33737Sbostic * Redistribution and use in source and binary forms are permitted 6*33737Sbostic * provided that this notice is preserved and that due credit is given 7*33737Sbostic * to the University of California at Berkeley. The name of the University 8*33737Sbostic * may not be used to endorse or promote products derived from this 9*33737Sbostic * software without specific prior written permission. This software 10*33737Sbostic * is provided ``as is'' without express or implied warranty. 1126053Sminshall */ 1226053Sminshall 1326053Sminshall #ifndef lint 14*33737Sbostic static char sccsid[] = "@(#)ruserpass.c 1.4 (Berkeley) 03/14/88"; 15*33737Sbostic #endif /* not lint */ 1626053Sminshall 1726053Sminshall struct macel { 1826053Sminshall char mac_name[9]; /* macro name */ 1926053Sminshall char *mac_start; /* start of macro in macbuf */ 2026053Sminshall char *mac_end; /* end of macro in macbuf */ 2126053Sminshall }; 2226053Sminshall 2326053Sminshall extern int macnum, proxy; /* number of defined macros */ 2426053Sminshall extern struct macel macros[16], *macpt; 2526053Sminshall extern char macbuf[4096]; 2626053Sminshall 2726053Sminshall #include <stdio.h> 2826053Sminshall #include <utmp.h> 2926053Sminshall #include <ctype.h> 3026053Sminshall #include <sys/types.h> 3126053Sminshall #include <sys/stat.h> 3226053Sminshall #include <errno.h> 3326053Sminshall 3426053Sminshall char *renvlook(), *malloc(), *index(), *getenv(), *getpass(), *getlogin(); 3526498Sminshall char *strcpy(); 3626053Sminshall struct utmp *getutmp(); 3726053Sminshall static FILE *cfile; 3826053Sminshall 3926053Sminshall ruserpass(host, aname, apass, aacct) 4026053Sminshall char *host, **aname, **apass, **aacct; 4126053Sminshall { 4226053Sminshall 4326053Sminshall /* renv(host, aname, apass, aacct); 4426053Sminshall if (*aname == 0 || *apass == 0) */ 4526053Sminshall return(rnetrc(host, aname, apass, aacct)); 4626053Sminshall } 4726053Sminshall 4826053Sminshall #define DEFAULT 1 4926053Sminshall #define LOGIN 2 5026053Sminshall #define PASSWD 3 5126053Sminshall #define ACCOUNT 4 5226053Sminshall #define MACDEF 5 5326053Sminshall #define ID 10 5426053Sminshall #define MACHINE 11 5526053Sminshall 5626053Sminshall static char tokval[100]; 5726053Sminshall 5826053Sminshall static struct toktab { 5926053Sminshall char *tokstr; 6026053Sminshall int tval; 6126053Sminshall } toktab[]= { 6226053Sminshall "default", DEFAULT, 6326053Sminshall "login", LOGIN, 6426053Sminshall "password", PASSWD, 6526053Sminshall "account", ACCOUNT, 6626053Sminshall "machine", MACHINE, 6726053Sminshall "macdef", MACDEF, 6826053Sminshall 0, 0 6926053Sminshall }; 7026053Sminshall 7126053Sminshall static 7226053Sminshall rnetrc(host, aname, apass, aacct) 7326053Sminshall char *host, **aname, **apass, **aacct; 7426053Sminshall { 7526498Sminshall char *hdir, buf[BUFSIZ], *tmp; 7626498Sminshall int t, i, c; 7726053Sminshall struct stat stb; 7826053Sminshall extern int errno; 7926053Sminshall 8026053Sminshall hdir = getenv("HOME"); 8126053Sminshall if (hdir == NULL) 8226053Sminshall hdir = "."; 8326498Sminshall (void) sprintf(buf, "%s/.netrc", hdir); 8426053Sminshall cfile = fopen(buf, "r"); 8526053Sminshall if (cfile == NULL) { 8626053Sminshall if (errno != ENOENT) 8726053Sminshall perror(buf); 8826053Sminshall return(0); 8926053Sminshall } 9026053Sminshall next: 9126053Sminshall while ((t = token())) switch(t) { 9226053Sminshall 9326053Sminshall case DEFAULT: 9426053Sminshall (void) token(); 9526053Sminshall continue; 9626053Sminshall 9726053Sminshall case MACHINE: 9826053Sminshall if (token() != ID || strcmp(host, tokval)) 9926053Sminshall continue; 10026053Sminshall while ((t = token()) && t != MACHINE) switch(t) { 10126053Sminshall 10226053Sminshall case LOGIN: 10326053Sminshall if (token()) 10426053Sminshall if (*aname == 0) { 10526498Sminshall *aname = malloc((unsigned) strlen(tokval) + 1); 10626498Sminshall (void) strcpy(*aname, tokval); 10726053Sminshall } else { 10826053Sminshall if (strcmp(*aname, tokval)) 10926053Sminshall goto next; 11026053Sminshall } 11126053Sminshall break; 11226053Sminshall case PASSWD: 11326053Sminshall if (fstat(fileno(cfile), &stb) >= 0 11426053Sminshall && (stb.st_mode & 077) != 0) { 11526054Sminshall fprintf(stderr, "Error - .netrc file not correct mode.\n"); 11626053Sminshall fprintf(stderr, "Remove password or correct mode.\n"); 11726053Sminshall return(-1); 11826053Sminshall } 11926053Sminshall if (token() && *apass == 0) { 12026498Sminshall *apass = malloc((unsigned) strlen(tokval) + 1); 12126498Sminshall (void) strcpy(*apass, tokval); 12226053Sminshall } 12326053Sminshall break; 12426053Sminshall case ACCOUNT: 12526053Sminshall if (fstat(fileno(cfile), &stb) >= 0 12626053Sminshall && (stb.st_mode & 077) != 0) { 12726054Sminshall fprintf(stderr, "Error - .netrc file not correct mode.\n"); 12826053Sminshall fprintf(stderr, "Remove account or correct mode.\n"); 12926053Sminshall return(-1); 13026053Sminshall } 13126053Sminshall if (token() && *aacct == 0) { 13226498Sminshall *aacct = malloc((unsigned) strlen(tokval) + 1); 13326498Sminshall (void) strcpy(*aacct, tokval); 13426053Sminshall } 13526053Sminshall break; 13626053Sminshall case MACDEF: 13726053Sminshall if (proxy) { 13826053Sminshall return(0); 13926053Sminshall } 14026053Sminshall while ((c=getc(cfile)) != EOF && c == ' ' || c == '\t'); 14126053Sminshall if (c == EOF || c == '\n') { 14226053Sminshall printf("Missing macdef name argument.\n"); 14326053Sminshall return(-1); 14426053Sminshall } 14526053Sminshall if (macnum == 16) { 14626053Sminshall printf("Limit of 16 macros have already been defined\n"); 14726053Sminshall return(-1); 14826053Sminshall } 14926053Sminshall tmp = macros[macnum].mac_name; 15026053Sminshall *tmp++ = c; 15126053Sminshall for (i=0; i < 8 && (c=getc(cfile)) != EOF && 15226053Sminshall !isspace(c); ++i) { 15326053Sminshall *tmp++ = c; 15426053Sminshall } 15526053Sminshall if (c == EOF) { 15626053Sminshall printf("Macro definition missing null line terminator.\n"); 15726053Sminshall return(-1); 15826053Sminshall } 15926053Sminshall *tmp = '\0'; 16026053Sminshall if (c != '\n') { 16126053Sminshall while ((c=getc(cfile)) != EOF && c != '\n'); 16226053Sminshall } 16326053Sminshall if (c == EOF) { 16426053Sminshall printf("Macro definition missing null line terminator.\n"); 16526053Sminshall return(-1); 16626053Sminshall } 16726053Sminshall if (macnum == 0) { 16826053Sminshall macros[macnum].mac_start = macbuf; 16926053Sminshall } 17026053Sminshall else { 17126053Sminshall macros[macnum].mac_start = macros[macnum-1].mac_end + 1; 17226053Sminshall } 17326053Sminshall tmp = macros[macnum].mac_start; 17426053Sminshall while (tmp != macbuf + 4096) { 17526053Sminshall if ((c=getc(cfile)) == EOF) { 17626053Sminshall printf("Macro definition missing null line terminator.\n"); 17726053Sminshall return(-1); 17826053Sminshall } 17926053Sminshall *tmp = c; 18026053Sminshall if (*tmp == '\n') { 18126053Sminshall if (*(tmp-1) == '\0') { 18226053Sminshall macros[macnum++].mac_end = tmp - 1; 18326053Sminshall break; 18426053Sminshall } 18526053Sminshall *tmp = '\0'; 18626053Sminshall } 18726053Sminshall tmp++; 18826053Sminshall } 18926053Sminshall if (tmp == macbuf + 4096) { 19026053Sminshall printf("4K macro buffer exceeded\n"); 19126053Sminshall return(-1); 19226053Sminshall } 19326053Sminshall break; 19426053Sminshall default: 19526054Sminshall fprintf(stderr, "Unknown .netrc keyword %s\n", tokval); 19626053Sminshall break; 19726053Sminshall } 19826053Sminshall goto done; 19926053Sminshall } 20026053Sminshall done: 20126498Sminshall (void) fclose(cfile); 20226498Sminshall return(0); 20326053Sminshall } 20426053Sminshall 20526053Sminshall static 20626053Sminshall token() 20726053Sminshall { 20826053Sminshall char *cp; 20926053Sminshall int c; 21026053Sminshall struct toktab *t; 21126053Sminshall 21226053Sminshall if (feof(cfile)) 21326053Sminshall return (0); 21426053Sminshall while ((c = getc(cfile)) != EOF && 21526053Sminshall (c == '\n' || c == '\t' || c == ' ' || c == ',')) 21626053Sminshall continue; 21726053Sminshall if (c == EOF) 21826053Sminshall return (0); 21926053Sminshall cp = tokval; 22026053Sminshall if (c == '"') { 22126053Sminshall while ((c = getc(cfile)) != EOF && c != '"') { 22226053Sminshall if (c == '\\') 22326053Sminshall c = getc(cfile); 22426053Sminshall *cp++ = c; 22526053Sminshall } 22626053Sminshall } else { 22726053Sminshall *cp++ = c; 22826053Sminshall while ((c = getc(cfile)) != EOF 22926053Sminshall && c != '\n' && c != '\t' && c != ' ' && c != ',') { 23026053Sminshall if (c == '\\') 23126053Sminshall c = getc(cfile); 23226053Sminshall *cp++ = c; 23326053Sminshall } 23426053Sminshall } 23526053Sminshall *cp = 0; 23626053Sminshall if (tokval[0] == 0) 23726053Sminshall return (0); 23826053Sminshall for (t = toktab; t->tokstr; t++) 23926053Sminshall if (!strcmp(t->tokstr, tokval)) 24026053Sminshall return (t->tval); 24126053Sminshall return (ID); 24226053Sminshall } 243