Module: wine Branch: master Commit: cdffa876663bf8d4efe657cf3ae0b5a9af832912 URL: http://source.winehq.org/git/wine.git/?a=commit;h=cdffa876663bf8d4efe657cf3a...
Author: Juan Lang juan.lang@gmail.com Date: Wed Aug 12 09:15:33 2009 -0700
ws2_32: Implement getsockopt(SOL_IRLMP, IRLMP_ENUMDEVICES).
---
dlls/ws2_32/socket.c | 67 ++++++++++++++++++++++++++++++++++++++++++++++++++ 1 files changed, 67 insertions(+), 0 deletions(-)
diff --git a/dlls/ws2_32/socket.c b/dlls/ws2_32/socket.c index afa8d9b..273f84a 100644 --- a/dlls/ws2_32/socket.c +++ b/dlls/ws2_32/socket.c @@ -2007,6 +2007,73 @@ INT WINAPI WS_getsockopt(SOCKET s, INT level, }/* end switch(optname) */ } /* end case NSPROTO_IPX */ #endif + +#ifdef HAVE_IRDA + case WS_SOL_IRLMP: + switch(optname) + { + case WS_IRLMP_ENUMDEVICES: + { + static const int MAX_IRDA_DEVICES = 10; + char buf[sizeof(struct irda_device_list) + + (MAX_IRDA_DEVICES - 1) * sizeof(struct irda_device_info)]; + int fd, res; + socklen_t len = sizeof(buf); + + if ( (fd = get_sock_fd( s, 0, NULL )) == -1) + return SOCKET_ERROR; + res = getsockopt( fd, SOL_IRLMP, IRLMP_ENUMDEVICES, buf, &len ); + if (res < 0) + { + SetLastError(wsaErrno()); + return SOCKET_ERROR; + } + else + { + struct irda_device_list *src = (struct irda_device_list *)buf; + DEVICELIST *dst = (DEVICELIST *)optval; + INT needed = sizeof(DEVICELIST), i; + + if (src->len > 0) + needed += (src->len - 1) * sizeof(IRDA_DEVICE_INFO); + if (*optlen < needed) + { + SetLastError(WSAEFAULT); + return SOCKET_ERROR; + } + *optlen = needed; + TRACE("IRLMP_ENUMDEVICES: %d devices found:\n", src->len); + dst->numDevice = src->len; + for (i = 0; i < src->len; i++) + { + TRACE("saddr = %08x, daddr = %08x, info = %s, hints = %02x%02x\n", + src->dev[i].saddr, src->dev[i].daddr, + src->dev[i].info, src->dev[i].hints[0], + src->dev[i].hints[1]); + memcpy( dst->Device[i].irdaDeviceID, + &src->dev[i].daddr, + sizeof(dst->Device[i].irdaDeviceID) ) ; + memcpy( dst->Device[i].irdaDeviceName, + &src->dev[i].info, + sizeof(dst->Device[i].irdaDeviceName) ) ; + memcpy( &dst->Device[i].irdaDeviceHints1, + &src->dev[i].hints[0], + sizeof(dst->Device[i].irdaDeviceHints1) ) ; + memcpy( &dst->Device[i].irdaDeviceHints2, + &src->dev[i].hints[1], + sizeof(dst->Device[i].irdaDeviceHints2) ) ; + dst->Device[i].irdaCharSet = src->dev[i].charset; + } + return 0; + } + } + default: + FIXME("IrDA optname:0x%x\n", optname); + return SOCKET_ERROR; + } + break; /* case WS_SOL_IRLMP */ +#endif + /* Levels WS_IPPROTO_TCP and WS_IPPROTO_IP convert directly */ case WS_IPPROTO_TCP: switch(optname)