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.