126053Sminshall /* 226053Sminshall * Copyright (c) 1985 Regents of the University of California. 333737Sbostic * All rights reserved. 433737Sbostic * 5*42666Sbostic * %sccs.include.redist.c% 626053Sminshall */ 726053Sminshall 826053Sminshall #ifndef lint 9*42666Sbostic static char sccsid[] = "@(#)ruserpass.c 5.2 (Berkeley) 06/01/90"; 1033737Sbostic #endif /* not lint */ 1126053Sminshall 1235631Sbostic #include <sys/types.h> 1326053Sminshall #include <stdio.h> 1426053Sminshall #include <utmp.h> 1526053Sminshall #include <ctype.h> 1626053Sminshall #include <sys/stat.h> 1726053Sminshall #include <errno.h> 1836940Skarels #include "ftp_var.h" 1926053Sminshall 2026053Sminshall char *renvlook(), *malloc(), *index(), *getenv(), *getpass(), *getlogin(); 2126498Sminshall char *strcpy(); 2226053Sminshall struct utmp *getutmp(); 2326053Sminshall static FILE *cfile; 2426053Sminshall 2526053Sminshall #define DEFAULT 1 2626053Sminshall #define LOGIN 2 2726053Sminshall #define PASSWD 3 2826053Sminshall #define ACCOUNT 4 2926053Sminshall #define MACDEF 5 3026053Sminshall #define ID 10 3136940Skarels #define MACH 11 3226053Sminshall 3326053Sminshall static char tokval[100]; 3426053Sminshall 3526053Sminshall static struct toktab { 3626053Sminshall char *tokstr; 3726053Sminshall int tval; 3826053Sminshall } toktab[]= { 3926053Sminshall "default", DEFAULT, 4026053Sminshall "login", LOGIN, 4126053Sminshall "password", PASSWD, 4236940Skarels "passwd", PASSWD, 4326053Sminshall "account", ACCOUNT, 4436940Skarels "machine", MACH, 4526053Sminshall "macdef", MACDEF, 4626053Sminshall 0, 0 4726053Sminshall }; 4826053Sminshall 4936940Skarels ruserpass(host, aname, apass, aacct) 5026053Sminshall char *host, **aname, **apass, **aacct; 5126053Sminshall { 5226498Sminshall char *hdir, buf[BUFSIZ], *tmp; 5336940Skarels char myname[MAXHOSTNAMELEN], *mydomain; 5436935Skarels int t, i, c, usedefault = 0; 5526053Sminshall struct stat stb; 5626053Sminshall extern int errno; 5726053Sminshall 5826053Sminshall hdir = getenv("HOME"); 5926053Sminshall if (hdir == NULL) 6026053Sminshall hdir = "."; 6126498Sminshall (void) sprintf(buf, "%s/.netrc", hdir); 6226053Sminshall cfile = fopen(buf, "r"); 6326053Sminshall if (cfile == NULL) { 6426053Sminshall if (errno != ENOENT) 6526053Sminshall perror(buf); 6626053Sminshall return(0); 6726053Sminshall } 6836940Skarels if (gethostname(myname, sizeof(myname)) < 0) 6936940Skarels myname[0] = '\0'; 7036940Skarels if ((mydomain = index(myname, '.')) == NULL) 7136940Skarels mydomain = ""; 7226053Sminshall next: 7326053Sminshall while ((t = token())) switch(t) { 7426053Sminshall 7526053Sminshall case DEFAULT: 7636935Skarels usedefault = 1; 7736935Skarels /* FALL THROUGH */ 7826053Sminshall 7936940Skarels case MACH: 8036940Skarels if (!usedefault) { 8136940Skarels if (token() != ID) 8236940Skarels continue; 8336940Skarels /* 8436940Skarels * Allow match either for user's input host name 8536940Skarels * or official hostname. Also allow match of 8636940Skarels * incompletely-specified host in local domain. 8736940Skarels */ 8836940Skarels if (strcasecmp(host, tokval) == 0) 8936940Skarels goto match; 9036940Skarels if (strcasecmp(hostname, tokval) == 0) 9136940Skarels goto match; 9236940Skarels if ((tmp = index(hostname, '.')) != NULL && 9336940Skarels strcasecmp(tmp, mydomain) == 0 && 9436940Skarels strncasecmp(hostname, tokval, tmp-hostname) == 0 && 9536940Skarels tokval[tmp - hostname] == '\0') 9636940Skarels goto match; 9736940Skarels if ((tmp = index(host, '.')) != NULL && 9836940Skarels strcasecmp(tmp, mydomain) == 0 && 9936940Skarels strncasecmp(host, tokval, tmp - host) == 0 && 10036940Skarels tokval[tmp - host] == '\0') 10136940Skarels goto match; 10226053Sminshall continue; 10336940Skarels } 10436940Skarels match: 10536940Skarels while ((t = token()) && t != MACH && t != DEFAULT) switch(t) { 10626053Sminshall 10726053Sminshall case LOGIN: 10826053Sminshall if (token()) 10926053Sminshall if (*aname == 0) { 11026498Sminshall *aname = malloc((unsigned) strlen(tokval) + 1); 11126498Sminshall (void) strcpy(*aname, tokval); 11226053Sminshall } else { 11326053Sminshall if (strcmp(*aname, tokval)) 11426053Sminshall goto next; 11526053Sminshall } 11626053Sminshall break; 11726053Sminshall case PASSWD: 11836940Skarels if (strcmp(*aname, "anonymous") && 11936940Skarels fstat(fileno(cfile), &stb) >= 0 && 12036940Skarels (stb.st_mode & 077) != 0) { 12126054Sminshall fprintf(stderr, "Error - .netrc file not correct mode.\n"); 12226053Sminshall fprintf(stderr, "Remove password or correct mode.\n"); 12336940Skarels goto bad; 12426053Sminshall } 12526053Sminshall if (token() && *apass == 0) { 12626498Sminshall *apass = malloc((unsigned) strlen(tokval) + 1); 12726498Sminshall (void) strcpy(*apass, tokval); 12826053Sminshall } 12926053Sminshall break; 13026053Sminshall case ACCOUNT: 13126053Sminshall if (fstat(fileno(cfile), &stb) >= 0 13226053Sminshall && (stb.st_mode & 077) != 0) { 13326054Sminshall fprintf(stderr, "Error - .netrc file not correct mode.\n"); 13426053Sminshall fprintf(stderr, "Remove account or correct mode.\n"); 13536940Skarels goto bad; 13626053Sminshall } 13726053Sminshall if (token() && *aacct == 0) { 13826498Sminshall *aacct = malloc((unsigned) strlen(tokval) + 1); 13926498Sminshall (void) strcpy(*aacct, tokval); 14026053Sminshall } 14126053Sminshall break; 14226053Sminshall case MACDEF: 14326053Sminshall if (proxy) { 14436940Skarels (void) fclose(cfile); 14526053Sminshall return(0); 14626053Sminshall } 14726053Sminshall while ((c=getc(cfile)) != EOF && c == ' ' || c == '\t'); 14826053Sminshall if (c == EOF || c == '\n') { 14926053Sminshall printf("Missing macdef name argument.\n"); 15036940Skarels goto bad; 15126053Sminshall } 15226053Sminshall if (macnum == 16) { 15326053Sminshall printf("Limit of 16 macros have already been defined\n"); 15436940Skarels goto bad; 15526053Sminshall } 15626053Sminshall tmp = macros[macnum].mac_name; 15726053Sminshall *tmp++ = c; 15826053Sminshall for (i=0; i < 8 && (c=getc(cfile)) != EOF && 15926053Sminshall !isspace(c); ++i) { 16026053Sminshall *tmp++ = c; 16126053Sminshall } 16226053Sminshall if (c == EOF) { 16326053Sminshall printf("Macro definition missing null line terminator.\n"); 16436940Skarels goto bad; 16526053Sminshall } 16626053Sminshall *tmp = '\0'; 16726053Sminshall if (c != '\n') { 16826053Sminshall while ((c=getc(cfile)) != EOF && c != '\n'); 16926053Sminshall } 17026053Sminshall if (c == EOF) { 17126053Sminshall printf("Macro definition missing null line terminator.\n"); 17236940Skarels goto bad; 17326053Sminshall } 17426053Sminshall if (macnum == 0) { 17526053Sminshall macros[macnum].mac_start = macbuf; 17626053Sminshall } 17726053Sminshall else { 17826053Sminshall macros[macnum].mac_start = macros[macnum-1].mac_end + 1; 17926053Sminshall } 18026053Sminshall tmp = macros[macnum].mac_start; 18126053Sminshall while (tmp != macbuf + 4096) { 18226053Sminshall if ((c=getc(cfile)) == EOF) { 18326053Sminshall printf("Macro definition missing null line terminator.\n"); 18436940Skarels goto bad; 18526053Sminshall } 18626053Sminshall *tmp = c; 18726053Sminshall if (*tmp == '\n') { 18826053Sminshall if (*(tmp-1) == '\0') { 18926053Sminshall macros[macnum++].mac_end = tmp - 1; 19026053Sminshall break; 19126053Sminshall } 19226053Sminshall *tmp = '\0'; 19326053Sminshall } 19426053Sminshall tmp++; 19526053Sminshall } 19626053Sminshall if (tmp == macbuf + 4096) { 19726053Sminshall printf("4K macro buffer exceeded\n"); 19836940Skarels goto bad; 19926053Sminshall } 20026053Sminshall break; 20126053Sminshall default: 20226054Sminshall fprintf(stderr, "Unknown .netrc keyword %s\n", tokval); 20326053Sminshall break; 20426053Sminshall } 20526053Sminshall goto done; 20626053Sminshall } 20726053Sminshall done: 20826498Sminshall (void) fclose(cfile); 20926498Sminshall return(0); 21036940Skarels bad: 21136940Skarels (void) fclose(cfile); 21236940Skarels return(-1); 21326053Sminshall } 21426053Sminshall 21526053Sminshall static 21626053Sminshall token() 21726053Sminshall { 21826053Sminshall char *cp; 21926053Sminshall int c; 22026053Sminshall struct toktab *t; 22126053Sminshall 22226053Sminshall if (feof(cfile)) 22326053Sminshall return (0); 22426053Sminshall while ((c = getc(cfile)) != EOF && 22526053Sminshall (c == '\n' || c == '\t' || c == ' ' || c == ',')) 22626053Sminshall continue; 22726053Sminshall if (c == EOF) 22826053Sminshall return (0); 22926053Sminshall cp = tokval; 23026053Sminshall if (c == '"') { 23126053Sminshall while ((c = getc(cfile)) != EOF && c != '"') { 23226053Sminshall if (c == '\\') 23326053Sminshall c = getc(cfile); 23426053Sminshall *cp++ = c; 23526053Sminshall } 23626053Sminshall } else { 23726053Sminshall *cp++ = c; 23826053Sminshall while ((c = getc(cfile)) != EOF 23926053Sminshall && c != '\n' && c != '\t' && c != ' ' && c != ',') { 24026053Sminshall if (c == '\\') 24126053Sminshall c = getc(cfile); 24226053Sminshall *cp++ = c; 24326053Sminshall } 24426053Sminshall } 24526053Sminshall *cp = 0; 24626053Sminshall if (tokval[0] == 0) 24726053Sminshall return (0); 24826053Sminshall for (t = toktab; t->tokstr; t++) 24926053Sminshall if (!strcmp(t->tokstr, tokval)) 25026053Sminshall return (t->tval); 25126053Sminshall return (ID); 25226053Sminshall } 253