Annotation of 41BSD/cmd/berknet/netrc.c, revision 1.1.1.1

1.1       root        1: /*
                      2:        netrc.c
                      3: 
                      4:        procedures to read and parse the .netrc file
                      5: 
                      6:        You may call:
                      7:                commandfile()           to read the file.
                      8:                rdnetfile(cfile)        to read the file.
                      9: 
                     10: Note:
                     11:        commandfile()
                     12:                will read the passwd file
                     13:                if getenv(HOME) searches the passwd file
                     14: 
                     15: Table of netrc options
                     16:        option                  default
                     17:        ------                  -------
                     18:        default                 default machine
                     19:        login string            current login
                     20:        password string         -
                     21:        notify yes/no           yes
                     22:        write yes/no            yes
                     23:        command string          -
                     24:        force yes/no            no
                     25: 
                     26: Fabry has suggested that machine names be more general:
                     27: that you be able to say:
                     28: 
                     29:        cory:   fabry on Cory
                     30:        caf:    caf on Cory
                     31:        c:      fabry on C
                     32: 
                     33: so the formulation would look like:
                     34: 
                     35:        default key
                     36:        key: machine login passwd ...
                     37:        key: ....
                     38: 
                     39: and so on
                     40: 
                     41: Gould has suggested the format be:
                     42: 
                     43:        pseudo cory     real Cory       login fabry
                     44:        pseudo caf      real Cory       login caf
                     45:        pseudo c        real C          login fabry
                     46: 
                     47: Init file example:
                     48: format local C remote A
                     49: 
                     50:        default A
                     51:        machine A    local C link /dev/net-A    speed 9
                     52:        machine Cory local C link /dev/net-Cory speed 9
                     53:        
                     54: if remote == 0, default is A
                     55: 
                     56: passwords work as follows:
                     57:    passwd = "\n" means no password
                     58: 
                     59: */
                     60: # include "defs.h"
                     61: 
                     62: /* tokens, returned by parser */
                     63: # define MACHINE 1
                     64: # define LOGIN 2
                     65: # define PASSWORD 3
                     66: # define ONLYUID 4
                     67: # define NOTIFY 5
                     68: # define QUIET 6
                     69: # define COMMAND 7
                     70: # define ID 8
                     71: # define YES 9
                     72: # define DEFAULT 10
                     73: # define WRITE 11
                     74: # define NO 12
                     75: # define FORCE 13
                     76: # define LOCALTOK 14
                     77: # define LINK 15
                     78: # define SPEED 16
                     79: # define LENGTH 18
                     80: # define DEBUGTOK 19
                     81: # define ALTIME 20
                     82: # define ALCOUNT 21
                     83: # define HISPEEDLINK 22
                     84: # define EIGHTBIT 23
                     85: # define INSPEED 24
                     86: # define OUTSPEED 25
                     87: 
                     88: /* global */
                     89: struct userinfo status;
                     90: struct daemonparms netd = {
                     91:        LINKS,                  /* inspeed */
                     92:        LINKS,                  /* outspeed */
                     93:        MAXBREAD,               /* maxbread */
                     94:        ATIME,                  /* atime */
                     95:        ATIME,                  /* oatime */
                     96:        "/dev/null",            /* device */
                     97:        SIZE,                   /* datasize */
                     98:        0                       /* onlyuid */
                     99:        /* rest are all zero */
                    100: };
                    101: 
                    102: /* local */
                    103: static char tokval[100];
                    104: 
                    105: static struct tokstruct {
                    106:        char *tokstr;
                    107:        int tval;
                    108: }      toktab[]= {
                    109:        "machine",      MACHINE,
                    110:        "login",        LOGIN,
                    111:        "password",     PASSWORD,
                    112:        "onlyuid",      ONLYUID,
                    113:        "notify",       NOTIFY,
                    114:        "command",      COMMAND,
                    115:        "yes",          YES,
                    116:        "y",            YES,
                    117:        "no",           NO,
                    118:        "n",            NO,
                    119:        "default",      DEFAULT,
                    120:        "write",        WRITE,
                    121:        "force",        FORCE,
                    122:        "quiet",        QUIET,
                    123:        "local",        LOCALTOK,
                    124:        "speed",        SPEED,
                    125:        "link",         LINK,
                    126:        "length",       LENGTH,
                    127:        "debug",        DEBUGTOK,
                    128:        "time",         ALTIME,
                    129:        "count",        ALCOUNT,
                    130:        "hispeedlink",  HISPEEDLINK,
                    131:        "8bit",         EIGHTBIT,
                    132:        "inspeed",      INSPEED,
                    133:        "outspeed",     OUTSPEED,
                    134:        0,              0
                    135:        };
                    136: 
                    137: static struct stat statbuf;
                    138: 
                    139: /*
                    140:        commandfile()
                    141: 
                    142:        this procedure reads in and parses the .netrc file.
                    143:        when you call this, if the remote machine is to be explicitely
                    144:        set, the global variable "remote" must have a value.
                    145:        on return, if it is non-zero, "remote" will have the
                    146:        remote machine the data was collected for.
                    147:        status.localname need not have a value.
                    148: */
                    149: commandfile(){
                    150:        char *hdir, buf[BUFSIZ];
                    151:        FILE *cfile;
                    152:        hdir = getenv("HOME");
                    153:        if(hdir == NULL)hdir = ".";
                    154:        sprintf(buf,"%s/.netrc",hdir);
                    155: /*
                    156:        debug("file %s",buf);
                    157: */
                    158:        cfile = fopen(buf,"r");
                    159:        if(cfile == NULL)return;
                    160:        rdnetfile(cfile);
                    161:        fclose(cfile);
                    162:        }
                    163: /*
                    164:        read the file cfile and parse
                    165: */
                    166: rdnetfile(cfile)
                    167:        FILE *cfile;
                    168: {
                    169:        int t;
                    170:        if(cfile == NULL)return;
                    171:        if(fstat(fileno(cfile),&statbuf) < 0 || (statbuf.st_mode & 0444) == 0)
                    172:                return;
                    173:        while((t = token(cfile))){
                    174:                switch(t){
                    175:                case DEFAULT:
                    176:                        if(token(cfile) == ID && remote == 0)remote = lookup(tokval);
                    177:                        /*
                    178:                        debug("rem %c\n",remote);
                    179:                        */
                    180:                        break;
                    181:                case MACHINE:
                    182:                        if(remote == 0)remote = getremote(local);
                    183:                        if(token(cfile) != ID)continue;
                    184:                        if(remote != lookup(tokval))continue;
                    185:                        /* this is the entry for the remote mach we want */
                    186:                        getnetline(cfile);
                    187:                        return;
                    188:                        break;
                    189:                }
                    190:                }
                    191:        return;
                    192:        }
                    193: /*
                    194:        read a line of the file
                    195: */
                    196: static getnetline(cfile)
                    197:        FILE *cfile;
                    198: {
                    199:        int t;
                    200:        while((t = token(cfile))){
                    201:                switch(t){
                    202:                /* these options are usually in the .netrc file */
                    203:                case MACHINE: return;
                    204:                case LOGIN:
                    205:                        if(token(cfile) && status.login[0] == 0)
                    206:                                strcpy(status.login,tokval);
                    207:                        break;
                    208:                case PASSWORD:
                    209:                        if(fstat(fileno(cfile),&statbuf) >= 0
                    210:                        && (statbuf.st_mode & 077) != 0){
                    211:                                err("Error - .netrc file not correct mode.\n");
                    212:                                err("Remove password or correct mode.\n");
                    213:                                exit(EX_USAGE);
                    214:                                }
                    215:                        if(token(cfile) && status.mpasswd[0] == 0)
                    216:                                strcpy(status.mpasswd,tokval);
                    217:                        /*
                    218:                        debug("mp:%s:%s\n",status.mpasswd,tokval);
                    219:                        */
                    220:                        break;
                    221:                case NOTIFY:
                    222:                        status.nonotify = token(cfile) == NO;
                    223:                        break;
                    224:                case WRITE:
                    225:                        status.nowrite = token(cfile) == NO;
                    226:                        break;
                    227:                case COMMAND:
                    228:                        if(token(cfile) && status.defcmd[0] == 0)
                    229:                                strcpy(status.defcmd,tokval);
                    230:                        break;
                    231:                case QUIET:
                    232:                        status.quiet = token(cfile) == YES;
                    233:                        break;
                    234:                case FORCE:
                    235:                        status.force = token(cfile) == YES;
                    236:                        break;
                    237: 
                    238:                /* these options are usually in /usr/net/initfile */
                    239:                case LOCALTOK:
                    240:                        if(token(cfile))local = lookup(tokval);
                    241:                        break;
                    242:                case LINK:
                    243:                        if(token(cfile))strcpy(netd.dp_device,tokval);
                    244:                        break;
                    245:                case SPEED:
                    246:                        if(token(cfile))
                    247:                                netd.dp_inspeed = netd.dp_outspeed=atoi(tokval);
                    248:                        break;
                    249:                case INSPEED:
                    250:                        if(token(cfile))netd.dp_inspeed = atoi(tokval);
                    251:                        break;
                    252:                case OUTSPEED:
                    253:                        if(token(cfile))netd.dp_outspeed = atoi(tokval);
                    254:                        break;
                    255:                case LENGTH:
                    256:                        if(token(cfile))netd.dp_datasize = atoi(tokval);
                    257:                        break;
                    258:                case DEBUGTOK:
                    259:                        debugflg++;
                    260:                        break;
                    261:                case ALTIME:
                    262:                        if(token(cfile))netd.dp_oatime = atoi(tokval);
                    263:                        break;
                    264:                case ALCOUNT:
                    265:                        if(token(cfile))netd.dp_maxbread = atoi(tokval);
                    266:                        break;
                    267:                case ONLYUID:
                    268:                        if(token(cfile))netd.dp_onlyuid = atoi(tokval);
                    269:                        break;
                    270:                case EIGHTBIT:
                    271:                        netd.dp_use8bit++;
                    272:                        break;
                    273:                case HISPEEDLINK:
                    274:                        if(token(cfile))strcpy(netd.dp_hispeedlink,tokval);
                    275:                        break;
                    276:                default:
                    277:                        err("Unknown .netrc option %s\n",tokval);       
                    278:                        break;
                    279:                }
                    280:                }
                    281:        }
                    282: static token(cfile)
                    283:        FILE *cfile;
                    284: {      /* returns next token in cfile, 0 on EOF */
                    285:        char *p;
                    286:        int c;
                    287:        if(feof(cfile))return(0);
                    288:        while((c = getc(cfile)) != EOF && (c == '\n' || c == '\t'
                    289:                || c == ' ' || c == ','));
                    290:        /* next char begins token */
                    291:        if(c == EOF)return(0);
                    292:        p = tokval;
                    293:        if(c == '"'){   /* process quoted string */
                    294:                while((c = getc(cfile)) != EOF && c != '"'){
                    295:                        if(c == '\\')c = getc(cfile);
                    296:                        *p++ = c;
                    297:                        }
                    298:                }
                    299:        else {
                    300:                *p++ = c;
                    301:                while((c = getc(cfile)) != EOF && c != '\n' && c != '\t' 
                    302:                        && c != ' ' && c != ','){
                    303:                        if(c == '\\')c = getc(cfile);
                    304:                        *p++ = c;
                    305:                        }
                    306:                }
                    307:        *p = 0;
                    308:        if(tokval[0] == 0)return(0);
                    309: /*
                    310:        debug("tok %s",tokval);
                    311: */
                    312:        return(tlookup(tokval));
                    313:        }
                    314: static tlookup(str)
                    315:   char *str; {
                    316:        struct tokstruct *p;
                    317:        for(p = toktab; p->tokstr; p++)
                    318:                if(streql(p->tokstr,str) == 0){
                    319:                        return(p->tval);
                    320:                        }
                    321:        return(ID);
                    322:        }

unix.superglobalmegacorp.com

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