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*26054Sminshall static char sccsid[] = "@(#)ruserpass.c 1.2 (Berkeley) 02/03/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(); 3026053Sminshall struct utmp *getutmp(); 3126053Sminshall static FILE *cfile; 3226053Sminshall 3326053Sminshall ruserpass(host, aname, apass, aacct) 3426053Sminshall char *host, **aname, **apass, **aacct; 3526053Sminshall { 3626053Sminshall 3726053Sminshall /* renv(host, aname, apass, aacct); 3826053Sminshall if (*aname == 0 || *apass == 0) */ 3926053Sminshall return(rnetrc(host, aname, apass, aacct)); 4026053Sminshall } 4126053Sminshall 4226053Sminshall #define DEFAULT 1 4326053Sminshall #define LOGIN 2 4426053Sminshall #define PASSWD 3 4526053Sminshall #define ACCOUNT 4 4626053Sminshall #define MACDEF 5 4726053Sminshall #define ID 10 4826053Sminshall #define MACHINE 11 4926053Sminshall 5026053Sminshall static char tokval[100]; 5126053Sminshall 5226053Sminshall static struct toktab { 5326053Sminshall char *tokstr; 5426053Sminshall int tval; 5526053Sminshall } toktab[]= { 5626053Sminshall "default", DEFAULT, 5726053Sminshall "login", LOGIN, 5826053Sminshall "password", PASSWD, 5926053Sminshall "account", ACCOUNT, 6026053Sminshall "machine", MACHINE, 6126053Sminshall "macdef", MACDEF, 6226053Sminshall 0, 0 6326053Sminshall }; 6426053Sminshall 6526053Sminshall static 6626053Sminshall rnetrc(host, aname, apass, aacct) 6726053Sminshall char *host, **aname, **apass, **aacct; 6826053Sminshall { 6926053Sminshall char *hdir, buf[BUFSIZ], *tmp, c; 7026053Sminshall int t, i; 7126053Sminshall struct stat stb; 7226053Sminshall extern int errno; 7326053Sminshall 7426053Sminshall hdir = getenv("HOME"); 7526053Sminshall if (hdir == NULL) 7626053Sminshall hdir = "."; 77*26054Sminshall sprintf(buf, "%s/.netrc", hdir); 7826053Sminshall cfile = fopen(buf, "r"); 7926053Sminshall if (cfile == NULL) { 8026053Sminshall if (errno != ENOENT) 8126053Sminshall perror(buf); 8226053Sminshall return(0); 8326053Sminshall } 8426053Sminshall next: 8526053Sminshall while ((t = token())) switch(t) { 8626053Sminshall 8726053Sminshall case DEFAULT: 8826053Sminshall (void) token(); 8926053Sminshall continue; 9026053Sminshall 9126053Sminshall case MACHINE: 9226053Sminshall if (token() != ID || strcmp(host, tokval)) 9326053Sminshall continue; 9426053Sminshall while ((t = token()) && t != MACHINE) switch(t) { 9526053Sminshall 9626053Sminshall case LOGIN: 9726053Sminshall if (token()) 9826053Sminshall if (*aname == 0) { 9926053Sminshall *aname = malloc(strlen(tokval) + 1); 10026053Sminshall strcpy(*aname, tokval); 10126053Sminshall } else { 10226053Sminshall if (strcmp(*aname, tokval)) 10326053Sminshall goto next; 10426053Sminshall } 10526053Sminshall break; 10626053Sminshall case PASSWD: 10726053Sminshall if (fstat(fileno(cfile), &stb) >= 0 10826053Sminshall && (stb.st_mode & 077) != 0) { 109*26054Sminshall fprintf(stderr, "Error - .netrc file not correct mode.\n"); 11026053Sminshall fprintf(stderr, "Remove password or correct mode.\n"); 11126053Sminshall return(-1); 11226053Sminshall } 11326053Sminshall if (token() && *apass == 0) { 11426053Sminshall *apass = malloc(strlen(tokval) + 1); 11526053Sminshall strcpy(*apass, tokval); 11626053Sminshall } 11726053Sminshall break; 11826053Sminshall case ACCOUNT: 11926053Sminshall if (fstat(fileno(cfile), &stb) >= 0 12026053Sminshall && (stb.st_mode & 077) != 0) { 121*26054Sminshall fprintf(stderr, "Error - .netrc file not correct mode.\n"); 12226053Sminshall fprintf(stderr, "Remove account or correct mode.\n"); 12326053Sminshall return(-1); 12426053Sminshall } 12526053Sminshall if (token() && *aacct == 0) { 12626053Sminshall *aacct = malloc(strlen(tokval) + 1); 12726053Sminshall strcpy(*aacct, tokval); 12826053Sminshall } 12926053Sminshall break; 13026053Sminshall case MACDEF: 13126053Sminshall if (proxy) { 13226053Sminshall return(0); 13326053Sminshall } 13426053Sminshall while ((c=getc(cfile)) != EOF && c == ' ' || c == '\t'); 13526053Sminshall if (c == EOF || c == '\n') { 13626053Sminshall printf("Missing macdef name argument.\n"); 13726053Sminshall return(-1); 13826053Sminshall } 13926053Sminshall if (macnum == 16) { 14026053Sminshall printf("Limit of 16 macros have already been defined\n"); 14126053Sminshall return(-1); 14226053Sminshall } 14326053Sminshall tmp = macros[macnum].mac_name; 14426053Sminshall *tmp++ = c; 14526053Sminshall for (i=0; i < 8 && (c=getc(cfile)) != EOF && 14626053Sminshall !isspace(c); ++i) { 14726053Sminshall *tmp++ = c; 14826053Sminshall } 14926053Sminshall if (c == EOF) { 15026053Sminshall printf("Macro definition missing null line terminator.\n"); 15126053Sminshall return(-1); 15226053Sminshall } 15326053Sminshall *tmp = '\0'; 15426053Sminshall if (c != '\n') { 15526053Sminshall while ((c=getc(cfile)) != EOF && c != '\n'); 15626053Sminshall } 15726053Sminshall if (c == EOF) { 15826053Sminshall printf("Macro definition missing null line terminator.\n"); 15926053Sminshall return(-1); 16026053Sminshall } 16126053Sminshall if (macnum == 0) { 16226053Sminshall macros[macnum].mac_start = macbuf; 16326053Sminshall } 16426053Sminshall else { 16526053Sminshall macros[macnum].mac_start = macros[macnum-1].mac_end + 1; 16626053Sminshall } 16726053Sminshall tmp = macros[macnum].mac_start; 16826053Sminshall while (tmp != macbuf + 4096) { 16926053Sminshall if ((c=getc(cfile)) == EOF) { 17026053Sminshall printf("Macro definition missing null line terminator.\n"); 17126053Sminshall return(-1); 17226053Sminshall } 17326053Sminshall *tmp = c; 17426053Sminshall if (*tmp == '\n') { 17526053Sminshall if (*(tmp-1) == '\0') { 17626053Sminshall macros[macnum++].mac_end = tmp - 1; 17726053Sminshall break; 17826053Sminshall } 17926053Sminshall *tmp = '\0'; 18026053Sminshall } 18126053Sminshall tmp++; 18226053Sminshall } 18326053Sminshall if (tmp == macbuf + 4096) { 18426053Sminshall printf("4K macro buffer exceeded\n"); 18526053Sminshall return(-1); 18626053Sminshall } 18726053Sminshall break; 18826053Sminshall default: 189*26054Sminshall fprintf(stderr, "Unknown .netrc keyword %s\n", tokval); 19026053Sminshall break; 19126053Sminshall } 19226053Sminshall goto done; 19326053Sminshall } 19426053Sminshall done: 19526053Sminshall fclose(cfile); 19626053Sminshall } 19726053Sminshall 19826053Sminshall static 19926053Sminshall token() 20026053Sminshall { 20126053Sminshall char *cp; 20226053Sminshall int c; 20326053Sminshall struct toktab *t; 20426053Sminshall 20526053Sminshall if (feof(cfile)) 20626053Sminshall return (0); 20726053Sminshall while ((c = getc(cfile)) != EOF && 20826053Sminshall (c == '\n' || c == '\t' || c == ' ' || c == ',')) 20926053Sminshall continue; 21026053Sminshall if (c == EOF) 21126053Sminshall return (0); 21226053Sminshall cp = tokval; 21326053Sminshall if (c == '"') { 21426053Sminshall while ((c = getc(cfile)) != EOF && c != '"') { 21526053Sminshall if (c == '\\') 21626053Sminshall c = getc(cfile); 21726053Sminshall *cp++ = c; 21826053Sminshall } 21926053Sminshall } else { 22026053Sminshall *cp++ = c; 22126053Sminshall while ((c = getc(cfile)) != EOF 22226053Sminshall && c != '\n' && c != '\t' && c != ' ' && c != ',') { 22326053Sminshall if (c == '\\') 22426053Sminshall c = getc(cfile); 22526053Sminshall *cp++ = c; 22626053Sminshall } 22726053Sminshall } 22826053Sminshall *cp = 0; 22926053Sminshall if (tokval[0] == 0) 23026053Sminshall return (0); 23126053Sminshall for (t = toktab; t->tokstr; t++) 23226053Sminshall if (!strcmp(t->tokstr, tokval)) 23326053Sminshall return (t->tval); 23426053Sminshall return (ID); 23526053Sminshall } 236