aboutsummaryrefslogtreecommitdiff
path: root/libjaylink/device.c
diff options
context:
space:
mode:
authorMarc Schink <jaylink-dev@marcschink.de>2016-07-29 10:33:03 +0200
committerMarc Schink <jaylink-dev@marcschink.de>2016-08-03 01:01:43 +0200
commitaee8ed0d9449a2157b1f19ba1a0de0992593d803 (patch)
treeb1459f43d3f2c7d22122d787750016e7f71f448a /libjaylink/device.c
parentabb7feafed252eefef9c8a16d0120a3017b1d934 (diff)
downloadlibjaylink-aee8ed0d9449a2157b1f19ba1a0de0992593d803.zip
libjaylink-aee8ed0d9449a2157b1f19ba1a0de0992593d803.tar.gz
libjaylink-aee8ed0d9449a2157b1f19ba1a0de0992593d803.tar.bz2
Use string for IPv4 address in jaylink_connection
Instead of representing the IPv4 address as 32-bit integer, use the much more convenient quad-dotted decimal string representation. Signed-off-by: Marc Schink <jaylink-dev@marcschink.de>
Diffstat (limited to 'libjaylink/device.c')
-rw-r--r--libjaylink/device.c86
1 files changed, 71 insertions, 15 deletions
diff --git a/libjaylink/device.c b/libjaylink/device.c
index 73e5537..cadddd8 100644
--- a/libjaylink/device.c
+++ b/libjaylink/device.c
@@ -21,6 +21,12 @@
#include <stdint.h>
#include <stdbool.h>
#include <string.h>
+#ifdef _WIN32
+#include <winsock2.h>
+#else
+#include <sys/socket.h>
+#include <arpa/inet.h>
+#endif
#include <libusb.h>
#include "libjaylink.h"
@@ -1022,12 +1028,20 @@ static void parse_conntable(struct jaylink_connection *conns,
{
unsigned int i;
size_t offset;
+ struct in_addr in;
offset = 0;
for (i = 0; i < num; i++) {
conns[i].pid = buffer_get_u32(buffer, offset);
- conns[i].hid = buffer_get_u32(buffer, offset + 4);
+
+ in.s_addr = buffer_get_u32(buffer, offset + 4);
+ /*
+ * Use inet_ntoa() instead of inet_ntop() because the latter
+ * requires at least Windows Vista.
+ */
+ strcpy(conns[i].hid, inet_ntoa(in));
+
conns[i].iid = buffer[offset + 8];
conns[i].cid = buffer[offset + 9];
conns[i].handle = buffer_get_u16(buffer, offset + 10);
@@ -1036,6 +1050,34 @@ static void parse_conntable(struct jaylink_connection *conns,
}
}
+static bool _inet_pton(const char *str, struct in_addr *in)
+{
+#ifdef _WIN32
+ int ret;
+ struct sockaddr_in sock_in;
+ int length;
+
+ length = sizeof(sock_in);
+
+ /*
+ * Use WSAStringToAddress() instead of inet_pton() because the latter
+ * requires at least Windows Vista.
+ */
+ ret = WSAStringToAddress((LPTSTR)str, AF_INET, NULL,
+ (LPSOCKADDR)&sock_in, &length);
+
+ if (ret != 0)
+ return false;
+
+ *in = sock_in.sin_addr;
+#else
+ if (inet_pton(AF_INET, str, in) != 1)
+ return false;
+#endif
+
+ return true;
+}
+
/**
* Register a connection on a device.
*
@@ -1088,26 +1130,33 @@ JAYLINK_API int jaylink_register(struct jaylink_device_handle *devh,
uint32_t size;
uint32_t table_size;
uint16_t addinfo_size;
+ struct in_addr in;
if (!devh || !connection || !connections || !count)
return JAYLINK_ERR_ARG;
ctx = devh->dev->ctx;
- ret = transport_start_write_read(devh, 14, REG_MIN_SIZE, true);
-
- if (ret != JAYLINK_OK) {
- log_err(ctx, "transport_start_write_read() failed: %i.", ret);
- return ret;
- }
buf[0] = CMD_REGISTER;
buf[1] = REG_CMD_REGISTER;
buffer_set_u32(buf, connection->pid, 2);
- buffer_set_u32(buf, connection->hid, 6);
+
+ if (!_inet_pton(connection->hid, &in))
+ return JAYLINK_ERR_ARG;
+
+ buffer_set_u32(buf, in.s_addr, 6);
+
buf[10] = connection->iid;
buf[11] = connection->cid;
buffer_set_u16(buf, connection->handle, 12);
+ ret = transport_start_write_read(devh, 14, REG_MIN_SIZE, true);
+
+ if (ret != JAYLINK_OK) {
+ log_err(ctx, "transport_start_write_read() failed: %i.", ret);
+ return ret;
+ }
+
ret = transport_write(devh, buf, 14);
if (ret != JAYLINK_OK) {
@@ -1225,26 +1274,33 @@ JAYLINK_API int jaylink_unregister(struct jaylink_device_handle *devh,
uint32_t size;
uint32_t table_size;
uint16_t addinfo_size;
+ struct in_addr in;
if (!devh || !connection || !connections || !count)
return JAYLINK_ERR_ARG;
ctx = devh->dev->ctx;
- ret = transport_start_write_read(devh, 14, REG_MIN_SIZE, true);
-
- if (ret != JAYLINK_OK) {
- log_err(ctx, "transport_start_write_read() failed: %i.", ret);
- return ret;
- }
buf[0] = CMD_REGISTER;
buf[1] = REG_CMD_UNREGISTER;
buffer_set_u32(buf, connection->pid, 2);
- buffer_set_u32(buf, connection->hid, 6);
+
+ if (!_inet_pton(connection->hid, &in))
+ return JAYLINK_ERR_ARG;
+
+ buffer_set_u32(buf, in.s_addr, 6);
+
buf[10] = connection->iid;
buf[11] = connection->cid;
buffer_set_u16(buf, connection->handle, 12);
+ ret = transport_start_write_read(devh, 14, REG_MIN_SIZE, true);
+
+ if (ret != JAYLINK_OK) {
+ log_err(ctx, "transport_start_write_read() failed: %i.", ret);
+ return ret;
+ }
+
ret = transport_write(devh, buf, 14);
if (ret != JAYLINK_OK) {