vx32

Local 9vx git repository for patches.
git clone git://r-36.net/vx32
Log | Files | Refs

commit 63886a0f0e4e2e423f7b544275543cf6bbef5a55
parent 91f17a2007af56e7a849bc5ea5f6f2d06c9f5185
Author: Jesus Galan Lopez (yiyus) <yiyu.jgl@gmail.com>
Date:   Mon, 27 Sep 2010 23:15:31 +0200

ini: ether values

Diffstat:
Msrc/9vx/Makefrag | 2+-
Msrc/9vx/conf.c | 55+++++++++++++++++++++++++++++++++++++++++++++++++------
Msrc/9vx/main.c | 37++++++++++++++++++-------------------
Msrc/9vx/vether.c | 63+++------------------------------------------------------------
Msrc/9vx/vether.h | 3---
5 files changed, 71 insertions(+), 89 deletions(-)

diff --git a/src/9vx/Makefrag b/src/9vx/Makefrag @@ -26,7 +26,7 @@ endif #PLAN9GUI=nogui # Virtual ethernet devices -#PLAN9PCAP=etherpcap +PLAN9PCAP=etherpcap #PLAN9PCAP=nopcap #PLAN9TAP=ethertap #PLAN9TAP=notap diff --git a/src/9vx/conf.c b/src/9vx/conf.c @@ -14,6 +14,48 @@ char filebuf[BOOTARGSLEN]; +static void +addether(char *name, char *value) +{ + char *p; + int ctlrno; + + ctlrno = atoi(&name[5]); + if(ctlrno > MaxEther) + return; + p = value; + while(*p){ + while(*p == ' ' || *p == '\t') + p++; + if(*p == '\0') + break; + if(strncmp(p, "type=", 5) == 0){ + p += 5; + if(strncmp(p, "tap", 3) == 0) + ve[ctlrno].tap = 1; + else if(strncmp(p, "pcap", 4) == 0) + ve[ctlrno].tap = 0; + else + return; + } + else if(strncmp(p, "dev=", 4) == 0){ + p += 4; + ve[ctlrno].dev = p; + while(*p && *p != ' ' && *p != '\t') + p++; + *p++ = '\0'; + continue; + } + else if(strncmp(p, "ea=", 3) == 0){ + if(parseether(ve[ctlrno].ea, p+3) == -1) + memset(ve[ctlrno].ea, 0, 6); + } + while(*p && *p != ' ' && *p != '\t') + p++; + } + nve++; +} + void setinioptions() { @@ -36,15 +78,15 @@ setinioptions() memsize = atoi(value); else if(strcmp(name, "canopenfiles") == 0) canopen = value; - else if(strcmp(name, "ether") == 0) - //addether(name, value); - value = value; + else if(strncmp(name, "ether", 5) == 0) + addether(name, value); else if(strcmp(name, "initarg") == 0) initarg = value; else if(strcmp(name, "localroot") == 0) localroot = value; else if(strcmp(name, "user") == 0) username = value; + /* Restore '=' for setinienv and printconfig */ *(--value) = '='; } } @@ -108,8 +150,6 @@ addini(char *buf) if(!incomment) *p++ = *q; } - if(p > buf && p[-1] != '\n') - *p++ = '\n'; *p++ = 0; n += gettokens(buf, &inifield[n], MAXCONF-n, "\n"); @@ -154,7 +194,9 @@ fullpath(char *root) { return root; } -/* poor man's quotestrdup to avoid needing quote.c */ +/* + * Poor man's quotestrdup to avoid needing quote.c + */ char* quoted(char *in) { char *out, *p; @@ -217,6 +259,7 @@ printconfig(char *argv0){ print(argv0); if(usetty) print(" -%c", nogui ? 'g' : 't'); + print(" \n"); for(i = 0; i < MAXCONF; i++){ if(!inifield[i]) break; diff --git a/src/9vx/main.c b/src/9vx/main.c @@ -82,7 +82,6 @@ nop(void) int main(int argc, char **argv) { - int vetap; char *file; /* Minimal set up to make print work. */ @@ -101,6 +100,7 @@ main(int argc, char **argv) nofork = 0; nve = 0; usetty = 0; +readargs: ARGBEGIN{ /* debugging options */ case '1': @@ -145,21 +145,8 @@ main(int argc, char **argv) case 't': usetty = 1; break; - default: - goto iniargs; - }ARGEND - -iniargs: - while(argc > 0 && argv[0][0] != '-'){ - addini(strdup(argv[0])); - argc--; argv++; - } - /* - * ARGBEGIN will do: argv++; argc--; - * but argv[0] is not argv0 now - */ - argc++; argv--; - ARGBEGIN{ + + /* ini values */ case 'f': file = EARGF(usage()); if(addinifile(file) < 0) @@ -167,7 +154,7 @@ iniargs: break; case 'i': /* - * Pass additional flag after -i is to init + * Pass additional flag after -i to init * This is convenient for -ic and -im */ if(_args[0] != 0){ @@ -183,11 +170,23 @@ iniargs: case 'u': username = EARGF(usage()); break; + default: usage(); }ARGEND - if(argc > 0) - goto iniargs; + + while(argc > 0){ + if(argv[0][0] == '-'){ + /* + * ARGBEGIN will do: argv++; argc--; + * to skip argv0, but argv[0] is not argv0 now + */ + argc++; argv--; + goto readargs; + } + addini(strdup(argv[0])); + argc--; argv++; + } if(username == nil && (username = getuser()) == nil) username = "tor"; diff --git a/src/9vx/vether.c b/src/9vx/vether.c @@ -30,55 +30,13 @@ extern void espinit(Fs*); extern SDifc sdloopifc; extern SDifc sdaoeifc; -void -setmac(char *macaddr) -{ - int i; - char **nc = &macaddr; - - if(nve == 0) - return; - ve[nve-1].mac = macaddr; - for(i = 0; i < Eaddrlen; i++){ - ve[nve-1].ea[i] = (uchar)strtoul(macaddr, nc, 16); - macaddr = *nc+1; - } -} - -static int -eainuse(int n, uchar ea[Eaddrlen]) -{ - int i; - - for(i = 0; i < nve; i++) - if((i<n || ve[i].mac != nil) && memcmp(ea, ve[i].ea, Eaddrlen) == 0) - return -1; - return 0; -} - -void -addve(char *dev, int tap) -{ - if(nve == MaxEther) - panic("too many virtual ether cards"); - ve[nve].tap = tap; - ve[nve].dev = dev; - ve[nve].mac = nil; - nve++; -} - void links(void) { - static uchar ea[Eaddrlen] = {0x00, 0x00, 0x09, 0x00, 0x00, 0x00}; - ethermediumlink(); loopbackmediumlink(); netdevmediumlink(); - for(int i=0; i<nve; i++){ - if(ve[i].mac == nil){ - while(eainuse(i, ea)) - ea[5]++; - memcpy(ve[i].ea, ea, Eaddrlen); - } + for(int i=0; i<MaxEther; i++){ + if(ve[i].dev == nil) + continue; if(ve[i].tap == 1) ethertaplink(); else @@ -99,21 +57,6 @@ void (*ipprotoinit[])(Fs*) = { nil, }; -int -eafrom(char *ma, uchar ea[6]) -{ - int i; - char **nc = &ma; - - for(i = 0; i < 6; i++){ - if(!ma) - return -1; - ea[i] = (uchar)strtoul(ma, nc, 16); - ma = *nc+1; - } - return 0; -} - SDifc *sdifc[] = { &sdloopifc, diff --git a/src/9vx/vether.h b/src/9vx/vether.h @@ -3,13 +3,10 @@ struct Vether { int tap; char *dev; - char *mac; uchar ea[Eaddrlen]; }; Vether ve[MaxEther+1]; int nve; -void setmac(char*); -void addve(char*, int); void links();