commit 22f9c849f452516af8e9af87ef48461002501fc3
parent 7792c92a37520a1624fcbc3c715ecc92a8f8859f
Author: Jesus Galan Lopez (yiyus) <yiyu.jgl@gmail.com>
Date:   Tue, 15 Jun 2010 20:31:40 +0200
parse multiple netdev options
Diffstat:
3 files changed, 46 insertions(+), 35 deletions(-)
diff --git a/src/9vx/main.c b/src/9vx/main.c
@@ -27,6 +27,10 @@
 
 #include "fs.h"
 
+#include "netif.h"
+#include "etherif.h"
+#include "vether.h"
+
 #define Image IMAGE
 #include	"draw.h"
 #include	"memdraw.h"
@@ -59,7 +63,6 @@ static int	bootboot;	/* run /boot/boot instead of bootscript */
 static int	initrc;	/* run rc instead of init */
 static int	nogui;	/* do not start the gui */
 static int	usetty;	/* use tty for input/output */
-static int	vether;	/* use virtual ethernet device */
 static char*	username;
 static Mach mach0;
 
@@ -97,6 +100,8 @@ int
 main(int argc, char **argv)
 {
 	int nofork;
+	int vetap;
+	char *vedev;
 	char buf[1024];
 	
 	/* Minimal set up to make print work. */
@@ -107,6 +112,7 @@ main(int argc, char **argv)
 	nogui = 0;
 	nofork = 0;
 	usetty = 0;
+	nve = 0;
 	localroot = nil;
 	ARGBEGIN{
 	/* debugging options */
@@ -155,22 +161,22 @@ main(int argc, char **argv)
 	case 'p':
 		inifile = EARGF(usage());
 		break;
+	case 'm':
+		setea(EARGF(usage()));
+		break;
 	case 'n':
-		vether = 1;
-		netdev = ARGF();
-		if(strcmp(netdev, "tap") == 0){
-			nettap = 1;
-			netdev = ARGF();
+		vetap = 0;
+		vedev = ARGF();
+		if(vedev != nil && strcmp(vedev, "tap") == 0){
+			vetap = 1;
+			vedev = ARGF();
 		}
-		if(netdev != 0 && netdev[0] == '-'){
-			netdev = nil;
+		if(vedev != nil && vedev[0] == '-'){
+			vedev = nil;
 			argc++;
 			*argv--;
 		}
-		break;
-	case 'm':
-		vether = 1;
-		macaddr = EARGF(usage());
+		addve(vedev, vetap);
 		break;
 	case 'r':
 		localroot = EARGF(usage());
@@ -241,28 +247,27 @@ main(int argc, char **argv)
 	if(bootboot | nogui | initrc | usetty)
 		print("-%s%s%s%s ", bootboot ? "b" : "", nogui ? "g" : "",
 			initrc ? "i " : "", usetty ? "t " : "");
-	if(vether)
-		print("-n ");
-	if(nettap)
-		print("tap ");
-	if(netdev)
-		print("%s ", netdev);
-	if(macaddr)
-		print("-m %s ", macaddr);
+	for(int i=0; i<nve; i++){
+		print("-n %s", ve[i].tap ? "tap ": "");
+		if(ve[i].dev != nil)
+			print("%s ", ve[i].dev);
+		if(ve[i].mac != nil)
+			print("-m %s ", ve[i].mac);
+	}
 	print("-r %s -u %s\n", localroot, username);
 
-	if(!vether)
+	if(nve == 0)
 		ipdevtab = pipdevtab;
 
 	printinit();
 	procinit0();
 	initseg();
-	if(vether)
+	if(nve > 0)
 		links();
 
 	chandevreset();
 	if(!singlethread){
-		if(!netdev)
+		if(nve == 0)
 			makekprocdev(&ipdevtab);
 		makekprocdev(&fsdevtab);
 		makekprocdev(&drawdevtab);
@@ -381,6 +386,9 @@ inifields(void (*fp)(char*, char*))
 void
 iniopt(char *name, char *value)
 {
+	char *vedev;
+	int vetap;
+
 	if(*name == '*')
 		name++;
 	if(strcmp(name, "bootboot") == 0)
@@ -393,17 +401,15 @@ iniopt(char *name, char *value)
 		username = value;
 	else if(strcmp(name, "usetty") == 0)
 		usetty = 1;
+	else if(strcmp(name, "macaddr") == 0 && !macaddr)
+		setea(value);
 	else if(strcmp(name, "netdev") == 0 && !netdev){
-		vether = 1;
 		if(strncmp(value, "tap", 3) == 0) {
-			nettap = 1;
+			vetap = 1;
 			value += 4;
 		}
-		netdev = value;
-	}
-	else if(strcmp(name, "macaddr") == 0 && !macaddr){
-		vether = 1;
-		macaddr = value;
+		vedev = value;
+		addve(vedev, vetap);
 	}
 	else if(strcmp(name, "nogui") == 0){
 		nogui = 1;
diff --git a/src/9vx/vether.c b/src/9vx/vether.c
@@ -38,6 +38,7 @@ setea(char *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;
@@ -47,14 +48,13 @@ setea(char *macaddr)
 void
 addve(char *dev, int tap)
 {
-	int i;
-
 	static uchar ea[Eaddrlen] = {0x00, 0x00, 0x09, 0x00, 0x00, 0x00};
 
 	if(nve == MaxEther)
 		panic("too many virtual ether cards");
-	ve[nve].dev = dev;
 	ve[nve].tap = tap;
+	ve[nve].dev = dev;
+	ve[nve].mac = nil;
 	/* This ea could conflict with one given by the user */
 	memcpy(ve[nve].ea, ea, Eaddrlen);
 	ea[5]++;
diff --git a/src/9vx/vether.h b/src/9vx/vether.h
@@ -3,8 +3,13 @@ struct Vether
 {
 	int	tap;
 	char	*dev;
+	char	*mac;
 	uchar ea[Eaddrlen];
 };
 
-static Vether ve[MaxEther+1];
-static int nve = 0;
+Vether ve[MaxEther+1];
+int nve;
+
+void	setea(char*);
+void	addve(char*, int);
+void	links();