mirror of
https://github.com/reactos/reactos.git
synced 2025-08-05 17:52:56 +00:00
[DHCPCSVC]
- Use an event to signal when an adapter has been added svn path=/trunk/; revision=47866
This commit is contained in:
parent
763a24d9d7
commit
f4530b30f2
3 changed files with 38 additions and 24 deletions
|
@ -227,10 +227,11 @@ InterfaceConnected(MIB_IFROW IfEntry)
|
||||||
/*
|
/*
|
||||||
* XXX Figure out the way to bind a specific adapter to a socket.
|
* XXX Figure out the way to bind a specific adapter to a socket.
|
||||||
*/
|
*/
|
||||||
DWORD WINAPI AdapterDiscoveryThread(LPVOID Unused) {
|
DWORD WINAPI AdapterDiscoveryThread(LPVOID Context) {
|
||||||
PMIB_IFTABLE Table = (PMIB_IFTABLE) malloc(sizeof(MIB_IFTABLE));
|
PMIB_IFTABLE Table = (PMIB_IFTABLE) malloc(sizeof(MIB_IFTABLE));
|
||||||
DWORD Error, Size = sizeof(MIB_IFTABLE);
|
DWORD Error, Size = sizeof(MIB_IFTABLE);
|
||||||
PDHCP_ADAPTER Adapter = NULL;
|
PDHCP_ADAPTER Adapter = NULL;
|
||||||
|
HANDLE AdapterStateChangedEvent = (HANDLE)Context;
|
||||||
struct interface_info *ifi = NULL;
|
struct interface_info *ifi = NULL;
|
||||||
int i;
|
int i;
|
||||||
|
|
||||||
|
@ -345,6 +346,8 @@ DWORD WINAPI AdapterDiscoveryThread(LPVOID Unused) {
|
||||||
|
|
||||||
ApiLock();
|
ApiLock();
|
||||||
InsertTailList( &AdapterList, &Adapter->ListEntry );
|
InsertTailList( &AdapterList, &Adapter->ListEntry );
|
||||||
|
DbgPrint("DHCPCSVC: Discovered new adapter [%s]\n", Adapter->DhclientInfo.name);
|
||||||
|
SetEvent(AdapterStateChangedEvent);
|
||||||
ApiUnlock();
|
ApiUnlock();
|
||||||
} else { free( Adapter ); Adapter = 0; }
|
} else { free( Adapter ); Adapter = 0; }
|
||||||
} else { free( Adapter ); Adapter = 0; }
|
} else { free( Adapter ); Adapter = 0; }
|
||||||
|
@ -361,22 +364,27 @@ DWORD WINAPI AdapterDiscoveryThread(LPVOID Unused) {
|
||||||
return Error;
|
return Error;
|
||||||
}
|
}
|
||||||
|
|
||||||
BOOLEAN StartAdapterDiscovery(VOID) {
|
HANDLE StartAdapterDiscovery(VOID) {
|
||||||
HANDLE ThreadHandle;
|
HANDLE ThreadHandle, EventHandle;
|
||||||
|
|
||||||
|
EventHandle = CreateEvent(NULL,
|
||||||
|
FALSE,
|
||||||
|
FALSE,
|
||||||
|
NULL);
|
||||||
|
|
||||||
ThreadHandle = CreateThread(NULL,
|
ThreadHandle = CreateThread(NULL,
|
||||||
0,
|
0,
|
||||||
AdapterDiscoveryThread,
|
AdapterDiscoveryThread,
|
||||||
NULL,
|
(LPVOID)EventHandle,
|
||||||
0,
|
0,
|
||||||
NULL);
|
NULL);
|
||||||
|
|
||||||
if (ThreadHandle == NULL)
|
if (ThreadHandle == NULL)
|
||||||
return FALSE;
|
return NULL;
|
||||||
|
|
||||||
CloseHandle(ThreadHandle);
|
CloseHandle(ThreadHandle);
|
||||||
|
|
||||||
return TRUE;
|
return EventHandle;
|
||||||
}
|
}
|
||||||
|
|
||||||
void AdapterStop() {
|
void AdapterStop() {
|
||||||
|
|
|
@ -68,8 +68,10 @@ dispatch(void)
|
||||||
fd_set fds;
|
fd_set fds;
|
||||||
time_t howlong, cur_time;
|
time_t howlong, cur_time;
|
||||||
struct timeval timeval;
|
struct timeval timeval;
|
||||||
|
HANDLE AdapterStateChangedEvent;
|
||||||
|
|
||||||
if (!StartAdapterDiscovery())
|
AdapterStateChangedEvent = StartAdapterDiscovery();
|
||||||
|
if (!AdapterStateChangedEvent)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
ApiLock();
|
ApiLock();
|
||||||
|
@ -103,29 +105,31 @@ dispatch(void)
|
||||||
if (howlong > INT_MAX / 1000)
|
if (howlong > INT_MAX / 1000)
|
||||||
howlong = INT_MAX / 1000;
|
howlong = INT_MAX / 1000;
|
||||||
to_msec = howlong * 1000;
|
to_msec = howlong * 1000;
|
||||||
} else
|
|
||||||
to_msec = 5000;
|
|
||||||
|
|
||||||
/* Set up the descriptors to be polled. */
|
/* Set up the descriptors to be polled. */
|
||||||
FD_ZERO(&fds);
|
FD_ZERO(&fds);
|
||||||
|
|
||||||
for (l = protocols; l; l = l->next)
|
for (l = protocols; l; l = l->next)
|
||||||
FD_SET(l->fd, &fds);
|
FD_SET(l->fd, &fds);
|
||||||
|
|
||||||
/* Wait for a packet or a timeout... XXX */
|
/* Wait for a packet or a timeout... XXX */
|
||||||
timeval.tv_sec = to_msec / 1000;
|
timeval.tv_sec = to_msec / 1000;
|
||||||
timeval.tv_usec = to_msec % 1000;
|
timeval.tv_usec = to_msec % 1000;
|
||||||
|
|
||||||
ApiUnlock();
|
ApiUnlock();
|
||||||
|
|
||||||
if (protocols)
|
|
||||||
count = select(0, &fds, NULL, NULL, &timeval);
|
count = select(0, &fds, NULL, NULL, &timeval);
|
||||||
else {
|
|
||||||
Sleep(to_msec);
|
|
||||||
count = 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
ApiLock();
|
ApiLock();
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
ApiUnlock();
|
||||||
|
WaitForSingleObject(AdapterStateChangedEvent, INFINITE);
|
||||||
|
ApiLock();
|
||||||
|
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
DH_DbgPrint(MID_TRACE,("Select: %d\n", count));
|
DH_DbgPrint(MID_TRACE,("Select: %d\n", count));
|
||||||
|
|
||||||
|
@ -149,6 +153,8 @@ dispatch(void)
|
||||||
}
|
}
|
||||||
} while (1);
|
} while (1);
|
||||||
|
|
||||||
|
CloseHandle(AdapterStateChangedEvent);
|
||||||
|
|
||||||
ApiUnlock();
|
ApiUnlock();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -77,7 +77,7 @@ typedef DWORD (*PipeSendFunc)( COMM_DHCP_REPLY *Reply );
|
||||||
#define srandom srand
|
#define srandom srand
|
||||||
|
|
||||||
void AdapterInit(VOID);
|
void AdapterInit(VOID);
|
||||||
BOOLEAN StartAdapterDiscovery(VOID);
|
HANDLE StartAdapterDiscovery(VOID);
|
||||||
void AdapterStop(VOID);
|
void AdapterStop(VOID);
|
||||||
extern PDHCP_ADAPTER AdapterGetFirst();
|
extern PDHCP_ADAPTER AdapterGetFirst();
|
||||||
extern PDHCP_ADAPTER AdapterGetNext(PDHCP_ADAPTER);
|
extern PDHCP_ADAPTER AdapterGetNext(PDHCP_ADAPTER);
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue