ws2_32: Implement getsockopt(SOL_IRLMP, IRLMP_ENUMDEVICES).
This commit is contained in:
parent
c3f2eceaf2
commit
cdffa87666
@ -2007,6 +2007,73 @@ INT WINAPI WS_getsockopt(SOCKET s, INT level,
|
|||||||
}/* end switch(optname) */
|
}/* end switch(optname) */
|
||||||
} /* end case NSPROTO_IPX */
|
} /* end case NSPROTO_IPX */
|
||||||
#endif
|
#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 */
|
/* Levels WS_IPPROTO_TCP and WS_IPPROTO_IP convert directly */
|
||||||
case WS_IPPROTO_TCP:
|
case WS_IPPROTO_TCP:
|
||||||
switch(optname)
|
switch(optname)
|
||||||
|
Loading…
x
Reference in New Issue
Block a user