diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/Makefile.am | 2 | ||||
-rw-r--r-- | src/libusbmuxd.c | 42 | ||||
-rw-r--r-- | src/sock_stuff.h | 65 | ||||
-rw-r--r-- | src/socket.c (renamed from src/sock_stuff.c) | 113 | ||||
-rw-r--r-- | src/socket.h | 65 |
5 files changed, 152 insertions, 135 deletions
diff --git a/src/Makefile.am b/src/Makefile.am index 71f218c..4cd338e 100644 --- a/src/Makefile.am +++ b/src/Makefile.am @@ -8,7 +8,7 @@ libusbmuxd_la_LDFLAGS = $(AM_LDFLAGS) -version-info $(LIBUSBMUXD_SO_VERSION) -no libusbmuxd_la_LIBADD = libusbmuxd_la_SOURCES = \ collection.c collection.h \ - sock_stuff.c sock_stuff.h \ + socket.c socket.h \ libusbmuxd.c if WIN32 diff --git a/src/libusbmuxd.c b/src/libusbmuxd.c index 1cf6dcb..97114a8 100644 --- a/src/libusbmuxd.c +++ b/src/libusbmuxd.c @@ -69,7 +69,7 @@ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA // usbmuxd protocol #include "usbmuxd-proto.h" // socket utility functions -#include "sock_stuff.h" +#include "socket.h" // misc utility functions #include "collection.h" @@ -111,9 +111,9 @@ static usbmuxd_device_info_t *devices_find(uint32_t handle) static int connect_usbmuxd_socket() { #if defined(WIN32) || defined(__CYGWIN__) - return connect_socket("127.0.0.1", USBMUXD_SOCKET_PORT); + return socket_connect("127.0.0.1", USBMUXD_SOCKET_PORT); #else - return connect_unix_socket(USBMUXD_SOCKET_FILE); + return socket_connect_unix(USBMUXD_SOCKET_FILE); #endif } @@ -169,7 +169,7 @@ static int receive_packet(int sfd, struct usbmuxd_header *header, void **payload header->message = 0; header->tag = 0; - recv_len = recv_buf_timeout(sfd, &hdr, sizeof(hdr), 0, timeout); + recv_len = socket_receive_timeout(sfd, &hdr, sizeof(hdr), 0, timeout); if (recv_len < 0) { return recv_len; } else if ((size_t)recv_len < sizeof(hdr)) { @@ -179,7 +179,7 @@ static int receive_packet(int sfd, struct usbmuxd_header *header, void **payload uint32_t payload_size = hdr.length - sizeof(hdr); if (payload_size > 0) { payload_loc = (char*)malloc(payload_size); - if (recv_buf_timeout(sfd, payload_loc, payload_size, 0, 5000) != (int)payload_size) { + if (socket_receive_timeout(sfd, payload_loc, payload_size, 0, 5000) != (int)payload_size) { DEBUG(1, "%s: Error receiving payload of size %d\n", __func__, payload_size); free(payload_loc); return -EBADMSG; @@ -204,7 +204,7 @@ static int receive_packet(int sfd, struct usbmuxd_header *header, void **payload memcpy(header, &hdr, sizeof(hdr)); return hdr.length; } - + plist_get_string_val(node, &message); if (message) { uint64_t val = 0; @@ -338,17 +338,17 @@ static int send_packet(int sfd, uint32_t message, uint32_t tag, void *payload, u if (payload && (payload_size > 0)) { header.length += payload_size; } - int sent = send_buf(sfd, &header, sizeof(header)); + int sent = socket_send(sfd, &header, sizeof(header)); if (sent != sizeof(header)) { DEBUG(1, "%s: ERROR: could not send packet header\n", __func__); return -1; } if (payload && (payload_size > 0)) { - sent += send_buf(sfd, payload, payload_size); + sent += socket_send(sfd, payload, payload_size); } if (sent != (int)header.length) { DEBUG(1, "%s: ERROR: could not send whole packet\n", __func__); - close_socket(sfd); + socket_close(sfd); return -1; } return sent; @@ -591,11 +591,11 @@ retry: tag = ++use_tag; if (send_listen_packet(sfd, tag) <= 0) { DEBUG(1, "%s: ERROR: could not send listen packet\n", __func__); - close_socket(sfd); + socket_close(sfd); return -1; } if (usbmuxd_get_result(sfd, tag, &res, NULL) && (res != 0)) { - close_socket(sfd); + socket_close(sfd); if ((res == RESULT_BADVERSION) && (proto_version == 1)) { proto_version = 0; goto retry; @@ -685,7 +685,7 @@ static void device_monitor_cleanup(void* data) } ENDFOREACH collection_free(&devices); - close_socket(listenfd); + socket_close(listenfd); listenfd = -1; } @@ -753,7 +753,7 @@ int usbmuxd_unsubscribe() { event_cb = NULL; - shutdown_socket(listenfd, SHUT_RDWR); + socket_shutdown(listenfd, SHUT_RDWR); #ifdef WIN32 if (devmon != NULL) { @@ -842,7 +842,7 @@ retry: if (res == RESULT_BADVERSION) { proto_version = 0; } - close_socket(sfd); + socket_close(sfd); try_list_devices = 0; goto retry; } @@ -856,7 +856,7 @@ retry: if (usbmuxd_get_result(sfd, tag, &res, NULL) && (res == 0)) { listen_success = 1; } else { - close_socket(sfd); + socket_close(sfd); if ((res == RESULT_BADVERSION) && (proto_version == 1)) { proto_version = 0; goto retry; @@ -918,7 +918,7 @@ retry: got_device_list: // explicitly close connection - close_socket(sfd); + socket_close(sfd); // create copy of device info entries from collection newlist = (usbmuxd_device_info_t*)malloc(sizeof(usbmuxd_device_info_t) * (collection_count(&tmpdevs) + 1)); @@ -1009,7 +1009,7 @@ retry: } else { if ((res == RESULT_BADVERSION) && (proto_version == 1)) { proto_version = 0; - close_socket(sfd); + socket_close(sfd); goto retry; } DEBUG(1, "%s: Connect failed, Error code=%d\n", __func__, res); @@ -1021,14 +1021,14 @@ retry: return sfd; } - close_socket(sfd); + socket_close(sfd); return -1; } int usbmuxd_disconnect(int sfd) { - return close_socket(sfd); + return socket_close(sfd); } int usbmuxd_send(int sfd, const char *data, uint32_t len, uint32_t *sent_bytes) @@ -1056,7 +1056,7 @@ int usbmuxd_send(int sfd, const char *data, uint32_t len, uint32_t *sent_bytes) int usbmuxd_recv_timeout(int sfd, char *data, uint32_t len, uint32_t *recv_bytes, unsigned int timeout) { - int num_recv = recv_buf_timeout(sfd, (void*)data, len, 0, timeout); + int num_recv = socket_receive_timeout(sfd, (void*)data, len, 0, timeout); if (num_recv < 0) { *recv_bytes = 0; return num_recv; @@ -1241,5 +1241,5 @@ void libusbmuxd_set_use_inotify(int set) void libusbmuxd_set_debug_level(int level) { libusbmuxd_debug = level; - sock_stuff_set_verbose(level); + socket_set_verbose(level); } diff --git a/src/sock_stuff.h b/src/sock_stuff.h deleted file mode 100644 index 5efcd27..0000000 --- a/src/sock_stuff.h +++ /dev/null @@ -1,65 +0,0 @@ -/* - libusbmuxd - client library to talk to usbmuxd - -Copyright (C) 2009 Nikias Bassen <nikias@gmx.li> -Copyright (C) 2009 Paul Sladen <libiphone@paul.sladen.org> -Copyright (C) 2009 Martin Szulecki <opensuse@sukimashita.com> - -This library is free software; you can redistribute it and/or modify -it under the terms of the GNU Lesser General Public License as -published by the Free Software Foundation, either version 2.1 of the -License, or (at your option) any later version. - -This library is distributed in the hope that it will be useful, -but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -GNU General Public License for more details. - -You should have received a copy of the GNU Lesser General Public -License along with this program; if not, write to the Free Software -Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA - -*/ - -#ifndef __SOCK_STUFF_H -#define __SOCK_STUFF_H - -#include <stdint.h> - -enum fd_mode { - FDM_READ, - FDM_WRITE, - FDM_EXCEPT -}; -typedef enum fd_mode fd_mode; - -#ifdef WIN32 -#include <winsock2.h> -#define SHUT_RD SD_READ -#define SHUT_WR SD_WRITE -#define SHUT_RDWR SD_BOTH -#endif - -#ifndef WIN32 -int create_unix_socket(const char *filename); -int connect_unix_socket(const char *filename); -#endif -int create_socket(uint16_t port); -#if defined(WIN32) || defined(__CYGWIN__) -int connect_socket(const char *addr, uint16_t port); -#endif -int check_fd(int fd, fd_mode fdm, unsigned int timeout); - -int shutdown_socket(int fd, int how); -int close_socket(int fd); - -int recv_buf(int fd, void *data, size_t size); -int peek_buf(int fd, void *data, size_t size); -int recv_buf_timeout(int fd, void *data, size_t size, int flags, - unsigned int timeout); - -int send_buf(int fd, void *data, size_t size); - -void sock_stuff_set_verbose(int level); - -#endif /* __SOCK_STUFF_H */ diff --git a/src/sock_stuff.c b/src/socket.c index 609c8ad..c35de33 100644 --- a/src/sock_stuff.c +++ b/src/socket.c @@ -1,25 +1,23 @@ /* - libusbmuxd - client library to talk to usbmuxd - -Copyright (C) 2009 Nikias Bassen <nikias@gmx.li> -Copyright (C) 2009 Paul Sladen <libiphone@paul.sladen.org> -Copyright (C) 2009 Martin Szulecki <opensuse@sukimashita.com> - -This library is free software; you can redistribute it and/or modify -it under the terms of the GNU Lesser General Public License as -published by the Free Software Foundation, either version 2.1 of the -License, or (at your option) any later version. - -This library is distributed in the hope that it will be useful, -but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -GNU General Public License for more details. - -You should have received a copy of the GNU Lesser General Public -License along with this program; if not, write to the Free Software -Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA - -*/ + * socket.c + * + * Copyright (c) 2012 Martin Szulecki All Rights Reserved. + * Copyright (c) 2012 Nikias Bassen All Rights Reserved. + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + */ #include <stdio.h> #include <stddef.h> @@ -30,8 +28,8 @@ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA #include <sys/time.h> #include <sys/stat.h> #ifdef WIN32 -#include <windows.h> #include <winsock2.h> +#include <windows.h> static int wsa_init = 0; #else #include <sys/socket.h> @@ -40,19 +38,19 @@ static int wsa_init = 0; #include <netdb.h> #include <arpa/inet.h> #endif -#include "sock_stuff.h" +#include "socket.h" #define RECV_TIMEOUT 20000 static int verbose = 0; -void sock_stuff_set_verbose(int level) +void socket_set_verbose(int level) { verbose = level; } #ifndef WIN32 -int create_unix_socket(const char *filename) +int socket_create_unix(const char *filename) { struct sockaddr_un name; int sock; @@ -85,20 +83,20 @@ int create_unix_socket(const char *filename) if (bind(sock, (struct sockaddr *) &name, size) < 0) { perror("bind"); - close_socket(sock); + socket_close(sock); return -1; } if (listen(sock, 10) < 0) { perror("listen"); - close_socket(sock); + socket_close(sock); return -1; } return sock; } -int connect_unix_socket(const char *filename) +int socket_connect_unix(const char *filename) { struct sockaddr_un name; int sfd = -1; @@ -134,7 +132,7 @@ int connect_unix_socket(const char *filename) + strlen(name.sun_path) + 1); if (connect(sfd, (struct sockaddr *) &name, size) < 0) { - close_socket(sfd); + socket_close(sfd); if (verbose >= 2) fprintf(stderr, "%s: connect: %s\n", __func__, strerror(errno)); @@ -145,7 +143,7 @@ int connect_unix_socket(const char *filename) } #endif -int create_socket(uint16_t port) +int socket_create(uint16_t port) { int sfd = -1; int yes = 1; @@ -168,7 +166,7 @@ int create_socket(uint16_t port) if (setsockopt(sfd, SOL_SOCKET, SO_REUSEADDR, (void*)&yes, sizeof(int)) == -1) { perror("setsockopt()"); - close_socket(sfd); + socket_close(sfd); return -1; } @@ -179,21 +177,20 @@ int create_socket(uint16_t port) if (0 > bind(sfd, (struct sockaddr *) &saddr, sizeof(saddr))) { perror("bind()"); - close_socket(sfd); + socket_close(sfd); return -1; } if (listen(sfd, 1) == -1) { perror("listen()"); - close_socket(sfd); + socket_close(sfd); return -1; } return sfd; } -#if defined(WIN32) || defined(__CYGWIN__) -int connect_socket(const char *addr, uint16_t port) +int socket_connect(const char *addr, uint16_t port) { int sfd = -1; int yes = 1; @@ -235,7 +232,7 @@ int connect_socket(const char *addr, uint16_t port) if (setsockopt(sfd, SOL_SOCKET, SO_REUSEADDR, (void*)&yes, sizeof(int)) == -1) { perror("setsockopt()"); - close_socket(sfd); + socket_close(sfd); return -1; } @@ -246,15 +243,14 @@ int connect_socket(const char *addr, uint16_t port) if (connect(sfd, (struct sockaddr *) &saddr, sizeof(saddr)) < 0) { perror("connect"); - close_socket(sfd); + socket_close(sfd); return -2; } return sfd; } -#endif /* WIN32 || __CYGWIN__ */ -int check_fd(int fd, fd_mode fdm, unsigned int timeout) +int socket_check_fd(int fd, fd_mode fdm, unsigned int timeout) { fd_set fds; int sret; @@ -321,12 +317,33 @@ int check_fd(int fd, fd_mode fdm, unsigned int timeout) return sret; } -int shutdown_socket(int fd, int how) +int socket_accept(int fd, uint16_t port) +{ +#ifdef WIN32 + int addr_len; +#else + socklen_t addr_len; +#endif + int result; + struct sockaddr_in addr; + + memset(&addr, 0, sizeof(addr)); + addr.sin_family = AF_INET; + addr.sin_addr.s_addr = htonl(INADDR_ANY); + addr.sin_port = htons(port); + + addr_len = sizeof(addr); + result = accept(fd, (struct sockaddr*)&addr, &addr_len); + + return result; +} + +int socket_shutdown(int fd, int how) { return shutdown(fd, how); } -int close_socket(int fd) { +int socket_close(int fd) { #ifdef WIN32 return closesocket(fd); #else @@ -334,24 +351,24 @@ int close_socket(int fd) { #endif } -int recv_buf(int fd, void *data, size_t length) +int socket_receive(int fd, void *data, size_t length) { - return recv_buf_timeout(fd, data, length, 0, RECV_TIMEOUT); + return socket_receive_timeout(fd, data, length, 0, RECV_TIMEOUT); } -int peek_buf(int fd, void *data, size_t length) +int socket_peek(int fd, void *data, size_t length) { - return recv_buf_timeout(fd, data, length, MSG_PEEK, RECV_TIMEOUT); + return socket_receive_timeout(fd, data, length, MSG_PEEK, RECV_TIMEOUT); } -int recv_buf_timeout(int fd, void *data, size_t length, int flags, +int socket_receive_timeout(int fd, void *data, size_t length, int flags, unsigned int timeout) { int res; int result; // check if data is available - res = check_fd(fd, FDM_READ, timeout); + res = socket_check_fd(fd, FDM_READ, timeout); if (res <= 0) { return res; } @@ -369,7 +386,7 @@ int recv_buf_timeout(int fd, void *data, size_t length, int flags, return result; } -int send_buf(int fd, void *data, size_t length) +int socket_send(int fd, void *data, size_t length) { return send(fd, data, length, 0); } diff --git a/src/socket.h b/src/socket.h new file mode 100644 index 0000000..c2b2599 --- /dev/null +++ b/src/socket.h @@ -0,0 +1,65 @@ +/* + * socket.h + * + * Copyright (c) 2012 Martin Szulecki All Rights Reserved. + * Copyright (c) 2012 Nikias Bassen All Rights Reserved. + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + */ + +#ifndef __SOCKET_SOCKET_H +#define __SOCKET_SOCKET_H + +#include <stdlib.h> +#include <stdint.h> + +enum fd_mode { + FDM_READ, + FDM_WRITE, + FDM_EXCEPT +}; +typedef enum fd_mode fd_mode; + +#ifdef WIN32 +#include <winsock2.h> +#define SHUT_RD SD_READ +#define SHUT_WR SD_WRITE +#define SHUT_RDWR SD_BOTH +#else +#include <sys/socket.h> +#endif + +#ifndef WIN32 +int socket_create_unix(const char *filename); +int socket_connect_unix(const char *filename); +#endif +int socket_create(uint16_t port); +int socket_connect(const char *addr, uint16_t port); +int socket_check_fd(int fd, fd_mode fdm, unsigned int timeout); +int socket_accept(int fd, uint16_t port); + +int socket_shutdown(int fd, int how); +int socket_close(int fd); + +int socket_receive(int fd, void *data, size_t size); +int socket_peek(int fd, void *data, size_t size); +int socket_receive_timeout(int fd, void *data, size_t size, int flags, + unsigned int timeout); + +int socket_send(int fd, void *data, size_t size); + +void socket_set_verbose(int level); + +#endif /* __SOCKET_SOCKET_H */ |