Annotation of researchv10dc/ipc/bin/ftp/ruserpass.c, revision 1.1.1.1

1.1       root        1: /*
                      2:  * Copyright (c) 1985 Regents of the University of California.
                      3:  * All rights reserved.
                      4:  *
                      5:  * Redistribution and use in source and binary forms are permitted
                      6:  * provided that the above copyright notice and this paragraph are
                      7:  * duplicated in all such forms and that any documentation,
                      8:  * advertising materials, and other materials related to such
                      9:  * distribution and use acknowledge that the software was developed
                     10:  * by the University of California, Berkeley.  The name of the
                     11:  * University may not be used to endorse or promote products derived
                     12:  * from this software without specific prior written permission.
                     13:  * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR
                     14:  * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED
                     15:  * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
                     16:  */
                     17: 
                     18: #ifndef lint
                     19: static char sccsid[] = "@(#)ruserpass.c        5.1 (Berkeley) 3/1/89";
                     20: #endif /* not lint */
                     21: 
                     22: #include <sys/types.h>
                     23: #include <stdio.h>
                     24: #include <utmp.h>
                     25: #include <ctype.h>
                     26: #include <sys/stat.h>
                     27: #include <string.h>
                     28: #include <errno.h>
                     29: #include "ftp_var.h"
                     30: 
                     31: char   *renvlook(), *malloc(), *getenv(), *getpass(), *getlogin();
                     32: char   *strcpy();
                     33: struct utmp *getutmp();
                     34: static FILE *cfile;
                     35: 
                     36: #define        DEFAULT 1
                     37: #define        LOGIN   2
                     38: #define        PASSWD  3
                     39: #define        ACCOUNT 4
                     40: #define MACDEF  5
                     41: #define        ID      10
                     42: #define        MACH    11
                     43: 
                     44: static char tokval[100];
                     45: 
                     46: static struct toktab {
                     47:        char *tokstr;
                     48:        int tval;
                     49: } toktab[]= {
                     50:        "default",      DEFAULT,
                     51:        "login",        LOGIN,
                     52:        "password",     PASSWD,
                     53:        "passwd",       PASSWD,
                     54:        "account",      ACCOUNT,
                     55:        "machine",      MACH,
                     56:        "macdef",       MACDEF,
                     57:        0,              0
                     58: };
                     59: 
                     60: ruserpass(host, aname, apass, aacct)
                     61:        char *host, **aname, **apass, **aacct;
                     62: {
                     63:        char *hdir, buf[BUFSIZ], *tmp;
                     64:        char myname[MAXHOSTNAMELEN], *mydomain;
                     65:        int t, i, c, usedefault = 0;
                     66:        struct stat stb;
                     67:        extern int errno;
                     68: 
                     69:        hdir = getenv("HOME");
                     70:        if (hdir == NULL)
                     71:                hdir = ".";
                     72:        (void) sprintf(buf, "%s/.netrc", hdir);
                     73:        cfile = fopen(buf, "r");
                     74:        if (cfile == NULL) {
                     75:                if (errno != ENOENT)
                     76:                        perror(buf);
                     77:                return(0);
                     78:        }
                     79: #ifdef REMOVE
                     80:        if (gethostname(myname, sizeof(myname)) < 0)
                     81: #endif
                     82:                myname[0] = '\0';
                     83:        if ((mydomain = strchr(myname, '.')) == NULL)
                     84:                mydomain = "";
                     85: next:
                     86:        while ((t = token())) switch(t) {
                     87: 
                     88:        case DEFAULT:
                     89:                usedefault = 1;
                     90:                /* FALL THROUGH */
                     91: 
                     92:        case MACH:
                     93:                if (!usedefault) {
                     94:                        if (token() != ID)
                     95:                                continue;
                     96:                        /*
                     97:                         * Allow match either for user's input host name
                     98:                         * or official hostname.  Also allow match of 
                     99:                         * incompletely-specified host in local domain.
                    100:                         */
                    101:                        if (strcasecmp(host, tokval) == 0)
                    102:                                goto match;
                    103:                        if (strcasecmp(hostname, tokval) == 0)
                    104:                                goto match;
                    105:                        if ((tmp = strchr(hostname, '.')) != NULL &&
                    106:                            strcasecmp(tmp, mydomain) == 0 &&
                    107:                            strncasecmp(hostname, tokval, tmp-hostname) == 0 &&
                    108:                            tokval[tmp - hostname] == '\0')
                    109:                                goto match;
                    110:                        if ((tmp = strchr(host, '.')) != NULL &&
                    111:                            strcasecmp(tmp, mydomain) == 0 &&
                    112:                            strncasecmp(host, tokval, tmp - host) == 0 &&
                    113:                            tokval[tmp - host] == '\0')
                    114:                                goto match;
                    115:                        continue;
                    116:                }
                    117:        match:
                    118:                while ((t = token()) && t != MACH && t != DEFAULT) switch(t) {
                    119: 
                    120:                case LOGIN:
                    121:                        if (token())
                    122:                                if (*aname == 0) { 
                    123:                                        *aname = malloc((unsigned) strlen(tokval) + 1);
                    124:                                        (void) strcpy(*aname, tokval);
                    125:                                } else {
                    126:                                        if (strcmp(*aname, tokval))
                    127:                                                goto next;
                    128:                                }
                    129:                        break;
                    130:                case PASSWD:
                    131:                        if (strcmp(*aname, "anonymous") &&
                    132:                            fstat(fileno(cfile), &stb) >= 0 &&
                    133:                            (stb.st_mode & 077) != 0) {
                    134:        fprintf(stderr, "Error - .netrc file not correct mode.\n");
                    135:        fprintf(stderr, "Remove password or correct mode.\n");
                    136:                                goto bad;
                    137:                        }
                    138:                        if (token() && *apass == 0) {
                    139:                                *apass = malloc((unsigned) strlen(tokval) + 1);
                    140:                                (void) strcpy(*apass, tokval);
                    141:                        }
                    142:                        break;
                    143:                case ACCOUNT:
                    144:                        if (fstat(fileno(cfile), &stb) >= 0
                    145:                            && (stb.st_mode & 077) != 0) {
                    146:        fprintf(stderr, "Error - .netrc file not correct mode.\n");
                    147:        fprintf(stderr, "Remove account or correct mode.\n");
                    148:                                goto bad;
                    149:                        }
                    150:                        if (token() && *aacct == 0) {
                    151:                                *aacct = malloc((unsigned) strlen(tokval) + 1);
                    152:                                (void) strcpy(*aacct, tokval);
                    153:                        }
                    154:                        break;
                    155:                case MACDEF:
                    156:                        if (proxy) {
                    157:                                (void) fclose(cfile);
                    158:                                return(0);
                    159:                        }
                    160:                        while ((c=getc(cfile)) != EOF && c == ' ' || c == '\t');
                    161:                        if (c == EOF || c == '\n') {
                    162:                                printf("Missing macdef name argument.\n");
                    163:                                goto bad;
                    164:                        }
                    165:                        if (macnum == 16) {
                    166:                                printf("Limit of 16 macros have already been defined\n");
                    167:                                goto bad;
                    168:                        }
                    169:                        tmp = macros[macnum].mac_name;
                    170:                        *tmp++ = c;
                    171:                        for (i=0; i < 8 && (c=getc(cfile)) != EOF &&
                    172:                            !isspace(c); ++i) {
                    173:                                *tmp++ = c;
                    174:                        }
                    175:                        if (c == EOF) {
                    176:                                printf("Macro definition missing null line terminator.\n");
                    177:                                goto bad;
                    178:                        }
                    179:                        *tmp = '\0';
                    180:                        if (c != '\n') {
                    181:                                while ((c=getc(cfile)) != EOF && c != '\n');
                    182:                        }
                    183:                        if (c == EOF) {
                    184:                                printf("Macro definition missing null line terminator.\n");
                    185:                                goto bad;
                    186:                        }
                    187:                        if (macnum == 0) {
                    188:                                macros[macnum].mac_start = macbuf;
                    189:                        }
                    190:                        else {
                    191:                                macros[macnum].mac_start = macros[macnum-1].mac_end + 1;
                    192:                        }
                    193:                        tmp = macros[macnum].mac_start;
                    194:                        while (tmp != macbuf + 4096) {
                    195:                                if ((c=getc(cfile)) == EOF) {
                    196:                                printf("Macro definition missing null line terminator.\n");
                    197:                                        goto bad;
                    198:                                }
                    199:                                *tmp = c;
                    200:                                if (*tmp == '\n') {
                    201:                                        if (*(tmp-1) == '\0') {
                    202:                                           macros[macnum++].mac_end = tmp - 1;
                    203:                                           break;
                    204:                                        }
                    205:                                        *tmp = '\0';
                    206:                                }
                    207:                                tmp++;
                    208:                        }
                    209:                        if (tmp == macbuf + 4096) {
                    210:                                printf("4K macro buffer exceeded\n");
                    211:                                goto bad;
                    212:                        }
                    213:                        break;
                    214:                default:
                    215:        fprintf(stderr, "Unknown .netrc keyword %s\n", tokval);
                    216:                        break;
                    217:                }
                    218:                goto done;
                    219:        }
                    220: done:
                    221:        (void) fclose(cfile);
                    222:        return(0);
                    223: bad:
                    224:        (void) fclose(cfile);
                    225:        return(-1);
                    226: }
                    227: 
                    228: static
                    229: token()
                    230: {
                    231:        char *cp;
                    232:        int c;
                    233:        struct toktab *t;
                    234: 
                    235:        if (feof(cfile))
                    236:                return (0);
                    237:        while ((c = getc(cfile)) != EOF &&
                    238:            (c == '\n' || c == '\t' || c == ' ' || c == ','))
                    239:                continue;
                    240:        if (c == EOF)
                    241:                return (0);
                    242:        cp = tokval;
                    243:        if (c == '"') {
                    244:                while ((c = getc(cfile)) != EOF && c != '"') {
                    245:                        if (c == '\\')
                    246:                                c = getc(cfile);
                    247:                        *cp++ = c;
                    248:                }
                    249:        } else {
                    250:                *cp++ = c;
                    251:                while ((c = getc(cfile)) != EOF
                    252:                    && c != '\n' && c != '\t' && c != ' ' && c != ',') {
                    253:                        if (c == '\\')
                    254:                                c = getc(cfile);
                    255:                        *cp++ = c;
                    256:                }
                    257:        }
                    258:        *cp = 0;
                    259:        if (tokval[0] == 0)
                    260:                return (0);
                    261:        for (t = toktab; t->tokstr; t++)
                    262:                if (!strcmp(t->tokstr, tokval))
                    263:                        return (t->tval);
                    264:        return (ID);
                    265: }

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.