+
+ do
+ {
+ memset(&newNetwork, 0, sizeof(data1));
+
+ bool bindfailed = false;
+
+ if ((f = openSection("LISTEN-ON", 1, iniFile)))
+ {
+ MYBYTE i = 0;
+
+ while (readSection(raw, f))
+ {
+ MYWORD port = 69;
+
+ cfig.ifspecified = true;
+ mySplit(name, value, raw, ':');
+
+ if (value[0])
+ port = atoi(value);
+
+ if(i < MAX_SERVERS)
+ {
+ if (isIP(name))
+ {
+ MYDWORD addr = my_inet_addr(name);
+
+ if (!addr)
+ {
+ newNetwork.listenServers[0] = 0;
+ newNetwork.listenPorts[0] = port;
+ fclose(f);
+ break;
+ }
+ else if (!findServer(newNetwork.listenServers, addr))
+ {
+ newNetwork.listenServers[i] = addr;
+ newNetwork.listenPorts[i] = port;
+ i++;
+ }
+ }
+ else
+ {
+ sprintf(logBuff, "Warning: Section [LISTEN-ON], Invalid Interface Address %s, ignored", raw);
+ logMess(logBuff, 1);
+ }
+ }
+ }
+ }
+
+ if (!cfig.ifspecified)
+ {
+ sprintf(logBuff, "detecting Interfaces..");
+ logMess(logBuff, 1);
+ getInterfaces(&newNetwork);
+
+ for (MYBYTE n = 0; n < MAX_SERVERS && newNetwork.staticServers[n]; n++)
+ {
+ newNetwork.listenServers[n] = newNetwork.staticServers[n];
+ newNetwork.listenPorts[n] = 69;
+ }
+ }
+
+ MYBYTE i = 0;
+
+ for (int j = 0; j < MAX_SERVERS && newNetwork.listenPorts[j]; j++)
+ {
+ int k = 0;
+
+ for (; k < MAX_SERVERS && network.tftpConn[k].loaded; k++)
+ {
+ if (network.tftpConn[k].ready && network.tftpConn[k].server == newNetwork.listenServers[j] && network.tftpConn[k].port == newNetwork.listenPorts[j])
+ break;
+ }
+
+ if (network.tftpConn[k].ready && network.tftpConn[k].server == newNetwork.listenServers[j] && network.tftpConn[k].port == newNetwork.listenPorts[j])
+ {
+ memcpy(&(newNetwork.tftpConn[i]), &(network.tftpConn[k]), sizeof(tftpConnType));
+
+ if (newNetwork.maxFD < newNetwork.tftpConn[i].sock)
+ newNetwork.maxFD = newNetwork.tftpConn[i].sock;
+
+ network.tftpConn[k].ready = false;
+ //printf("%d, %s found\n", i, IP2String(tempbuff, newNetwork.tftpConn[i].server));
+ i++;
+ continue;
+ }
+ else
+ {
+ newNetwork.tftpConn[i].sock = socket(PF_INET, SOCK_DGRAM, IPPROTO_UDP);
+
+ if (newNetwork.tftpConn[i].sock == INVALID_SOCKET)
+ {
+ bindfailed = true;
+ sprintf(logBuff, "Failed to Create Socket");
+ logMess(logBuff, 1);
+ continue;
+ }
+
+ //printf("Socket %u\n", newNetwork.tftpConn[i].sock);
+
+ errno = 0;
+ newNetwork.tftpConn[i].addr.sin_family = AF_INET;
+ newNetwork.tftpConn[i].addr.sin_addr.s_addr = newNetwork.listenServers[j];
+ newNetwork.tftpConn[i].addr.sin_port = htons(newNetwork.listenPorts[j]);
+ int nRet = bind(newNetwork.tftpConn[i].sock, (sockaddr*)&newNetwork.tftpConn[i].addr, sizeof(struct sockaddr_in));
+
+ if (nRet == SOCKET_ERROR || errno)
+ {
+ bindfailed = true;
+ closesocket(newNetwork.tftpConn[i].sock);
+ sprintf(logBuff, "%s Port %i bind failed", IP2String(tempbuff, newNetwork.listenServers[j]), newNetwork.listenPorts[j]);
+ logMess(logBuff, 1);
+ continue;
+ }
+
+ newNetwork.tftpConn[i].loaded = true;
+ newNetwork.tftpConn[i].ready = true;
+ newNetwork.tftpConn[i].server = newNetwork.listenServers[j];
+ newNetwork.tftpConn[i].port = newNetwork.listenPorts[j];
+
+ //printf("%d, %s created\n", i, IP2String(tempbuff, newNetwork.tftpConn[i].server));
+
+ if (newNetwork.maxFD < newNetwork.tftpConn[i].sock)
+ newNetwork.maxFD = newNetwork.tftpConn[i].sock;
+
+ if (!newNetwork.listenServers[j])
+ break;
+
+ i++;
+ }
+ }
+
+ if (bindfailed)
+ cfig.failureCount++;
+ else
+ cfig.failureCount = 0;
+
+ closeConn();
+ memcpy(&network, &newNetwork, sizeof(data1));
+
+ //printf("%i %i %i\n", network.tftpConn[0].ready, network.dnsUdpConn[0].ready, network.dnsTcpConn[0].ready);
+
+ if (!network.tftpConn[0].ready)
+ {
+ sprintf(logBuff, "No Static Interface ready, Waiting...");
+ logMess(logBuff, 1);
+ continue;
+ }
+
+ for (int i = 0; i < MAX_SERVERS && network.tftpConn[i].loaded; i++)
+ {
+ sprintf(logBuff, "Listening On: %s:%d", IP2String(tempbuff, network.tftpConn[i].server), network.tftpConn[i].port);
+ logMess(logBuff, 1);
+ }
+
+ network.ready = true;
+
+ } while (detectChange());
+
+ //printf("Exiting Init\n");
+
+ _endthread();
+ return;
+}
+
+bool detectChange()
+{
+ if (!cfig.failureCount)
+ {
+ if (cfig.ifspecified)
+ return false;
+ }
+
+ MYDWORD eventWait = UINT_MAX;
+
+ if (cfig.failureCount)
+ eventWait = 10000 * pow(2, cfig.failureCount);
+
+ OVERLAPPED overlap;
+ MYDWORD ret;
+ HANDLE hand = NULL;
+ overlap.hEvent = WSACreateEvent();
+
+ ret = NotifyAddrChange(&hand, &overlap);
+
+ if (ret != NO_ERROR)
+ {
+ if (WSAGetLastError() != WSA_IO_PENDING)
+ {
+ printf("NotifyAddrChange error...%d\n", WSAGetLastError());
+ return true;
+ }
+ }
+
+ if ( WaitForSingleObject(overlap.hEvent, eventWait) == WAIT_OBJECT_0 )
+ WSACloseEvent(overlap.hEvent);
+
+ network.ready = false;
+
+ while (network.busy)
+ Sleep(1000);
+
+ if (cfig.failureCount)
+ {
+ sprintf(logBuff, "Retrying failed Listening Interfaces..");
+ logMess(logBuff, 1);
+ }
+ else
+ {
+ sprintf(logBuff, "Network changed, re-detecting Interfaces..");
+ logMess(logBuff, 1);
+ }
+
+ return true;
+}
+
+/*
+void getInterfaces(data1 *network)
+{
+ memset(network, 0, sizeof(data1));
+
+ SOCKET sd = WSASocket(PF_INET, SOCK_DGRAM, 0, 0, 0, 0);
+
+ if (sd == INVALID_SOCKET)
+ return;
+
+ INTERFACE_INFO InterfaceList[MAX_SERVERS];
+ unsigned long nBytesReturned;
+
+ if (WSAIoctl(sd, SIO_GET_INTERFACE_LIST, 0, 0, &InterfaceList,
+ sizeof(InterfaceList), &nBytesReturned, 0, 0) == SOCKET_ERROR)
+ return ;
+
+ int nNumInterfaces = nBytesReturned / sizeof(INTERFACE_INFO);
+
+ for (int i = 0; i < nNumInterfaces; ++i)
+ {
+ sockaddr_in *pAddress = (sockaddr_in*)&(InterfaceList[i].iiAddress);
+ u_long nFlags = InterfaceList[i].iiFlags;
+
+ if (!(nFlags & IFF_POINTTOPOINT))
+ {
+ //printf("%s\n", IP2String(tempbuff, pAddress->sin_addr.S_un.S_addr));
+ addServer(network->staticServers, pAddress->sin_addr.s_addr);
+ }
+ }
+
+ closesocket(sd);