On Wed, 2013-05-08 at 15:34 -0600, Erich E. Hoover wrote:
+#ifdef HAVE_LINUX_NETLINK_H +# include <linux/netlink.h> +#endif +#ifdef HAVE_LINUX_RTNETLINK_H +# include <linux/rtnetlink.h> +#endif
+#ifdef NLMSG_OK +# define WINE_LINKMON_FAMILY PF_NETLINK +# define WINE_LINKMON_TYPE SOCK_RAW +# define WINE_LINKMON_PROTO NETLINK_ROUTE +# define WINE_LINKMON_ADDRCHANGE(b) (NLMSG_OK((struct nlmsghdr*)b, len) \
&& (((struct nlmsghdr*)b)->nlmsg_type == RTM_NEWADDR \
|| ((struct nlmsghdr*)b)->nlmsg_type == RTM_DELADDR))
+#endif
I don't see the need for these defines. WINE_LINKMON_ADDRCHANGE could be turned into a function.
@@ -2043,12 +2100,79 @@ DWORD WINAPI IpRenewAddress(PIP_ADAPTER_INDEX_MAP AdapterInfo)
- FIXME
- Stub, returns ERROR_NOT_SUPPORTED.
*/ -DWORD WINAPI NotifyAddrChange(PHANDLE Handle, LPOVERLAPPED overlapped) +DWORD WINAPI NotifyAddrChange(PHANDLE handle, LPOVERLAPPED overlapped) {
- FIXME("(Handle %p, overlapped %p): stub\n", Handle, overlapped);
- if (Handle) *Handle = INVALID_HANDLE_VALUE;
- if (overlapped) ((IO_STATUS_BLOCK *) overlapped)->u.Status = STATUS_PENDING;
- return ERROR_IO_PENDING;
+#ifdef WINE_LINKMON_FAMILY
- IO_STATUS_BLOCK *iosb = (IO_STATUS_BLOCK *) overlapped;
- struct sockaddr_nl addr;
- NTSTATUS status;
- int fd = -1;
- HANDLE h;
- TRACE("(handle %p, overlapped %p): stub\n", handle, overlapped);
- h = INVALID_HANDLE_VALUE;
- SERVER_START_REQ( create_socket )
Using a generic socket object might work I guess. The cost will be a new socket per caller whereas in theory we could serve all callers with a single socket, though that would require a dedicated server request. That might be needed anyway, if this handle somehow turns out to be special.
I know MacOS has a similar socket based mechanism that could probably be handled in the same way.