فهرست منبع

More build fixes.

Adam Ierymenko 8 سال پیش
والد
کامیت
48cadcd2fc
2فایلهای تغییر یافته به همراه34 افزوده شده و 14 حذف شده
  1. 33 14
      osdep/LinuxEthernetTap.cpp
  2. 1 0
      osdep/OSXEthernetTap.cpp

+ 33 - 14
osdep/LinuxEthernetTap.cpp

@@ -93,19 +93,31 @@ LinuxEthernetTap::LinuxEthernetTap(
 	memset(&ifr,0,sizeof(ifr));
 
 	// Try to recall our last device name, or pick an unused one if that fails.
-	bool recalledDevice = false;
-	std::string devmapbuf;
-	Dictionary<8194> devmap;
-	if (OSUtils::readFile((_homePath + ZT_PATH_SEPARATOR_S + "devicemap").c_str(),devmapbuf)) {
-		devmap.load(devmapbuf.c_str());
-		char desiredDevice[128];
-		if (devmap.get(nwids,desiredDevice,sizeof(desiredDevice)) > 0) {
-			Utils::scopy(ifr.ifr_name,sizeof(ifr.ifr_name),desiredDevice);
-			Utils::snprintf(procpath,sizeof(procpath),"/proc/sys/net/ipv4/conf/%s",ifr.ifr_name);
-			recalledDevice = (stat(procpath,&sbuf) != 0);
+	std::map<std::string,std::string> globalDeviceMap;
+	FILE *devmapf = fopen((_homePath + ZT_PATH_SEPARATOR_S + "devicemap").c_str(),"r");
+	if (devmapf) {
+		char buf[256];
+		while (fgets(buf,sizeof(buf),devmapf)) {
+			char *x = (char *)0;
+			char *y = (char *)0;
+			char *saveptr = (char *)0;
+			for(char *f=Utils::stok(buf,"\r\n=",&saveptr);(f);f=Utils::stok((char *)0,"\r\n=",&saveptr)) {
+				if (!x) x = f;
+				else if (!y) y = f;
+				else break;
+			}
+			if ((x)&&(y)&&(x[0])&&(y[0]))
+				globalDeviceMap[x] = y;
 		}
+		fclose(devmapf);
+	}
+	bool recalledDevice = false;
+	std::map<std::string,std::string>::const_iterator gdmEntry = globalDeviceMap.find(nwids);
+	if (gdmEntry != globalDeviceMap.end()) {
+		Utils::scopy(ifr.ifr_name,sizeof(ifr.ifr_name),gdmEntry->second.c_str());
+		Utils::snprintf(procpath,sizeof(procpath),"/proc/sys/net/ipv4/conf/%s",ifr.ifr_name);
+		recalledDevice = (stat(procpath,&sbuf) != 0);
 	}
-
 	if (!recalledDevice) {
 		int devno = 0;
 		do {
@@ -179,9 +191,16 @@ LinuxEthernetTap::LinuxEthernetTap(
 
 	(void)::pipe(_shutdownSignalPipe);
 
-	devmap.erase(nwids);
-	devmap.add(nwids,_dev.c_str());
-	OSUtils::writeFile((_homePath + ZT_PATH_SEPARATOR_S + "devicemap").c_str(),(const void *)devmap.data(),devmap.sizeBytes());
+	globalDeviceMap[nwids] = _dev;
+	devmapf = fopen((_homePath + ZT_PATH_SEPARATOR_S + "devicemap").c_str(),"w");
+	if (devmapf) {
+		gdmEntry = globalDeviceMap.begin();
+		while (gdmEntry != globalDeviceMap.end()) {
+			fprintf(devmapf,"%s=%s\n",gdmEntry->first.c_str(),gdmEntry->second.c_str());
+			++gdmEntry;
+		}
+		fclose(devmapf);
+	}
 
 	_thread = Thread::start(this);
 }

+ 1 - 0
osdep/OSXEthernetTap.cpp

@@ -368,6 +368,7 @@ OSXEthernetTap::OSXEthernetTap(
 			if ((x)&&(y)&&(x[0])&&(y[0]))
 				globalDeviceMap[x] = y;
 		}
+		fclose(devmapf);
 	}
 	bool recalledDevice = false;
 	std::map<std::string,std::string>::const_iterator gdmEntry = globalDeviceMap.find(nwids);