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

Defined functions

rnetrc defined in line 66; used 1 times
  • in line 40
ruserpass defined in line 34; used 1 times
token defined in line 200; used 7 times

Defined variables

sccsid defined in line 8; never used
toktab defined in line 56; used 1 times
tokval defined in line 51; used 12 times

Defined struct's

macel defined in line 12; used 2 times
  • in line 19(2)
toktab defined in line 53; used 2 times
  • in line 205(2)

Defined macros

ACCOUNT defined in line 46; used 1 times
  • in line 60
DEFAULT defined in line 43; used 1 times
  • in line 57
ID defined in line 48; used 2 times
LOGIN defined in line 44; used 1 times
  • in line 58
MACDEF defined in line 47; used 1 times
  • in line 62
MACHINE defined in line 49; used 2 times
PASSWD defined in line 45; used 1 times
  • in line 59
Last modified: 1986-03-07
Generated: 2016-12-26
Generated by src2html V0.67
page hit count: 1634
Valid CSS Valid XHTML 1.0 Strict