diff options
| author | 2021-09-01 15:48:32 +0200 | |
|---|---|---|
| committer | 2021-09-01 15:48:32 +0200 | |
| commit | ce7609375646cfb1e7d490579e172c37c74a0589 (patch) | |
| tree | 0e0855e3c3971fc831c1378c35169990fb21cb13 | |
| parent | 24abbb9450c723617e10a6843978aa04a576523e (diff) | |
| download | libimobiledevice-ce7609375646cfb1e7d490579e172c37c74a0589.tar.gz libimobiledevice-ce7609375646cfb1e7d490579e172c37c74a0589.tar.bz2 | |
Remove common code in favor of new libimobiledevice-glue
| -rw-r--r-- | README.md | 3 | ||||
| -rw-r--r-- | common/Makefile.am | 5 | ||||
| -rw-r--r-- | common/socket.c | 1169 | ||||
| -rw-r--r-- | common/socket.h | 68 | ||||
| -rw-r--r-- | common/thread.c | 140 | ||||
| -rw-r--r-- | common/thread.h | 76 | ||||
| -rw-r--r-- | common/userpref.c | 3 | ||||
| -rw-r--r-- | common/utils.c | 530 | ||||
| -rw-r--r-- | common/utils.h | 64 | ||||
| -rw-r--r-- | configure.ac | 3 | ||||
| -rw-r--r-- | src/Makefile.am | 2 | ||||
| -rw-r--r-- | src/afc.h | 2 | ||||
| -rw-r--r-- | src/companion_proxy.c | 1 | ||||
| -rw-r--r-- | src/companion_proxy.h | 2 | ||||
| -rw-r--r-- | src/debugserver.c | 3 | ||||
| -rw-r--r-- | src/idevice.c | 5 | ||||
| -rw-r--r-- | src/installation_proxy.h | 2 | ||||
| -rw-r--r-- | src/lockdown.c | 2 | ||||
| -rw-r--r-- | src/mobile_image_mounter.h | 2 | ||||
| -rw-r--r-- | src/notification_proxy.h | 2 | ||||
| -rw-r--r-- | src/preboard.h | 2 | ||||
| -rw-r--r-- | src/sbservices.h | 2 | ||||
| -rw-r--r-- | src/syslog_relay.h | 2 | ||||
| -rw-r--r-- | tools/Makefile.am | 54 | ||||
| -rw-r--r-- | tools/idevicebackup.c | 2 | ||||
| -rw-r--r-- | tools/idevicebackup2.c | 2 | ||||
| -rw-r--r-- | tools/idevicecrashreport.c | 2 | ||||
| -rw-r--r-- | tools/idevicedebugserverproxy.c | 4 | ||||
| -rw-r--r-- | tools/ideviceimagemounter.c | 2 | ||||
| -rw-r--r-- | tools/ideviceinfo.c | 2 | ||||
| -rw-r--r-- | tools/ideviceprovision.c | 2 | ||||
| -rw-r--r-- | tools/idevicesyslog.c | 92 |
32 files changed, 71 insertions, 2181 deletions
| @@ -62,6 +62,7 @@ sudo apt-get install \ | |||
| 62 | libtool-bin \ | 62 | libtool-bin \ |
| 63 | libplist-dev \ | 63 | libplist-dev \ |
| 64 | libusbmuxd-dev \ | 64 | libusbmuxd-dev \ |
| 65 | libimobiledevice-glue-dev \ | ||
| 65 | libssl-dev \ | 66 | libssl-dev \ |
| 66 | usbmuxd | 67 | usbmuxd |
| 67 | ``` | 68 | ``` |
| @@ -188,4 +189,4 @@ iPadOS, tvOS, watchOS, and macOS are trademarks of Apple Inc. | |||
| 188 | This project is an independent software and has not been authorized, sponsored, | 189 | This project is an independent software and has not been authorized, sponsored, |
| 189 | or otherwise approved by Apple Inc. | 190 | or otherwise approved by Apple Inc. |
| 190 | 191 | ||
| 191 | README Updated on: 2021-07-27 | 192 | README Updated on: 2021-08-30 |
diff --git a/common/Makefile.am b/common/Makefile.am index ab01b83..1a90571 100644 --- a/common/Makefile.am +++ b/common/Makefile.am | |||
| @@ -25,11 +25,8 @@ noinst_LTLIBRARIES = libinternalcommon.la | |||
| 25 | libinternalcommon_la_LIBADD = | 25 | libinternalcommon_la_LIBADD = |
| 26 | libinternalcommon_la_LDFLAGS = $(AM_LDFLAGS) -no-undefined | 26 | libinternalcommon_la_LDFLAGS = $(AM_LDFLAGS) -no-undefined |
| 27 | libinternalcommon_la_SOURCES = \ | 27 | libinternalcommon_la_SOURCES = \ |
| 28 | socket.c socket.h \ | ||
| 29 | thread.c thread.h \ | ||
| 30 | debug.c debug.h \ | 28 | debug.c debug.h \ |
| 31 | userpref.c userpref.h \ | 29 | userpref.c userpref.h |
| 32 | utils.c utils.h | ||
| 33 | 30 | ||
| 34 | if WIN32 | 31 | if WIN32 |
| 35 | libinternalcommon_la_LIBADD += -lole32 -lws2_32 | 32 | libinternalcommon_la_LIBADD += -lole32 -lws2_32 |
diff --git a/common/socket.c b/common/socket.c deleted file mode 100644 index 99a96b1..0000000 --- a/common/socket.c +++ /dev/null | |||
| @@ -1,1169 +0,0 @@ | |||
| 1 | /* | ||
| 2 | * socket.c | ||
| 3 | * | ||
| 4 | * Copyright (C) 2012-2020 Nikias Bassen <nikias@gmx.li> | ||
| 5 | * Copyright (C) 2012 Martin Szulecki <m.szulecki@libimobiledevice.org> | ||
| 6 | * | ||
| 7 | * This library is free software; you can redistribute it and/or | ||
| 8 | * modify it under the terms of the GNU Lesser General Public | ||
| 9 | * License as published by the Free Software Foundation; either | ||
| 10 | * version 2.1 of the License, or (at your option) any later version. | ||
| 11 | * | ||
| 12 | * This library is distributed in the hope that it will be useful, | ||
| 13 | * but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
| 14 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU | ||
| 15 | * Lesser General Public License for more details. | ||
| 16 | * | ||
| 17 | * You should have received a copy of the GNU Lesser General Public | ||
| 18 | * License along with this library; if not, write to the Free Software | ||
| 19 | * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA | ||
| 20 | */ | ||
| 21 | |||
| 22 | #ifdef HAVE_CONFIG_H | ||
| 23 | #include <config.h> | ||
| 24 | #endif | ||
| 25 | #include <stdio.h> | ||
| 26 | #include <stddef.h> | ||
| 27 | #include <stdlib.h> | ||
| 28 | #include <string.h> | ||
| 29 | #include <unistd.h> | ||
| 30 | #include <errno.h> | ||
| 31 | #include <sys/time.h> | ||
| 32 | #include <sys/stat.h> | ||
| 33 | #ifdef WIN32 | ||
| 34 | #include <winsock2.h> | ||
| 35 | #include <ws2tcpip.h> | ||
| 36 | #include <windows.h> | ||
| 37 | #ifndef HAVE_GETIFADDRS | ||
| 38 | #include <iphlpapi.h> | ||
| 39 | #endif | ||
| 40 | static int wsa_init = 0; | ||
| 41 | #ifndef IFF_RUNNING | ||
| 42 | #define IFF_RUNNING IFF_UP | ||
| 43 | #endif | ||
| 44 | #ifndef AI_NUMERICSERV | ||
| 45 | #define AI_NUMERICSERV 0 | ||
| 46 | #endif | ||
| 47 | #else | ||
| 48 | #include <sys/socket.h> | ||
| 49 | #include <sys/un.h> | ||
| 50 | #include <netinet/in.h> | ||
| 51 | #include <netinet/tcp.h> | ||
| 52 | #include <netdb.h> | ||
| 53 | #include <arpa/inet.h> | ||
| 54 | #include <fcntl.h> | ||
| 55 | #ifdef AF_INET6 | ||
| 56 | #include <net/if.h> | ||
| 57 | #include <ifaddrs.h> | ||
| 58 | #endif | ||
| 59 | #endif | ||
| 60 | #include "socket.h" | ||
| 61 | |||
| 62 | #define RECV_TIMEOUT 20000 | ||
| 63 | #define SEND_TIMEOUT 10000 | ||
| 64 | #define CONNECT_TIMEOUT 5000 | ||
| 65 | |||
| 66 | #ifndef EAFNOSUPPORT | ||
| 67 | #define EAFNOSUPPORT 102 | ||
| 68 | #endif | ||
| 69 | #ifndef ECONNRESET | ||
| 70 | #define ECONNRESET 108 | ||
| 71 | #endif | ||
| 72 | #ifndef ETIMEDOUT | ||
| 73 | #define ETIMEDOUT 138 | ||
| 74 | #endif | ||
| 75 | |||
| 76 | static int verbose = 0; | ||
| 77 | |||
| 78 | void socket_set_verbose(int level) | ||
| 79 | { | ||
| 80 | verbose = level; | ||
| 81 | } | ||
| 82 | |||
| 83 | const char *socket_addr_to_string(struct sockaddr *addr, char *addr_out, size_t addr_out_size) | ||
| 84 | { | ||
| 85 | #ifdef WIN32 | ||
| 86 | WSADATA wsa_data; | ||
| 87 | if (!wsa_init) { | ||
| 88 | if (WSAStartup(MAKEWORD(2,2), &wsa_data) != ERROR_SUCCESS) { | ||
| 89 | fprintf(stderr, "WSAStartup failed!\n"); | ||
| 90 | ExitProcess(-1); | ||
| 91 | } | ||
| 92 | wsa_init = 1; | ||
| 93 | } | ||
| 94 | DWORD addr_out_len = addr_out_size; | ||
| 95 | DWORD addrlen = 0; | ||
| 96 | |||
| 97 | if (addr->sa_family == AF_INET) { | ||
| 98 | addrlen = sizeof(struct sockaddr_in); | ||
| 99 | } | ||
| 100 | #ifdef AF_INET6 | ||
| 101 | else if (addr->sa_family == AF_INET6) { | ||
| 102 | addrlen = sizeof(struct sockaddr_in6); | ||
| 103 | } | ||
| 104 | #endif | ||
| 105 | else { | ||
| 106 | errno = EAFNOSUPPORT; | ||
| 107 | return NULL; | ||
| 108 | } | ||
| 109 | |||
| 110 | if (WSAAddressToString(addr, addrlen, NULL, addr_out, &addr_out_len) == 0) { | ||
| 111 | return addr_out; | ||
| 112 | } | ||
| 113 | #else | ||
| 114 | const void *addrdata = NULL; | ||
| 115 | |||
| 116 | if (addr->sa_family == AF_INET) { | ||
| 117 | addrdata = &((struct sockaddr_in*)addr)->sin_addr; | ||
| 118 | } | ||
| 119 | #ifdef AF_INET6 | ||
| 120 | else if (addr->sa_family == AF_INET6) { | ||
| 121 | addrdata = &((struct sockaddr_in6*)addr)->sin6_addr; | ||
| 122 | } | ||
| 123 | #endif | ||
| 124 | else { | ||
| 125 | errno = EAFNOSUPPORT; | ||
| 126 | return NULL; | ||
| 127 | } | ||
| 128 | |||
| 129 | if (inet_ntop(addr->sa_family, addrdata, addr_out, addr_out_size)) { | ||
| 130 | return addr_out; | ||
| 131 | } | ||
| 132 | #endif | ||
| 133 | return NULL; | ||
| 134 | } | ||
| 135 | |||
| 136 | #ifndef WIN32 | ||
| 137 | int socket_create_unix(const char *filename) | ||
| 138 | { | ||
| 139 | struct sockaddr_un name; | ||
| 140 | int sock; | ||
| 141 | #ifdef SO_NOSIGPIPE | ||
| 142 | int yes = 1; | ||
| 143 | #endif | ||
| 144 | |||
| 145 | // remove if still present | ||
| 146 | unlink(filename); | ||
| 147 | |||
| 148 | /* Create the socket. */ | ||
| 149 | sock = socket(PF_UNIX, SOCK_STREAM, 0); | ||
| 150 | if (sock < 0) { | ||
| 151 | perror("socket"); | ||
| 152 | return -1; | ||
| 153 | } | ||
| 154 | |||
| 155 | #ifdef SO_NOSIGPIPE | ||
| 156 | if (setsockopt(sock, SOL_SOCKET, SO_NOSIGPIPE, (void*)&yes, sizeof(int)) == -1) { | ||
| 157 | perror("setsockopt()"); | ||
| 158 | socket_close(sock); | ||
| 159 | return -1; | ||
| 160 | } | ||
| 161 | #endif | ||
| 162 | |||
| 163 | /* Bind a name to the socket. */ | ||
| 164 | name.sun_family = AF_UNIX; | ||
| 165 | strncpy(name.sun_path, filename, sizeof(name.sun_path)); | ||
| 166 | name.sun_path[sizeof(name.sun_path) - 1] = '\0'; | ||
| 167 | |||
| 168 | if (bind(sock, (struct sockaddr*)&name, sizeof(name)) < 0) { | ||
| 169 | perror("bind"); | ||
| 170 | socket_close(sock); | ||
| 171 | return -1; | ||
| 172 | } | ||
| 173 | |||
| 174 | if (listen(sock, 100) < 0) { | ||
| 175 | perror("listen"); | ||
| 176 | socket_close(sock); | ||
| 177 | return -1; | ||
| 178 | } | ||
| 179 | |||
| 180 | return sock; | ||
| 181 | } | ||
| 182 | |||
| 183 | int socket_connect_unix(const char *filename) | ||
| 184 | { | ||
| 185 | struct sockaddr_un name; | ||
| 186 | int sfd = -1; | ||
| 187 | struct stat fst; | ||
| 188 | #ifdef SO_NOSIGPIPE | ||
| 189 | int yes = 1; | ||
| 190 | #endif | ||
| 191 | int bufsize = 0x20000; | ||
| 192 | |||
| 193 | // check if socket file exists... | ||
| 194 | if (stat(filename, &fst) != 0) { | ||
| 195 | if (verbose >= 2) | ||
| 196 | fprintf(stderr, "%s: stat '%s': %s\n", __func__, filename, | ||
| 197 | strerror(errno)); | ||
| 198 | return -1; | ||
| 199 | } | ||
| 200 | // ... and if it is a unix domain socket | ||
| 201 | if (!S_ISSOCK(fst.st_mode)) { | ||
| 202 | if (verbose >= 2) | ||
| 203 | fprintf(stderr, "%s: File '%s' is not a socket!\n", __func__, | ||
| 204 | filename); | ||
| 205 | return -1; | ||
| 206 | } | ||
| 207 | // make a new socket | ||
| 208 | if ((sfd = socket(PF_UNIX, SOCK_STREAM, 0)) < 0) { | ||
| 209 | if (verbose >= 2) | ||
| 210 | fprintf(stderr, "%s: socket: %s\n", __func__, strerror(errno)); | ||
| 211 | return -1; | ||
| 212 | } | ||
| 213 | |||
| 214 | if (setsockopt(sfd, SOL_SOCKET, SO_SNDBUF, (void*)&bufsize, sizeof(int)) == -1) { | ||
| 215 | perror("Could not set send buffer for socket"); | ||
| 216 | } | ||
| 217 | |||
| 218 | if (setsockopt(sfd, SOL_SOCKET, SO_RCVBUF, (void*)&bufsize, sizeof(int)) == -1) { | ||
| 219 | perror("Could not set receive buffer for socket"); | ||
| 220 | } | ||
| 221 | |||
| 222 | #ifdef SO_NOSIGPIPE | ||
| 223 | if (setsockopt(sfd, SOL_SOCKET, SO_NOSIGPIPE, (void*)&yes, sizeof(int)) == -1) { | ||
| 224 | perror("setsockopt()"); | ||
| 225 | socket_close(sfd); | ||
| 226 | return -1; | ||
| 227 | } | ||
| 228 | #endif | ||
| 229 | // and connect to 'filename' | ||
| 230 | name.sun_family = AF_UNIX; | ||
| 231 | strncpy(name.sun_path, filename, sizeof(name.sun_path)); | ||
| 232 | name.sun_path[sizeof(name.sun_path) - 1] = 0; | ||
| 233 | |||
| 234 | int flags = fcntl(sfd, F_GETFL, 0); | ||
| 235 | fcntl(sfd, F_SETFL, flags | O_NONBLOCK); | ||
| 236 | |||
| 237 | do { | ||
| 238 | if (connect(sfd, (struct sockaddr*)&name, sizeof(name)) != -1) { | ||
| 239 | break; | ||
| 240 | } | ||
| 241 | if (errno == EINPROGRESS) { | ||
| 242 | fd_set fds; | ||
| 243 | FD_ZERO(&fds); | ||
| 244 | FD_SET(sfd, &fds); | ||
| 245 | |||
| 246 | struct timeval timeout; | ||
| 247 | timeout.tv_sec = CONNECT_TIMEOUT / 1000; | ||
| 248 | timeout.tv_usec = (CONNECT_TIMEOUT - (timeout.tv_sec * 1000)) * 1000; | ||
| 249 | if (select(sfd + 1, NULL, &fds, NULL, &timeout) == 1) { | ||
| 250 | int so_error; | ||
| 251 | socklen_t len = sizeof(so_error); | ||
| 252 | getsockopt(sfd, SOL_SOCKET, SO_ERROR, (void*)&so_error, &len); | ||
| 253 | if (so_error == 0) { | ||
| 254 | break; | ||
| 255 | } | ||
| 256 | } | ||
| 257 | } | ||
| 258 | socket_close(sfd); | ||
| 259 | sfd = -1; | ||
| 260 | } while (0); | ||
| 261 | |||
| 262 | if (sfd < 0) { | ||
| 263 | if (verbose >= 2) | ||
| 264 | fprintf(stderr, "%s: connect: %s\n", __func__, strerror(errno)); | ||
| 265 | return -1; | ||
| 266 | } | ||
| 267 | |||
| 268 | return sfd; | ||
| 269 | } | ||
| 270 | #endif | ||
| 271 | |||
| 272 | int socket_create(const char* addr, uint16_t port) | ||
| 273 | { | ||
| 274 | int sfd = -1; | ||
| 275 | int yes = 1; | ||
| 276 | struct addrinfo hints; | ||
| 277 | struct addrinfo *result, *rp; | ||
| 278 | char portstr[8]; | ||
| 279 | int res; | ||
| 280 | #ifdef WIN32 | ||
| 281 | WSADATA wsa_data; | ||
| 282 | if (!wsa_init) { | ||
| 283 | if (WSAStartup(MAKEWORD(2,2), &wsa_data) != ERROR_SUCCESS) { | ||
| 284 | fprintf(stderr, "WSAStartup failed!\n"); | ||
| 285 | ExitProcess(-1); | ||
| 286 | } | ||
| 287 | wsa_init = 1; | ||
| 288 | } | ||
| 289 | #endif | ||
| 290 | |||
| 291 | memset(&hints, '\0', sizeof(struct addrinfo)); | ||
| 292 | hints.ai_family = AF_UNSPEC; | ||
| 293 | hints.ai_socktype = SOCK_STREAM; | ||
| 294 | hints.ai_flags = AI_PASSIVE | AI_NUMERICSERV; | ||
| 295 | hints.ai_protocol = IPPROTO_TCP; | ||
| 296 | |||
| 297 | sprintf(portstr, "%d", port); | ||
| 298 | |||
| 299 | if (!addr) { | ||
| 300 | addr = "localhost"; | ||
| 301 | } | ||
| 302 | res = getaddrinfo(addr, portstr, &hints, &result); | ||
| 303 | if (res != 0) { | ||
| 304 | fprintf(stderr, "%s: getaddrinfo: %s\n", __func__, gai_strerror(res)); | ||
| 305 | return -1; | ||
| 306 | } | ||
| 307 | |||
| 308 | for (rp = result; rp != NULL; rp = rp->ai_next) { | ||
| 309 | sfd = socket(rp->ai_family, rp->ai_socktype, rp->ai_protocol); | ||
| 310 | if (sfd == -1) { | ||
| 311 | continue; | ||
| 312 | } | ||
| 313 | |||
| 314 | if (setsockopt(sfd, SOL_SOCKET, SO_REUSEADDR, (void*)&yes, sizeof(int)) == -1) { | ||
| 315 | perror("setsockopt()"); | ||
| 316 | socket_close(sfd); | ||
| 317 | continue; | ||
| 318 | } | ||
| 319 | |||
| 320 | #ifdef SO_NOSIGPIPE | ||
| 321 | if (setsockopt(sfd, SOL_SOCKET, SO_NOSIGPIPE, (void*)&yes, sizeof(int)) == -1) { | ||
| 322 | perror("setsockopt()"); | ||
| 323 | socket_close(sfd); | ||
| 324 | continue; | ||
| 325 | } | ||
| 326 | #endif | ||
| 327 | |||
| 328 | #if defined(AF_INET6) && defined(IPV6_V6ONLY) | ||
| 329 | if (rp->ai_family == AF_INET6) { | ||
| 330 | if (setsockopt(sfd, IPPROTO_IPV6, IPV6_V6ONLY, (void*)&yes, sizeof(int)) == -1) { | ||
| 331 | perror("setsockopt() IPV6_V6ONLY"); | ||
| 332 | } | ||
| 333 | } | ||
| 334 | #endif | ||
| 335 | |||
| 336 | if (bind(sfd, rp->ai_addr, rp->ai_addrlen) < 0) { | ||
| 337 | perror("bind()"); | ||
| 338 | socket_close(sfd); | ||
| 339 | continue; | ||
| 340 | } | ||
| 341 | |||
| 342 | if (listen(sfd, 100) < 0) { | ||
| 343 | perror("listen()"); | ||
| 344 | socket_close(sfd); | ||
| 345 | continue; | ||
| 346 | } | ||
| 347 | break; | ||
| 348 | } | ||
| 349 | |||
| 350 | freeaddrinfo(result); | ||
| 351 | |||
| 352 | if (rp == NULL) { | ||
| 353 | return -1; | ||
| 354 | } | ||
| 355 | |||
| 356 | return sfd; | ||
| 357 | } | ||
| 358 | |||
| 359 | #ifdef AF_INET6 | ||
| 360 | static uint32_t _in6_addr_scope(struct in6_addr* addr) | ||
| 361 | { | ||
| 362 | uint32_t scope = 0; | ||
| 363 | |||
| 364 | if (IN6_IS_ADDR_MULTICAST(addr)) { | ||
| 365 | if (IN6_IS_ADDR_MC_NODELOCAL(addr)) { | ||
| 366 | scope = 1; | ||
| 367 | } else if (IN6_IS_ADDR_MC_LINKLOCAL(addr)) { | ||
| 368 | scope = 2; | ||
| 369 | } else if (IN6_IS_ADDR_MC_SITELOCAL(addr)) { | ||
| 370 | scope = 5; | ||
| 371 | } | ||
| 372 | |||
| 373 | return scope; | ||
| 374 | } | ||
| 375 | |||
| 376 | if (IN6_IS_ADDR_LINKLOCAL(addr)) { | ||
| 377 | scope = 2; | ||
| 378 | } else if (IN6_IS_ADDR_LOOPBACK(addr)) { | ||
| 379 | scope = 2; | ||
| 380 | } else if (IN6_IS_ADDR_SITELOCAL(addr)) { | ||
| 381 | scope = 5; | ||
| 382 | } else if (IN6_IS_ADDR_UNSPECIFIED(addr)) { | ||
| 383 | scope = 0; | ||
| 384 | } | ||
| 385 | |||
| 386 | return scope; | ||
| 387 | } | ||
| 388 | |||
| 389 | #ifndef HAVE_GETIFADDRS | ||
| 390 | #ifdef WIN32 | ||
| 391 | |||
| 392 | struct ifaddrs { | ||
| 393 | struct ifaddrs *ifa_next; /* Next item in list */ | ||
| 394 | char *ifa_name; /* Name of interface */ | ||
| 395 | unsigned int ifa_flags; /* Flags from SIOCGIFFLAGS */ | ||
| 396 | struct sockaddr *ifa_addr; /* Address of interface */ | ||
| 397 | struct sockaddr *ifa_netmask; /* Netmask of interface */ | ||
| 398 | union { | ||
| 399 | struct sockaddr *ifu_broadaddr; /* Broadcast address of interface */ | ||
| 400 | struct sockaddr *ifu_dstaddr; /* Point-to-point destination address */ | ||
| 401 | } ifa_ifu; | ||
| 402 | #define ifa_broadaddr ifa_ifu.ifu_broadaddr | ||
| 403 | #define ifa_dstaddr ifa_ifu.ifu_dstaddr | ||
| 404 | void *ifa_data; /* Address-specific data */ | ||
| 405 | }; | ||
| 406 | |||
| 407 | #define WORKING_BUFFER_SIZE 15000 | ||
| 408 | #define MAX_TRIES 3 | ||
| 409 | |||
| 410 | static void freeifaddrs(struct ifaddrs *ifa) | ||
| 411 | { | ||
| 412 | if (!ifa) { | ||
| 413 | return; | ||
| 414 | } | ||
| 415 | free(ifa->ifa_name); | ||
| 416 | free(ifa->ifa_addr); | ||
| 417 | free(ifa->ifa_netmask); | ||
| 418 | free(ifa->ifa_dstaddr); | ||
| 419 | freeifaddrs(ifa->ifa_next); | ||
| 420 | free(ifa); | ||
| 421 | } | ||
| 422 | |||
| 423 | /* | ||
| 424 | * getifaddrs() reference implementation for win32. | ||
| 425 | * Heavily based on openpgm's implementation found here: | ||
| 426 | * https://github.com/steve-o/openpgm/blob/master/openpgm/pgm/getifaddrs.c | ||
| 427 | */ | ||
| 428 | static int getifaddrs(struct ifaddrs** ifap) | ||
| 429 | { | ||
| 430 | struct ifaddrs* ifa = NULL; | ||
| 431 | |||
| 432 | DWORD dwRetVal = 0; | ||
| 433 | |||
| 434 | PIP_ADAPTER_ADDRESSES pAddresses = NULL; | ||
| 435 | ULONG outBufLen = 0; | ||
| 436 | ULONG Iterations = 0; | ||
| 437 | |||
| 438 | ULONG flags = GAA_FLAG_INCLUDE_PREFIX | | ||
| 439 | GAA_FLAG_SKIP_ANYCAST | | ||
| 440 | GAA_FLAG_SKIP_DNS_SERVER | | ||
| 441 | GAA_FLAG_SKIP_FRIENDLY_NAME | | ||
| 442 | GAA_FLAG_SKIP_MULTICAST; | ||
| 443 | |||
| 444 | PIP_ADAPTER_ADDRESSES adapter = NULL; | ||
| 445 | |||
| 446 | if (!ifap) { | ||
| 447 | errno = EINVAL; | ||
| 448 | return -1; | ||
| 449 | } | ||
| 450 | *ifap = NULL; | ||
| 451 | |||
| 452 | outBufLen = WORKING_BUFFER_SIZE; | ||
| 453 | do { | ||
| 454 | pAddresses = (IP_ADAPTER_ADDRESSES*)malloc(outBufLen); | ||
| 455 | if (pAddresses == NULL) { | ||
| 456 | printf("Memory allocation failed for IP_ADAPTER_ADDRESSES struct\n"); | ||
| 457 | return -1; | ||
| 458 | } | ||
| 459 | dwRetVal = GetAdaptersAddresses(AF_UNSPEC, flags, NULL, pAddresses, &outBufLen); | ||
| 460 | if (dwRetVal == ERROR_BUFFER_OVERFLOW) { | ||
| 461 | free(pAddresses); | ||
| 462 | pAddresses = NULL; | ||
| 463 | } else { | ||
| 464 | break; | ||
| 465 | } | ||
| 466 | Iterations++; | ||
| 467 | } while ((dwRetVal == ERROR_BUFFER_OVERFLOW) && (Iterations < MAX_TRIES)); | ||
| 468 | |||
| 469 | if (dwRetVal != NO_ERROR) { | ||
| 470 | free(pAddresses); | ||
| 471 | return -1; | ||
| 472 | } | ||
| 473 | |||
| 474 | for (adapter = pAddresses; adapter; adapter = adapter->Next) { | ||
| 475 | int unicastIndex = 0; | ||
| 476 | for (IP_ADAPTER_UNICAST_ADDRESS *unicast = adapter->FirstUnicastAddress; unicast; unicast = unicast->Next, ++unicastIndex) { | ||
| 477 | /* ensure IP adapter */ | ||
| 478 | if (AF_INET != unicast->Address.lpSockaddr->sa_family && AF_INET6 != unicast->Address.lpSockaddr->sa_family) { | ||
| 479 | continue; | ||
| 480 | } | ||
| 481 | |||
| 482 | if (!ifa) { | ||
| 483 | ifa = malloc(sizeof(struct ifaddrs)); | ||
| 484 | if (!ifa) { | ||
| 485 | errno = ENOMEM; | ||
| 486 | free(pAddresses); | ||
| 487 | return -1; | ||
| 488 | } | ||
| 489 | *ifap = ifa; | ||
| 490 | ifa->ifa_next = NULL; | ||
| 491 | } else { | ||
| 492 | struct ifaddrs* ifanew = malloc(sizeof(struct ifaddrs)); | ||
| 493 | if (!ifanew) { | ||
| 494 | freeifaddrs(*ifap); | ||
| 495 | free(pAddresses); | ||
| 496 | errno = ENOMEM; | ||
| 497 | return -1; | ||
| 498 | } | ||
| 499 | ifa->ifa_next = ifanew; | ||
| 500 | ifa = ifanew; | ||
| 501 | ifa->ifa_next = NULL; | ||
| 502 | } | ||
| 503 | |||
| 504 | /* name */ | ||
| 505 | ifa->ifa_name = strdup(adapter->AdapterName); | ||
| 506 | |||
| 507 | /* flags */ | ||
| 508 | ifa->ifa_flags = 0; | ||
| 509 | if (IfOperStatusUp == adapter->OperStatus) | ||
| 510 | ifa->ifa_flags |= IFF_UP; | ||
| 511 | if (IF_TYPE_SOFTWARE_LOOPBACK == adapter->IfType) | ||
| 512 | ifa->ifa_flags |= IFF_LOOPBACK; | ||
| 513 | if (!(adapter->Flags & IP_ADAPTER_NO_MULTICAST)) | ||
| 514 | ifa->ifa_flags |= IFF_MULTICAST; | ||
| 515 | |||
| 516 | /* address */ | ||
| 517 | ifa->ifa_addr = (struct sockaddr*)malloc(sizeof(struct sockaddr_storage)); | ||
| 518 | memcpy(ifa->ifa_addr, unicast->Address.lpSockaddr, unicast->Address.iSockaddrLength); | ||
| 519 | |||
| 520 | /* netmask */ | ||
| 521 | ifa->ifa_netmask = (struct sockaddr*)malloc(sizeof(struct sockaddr_storage)); | ||
| 522 | memset(ifa->ifa_netmask, 0, sizeof(struct sockaddr_storage)); | ||
| 523 | |||
| 524 | /* pre-Vista must hunt for matching prefix in linked list, otherwise use | ||
| 525 | * OnLinkPrefixLength from IP_ADAPTER_UNICAST_ADDRESS structure. | ||
| 526 | * FirstPrefix requires Windows XP SP1, from SP1 to pre-Vista provides a | ||
| 527 | * single adapter prefix for each IP address. Vista and later provides | ||
| 528 | * host IP address prefix, subnet IP address, and subnet broadcast IP | ||
| 529 | * address. In addition there is a multicast and broadcast address prefix. | ||
| 530 | */ | ||
| 531 | ULONG prefixLength = 0; | ||
| 532 | |||
| 533 | #if defined( _WIN32 ) && ( _WIN32_WINNT >= 0x0600 ) | ||
| 534 | /* For a unicast IPv4 address, any value greater than 32 is an illegal | ||
| 535 | * value. For a unicast IPv6 address, any value greater than 128 is an | ||
| 536 | * illegal value. A value of 255 is commonly used to represent an illegal | ||
| 537 | * value. | ||
| 538 | * | ||
| 539 | * Windows 7 SP1 returns 64 for Teredo links which is incorrect. | ||
| 540 | */ | ||
| 541 | |||
| 542 | #define IN6_IS_ADDR_TEREDO(addr) \ | ||
| 543 | (((const uint32_t *)(addr))[0] == ntohl (0x20010000)) | ||
| 544 | |||
| 545 | if (AF_INET6 == unicast->Address.lpSockaddr->sa_family && | ||
| 546 | /* TunnelType only applies to one interface on the adapter and no | ||
| 547 | * convenient method is provided to determine which. | ||
| 548 | */ | ||
| 549 | TUNNEL_TYPE_TEREDO == adapter->TunnelType && | ||
| 550 | /* Test the interface with the known Teredo network prefix. | ||
| 551 | */ | ||
| 552 | IN6_IS_ADDR_TEREDO( &((struct sockaddr_in6*)(unicast->Address.lpSockaddr))->sin6_addr) && | ||
| 553 | /* Test that this version is actually wrong, subsequent releases from Microsoft | ||
| 554 | * may resolve the issue. | ||
| 555 | */ | ||
| 556 | 32 != unicast->OnLinkPrefixLength) | ||
| 557 | { | ||
| 558 | prefixLength = 32; | ||
| 559 | } | ||
| 560 | else | ||
| 561 | prefixLength = unicast->OnLinkPrefixLength; | ||
| 562 | #else | ||
| 563 | /* The order of linked IP_ADAPTER_UNICAST_ADDRESS structures pointed to by | ||
| 564 | * the FirstUnicastAddress member does not have any relationship with the | ||
| 565 | * order of linked IP_ADAPTER_PREFIX structures pointed to by the FirstPrefix | ||
| 566 | * member. | ||
| 567 | * | ||
| 568 | * Example enumeration: | ||
| 569 | * [ no subnet ] | ||
| 570 | * ::1/128 - address | ||
| 571 | * ff00::%1/8 - multicast (no IPv6 broadcast) | ||
| 572 | * 127.0.0.0/8 - subnet | ||
| 573 | * 127.0.0.1/32 - address | ||
| 574 | * 127.255.255.255/32 - subnet broadcast | ||
| 575 | * 224.0.0.0/4 - multicast | ||
| 576 | * 255.255.255.255/32 - broadcast | ||
| 577 | * | ||
| 578 | * Which differs from most adapters listing three IPv6: | ||
| 579 | * fe80::%10/64 - subnet | ||
| 580 | * fe80::51e9:5fe5:4202:325a%10/128 - address | ||
| 581 | * ff00::%10/8 - multicast | ||
| 582 | * | ||
| 583 | * !IfOperStatusUp IPv4 addresses are skipped: | ||
| 584 | * fe80::%13/64 - subnet | ||
| 585 | * fe80::d530:946d:e8df:8c91%13/128 - address | ||
| 586 | * ff00::%13/8 - multicast | ||
| 587 | * [ no subnet ] | ||
| 588 | * [ no address ] | ||
| 589 | * 224.0.0.0/4 - multicast | ||
| 590 | * 255.255.255.255/32 - broadcast | ||
| 591 | * | ||
| 592 | * On PTP links no multicast or broadcast addresses are returned: | ||
| 593 | * [ no subnet ] | ||
| 594 | * fe80::5efe:10.203.9.30/128 - address | ||
| 595 | * [ no multicast ] | ||
| 596 | * [ no multicast ] | ||
| 597 | * [ no broadcast ] | ||
| 598 | * | ||
| 599 | * Active primary IPv6 interfaces are a bit overloaded: | ||
| 600 | * ::/0 - default route | ||
| 601 | * 2001::/32 - global subnet | ||
| 602 | * 2001:0:4137:9e76:2443:d6:ba87:1a2a/128 - global address | ||
| 603 | * fe80::/64 - link-local subnet | ||
| 604 | * fe80::2443:d6:ba87:1a2a/128 - link-local address | ||
| 605 | * ff00::/8 - multicast | ||
| 606 | */ | ||
| 607 | |||
| 608 | #define IN_LINKLOCAL(a) ((((uint32_t) (a)) & 0xaffff0000) == 0xa9fe0000) | ||
| 609 | |||
| 610 | for (IP_ADAPTER_PREFIX *prefix = adapter->FirstPrefix; prefix; prefix = prefix->Next) { | ||
| 611 | LPSOCKADDR lpSockaddr = prefix->Address.lpSockaddr; | ||
| 612 | if (lpSockaddr->sa_family != unicast->Address.lpSockaddr->sa_family) | ||
| 613 | continue; | ||
| 614 | /* special cases */ | ||
| 615 | /* RFC2863: IPv4 interface not up */ | ||
| 616 | if (AF_INET == lpSockaddr->sa_family && adapter->OperStatus != IfOperStatusUp) { | ||
| 617 | /* RFC3927: link-local IPv4 always has 16-bit CIDR */ | ||
| 618 | if (IN_LINKLOCAL( ntohl (((struct sockaddr_in*)(unicast->Address.lpSockaddr))->sin_addr.s_addr))) { | ||
| 619 | prefixLength = 16; | ||
| 620 | } | ||
| 621 | break; | ||
| 622 | } | ||
| 623 | /* default IPv6 route */ | ||
| 624 | if (AF_INET6 == lpSockaddr->sa_family && 0 == prefix->PrefixLength && IN6_IS_ADDR_UNSPECIFIED( &((struct sockaddr_in6*)(lpSockaddr))->sin6_addr)) { | ||
| 625 | continue; | ||
| 626 | } | ||
| 627 | /* Assume unicast address for first prefix of operational adapter */ | ||
| 628 | if (AF_INET == lpSockaddr->sa_family) | ||
| 629 | if (IN_MULTICAST( ntohl (((struct sockaddr_in*)(lpSockaddr))->sin_addr.s_addr))) { | ||
| 630 | fprintf(stderr, "FATAL: first prefix is non a unicast address\n"); | ||
| 631 | break; | ||
| 632 | } | ||
| 633 | if (AF_INET6 == lpSockaddr->sa_family) | ||
| 634 | if (IN6_IS_ADDR_MULTICAST( &((struct sockaddr_in6*)(lpSockaddr))->sin6_addr)) { | ||
| 635 | fprintf(stderr, "FATAL: first prefix is not a unicast address\n"); | ||
| 636 | break; | ||
| 637 | } | ||
| 638 | /* Assume subnet or host IP address for XP backward compatibility */ | ||
| 639 | |||
| 640 | prefixLength = prefix->PrefixLength; | ||
| 641 | break; | ||
| 642 | } | ||
| 643 | #endif /* defined( _WIN32 ) && ( _WIN32_WINNT >= 0x0600 ) */ | ||
| 644 | |||
| 645 | /* map prefix to netmask */ | ||
| 646 | ifa->ifa_netmask->sa_family = unicast->Address.lpSockaddr->sa_family; | ||
| 647 | switch (unicast->Address.lpSockaddr->sa_family) { | ||
| 648 | case AF_INET: | ||
| 649 | if (0 == prefixLength || prefixLength > 32) { | ||
| 650 | prefixLength = 32; | ||
| 651 | } | ||
| 652 | #if defined( _WIN32) && ( _WIN32_WINNT >= 0x0600 ) | ||
| 653 | /* Added in Vista, but no IPv6 equivalent. */ | ||
| 654 | { | ||
| 655 | ULONG Mask; | ||
| 656 | ConvertLengthToIpv4Mask (prefixLength, &Mask); | ||
| 657 | ((struct sockaddr_in*)ifa->ifa_netmask)->sin_addr.s_addr = Mask; /* network order */ | ||
| 658 | } | ||
| 659 | #else | ||
| 660 | /* NB: left-shift of full bit-width is undefined in C standard. */ | ||
| 661 | ((struct sockaddr_in*)ifa->ifa_netmask)->sin_addr.s_addr = htonl( 0xffffffffU << ( 32 - prefixLength ) ); | ||
| 662 | #endif | ||
| 663 | break; | ||
| 664 | |||
| 665 | case AF_INET6: | ||
| 666 | if (0 == prefixLength || prefixLength > 128) { | ||
| 667 | prefixLength = 128; | ||
| 668 | } | ||
| 669 | for (LONG i = prefixLength, j = 0; i > 0; i -= 8, ++j) { | ||
| 670 | ((struct sockaddr_in6*)ifa->ifa_netmask)->sin6_addr.s6_addr[ j ] = i >= 8 ? 0xff : (ULONG)(( 0xffU << ( 8 - i ) ) & 0xffU ); | ||
| 671 | } | ||
| 672 | break; | ||
| 673 | default: | ||
| 674 | break; | ||
| 675 | } | ||
| 676 | } | ||
| 677 | } | ||
| 678 | free(pAddresses); | ||
| 679 | |||
| 680 | return 0; | ||
| 681 | } | ||
| 682 | #else | ||
| 683 | #error No reference implementation for getifaddrs available for this platform. | ||
| 684 | #endif | ||
| 685 | #endif | ||
| 686 | |||
| 687 | static int32_t _sockaddr_in6_scope_id(struct sockaddr_in6* addr) | ||
| 688 | { | ||
| 689 | int32_t res = -1; | ||
| 690 | struct ifaddrs *ifaddr = NULL, *ifa = NULL; | ||
| 691 | uint32_t addr_scope; | ||
| 692 | |||
| 693 | /* get scope for requested address */ | ||
| 694 | addr_scope = _in6_addr_scope(&addr->sin6_addr); | ||
| 695 | if (addr_scope == 0) { | ||
| 696 | /* global scope doesn't need a specific scope id */ | ||
| 697 | return addr_scope; | ||
| 698 | } | ||
| 699 | |||
| 700 | /* get interfaces */ | ||
| 701 | if (getifaddrs(&ifaddr) == -1) { | ||
| 702 | perror("getifaddrs"); | ||
| 703 | return res; | ||
| 704 | } | ||
| 705 | |||
| 706 | /* loop over interfaces */ | ||
| 707 | for (ifa = ifaddr; ifa != NULL; ifa = ifa->ifa_next) { | ||
| 708 | /* skip if no address is available */ | ||
| 709 | if (ifa->ifa_addr == NULL) { | ||
| 710 | continue; | ||
| 711 | } | ||
| 712 | |||
| 713 | /* skip if wrong family */ | ||
| 714 | if (ifa->ifa_addr->sa_family != AF_INET6) { | ||
| 715 | continue; | ||
| 716 | } | ||
| 717 | |||
| 718 | /* skip if not up */ | ||
| 719 | if ((ifa->ifa_flags & IFF_UP) == 0) { | ||
| 720 | continue; | ||
| 721 | } | ||
| 722 | |||
| 723 | /* skip if not running */ | ||
| 724 | if ((ifa->ifa_flags & IFF_RUNNING) == 0) { | ||
| 725 | continue; | ||
| 726 | } | ||
| 727 | |||
| 728 | struct sockaddr_in6* addr_in = (struct sockaddr_in6*)ifa->ifa_addr; | ||
| 729 | |||
| 730 | /* skip if scopes do not match */ | ||
| 731 | if (_in6_addr_scope(&addr_in->sin6_addr) != addr_scope) { | ||
| 732 | continue; | ||
| 733 | } | ||
| 734 | |||
| 735 | /* use if address is equal */ | ||
| 736 | if (memcmp(&addr->sin6_addr.s6_addr, &addr_in->sin6_addr.s6_addr, sizeof(addr_in->sin6_addr.s6_addr)) == 0) { | ||
| 737 | /* if scope id equals the requested one then assume it was valid */ | ||
| 738 | if (addr->sin6_scope_id == addr_in->sin6_scope_id) { | ||
| 739 | res = addr_in->sin6_scope_id; | ||
| 740 | break; | ||
| 741 | } | ||
| 742 | |||
| 743 | if ((addr_in->sin6_scope_id > addr->sin6_scope_id) && (res >= 0)) { | ||
| 744 | // use last valid scope id as we're past the requested scope id | ||
| 745 | break; | ||
| 746 | } | ||
| 747 | res = addr_in->sin6_scope_id; | ||
| 748 | continue; | ||
| 749 | } | ||
| 750 | |||
| 751 | /* skip loopback interface if not already matched exactly above */ | ||
| 752 | if ((ifa->ifa_flags & IFF_LOOPBACK) != 0) { | ||
| 753 | continue; | ||
| 754 | } | ||
| 755 | |||
| 756 | if ((addr_in->sin6_scope_id > addr->sin6_scope_id) && (res >= 0)) { | ||
| 757 | // use last valid scope id as we're past the requested scope id | ||
| 758 | break; | ||
| 759 | } | ||
| 760 | |||
| 761 | res = addr_in->sin6_scope_id; | ||
| 762 | |||
| 763 | /* if scope id equals the requested one then assume it was valid */ | ||
| 764 | if (addr->sin6_scope_id == addr_in->sin6_scope_id) { | ||
| 765 | /* set the scope id of this interface as most likely candidate */ | ||
| 766 | break; | ||
| 767 | } | ||
| 768 | } | ||
| 769 | |||
| 770 | freeifaddrs(ifaddr); | ||
| 771 | |||
| 772 | return res; | ||
| 773 | } | ||
| 774 | #endif | ||
| 775 | |||
| 776 | int socket_connect_addr(struct sockaddr* addr, uint16_t port) | ||
| 777 | { | ||
| 778 | int sfd = -1; | ||
| 779 | int yes = 1; | ||
| 780 | int bufsize = 0x20000; | ||
| 781 | int addrlen = 0; | ||
| 782 | #ifdef WIN32 | ||
| 783 | u_long l_yes = 1; | ||
| 784 | WSADATA wsa_data; | ||
| 785 | if (!wsa_init) { | ||
| 786 | if (WSAStartup(MAKEWORD(2,2), &wsa_data) != ERROR_SUCCESS) { | ||
| 787 | fprintf(stderr, "WSAStartup failed!\n"); | ||
| 788 | ExitProcess(-1); | ||
| 789 | } | ||
| 790 | wsa_init = 1; | ||
| 791 | } | ||
| 792 | #endif | ||
| 793 | |||
| 794 | if (addr->sa_family == AF_INET) { | ||
| 795 | struct sockaddr_in* addr_in = (struct sockaddr_in*)addr; | ||
| 796 | addr_in->sin_port = htons(port); | ||
| 797 | addrlen = sizeof(struct sockaddr_in); | ||
| 798 | } | ||
| 799 | #ifdef AF_INET6 | ||
| 800 | else if (addr->sa_family == AF_INET6) { | ||
| 801 | struct sockaddr_in6* addr_in = (struct sockaddr_in6*)addr; | ||
| 802 | addr_in->sin6_port = htons(port); | ||
| 803 | |||
| 804 | /* | ||
| 805 | * IPv6 Routing Magic: | ||
| 806 | * | ||
| 807 | * If the scope of the address is a link-local one, IPv6 requires the | ||
| 808 | * scope id set to an interface number to allow proper routing. However, | ||
| 809 | * as the provided sockaddr might contain a wrong scope id, we must find | ||
| 810 | * a scope id from a suitable interface on this system or routing might | ||
| 811 | * fail. An IPv6 guru should have another look though... | ||
| 812 | */ | ||
| 813 | addr_in->sin6_scope_id = _sockaddr_in6_scope_id(addr_in); | ||
| 814 | |||
| 815 | addrlen = sizeof(struct sockaddr_in6); | ||
| 816 | } | ||
| 817 | #endif | ||
| 818 | else { | ||
| 819 | fprintf(stderr, "ERROR: Unsupported address family"); | ||
| 820 | return -1; | ||
| 821 | } | ||
| 822 | |||
| 823 | sfd = socket(addr->sa_family, SOCK_STREAM, IPPROTO_TCP); | ||
| 824 | if (sfd == -1) { | ||
| 825 | perror("socket()"); | ||
| 826 | return -1; | ||
| 827 | } | ||
| 828 | |||
| 829 | #ifdef SO_NOSIGPIPE | ||
| 830 | if (setsockopt(sfd, SOL_SOCKET, SO_NOSIGPIPE, (void*)&yes, sizeof(int)) == -1) { | ||
| 831 | perror("setsockopt()"); | ||
| 832 | socket_close(sfd); | ||
| 833 | return -1; | ||
| 834 | } | ||
| 835 | #endif | ||
| 836 | |||
| 837 | if (setsockopt(sfd, SOL_SOCKET, SO_REUSEADDR, (void*)&yes, sizeof(int)) == -1) { | ||
| 838 | perror("setsockopt()"); | ||
| 839 | socket_close(sfd); | ||
| 840 | return -1; | ||
| 841 | } | ||
| 842 | |||
| 843 | #ifdef WIN32 | ||
| 844 | ioctlsocket(sfd, FIONBIO, &l_yes); | ||
| 845 | #else | ||
| 846 | int flags = fcntl(sfd, F_GETFL, 0); | ||
| 847 | fcntl(sfd, F_SETFL, flags | O_NONBLOCK); | ||
| 848 | #endif | ||
| 849 | |||
| 850 | do { | ||
| 851 | if (connect(sfd, addr, addrlen) != -1) { | ||
| 852 | break; | ||
| 853 | } | ||
| 854 | #ifdef WIN32 | ||
| 855 | if (WSAGetLastError() == WSAEWOULDBLOCK) | ||
| 856 | #else | ||
| 857 | if (errno == EINPROGRESS) | ||
| 858 | #endif | ||
| 859 | { | ||
| 860 | fd_set fds; | ||
| 861 | FD_ZERO(&fds); | ||
| 862 | FD_SET(sfd, &fds); | ||
| 863 | |||
| 864 | struct timeval timeout; | ||
| 865 | timeout.tv_sec = CONNECT_TIMEOUT / 1000; | ||
| 866 | timeout.tv_usec = (CONNECT_TIMEOUT - (timeout.tv_sec * 1000)) * 1000; | ||
| 867 | if (select(sfd + 1, NULL, &fds, NULL, &timeout) == 1) { | ||
| 868 | int so_error; | ||
| 869 | socklen_t len = sizeof(so_error); | ||
| 870 | getsockopt(sfd, SOL_SOCKET, SO_ERROR, (void*)&so_error, &len); | ||
| 871 | if (so_error == 0) { | ||
| 872 | errno = 0; | ||
| 873 | break; | ||
| 874 | } | ||
| 875 | errno = so_error; | ||
| 876 | } | ||
| 877 | } | ||
| 878 | socket_close(sfd); | ||
| 879 | sfd = -1; | ||
| 880 | } while (0); | ||
| 881 | |||
| 882 | if (sfd < 0) { | ||
| 883 | if (verbose >= 2) { | ||
| 884 | char addrtxt[48]; | ||
| 885 | socket_addr_to_string(addr, addrtxt, sizeof(addrtxt)); | ||
| 886 | fprintf(stderr, "%s: Could not connect to %s port %d\n", __func__, addrtxt, port); | ||
| 887 | } | ||
| 888 | return -1; | ||
| 889 | } | ||
| 890 | |||
| 891 | if (setsockopt(sfd, IPPROTO_TCP, TCP_NODELAY, (void*)&yes, sizeof(int)) == -1) { | ||
| 892 | perror("Could not set TCP_NODELAY on socket"); | ||
| 893 | } | ||
| 894 | |||
| 895 | if (setsockopt(sfd, SOL_SOCKET, SO_SNDBUF, (void*)&bufsize, sizeof(int)) == -1) { | ||
| 896 | perror("Could not set send buffer for socket"); | ||
| 897 | } | ||
| 898 | |||
| 899 | if (setsockopt(sfd, SOL_SOCKET, SO_RCVBUF, (void*)&bufsize, sizeof(int)) == -1) { | ||
| 900 | perror("Could not set receive buffer for socket"); | ||
| 901 | } | ||
| 902 | |||
| 903 | return sfd; | ||
| 904 | } | ||
| 905 | |||
| 906 | int socket_connect(const char *addr, uint16_t port) | ||
| 907 | { | ||
| 908 | int sfd = -1; | ||
| 909 | int yes = 1; | ||
| 910 | int bufsize = 0x20000; | ||
| 911 | struct addrinfo hints; | ||
| 912 | struct addrinfo *result, *rp; | ||
| 913 | char portstr[8]; | ||
| 914 | int res; | ||
| 915 | #ifdef WIN32 | ||
| 916 | u_long l_yes = 1; | ||
| 917 | WSADATA wsa_data; | ||
| 918 | if (!wsa_init) { | ||
| 919 | if (WSAStartup(MAKEWORD(2,2), &wsa_data) != ERROR_SUCCESS) { | ||
| 920 | fprintf(stderr, "WSAStartup failed!\n"); | ||
| 921 | ExitProcess(-1); | ||
| 922 | } | ||
| 923 | wsa_init = 1; | ||
| 924 | } | ||
| 925 | #else | ||
| 926 | int flags = 0; | ||
| 927 | #endif | ||
| 928 | |||
| 929 | if (!addr) { | ||
| 930 | errno = EINVAL; | ||
| 931 | return -1; | ||
| 932 | } | ||
| 933 | |||
| 934 | memset(&hints, '\0', sizeof(struct addrinfo)); | ||
| 935 | hints.ai_family = AF_UNSPEC; | ||
| 936 | hints.ai_socktype = SOCK_STREAM; | ||
| 937 | hints.ai_flags = AI_NUMERICSERV; | ||
| 938 | hints.ai_protocol = IPPROTO_TCP; | ||
| 939 | |||
| 940 | sprintf(portstr, "%d", port); | ||
| 941 | |||
| 942 | res = getaddrinfo(addr, portstr, &hints, &result); | ||
| 943 | if (res != 0) { | ||
| 944 | fprintf(stderr, "%s: getaddrinfo: %s\n", __func__, gai_strerror(res)); | ||
| 945 | return -1; | ||
| 946 | } | ||
| 947 | |||
| 948 | for (rp = result; rp != NULL; rp = rp->ai_next) { | ||
| 949 | sfd = socket(rp->ai_family, rp->ai_socktype, rp->ai_protocol); | ||
| 950 | if (sfd == -1) { | ||
| 951 | continue; | ||
| 952 | } | ||
| 953 | |||
| 954 | #ifdef SO_NOSIGPIPE | ||
| 955 | if (setsockopt(sfd, SOL_SOCKET, SO_NOSIGPIPE, (void*)&yes, sizeof(int)) == -1) { | ||
| 956 | perror("setsockopt()"); | ||
| 957 | socket_close(sfd); | ||
| 958 | return -1; | ||
| 959 | } | ||
| 960 | #endif | ||
| 961 | |||
| 962 | if (setsockopt(sfd, SOL_SOCKET, SO_REUSEADDR, (void*)&yes, sizeof(int)) == -1) { | ||
| 963 | perror("setsockopt()"); | ||
| 964 | socket_close(sfd); | ||
| 965 | continue; | ||
| 966 | } | ||
| 967 | |||
| 968 | #ifdef WIN32 | ||
| 969 | ioctlsocket(sfd, FIONBIO, &l_yes); | ||
| 970 | #else | ||
| 971 | flags = fcntl(sfd, F_GETFL, 0); | ||
| 972 | fcntl(sfd, F_SETFL, flags | O_NONBLOCK); | ||
| 973 | #endif | ||
| 974 | |||
| 975 | if (connect(sfd, rp->ai_addr, rp->ai_addrlen) != -1) { | ||
| 976 | break; | ||
| 977 | } | ||
| 978 | #ifdef WIN32 | ||
| 979 | if (WSAGetLastError() == WSAEWOULDBLOCK) | ||
| 980 | #else | ||
| 981 | if (errno == EINPROGRESS) | ||
| 982 | #endif | ||
| 983 | { | ||
| 984 | fd_set fds; | ||
| 985 | FD_ZERO(&fds); | ||
| 986 | FD_SET(sfd, &fds); | ||
| 987 | |||
| 988 | struct timeval timeout; | ||
| 989 | timeout.tv_sec = CONNECT_TIMEOUT / 1000; | ||
| 990 | timeout.tv_usec = (CONNECT_TIMEOUT - (timeout.tv_sec * 1000)) * 1000; | ||
| 991 | if (select(sfd + 1, NULL, &fds, NULL, &timeout) == 1) { | ||
| 992 | int so_error; | ||
| 993 | socklen_t len = sizeof(so_error); | ||
| 994 | getsockopt(sfd, SOL_SOCKET, SO_ERROR, (void*)&so_error, &len); | ||
| 995 | if (so_error == 0) { | ||
| 996 | break; | ||
| 997 | } | ||
| 998 | } | ||
| 999 | } | ||
| 1000 | socket_close(sfd); | ||
| 1001 | } | ||
| 1002 | |||
| 1003 | freeaddrinfo(result); | ||
| 1004 | |||
| 1005 | if (rp == NULL) { | ||
| 1006 | if (verbose >= 2) | ||
| 1007 | fprintf(stderr, "%s: Could not connect to %s:%d\n", __func__, addr, port); | ||
| 1008 | return -1; | ||
| 1009 | } | ||
| 1010 | |||
| 1011 | if (setsockopt(sfd, IPPROTO_TCP, TCP_NODELAY, (void*)&yes, sizeof(int)) == -1) { | ||
| 1012 | perror("Could not set TCP_NODELAY on socket"); | ||
| 1013 | } | ||
| 1014 | |||
| 1015 | if (setsockopt(sfd, SOL_SOCKET, SO_SNDBUF, (void*)&bufsize, sizeof(int)) == -1) { | ||
| 1016 | perror("Could not set send buffer for socket"); | ||
| 1017 | } | ||
| 1018 | |||
| 1019 | if (setsockopt(sfd, SOL_SOCKET, SO_RCVBUF, (void*)&bufsize, sizeof(int)) == -1) { | ||
| 1020 | perror("Could not set receive buffer for socket"); | ||
| 1021 | } | ||
| 1022 | |||
| 1023 | return sfd; | ||
| 1024 | } | ||
| 1025 | |||
| 1026 | int socket_check_fd(int fd, fd_mode fdm, unsigned int timeout) | ||
| 1027 | { | ||
| 1028 | fd_set fds; | ||
| 1029 | int sret; | ||
| 1030 | int eagain; | ||
| 1031 | struct timeval to; | ||
| 1032 | struct timeval *pto; | ||
| 1033 | |||
| 1034 | if (fd < 0) { | ||
| 1035 | if (verbose >= 2) | ||
| 1036 | fprintf(stderr, "ERROR: invalid fd in check_fd %d\n", fd); | ||
| 1037 | return -1; | ||
| 1038 | } | ||
| 1039 | |||
| 1040 | FD_ZERO(&fds); | ||
| 1041 | FD_SET(fd, &fds); | ||
| 1042 | |||
| 1043 | sret = -1; | ||
| 1044 | |||
| 1045 | do { | ||
| 1046 | if (timeout > 0) { | ||
| 1047 | to.tv_sec = (time_t) (timeout / 1000); | ||
| 1048 | to.tv_usec = (time_t) ((timeout - (to.tv_sec * 1000)) * 1000); | ||
| 1049 | pto = &to; | ||
| 1050 | } else { | ||
| 1051 | pto = NULL; | ||
| 1052 | } | ||
| 1053 | eagain = 0; | ||
| 1054 | switch (fdm) { | ||
| 1055 | case FDM_READ: | ||
| 1056 | sret = select(fd + 1, &fds, NULL, NULL, pto); | ||
| 1057 | break; | ||
| 1058 | case FDM_WRITE: | ||
| 1059 | sret = select(fd + 1, NULL, &fds, NULL, pto); | ||
| 1060 | break; | ||
| 1061 | case FDM_EXCEPT: | ||
| 1062 | sret = select(fd + 1, NULL, NULL, &fds, pto); | ||
| 1063 | break; | ||
| 1064 | default: | ||
| 1065 | return -1; | ||
| 1066 | } | ||
| 1067 | |||
| 1068 | if (sret < 0) { | ||
| 1069 | switch (errno) { | ||
| 1070 | case EINTR: | ||
| 1071 | // interrupt signal in select | ||
| 1072 | if (verbose >= 2) | ||
| 1073 | fprintf(stderr, "%s: EINTR\n", __func__); | ||
| 1074 | eagain = 1; | ||
| 1075 | break; | ||
| 1076 | case EAGAIN: | ||
| 1077 | if (verbose >= 2) | ||
| 1078 | fprintf(stderr, "%s: EAGAIN\n", __func__); | ||
| 1079 | break; | ||
| 1080 | default: | ||
| 1081 | if (verbose >= 2) | ||
| 1082 | fprintf(stderr, "%s: select failed: %s\n", __func__, | ||
| 1083 | strerror(errno)); | ||
| 1084 | return -1; | ||
| 1085 | } | ||
| 1086 | } else if (sret == 0) { | ||
| 1087 | return -ETIMEDOUT; | ||
| 1088 | } | ||
| 1089 | } while (eagain); | ||
| 1090 | |||
| 1091 | return sret; | ||
| 1092 | } | ||
| 1093 | |||
| 1094 | int socket_accept(int fd, uint16_t port) | ||
| 1095 | { | ||
| 1096 | #ifdef WIN32 | ||
| 1097 | int addr_len; | ||
| 1098 | #else | ||
| 1099 | socklen_t addr_len; | ||
| 1100 | #endif | ||
| 1101 | int result; | ||
| 1102 | struct sockaddr_storage addr; | ||
| 1103 | addr_len = sizeof(addr); | ||
| 1104 | |||
| 1105 | result = accept(fd, (struct sockaddr*)&addr, &addr_len); | ||
| 1106 | |||
| 1107 | return result; | ||
| 1108 | } | ||
| 1109 | |||
| 1110 | int socket_shutdown(int fd, int how) | ||
| 1111 | { | ||
| 1112 | return shutdown(fd, how); | ||
| 1113 | } | ||
| 1114 | |||
| 1115 | int socket_close(int fd) { | ||
| 1116 | #ifdef WIN32 | ||
| 1117 | return closesocket(fd); | ||
| 1118 | #else | ||
| 1119 | return close(fd); | ||
| 1120 | #endif | ||
| 1121 | } | ||
| 1122 | |||
| 1123 | int socket_receive(int fd, void *data, size_t length) | ||
| 1124 | { | ||
| 1125 | return socket_receive_timeout(fd, data, length, 0, RECV_TIMEOUT); | ||
| 1126 | } | ||
| 1127 | |||
| 1128 | int socket_peek(int fd, void *data, size_t length) | ||
| 1129 | { | ||
| 1130 | return socket_receive_timeout(fd, data, length, MSG_PEEK, RECV_TIMEOUT); | ||
| 1131 | } | ||
| 1132 | |||
| 1133 | int socket_receive_timeout(int fd, void *data, size_t length, int flags, | ||
| 1134 | unsigned int timeout) | ||
| 1135 | { | ||
| 1136 | int res; | ||
| 1137 | int result; | ||
| 1138 | |||
| 1139 | // check if data is available | ||
| 1140 | res = socket_check_fd(fd, FDM_READ, timeout); | ||
| 1141 | if (res <= 0) { | ||
| 1142 | return res; | ||
| 1143 | } | ||
| 1144 | // if we get here, there _is_ data available | ||
| 1145 | result = recv(fd, data, length, flags); | ||
| 1146 | if (res > 0 && result == 0) { | ||
| 1147 | // but this is an error condition | ||
| 1148 | if (verbose >= 3) | ||
| 1149 | fprintf(stderr, "%s: fd=%d recv returned 0\n", __func__, fd); | ||
| 1150 | return -ECONNRESET; | ||
| 1151 | } | ||
| 1152 | if (result < 0) { | ||
| 1153 | return -errno; | ||
| 1154 | } | ||
| 1155 | return result; | ||
| 1156 | } | ||
| 1157 | |||
| 1158 | int socket_send(int fd, void *data, size_t length) | ||
| 1159 | { | ||
| 1160 | int flags = 0; | ||
| 1161 | int res = socket_check_fd(fd, FDM_WRITE, SEND_TIMEOUT); | ||
| 1162 | if (res <= 0) { | ||
| 1163 | return res; | ||
| 1164 | } | ||
| 1165 | #ifdef MSG_NOSIGNAL | ||
| 1166 | flags |= MSG_NOSIGNAL; | ||
| 1167 | #endif | ||
| 1168 | return send(fd, data, length, flags); | ||
| 1169 | } | ||
diff --git a/common/socket.h b/common/socket.h deleted file mode 100644 index 9567270..0000000 --- a/common/socket.h +++ /dev/null | |||
| @@ -1,68 +0,0 @@ | |||
| 1 | /* | ||
| 2 | * socket.h | ||
| 3 | * | ||
| 4 | * Copyright (C) 2012-2020 Nikias Bassen <nikias@gmx.li> | ||
| 5 | * Copyright (C) 2012 Martin Szulecki <m.szulecki@libimobiledevice.org> | ||
| 6 | * | ||
| 7 | * This library is free software; you can redistribute it and/or | ||
| 8 | * modify it under the terms of the GNU Lesser General Public | ||
| 9 | * License as published by the Free Software Foundation; either | ||
| 10 | * version 2.1 of the License, or (at your option) any later version. | ||
| 11 | * | ||
| 12 | * This library is distributed in the hope that it will be useful, | ||
| 13 | * but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
| 14 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU | ||
| 15 | * Lesser General Public License for more details. | ||
| 16 | * | ||
| 17 | * You should have received a copy of the GNU Lesser General Public | ||
| 18 | * License along with this library; if not, write to the Free Software | ||
| 19 | * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA | ||
| 20 | */ | ||
| 21 | |||
| 22 | #ifndef SOCKET_SOCKET_H | ||
| 23 | #define SOCKET_SOCKET_H | ||
| 24 | |||
| 25 | #include <stdlib.h> | ||
| 26 | #include <stdint.h> | ||
| 27 | |||
| 28 | enum fd_mode { | ||
| 29 | FDM_READ, | ||
| 30 | FDM_WRITE, | ||
| 31 | FDM_EXCEPT | ||
| 32 | }; | ||
| 33 | typedef enum fd_mode fd_mode; | ||
| 34 | |||
| 35 | #ifdef WIN32 | ||
| 36 | #include <winsock2.h> | ||
| 37 | #define SHUT_RD SD_READ | ||
| 38 | #define SHUT_WR SD_WRITE | ||
| 39 | #define SHUT_RDWR SD_BOTH | ||
| 40 | #else | ||
| 41 | #include <sys/socket.h> | ||
| 42 | #endif | ||
| 43 | |||
| 44 | #ifndef WIN32 | ||
| 45 | int socket_create_unix(const char *filename); | ||
| 46 | int socket_connect_unix(const char *filename); | ||
| 47 | #endif | ||
| 48 | int socket_create(const char *addr, uint16_t port); | ||
| 49 | int socket_connect_addr(struct sockaddr *addr, uint16_t port); | ||
| 50 | int socket_connect(const char *addr, uint16_t port); | ||
| 51 | int socket_check_fd(int fd, fd_mode fdm, unsigned int timeout); | ||
| 52 | int socket_accept(int fd, uint16_t port); | ||
| 53 | |||
| 54 | int socket_shutdown(int fd, int how); | ||
| 55 | int socket_close(int fd); | ||
| 56 | |||
| 57 | int socket_receive(int fd, void *data, size_t length); | ||
| 58 | int socket_peek(int fd, void *data, size_t length); | ||
| 59 | int socket_receive_timeout(int fd, void *data, size_t length, int flags, | ||
| 60 | unsigned int timeout); | ||
| 61 | |||
| 62 | int socket_send(int fd, void *data, size_t length); | ||
| 63 | |||
| 64 | void socket_set_verbose(int level); | ||
| 65 | |||
| 66 | const char *socket_addr_to_string(struct sockaddr *addr, char *addr_out, size_t addr_out_size); | ||
| 67 | |||
| 68 | #endif /* SOCKET_SOCKET_H */ | ||
diff --git a/common/thread.c b/common/thread.c deleted file mode 100644 index eb535ab..0000000 --- a/common/thread.c +++ /dev/null | |||
| @@ -1,140 +0,0 @@ | |||
| 1 | /* | ||
| 2 | * thread.c | ||
| 3 | * | ||
| 4 | * Copyright (c) 2012-2019 Nikias Bassen, All Rights Reserved. | ||
| 5 | * Copyright (c) 2012 Martin Szulecki, All Rights Reserved. | ||
| 6 | * | ||
| 7 | * This library is free software; you can redistribute it and/or | ||
| 8 | * modify it under the terms of the GNU Lesser General Public | ||
| 9 | * License as published by the Free Software Foundation; either | ||
| 10 | * version 2.1 of the License, or (at your option) any later version. | ||
| 11 | * | ||
| 12 | * This library is distributed in the hope that it will be useful, | ||
| 13 | * but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
| 14 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU | ||
| 15 | * Lesser General Public License for more details. | ||
| 16 | * | ||
| 17 | * You should have received a copy of the GNU Lesser General Public | ||
| 18 | * License along with this library; if not, write to the Free Software | ||
| 19 | * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA | ||
| 20 | */ | ||
| 21 | |||
| 22 | #ifdef HAVE_CONFIG_H | ||
| 23 | #include <config.h> | ||
| 24 | #endif | ||
| 25 | #include "thread.h" | ||
| 26 | |||
| 27 | int thread_new(THREAD_T *thread, thread_func_t thread_func, void* data) | ||
| 28 | { | ||
| 29 | #ifdef WIN32 | ||
| 30 | HANDLE th = CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)thread_func, data, 0, NULL); | ||
| 31 | if (th == NULL) { | ||
| 32 | return -1; | ||
| 33 | } | ||
| 34 | *thread = th; | ||
| 35 | return 0; | ||
| 36 | #else | ||
| 37 | int res = pthread_create(thread, NULL, thread_func, data); | ||
| 38 | return res; | ||
| 39 | #endif | ||
| 40 | } | ||
| 41 | |||
| 42 | void thread_detach(THREAD_T thread) | ||
| 43 | { | ||
| 44 | #ifdef WIN32 | ||
| 45 | CloseHandle(thread); | ||
| 46 | #else | ||
| 47 | pthread_detach(thread); | ||
| 48 | #endif | ||
| 49 | } | ||
| 50 | |||
| 51 | void thread_free(THREAD_T thread) | ||
| 52 | { | ||
| 53 | #ifdef WIN32 | ||
| 54 | CloseHandle(thread); | ||
| 55 | #endif | ||
| 56 | } | ||
| 57 | |||
| 58 | int thread_join(THREAD_T thread) | ||
| 59 | { | ||
| 60 | /* wait for thread to complete */ | ||
| 61 | #ifdef WIN32 | ||
| 62 | return (int)WaitForSingleObject(thread, INFINITE); | ||
| 63 | #else | ||
| 64 | return pthread_join(thread, NULL); | ||
| 65 | #endif | ||
| 66 | } | ||
| 67 | |||
| 68 | int thread_alive(THREAD_T thread) | ||
| 69 | { | ||
| 70 | #ifdef WIN32 | ||
| 71 | return WaitForSingleObject(thread, 0) == WAIT_TIMEOUT; | ||
| 72 | #else | ||
| 73 | return pthread_kill(thread, 0) == 0; | ||
| 74 | #endif | ||
| 75 | } | ||
| 76 | |||
| 77 | int thread_cancel(THREAD_T thread) | ||
| 78 | { | ||
| 79 | #ifdef WIN32 | ||
| 80 | return -1; | ||
| 81 | #else | ||
| 82 | #ifdef HAVE_PTHREAD_CANCEL | ||
| 83 | return pthread_cancel(thread); | ||
| 84 | #else | ||
| 85 | return -1; | ||
| 86 | #endif | ||
| 87 | #endif | ||
| 88 | } | ||
| 89 | |||
| 90 | void mutex_init(mutex_t* mutex) | ||
| 91 | { | ||
| 92 | #ifdef WIN32 | ||
| 93 | InitializeCriticalSection(mutex); | ||
| 94 | #else | ||
| 95 | pthread_mutex_init(mutex, NULL); | ||
| 96 | #endif | ||
| 97 | } | ||
| 98 | |||
| 99 | void mutex_destroy(mutex_t* mutex) | ||
| 100 | { | ||
| 101 | #ifdef WIN32 | ||
| 102 | DeleteCriticalSection(mutex); | ||
| 103 | #else | ||
| 104 | pthread_mutex_destroy(mutex); | ||
| 105 | #endif | ||
| 106 | } | ||
| 107 | |||
| 108 | void mutex_lock(mutex_t* mutex) | ||
| 109 | { | ||
| 110 | #ifdef WIN32 | ||
| 111 | EnterCriticalSection(mutex); | ||
| 112 | #else | ||
| 113 | pthread_mutex_lock(mutex); | ||
| 114 | #endif | ||
| 115 | } | ||
| 116 | |||
| 117 | void mutex_unlock(mutex_t* mutex) | ||
| 118 | { | ||
| 119 | #ifdef WIN32 | ||
| 120 | LeaveCriticalSection(mutex); | ||
| 121 | #else | ||
| 122 | pthread_mutex_unlock(mutex); | ||
| 123 | #endif | ||
| 124 | } | ||
| 125 | |||
| 126 | void thread_once(thread_once_t *once_control, void (*init_routine)(void)) | ||
| 127 | { | ||
| 128 | #ifdef WIN32 | ||
| 129 | while (InterlockedExchange(&(once_control->lock), 1) != 0) { | ||
| 130 | Sleep(1); | ||
| 131 | } | ||
| 132 | if (!once_control->state) { | ||
| 133 | once_control->state = 1; | ||
| 134 | init_routine(); | ||
| 135 | } | ||
| 136 | InterlockedExchange(&(once_control->lock), 0); | ||
| 137 | #else | ||
| 138 | pthread_once(once_control, init_routine); | ||
| 139 | #endif | ||
| 140 | } | ||
diff --git a/common/thread.h b/common/thread.h deleted file mode 100644 index 23e4510..0000000 --- a/common/thread.h +++ /dev/null | |||
| @@ -1,76 +0,0 @@ | |||
| 1 | /* | ||
| 2 | * thread.h | ||
| 3 | * | ||
| 4 | * Copyright (c) 2012-2019 Nikias Bassen, All Rights Reserved. | ||
| 5 | * Copyright (c) 2012 Martin Szulecki, All Rights Reserved. | ||
| 6 | * | ||
| 7 | * This library is free software; you can redistribute it and/or | ||
| 8 | * modify it under the terms of the GNU Lesser General Public | ||
| 9 | * License as published by the Free Software Foundation; either | ||
| 10 | * version 2.1 of the License, or (at your option) any later version. | ||
| 11 | * | ||
| 12 | * This library is distributed in the hope that it will be useful, | ||
| 13 | * but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
| 14 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU | ||
| 15 | * Lesser General Public License for more details. | ||
| 16 | * | ||
| 17 | * You should have received a copy of the GNU Lesser General Public | ||
| 18 | * License along with this library; if not, write to the Free Software | ||
| 19 | * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA | ||
| 20 | */ | ||
| 21 | |||
| 22 | #ifndef __THREAD_H | ||
| 23 | #define __THREAD_H | ||
| 24 | |||
| 25 | #include <stddef.h> | ||
| 26 | |||
| 27 | #ifdef WIN32 | ||
| 28 | #include <windows.h> | ||
| 29 | typedef HANDLE THREAD_T; | ||
| 30 | typedef CRITICAL_SECTION mutex_t; | ||
| 31 | typedef volatile struct { | ||
| 32 | LONG lock; | ||
| 33 | int state; | ||
| 34 | } thread_once_t; | ||
| 35 | #define THREAD_ONCE_INIT {0, 0} | ||
| 36 | #define THREAD_ID GetCurrentThreadId() | ||
| 37 | #define THREAD_T_NULL (THREAD_T)NULL | ||
| 38 | #else | ||
| 39 | #include <pthread.h> | ||
| 40 | #include <signal.h> | ||
| 41 | typedef pthread_t THREAD_T; | ||
| 42 | typedef pthread_mutex_t mutex_t; | ||
| 43 | typedef pthread_once_t thread_once_t; | ||
| 44 | #define THREAD_ONCE_INIT PTHREAD_ONCE_INIT | ||
| 45 | #define THREAD_ID pthread_self() | ||
| 46 | #define THREAD_T_NULL (THREAD_T)NULL | ||
| 47 | #endif | ||
| 48 | |||
| 49 | typedef void* (*thread_func_t)(void* data); | ||
| 50 | |||
| 51 | int thread_new(THREAD_T* thread, thread_func_t thread_func, void* data); | ||
| 52 | void thread_detach(THREAD_T thread); | ||
| 53 | void thread_free(THREAD_T thread); | ||
| 54 | int thread_join(THREAD_T thread); | ||
| 55 | int thread_alive(THREAD_T thread); | ||
| 56 | |||
| 57 | int thread_cancel(THREAD_T thread); | ||
| 58 | |||
| 59 | #ifdef WIN32 | ||
| 60 | #undef HAVE_THREAD_CLEANUP | ||
| 61 | #else | ||
| 62 | #ifdef HAVE_PTHREAD_CANCEL | ||
| 63 | #define HAVE_THREAD_CLEANUP 1 | ||
| 64 | #define thread_cleanup_push(routine, arg) pthread_cleanup_push(routine, arg) | ||
| 65 | #define thread_cleanup_pop(execute) pthread_cleanup_pop(execute) | ||
| 66 | #endif | ||
| 67 | #endif | ||
| 68 | |||
| 69 | void mutex_init(mutex_t* mutex); | ||
| 70 | void mutex_destroy(mutex_t* mutex); | ||
| 71 | void mutex_lock(mutex_t* mutex); | ||
| 72 | void mutex_unlock(mutex_t* mutex); | ||
| 73 | |||
| 74 | void thread_once(thread_once_t *once_control, void (*init_routine)(void)); | ||
| 75 | |||
| 76 | #endif | ||
diff --git a/common/userpref.c b/common/userpref.c index bf7e1bd..32904c7 100644 --- a/common/userpref.c +++ b/common/userpref.c | |||
| @@ -73,9 +73,10 @@ | |||
| 73 | #include <shlobj.h> | 73 | #include <shlobj.h> |
| 74 | #endif | 74 | #endif |
| 75 | 75 | ||
| 76 | #include <libimobiledevice-glue/utils.h> | ||
| 77 | |||
| 76 | #include "userpref.h" | 78 | #include "userpref.h" |
| 77 | #include "debug.h" | 79 | #include "debug.h" |
| 78 | #include "utils.h" | ||
| 79 | 80 | ||
| 80 | #if defined(HAVE_GNUTLS) | 81 | #if defined(HAVE_GNUTLS) |
| 81 | const ASN1_ARRAY_TYPE pkcs1_asn1_tab[] = { | 82 | const ASN1_ARRAY_TYPE pkcs1_asn1_tab[] = { |
diff --git a/common/utils.c b/common/utils.c deleted file mode 100644 index 58dac02..0000000 --- a/common/utils.c +++ /dev/null | |||
| @@ -1,530 +0,0 @@ | |||
| 1 | /* | ||
| 2 | * utils.c | ||
| 3 | * Miscellaneous utilities for string manipulation, | ||
| 4 | * file I/O and plist helper. | ||
| 5 | * | ||
| 6 | * Copyright (c) 2014-2019 Nikias Bassen, All Rights Reserved. | ||
| 7 | * Copyright (c) 2013-2014 Martin Szulecki, All Rights Reserved. | ||
| 8 | * Copyright (c) 2013 Federico Mena Quintero | ||
| 9 | * | ||
| 10 | * This library is free software; you can redistribute it and/or | ||
| 11 | * modify it under the terms of the GNU Lesser General Public | ||
| 12 | * License as published by the Free Software Foundation; either | ||
| 13 | * version 2.1 of the License, or (at your option) any later version. | ||
| 14 | * | ||
| 15 | * This library is distributed in the hope that it will be useful, | ||
| 16 | * but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
| 17 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU | ||
| 18 | * Lesser General Public License for more details. | ||
| 19 | * | ||
| 20 | * You should have received a copy of the GNU Lesser General Public | ||
| 21 | * License along with this library; if not, write to the Free Software | ||
| 22 | * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA | ||
| 23 | */ | ||
| 24 | |||
| 25 | #ifdef HAVE_CONFIG_H | ||
| 26 | #include <config.h> | ||
| 27 | #endif | ||
| 28 | |||
| 29 | #include <stdarg.h> | ||
| 30 | #include <stdlib.h> | ||
| 31 | #include <string.h> | ||
| 32 | #include <time.h> | ||
| 33 | #include <sys/time.h> | ||
| 34 | #include <inttypes.h> | ||
| 35 | #include <ctype.h> | ||
| 36 | |||
| 37 | #include "utils.h" | ||
| 38 | |||
| 39 | #ifndef HAVE_STPCPY | ||
| 40 | /** | ||
| 41 | * Copy characters from one string into another | ||
| 42 | * | ||
| 43 | * @note: The strings should not overlap, as the behavior is undefined. | ||
| 44 | * | ||
| 45 | * @s1: The source string. | ||
| 46 | * @s2: The destination string. | ||
| 47 | * | ||
| 48 | * @return a pointer to the terminating `\0' character of @s1, | ||
| 49 | * or NULL if @s1 or @s2 is NULL. | ||
| 50 | */ | ||
| 51 | char *stpcpy(char *s1, const char *s2) | ||
| 52 | { | ||
| 53 | if (s1 == NULL || s2 == NULL) | ||
| 54 | return NULL; | ||
| 55 | |||
| 56 | strcpy(s1, s2); | ||
| 57 | |||
| 58 | return s1 + strlen(s2); | ||
| 59 | } | ||
| 60 | #endif | ||
| 61 | |||
| 62 | /** | ||
| 63 | * Concatenate strings into a newly allocated string | ||
| 64 | * | ||
| 65 | * @note: Specify NULL for the last string in the varargs list | ||
| 66 | * | ||
| 67 | * @str: The first string in the list | ||
| 68 | * @...: Subsequent strings. Use NULL for the last item. | ||
| 69 | * | ||
| 70 | * @return a newly allocated string, or NULL if @str is NULL. This will also | ||
| 71 | * return NULL and set errno to ENOMEM if memory is exhausted. | ||
| 72 | */ | ||
| 73 | char *string_concat(const char *str, ...) | ||
| 74 | { | ||
| 75 | size_t len; | ||
| 76 | va_list args; | ||
| 77 | char *s; | ||
| 78 | char *result; | ||
| 79 | char *dest; | ||
| 80 | |||
| 81 | if (!str) | ||
| 82 | return NULL; | ||
| 83 | |||
| 84 | /* Compute final length */ | ||
| 85 | |||
| 86 | len = strlen(str) + 1; /* plus 1 for the null terminator */ | ||
| 87 | |||
| 88 | va_start(args, str); | ||
| 89 | s = va_arg(args, char *); | ||
| 90 | while (s) { | ||
| 91 | len += strlen(s); | ||
| 92 | s = va_arg(args, char*); | ||
| 93 | } | ||
| 94 | va_end(args); | ||
| 95 | |||
| 96 | /* Concat each string */ | ||
| 97 | |||
| 98 | result = malloc(len); | ||
| 99 | if (!result) | ||
| 100 | return NULL; /* errno remains set */ | ||
| 101 | |||
| 102 | dest = result; | ||
| 103 | |||
| 104 | dest = stpcpy(dest, str); | ||
| 105 | |||
| 106 | va_start(args, str); | ||
| 107 | s = va_arg(args, char *); | ||
| 108 | while (s) { | ||
| 109 | dest = stpcpy(dest, s); | ||
| 110 | s = va_arg(args, char *); | ||
| 111 | } | ||
| 112 | va_end(args); | ||
| 113 | |||
| 114 | return result; | ||
| 115 | } | ||
| 116 | |||
| 117 | char *string_append(char* str, ...) | ||
| 118 | { | ||
| 119 | size_t len = 0; | ||
| 120 | size_t slen; | ||
| 121 | va_list args; | ||
| 122 | char *s; | ||
| 123 | char *result; | ||
| 124 | char *dest; | ||
| 125 | |||
| 126 | /* Compute final length */ | ||
| 127 | |||
| 128 | if (str) { | ||
| 129 | len = strlen(str); | ||
| 130 | } | ||
| 131 | slen = len; | ||
| 132 | len++; /* plus 1 for the null terminator */ | ||
| 133 | |||
| 134 | va_start(args, str); | ||
| 135 | s = va_arg(args, char *); | ||
| 136 | while (s) { | ||
| 137 | len += strlen(s); | ||
| 138 | s = va_arg(args, char*); | ||
| 139 | } | ||
| 140 | va_end(args); | ||
| 141 | |||
| 142 | result = realloc(str, len); | ||
| 143 | if (!result) | ||
| 144 | return NULL; /* errno remains set */ | ||
| 145 | |||
| 146 | dest = result + slen; | ||
| 147 | |||
| 148 | /* Concat additional strings */ | ||
| 149 | |||
| 150 | va_start(args, str); | ||
| 151 | s = va_arg(args, char *); | ||
| 152 | while (s) { | ||
| 153 | dest = stpcpy(dest, s); | ||
| 154 | s = va_arg(args, char *); | ||
| 155 | } | ||
| 156 | va_end(args); | ||
| 157 | |||
| 158 | return result; | ||
| 159 | } | ||
| 160 | |||
| 161 | char *string_build_path(const char *elem, ...) | ||
| 162 | { | ||
| 163 | if (!elem) | ||
| 164 | return NULL; | ||
| 165 | va_list args; | ||
| 166 | int len = strlen(elem)+1; | ||
| 167 | va_start(args, elem); | ||
| 168 | char *arg = va_arg(args, char*); | ||
| 169 | while (arg) { | ||
| 170 | len += strlen(arg)+1; | ||
| 171 | arg = va_arg(args, char*); | ||
| 172 | } | ||
| 173 | va_end(args); | ||
| 174 | |||
| 175 | char* out = (char*)malloc(len); | ||
| 176 | strcpy(out, elem); | ||
| 177 | |||
| 178 | va_start(args, elem); | ||
| 179 | arg = va_arg(args, char*); | ||
| 180 | while (arg) { | ||
| 181 | strcat(out, "/"); | ||
| 182 | strcat(out, arg); | ||
| 183 | arg = va_arg(args, char*); | ||
| 184 | } | ||
| 185 | va_end(args); | ||
| 186 | return out; | ||
| 187 | } | ||
| 188 | |||
| 189 | char *string_format_size(uint64_t size) | ||
| 190 | { | ||
| 191 | char buf[80]; | ||
| 192 | double sz; | ||
| 193 | if (size >= 1000000000000LL) { | ||
| 194 | sz = ((double)size / 1000000000000.0f); | ||
| 195 | sprintf(buf, "%0.1f TB", sz); | ||
| 196 | } else if (size >= 1000000000LL) { | ||
| 197 | sz = ((double)size / 1000000000.0f); | ||
| 198 | sprintf(buf, "%0.1f GB", sz); | ||
| 199 | } else if (size >= 1000000LL) { | ||
| 200 | sz = ((double)size / 1000000.0f); | ||
| 201 | sprintf(buf, "%0.1f MB", sz); | ||
| 202 | } else if (size >= 1000LL) { | ||
| 203 | sz = ((double)size / 1000.0f); | ||
| 204 | sprintf(buf, "%0.1f KB", sz); | ||
| 205 | } else { | ||
| 206 | sprintf(buf, "%d Bytes", (int)size); | ||
| 207 | } | ||
| 208 | return strdup(buf); | ||
| 209 | } | ||
| 210 | |||
| 211 | char *string_toupper(char* str) | ||
| 212 | { | ||
| 213 | char *res = strdup(str); | ||
| 214 | unsigned int i; | ||
| 215 | for (i = 0; i < strlen(res); i++) { | ||
| 216 | res[i] = toupper(res[i]); | ||
| 217 | } | ||
| 218 | return res; | ||
| 219 | } | ||
| 220 | |||
| 221 | static int get_rand(int min, int max) | ||
| 222 | { | ||
| 223 | int retval = (rand() % (max - min)) + min; | ||
| 224 | return retval; | ||
| 225 | } | ||
| 226 | |||
| 227 | char *generate_uuid() | ||
| 228 | { | ||
| 229 | const char *chars = "ABCDEF0123456789"; | ||
| 230 | int i = 0; | ||
| 231 | char *uuid = (char *) malloc(sizeof(char) * 37); | ||
| 232 | |||
| 233 | srand(time(NULL)); | ||
| 234 | |||
| 235 | for (i = 0; i < 36; i++) { | ||
| 236 | if (i == 8 || i == 13 || i == 18 || i == 23) { | ||
| 237 | uuid[i] = '-'; | ||
| 238 | continue; | ||
| 239 | } else { | ||
| 240 | uuid[i] = chars[get_rand(0, 16)]; | ||
| 241 | } | ||
| 242 | } | ||
| 243 | |||
| 244 | /* make it a real string */ | ||
| 245 | uuid[36] = '\0'; | ||
| 246 | |||
| 247 | return uuid; | ||
| 248 | } | ||
| 249 | |||
| 250 | void buffer_read_from_filename(const char *filename, char **buffer, uint64_t *length) | ||
| 251 | { | ||
| 252 | FILE *f; | ||
| 253 | uint64_t size; | ||
| 254 | |||
| 255 | *length = 0; | ||
| 256 | |||
| 257 | f = fopen(filename, "rb"); | ||
| 258 | if (!f) { | ||
| 259 | return; | ||
| 260 | } | ||
| 261 | |||
| 262 | fseek(f, 0, SEEK_END); | ||
| 263 | size = ftell(f); | ||
| 264 | rewind(f); | ||
| 265 | |||
| 266 | if (size == 0) { | ||
| 267 | fclose(f); | ||
| 268 | return; | ||
| 269 | } | ||
| 270 | |||
| 271 | *buffer = (char*)malloc(sizeof(char)*(size+1)); | ||
| 272 | if (fread(*buffer, sizeof(char), size, f) != size) { | ||
| 273 | fclose(f); | ||
| 274 | return; | ||
| 275 | } | ||
| 276 | fclose(f); | ||
| 277 | |||
| 278 | *length = size; | ||
| 279 | } | ||
| 280 | |||
| 281 | void buffer_write_to_filename(const char *filename, const char *buffer, uint64_t length) | ||
| 282 | { | ||
| 283 | FILE *f; | ||
| 284 | |||
| 285 | f = fopen(filename, "wb"); | ||
| 286 | if (f) { | ||
| 287 | fwrite(buffer, sizeof(char), length, f); | ||
| 288 | fclose(f); | ||
| 289 | } | ||
| 290 | } | ||
| 291 | |||
| 292 | int plist_read_from_filename(plist_t *plist, const char *filename) | ||
| 293 | { | ||
| 294 | char *buffer = NULL; | ||
| 295 | uint64_t length; | ||
| 296 | |||
| 297 | if (!filename) | ||
| 298 | return 0; | ||
| 299 | |||
| 300 | buffer_read_from_filename(filename, &buffer, &length); | ||
| 301 | |||
| 302 | if (!buffer) { | ||
| 303 | return 0; | ||
| 304 | } | ||
| 305 | |||
| 306 | if ((length > 8) && (memcmp(buffer, "bplist00", 8) == 0)) { | ||
| 307 | plist_from_bin(buffer, length, plist); | ||
| 308 | } else { | ||
| 309 | plist_from_xml(buffer, length, plist); | ||
| 310 | } | ||
| 311 | |||
| 312 | free(buffer); | ||
| 313 | |||
| 314 | return 1; | ||
| 315 | } | ||
| 316 | |||
| 317 | int plist_write_to_filename(plist_t plist, const char *filename, enum plist_format_t format) | ||
| 318 | { | ||
| 319 | char *buffer = NULL; | ||
| 320 | uint32_t length; | ||
| 321 | |||
| 322 | if (!plist || !filename) | ||
| 323 | return 0; | ||
| 324 | |||
| 325 | if (format == PLIST_FORMAT_XML) | ||
| 326 | plist_to_xml(plist, &buffer, &length); | ||
| 327 | else if (format == PLIST_FORMAT_BINARY) | ||
| 328 | plist_to_bin(plist, &buffer, &length); | ||
| 329 | else | ||
| 330 | return 0; | ||
| 331 | |||
| 332 | buffer_write_to_filename(filename, buffer, length); | ||
| 333 | |||
| 334 | free(buffer); | ||
| 335 | |||
| 336 | return 1; | ||
| 337 | } | ||
| 338 | |||
| 339 | static const char base64_str[] = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"; | ||
| 340 | static const char base64_pad = '='; | ||
| 341 | |||
| 342 | static char *base64encode(const unsigned char *buf, size_t size) | ||
| 343 | { | ||
| 344 | if (!buf || !(size > 0)) return NULL; | ||
| 345 | int outlen = (size / 3) * 4; | ||
| 346 | char *outbuf = (char*)malloc(outlen+5); // 4 spare bytes + 1 for '\0' | ||
| 347 | size_t n = 0; | ||
| 348 | size_t m = 0; | ||
| 349 | unsigned char input[3]; | ||
| 350 | unsigned int output[4]; | ||
| 351 | while (n < size) { | ||
| 352 | input[0] = buf[n]; | ||
| 353 | input[1] = (n+1 < size) ? buf[n+1] : 0; | ||
| 354 | input[2] = (n+2 < size) ? buf[n+2] : 0; | ||
| 355 | output[0] = input[0] >> 2; | ||
| 356 | output[1] = ((input[0] & 3) << 4) + (input[1] >> 4); | ||
| 357 | output[2] = ((input[1] & 15) << 2) + (input[2] >> 6); | ||
| 358 | output[3] = input[2] & 63; | ||
| 359 | outbuf[m++] = base64_str[(int)output[0]]; | ||
| 360 | outbuf[m++] = base64_str[(int)output[1]]; | ||
| 361 | outbuf[m++] = (n+1 < size) ? base64_str[(int)output[2]] : base64_pad; | ||
| 362 | outbuf[m++] = (n+2 < size) ? base64_str[(int)output[3]] : base64_pad; | ||
| 363 | n+=3; | ||
| 364 | } | ||
| 365 | outbuf[m] = 0; // 0-termination! | ||
| 366 | return outbuf; | ||
| 367 | } | ||
| 368 | |||
| 369 | static void plist_node_print_to_stream(plist_t node, int* indent_level, FILE* stream); | ||
| 370 | |||
| 371 | static void plist_array_print_to_stream(plist_t node, int* indent_level, FILE* stream) | ||
| 372 | { | ||
| 373 | /* iterate over items */ | ||
| 374 | int i, count; | ||
| 375 | plist_t subnode = NULL; | ||
| 376 | |||
| 377 | count = plist_array_get_size(node); | ||
| 378 | |||
| 379 | for (i = 0; i < count; i++) { | ||
| 380 | subnode = plist_array_get_item(node, i); | ||
| 381 | fprintf(stream, "%*s", *indent_level, ""); | ||
| 382 | fprintf(stream, "%d: ", i); | ||
| 383 | plist_node_print_to_stream(subnode, indent_level, stream); | ||
| 384 | } | ||
| 385 | } | ||
| 386 | |||
| 387 | static void plist_dict_print_to_stream(plist_t node, int* indent_level, FILE* stream) | ||
| 388 | { | ||
| 389 | /* iterate over key/value pairs */ | ||
| 390 | plist_dict_iter it = NULL; | ||
| 391 | |||
| 392 | char* key = NULL; | ||
| 393 | plist_t subnode = NULL; | ||
| 394 | plist_dict_new_iter(node, &it); | ||
| 395 | plist_dict_next_item(node, it, &key, &subnode); | ||
| 396 | while (subnode) | ||
| 397 | { | ||
| 398 | fprintf(stream, "%*s", *indent_level, ""); | ||
| 399 | fprintf(stream, "%s", key); | ||
| 400 | if (plist_get_node_type(subnode) == PLIST_ARRAY) | ||
| 401 | fprintf(stream, "[%d]: ", plist_array_get_size(subnode)); | ||
| 402 | else | ||
| 403 | fprintf(stream, ": "); | ||
| 404 | free(key); | ||
| 405 | key = NULL; | ||
| 406 | plist_node_print_to_stream(subnode, indent_level, stream); | ||
| 407 | plist_dict_next_item(node, it, &key, &subnode); | ||
| 408 | } | ||
| 409 | free(it); | ||
| 410 | } | ||
| 411 | |||
| 412 | static void plist_node_print_to_stream(plist_t node, int* indent_level, FILE* stream) | ||
| 413 | { | ||
| 414 | char *s = NULL; | ||
| 415 | char *data = NULL; | ||
| 416 | double d; | ||
| 417 | uint8_t b; | ||
| 418 | uint64_t u = 0; | ||
| 419 | struct timeval tv = { 0, 0 }; | ||
| 420 | |||
| 421 | plist_type t; | ||
| 422 | |||
| 423 | if (!node) | ||
| 424 | return; | ||
| 425 | |||
| 426 | t = plist_get_node_type(node); | ||
| 427 | |||
| 428 | switch (t) { | ||
| 429 | case PLIST_BOOLEAN: | ||
| 430 | plist_get_bool_val(node, &b); | ||
| 431 | fprintf(stream, "%s\n", (b ? "true" : "false")); | ||
| 432 | break; | ||
| 433 | |||
| 434 | case PLIST_UINT: | ||
| 435 | plist_get_uint_val(node, &u); | ||
| 436 | fprintf(stream, "%"PRIu64"\n", u); | ||
| 437 | break; | ||
| 438 | |||
| 439 | case PLIST_REAL: | ||
| 440 | plist_get_real_val(node, &d); | ||
| 441 | fprintf(stream, "%f\n", d); | ||
| 442 | break; | ||
| 443 | |||
| 444 | case PLIST_STRING: | ||
| 445 | plist_get_string_val(node, &s); | ||
| 446 | fprintf(stream, "%s\n", s); | ||
| 447 | free(s); | ||
| 448 | break; | ||
| 449 | |||
| 450 | case PLIST_KEY: | ||
| 451 | plist_get_key_val(node, &s); | ||
| 452 | fprintf(stream, "%s: ", s); | ||
| 453 | free(s); | ||
| 454 | break; | ||
| 455 | |||
| 456 | case PLIST_DATA: | ||
| 457 | plist_get_data_val(node, &data, &u); | ||
| 458 | if (u > 0) { | ||
| 459 | s = base64encode((unsigned char*)data, u); | ||
| 460 | free(data); | ||
| 461 | if (s) { | ||
| 462 | fprintf(stream, "%s\n", s); | ||
| 463 | free(s); | ||
| 464 | } else { | ||
| 465 | fprintf(stream, "\n"); | ||
| 466 | } | ||
| 467 | } else { | ||
| 468 | fprintf(stream, "\n"); | ||
| 469 | } | ||
| 470 | break; | ||
| 471 | |||
| 472 | case PLIST_DATE: | ||
| 473 | plist_get_date_val(node, (int32_t*)&tv.tv_sec, (int32_t*)&tv.tv_usec); | ||
| 474 | { | ||
| 475 | time_t ti = (time_t)tv.tv_sec + MAC_EPOCH; | ||
| 476 | struct tm *btime = localtime(&ti); | ||
| 477 | if (btime) { | ||
| 478 | s = (char*)malloc(24); | ||
| 479 | memset(s, 0, 24); | ||
| 480 | if (strftime(s, 24, "%Y-%m-%dT%H:%M:%SZ", btime) <= 0) { | ||
| 481 | free (s); | ||
| 482 | s = NULL; | ||
| 483 | } | ||
| 484 | } | ||
| 485 | } | ||
| 486 | if (s) { | ||
| 487 | fprintf(stream, "%s\n", s); | ||
| 488 | free(s); | ||
| 489 | } else { | ||
| 490 | fprintf(stream, "\n"); | ||
| 491 | } | ||
| 492 | break; | ||
| 493 | |||
| 494 | case PLIST_ARRAY: | ||
| 495 | fprintf(stream, "\n"); | ||
| 496 | (*indent_level)++; | ||
| 497 | plist_array_print_to_stream(node, indent_level, stream); | ||
| 498 | (*indent_level)--; | ||
| 499 | break; | ||
| 500 | |||
| 501 | case PLIST_DICT: | ||
| 502 | fprintf(stream, "\n"); | ||
| 503 | (*indent_level)++; | ||
| 504 | plist_dict_print_to_stream(node, indent_level, stream); | ||
| 505 | (*indent_level)--; | ||
| 506 | break; | ||
| 507 | |||
| 508 | default: | ||
| 509 | break; | ||
| 510 | } | ||
| 511 | } | ||
| 512 | |||
| 513 | void plist_print_to_stream(plist_t plist, FILE* stream) | ||
| 514 | { | ||
| 515 | int indent = 0; | ||
| 516 | |||
| 517 | if (!plist || !stream) | ||
| 518 | return; | ||
| 519 | |||
| 520 | switch (plist_get_node_type(plist)) { | ||
| 521 | case PLIST_DICT: | ||
| 522 | plist_dict_print_to_stream(plist, &indent, stream); | ||
| 523 | break; | ||
| 524 | case PLIST_ARRAY: | ||
| 525 | plist_array_print_to_stream(plist, &indent, stream); | ||
| 526 | break; | ||
| 527 | default: | ||
| 528 | plist_node_print_to_stream(plist, &indent, stream); | ||
| 529 | } | ||
| 530 | } | ||
diff --git a/common/utils.h b/common/utils.h deleted file mode 100644 index 2c3acec..0000000 --- a/common/utils.h +++ /dev/null | |||
| @@ -1,64 +0,0 @@ | |||
| 1 | /* | ||
| 2 | * utils.h | ||
| 3 | * Miscellaneous utilities for string manipulation, | ||
| 4 | * file I/O and plist helper. | ||
| 5 | * | ||
| 6 | * Copyright (c) 2014-2019 Nikias Bassen, All Rights Reserved. | ||
| 7 | * Copyright (c) 2013-2014 Martin Szulecki, All Rights Reserved. | ||
| 8 | * Copyright (c) 2013 Federico Mena Quintero | ||
| 9 | * | ||
| 10 | * This library is free software; you can redistribute it and/or | ||
| 11 | * modify it under the terms of the GNU Lesser General Public | ||
| 12 | * License as published by the Free Software Foundation; either | ||
| 13 | * version 2.1 of the License, or (at your option) any later version. | ||
| 14 | * | ||
| 15 | * This library is distributed in the hope that it will be useful, | ||
| 16 | * but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
| 17 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU | ||
| 18 | * Lesser General Public License for more details. | ||
| 19 | * | ||
| 20 | * You should have received a copy of the GNU Lesser General Public | ||
| 21 | * License along with this library; if not, write to the Free Software | ||
| 22 | * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA | ||
| 23 | */ | ||
| 24 | |||
| 25 | #ifndef __UTILS_H | ||
| 26 | #define __UTILS_H | ||
| 27 | |||
| 28 | #ifdef HAVE_CONFIG_H | ||
| 29 | #include <config.h> | ||
| 30 | #endif | ||
| 31 | |||
| 32 | #ifdef WIN32 | ||
| 33 | #include <windows.h> | ||
| 34 | #endif | ||
| 35 | |||
| 36 | #include <stdio.h> | ||
| 37 | #include <plist/plist.h> | ||
| 38 | |||
| 39 | #define MAC_EPOCH 978307200 | ||
| 40 | |||
| 41 | #ifndef HAVE_STPCPY | ||
| 42 | char *stpcpy(char *s1, const char *s2); | ||
| 43 | #endif | ||
| 44 | char *string_concat(const char *str, ...); | ||
| 45 | char *string_append(char *str, ...); | ||
| 46 | char *string_build_path(const char *elem, ...); | ||
| 47 | char *string_format_size(uint64_t size); | ||
| 48 | char *string_toupper(char *str); | ||
| 49 | char *generate_uuid(void); | ||
| 50 | |||
| 51 | void buffer_read_from_filename(const char *filename, char **buffer, uint64_t *length); | ||
| 52 | void buffer_write_to_filename(const char *filename, const char *buffer, uint64_t length); | ||
| 53 | |||
| 54 | enum plist_format_t { | ||
| 55 | PLIST_FORMAT_XML, | ||
| 56 | PLIST_FORMAT_BINARY | ||
| 57 | }; | ||
| 58 | |||
| 59 | int plist_read_from_filename(plist_t *plist, const char *filename); | ||
| 60 | int plist_write_to_filename(plist_t plist, const char *filename, enum plist_format_t format); | ||
| 61 | |||
| 62 | void plist_print_to_stream(plist_t plist, FILE* stream); | ||
| 63 | |||
| 64 | #endif | ||
diff --git a/configure.ac b/configure.ac index a95bc69..ed9270c 100644 --- a/configure.ac +++ b/configure.ac | |||
| @@ -20,10 +20,12 @@ LIBIMOBILEDEVICE_SO_VERSION=6:0:0 | |||
| 20 | dnl Minimum package versions | 20 | dnl Minimum package versions |
| 21 | LIBUSBMUXD_VERSION=2.0.2 | 21 | LIBUSBMUXD_VERSION=2.0.2 |
| 22 | LIBPLIST_VERSION=2.2.0 | 22 | LIBPLIST_VERSION=2.2.0 |
| 23 | LIMD_GLUE_VERSION=1.0.0 | ||
| 23 | 24 | ||
| 24 | AC_SUBST(LIBIMOBILEDEVICE_SO_VERSION) | 25 | AC_SUBST(LIBIMOBILEDEVICE_SO_VERSION) |
| 25 | AC_SUBST(LIBUSBMUXD_VERSION) | 26 | AC_SUBST(LIBUSBMUXD_VERSION) |
| 26 | AC_SUBST(LIBPLIST_VERSION) | 27 | AC_SUBST(LIBPLIST_VERSION) |
| 28 | AC_SUBST(LIMD_GLUE_VERSION) | ||
| 27 | 29 | ||
| 28 | # Checks for programs. | 30 | # Checks for programs. |
| 29 | AC_PROG_CC | 31 | AC_PROG_CC |
| @@ -34,6 +36,7 @@ LT_INIT | |||
| 34 | # Checks for libraries. | 36 | # Checks for libraries. |
| 35 | PKG_CHECK_MODULES(libusbmuxd, libusbmuxd-2.0 >= $LIBUSBMUXD_VERSION) | 37 | PKG_CHECK_MODULES(libusbmuxd, libusbmuxd-2.0 >= $LIBUSBMUXD_VERSION) |
| 36 | PKG_CHECK_MODULES(libplist, libplist-2.0 >= $LIBPLIST_VERSION) | 38 | PKG_CHECK_MODULES(libplist, libplist-2.0 >= $LIBPLIST_VERSION) |
| 39 | PKG_CHECK_MODULES(limd_glue, libimobiledevice-glue-1.0 >= $LIMD_GLUE_VERSION) | ||
| 37 | 40 | ||
| 38 | # Checks for header files. | 41 | # Checks for header files. |
| 39 | AC_CHECK_HEADERS([stdint.h stdlib.h string.h gcrypt.h]) | 42 | AC_CHECK_HEADERS([stdint.h stdlib.h string.h gcrypt.h]) |
diff --git a/src/Makefile.am b/src/Makefile.am index 96fe963..183a745 100644 --- a/src/Makefile.am +++ b/src/Makefile.am | |||
| @@ -6,6 +6,7 @@ AM_CFLAGS = \ | |||
| 6 | $(GLOBAL_CFLAGS) \ | 6 | $(GLOBAL_CFLAGS) \ |
| 7 | $(libusbmuxd_CFLAGS) \ | 7 | $(libusbmuxd_CFLAGS) \ |
| 8 | $(libplist_CFLAGS) \ | 8 | $(libplist_CFLAGS) \ |
| 9 | $(limd_glue_CFLAGS) \ | ||
| 9 | $(ssl_lib_CFLAGS) \ | 10 | $(ssl_lib_CFLAGS) \ |
| 10 | $(LFS_CFLAGS) \ | 11 | $(LFS_CFLAGS) \ |
| 11 | $(PTHREAD_CFLAGS) | 12 | $(PTHREAD_CFLAGS) |
| @@ -13,6 +14,7 @@ AM_CFLAGS = \ | |||
| 13 | AM_LDFLAGS = \ | 14 | AM_LDFLAGS = \ |
| 14 | $(libusbmuxd_LIBS) \ | 15 | $(libusbmuxd_LIBS) \ |
| 15 | $(libplist_LIBS) \ | 16 | $(libplist_LIBS) \ |
| 17 | $(limd_glue_LIBS) \ | ||
| 16 | $(ssl_lib_LIBS) \ | 18 | $(ssl_lib_LIBS) \ |
| 17 | $(PTHREAD_LIBS) | 19 | $(PTHREAD_LIBS) |
| 18 | 20 | ||
| @@ -28,7 +28,7 @@ | |||
| 28 | #include "libimobiledevice/afc.h" | 28 | #include "libimobiledevice/afc.h" |
| 29 | #include "service.h" | 29 | #include "service.h" |
| 30 | #include "endianness.h" | 30 | #include "endianness.h" |
| 31 | #include "common/thread.h" | 31 | #include <libimobiledevice-glue/thread.h> |
| 32 | 32 | ||
| 33 | #define AFC_MAGIC "CFA6LPAA" | 33 | #define AFC_MAGIC "CFA6LPAA" |
| 34 | #define AFC_MAGIC_LEN (8) | 34 | #define AFC_MAGIC_LEN (8) |
diff --git a/src/companion_proxy.c b/src/companion_proxy.c index f09b416..92bc7f1 100644 --- a/src/companion_proxy.c +++ b/src/companion_proxy.c | |||
| @@ -29,7 +29,6 @@ | |||
| 29 | #include "companion_proxy.h" | 29 | #include "companion_proxy.h" |
| 30 | #include "lockdown.h" | 30 | #include "lockdown.h" |
| 31 | #include "common/debug.h" | 31 | #include "common/debug.h" |
| 32 | #include "common/thread.h" | ||
| 33 | 32 | ||
| 34 | /** | 33 | /** |
| 35 | * Convert a property_list_service_error_t value to a companion_proxy_error_t value. | 34 | * Convert a property_list_service_error_t value to a companion_proxy_error_t value. |
diff --git a/src/companion_proxy.h b/src/companion_proxy.h index 0314b67..0226640 100644 --- a/src/companion_proxy.h +++ b/src/companion_proxy.h | |||
| @@ -24,7 +24,7 @@ | |||
| 24 | 24 | ||
| 25 | #include "libimobiledevice/companion_proxy.h" | 25 | #include "libimobiledevice/companion_proxy.h" |
| 26 | #include "property_list_service.h" | 26 | #include "property_list_service.h" |
| 27 | #include "common/thread.h" | 27 | #include <libimobiledevice-glue/thread.h> |
| 28 | 28 | ||
| 29 | struct companion_proxy_client_private { | 29 | struct companion_proxy_client_private { |
| 30 | property_list_service_client_t parent; | 30 | property_list_service_client_t parent; |
diff --git a/src/debugserver.c b/src/debugserver.c index 1774087..b6a8b62 100644 --- a/src/debugserver.c +++ b/src/debugserver.c | |||
| @@ -29,10 +29,11 @@ | |||
| 29 | #define __USE_GNU 1 | 29 | #define __USE_GNU 1 |
| 30 | #include <stdio.h> | 30 | #include <stdio.h> |
| 31 | 31 | ||
| 32 | #include <libimobiledevice-glue/utils.h> | ||
| 33 | |||
| 32 | #include "debugserver.h" | 34 | #include "debugserver.h" |
| 33 | #include "lockdown.h" | 35 | #include "lockdown.h" |
| 34 | #include "common/debug.h" | 36 | #include "common/debug.h" |
| 35 | #include "common/utils.h" | ||
| 36 | #include "asprintf.h" | 37 | #include "asprintf.h" |
| 37 | 38 | ||
| 38 | /** | 39 | /** |
diff --git a/src/idevice.c b/src/idevice.c index 869ecac..4545bfa 100644 --- a/src/idevice.c +++ b/src/idevice.c | |||
| @@ -48,10 +48,11 @@ | |||
| 48 | #error No supported TLS/SSL library enabled | 48 | #error No supported TLS/SSL library enabled |
| 49 | #endif | 49 | #endif |
| 50 | 50 | ||
| 51 | #include <libimobiledevice-glue/socket.h> | ||
| 52 | #include <libimobiledevice-glue/thread.h> | ||
| 53 | |||
| 51 | #include "idevice.h" | 54 | #include "idevice.h" |
| 52 | #include "common/userpref.h" | 55 | #include "common/userpref.h" |
| 53 | #include "common/socket.h" | ||
| 54 | #include "common/thread.h" | ||
| 55 | #include "common/debug.h" | 56 | #include "common/debug.h" |
| 56 | 57 | ||
| 57 | #ifdef WIN32 | 58 | #ifdef WIN32 |
diff --git a/src/installation_proxy.h b/src/installation_proxy.h index 66dd5d0..033bdef 100644 --- a/src/installation_proxy.h +++ b/src/installation_proxy.h | |||
| @@ -25,7 +25,7 @@ | |||
| 25 | 25 | ||
| 26 | #include "libimobiledevice/installation_proxy.h" | 26 | #include "libimobiledevice/installation_proxy.h" |
| 27 | #include "property_list_service.h" | 27 | #include "property_list_service.h" |
| 28 | #include "common/thread.h" | 28 | #include <libimobiledevice-glue/thread.h> |
| 29 | 29 | ||
| 30 | struct instproxy_client_private { | 30 | struct instproxy_client_private { |
| 31 | property_list_service_client_t parent; | 31 | property_list_service_client_t parent; |
diff --git a/src/lockdown.c b/src/lockdown.c index 8fc2c49..70db834 100644 --- a/src/lockdown.c +++ b/src/lockdown.c | |||
| @@ -34,13 +34,13 @@ | |||
| 34 | #include <ctype.h> | 34 | #include <ctype.h> |
| 35 | #include <unistd.h> | 35 | #include <unistd.h> |
| 36 | #include <plist/plist.h> | 36 | #include <plist/plist.h> |
| 37 | #include <libimobiledevice-glue/utils.h> | ||
| 37 | 38 | ||
| 38 | #include "property_list_service.h" | 39 | #include "property_list_service.h" |
| 39 | #include "lockdown.h" | 40 | #include "lockdown.h" |
| 40 | #include "idevice.h" | 41 | #include "idevice.h" |
| 41 | #include "common/debug.h" | 42 | #include "common/debug.h" |
| 42 | #include "common/userpref.h" | 43 | #include "common/userpref.h" |
| 43 | #include "common/utils.h" | ||
| 44 | #include "asprintf.h" | 44 | #include "asprintf.h" |
| 45 | 45 | ||
| 46 | #ifdef WIN32 | 46 | #ifdef WIN32 |
diff --git a/src/mobile_image_mounter.h b/src/mobile_image_mounter.h index e9754e4..55c9cf2 100644 --- a/src/mobile_image_mounter.h +++ b/src/mobile_image_mounter.h | |||
| @@ -24,7 +24,7 @@ | |||
| 24 | 24 | ||
| 25 | #include "libimobiledevice/mobile_image_mounter.h" | 25 | #include "libimobiledevice/mobile_image_mounter.h" |
| 26 | #include "property_list_service.h" | 26 | #include "property_list_service.h" |
| 27 | #include "common/thread.h" | 27 | #include <libimobiledevice-glue/thread.h> |
| 28 | 28 | ||
| 29 | struct mobile_image_mounter_client_private { | 29 | struct mobile_image_mounter_client_private { |
| 30 | property_list_service_client_t parent; | 30 | property_list_service_client_t parent; |
diff --git a/src/notification_proxy.h b/src/notification_proxy.h index f641e25..ea85149 100644 --- a/src/notification_proxy.h +++ b/src/notification_proxy.h | |||
| @@ -24,7 +24,7 @@ | |||
| 24 | 24 | ||
| 25 | #include "libimobiledevice/notification_proxy.h" | 25 | #include "libimobiledevice/notification_proxy.h" |
| 26 | #include "property_list_service.h" | 26 | #include "property_list_service.h" |
| 27 | #include "common/thread.h" | 27 | #include <libimobiledevice-glue/thread.h> |
| 28 | 28 | ||
| 29 | struct np_client_private { | 29 | struct np_client_private { |
| 30 | property_list_service_client_t parent; | 30 | property_list_service_client_t parent; |
diff --git a/src/preboard.h b/src/preboard.h index c5143a9..61263fc 100644 --- a/src/preboard.h +++ b/src/preboard.h | |||
| @@ -24,7 +24,7 @@ | |||
| 24 | 24 | ||
| 25 | #include "libimobiledevice/preboard.h" | 25 | #include "libimobiledevice/preboard.h" |
| 26 | #include "property_list_service.h" | 26 | #include "property_list_service.h" |
| 27 | #include "common/thread.h" | 27 | #include <libimobiledevice-glue/thread.h> |
| 28 | 28 | ||
| 29 | struct preboard_client_private { | 29 | struct preboard_client_private { |
| 30 | property_list_service_client_t parent; | 30 | property_list_service_client_t parent; |
diff --git a/src/sbservices.h b/src/sbservices.h index 6c047ce..39d822c 100644 --- a/src/sbservices.h +++ b/src/sbservices.h | |||
| @@ -24,7 +24,7 @@ | |||
| 24 | 24 | ||
| 25 | #include "libimobiledevice/sbservices.h" | 25 | #include "libimobiledevice/sbservices.h" |
| 26 | #include "property_list_service.h" | 26 | #include "property_list_service.h" |
| 27 | #include "common/thread.h" | 27 | #include <libimobiledevice-glue/thread.h> |
| 28 | 28 | ||
| 29 | struct sbservices_client_private { | 29 | struct sbservices_client_private { |
| 30 | property_list_service_client_t parent; | 30 | property_list_service_client_t parent; |
diff --git a/src/syslog_relay.h b/src/syslog_relay.h index 3e48fa4..86d798e 100644 --- a/src/syslog_relay.h +++ b/src/syslog_relay.h | |||
| @@ -24,7 +24,7 @@ | |||
| 24 | 24 | ||
| 25 | #include "libimobiledevice/syslog_relay.h" | 25 | #include "libimobiledevice/syslog_relay.h" |
| 26 | #include "service.h" | 26 | #include "service.h" |
| 27 | #include "common/thread.h" | 27 | #include <libimobiledevice-glue/thread.h> |
| 28 | 28 | ||
| 29 | struct syslog_relay_client_private { | 29 | struct syslog_relay_client_private { |
| 30 | service_client_t parent; | 30 | service_client_t parent; |
diff --git a/tools/Makefile.am b/tools/Makefile.am index b78f3f2..354cf1c 100644 --- a/tools/Makefile.am +++ b/tools/Makefile.am | |||
| @@ -31,9 +31,9 @@ bin_PROGRAMS = \ | |||
| 31 | idevicesetlocation | 31 | idevicesetlocation |
| 32 | 32 | ||
| 33 | ideviceinfo_SOURCES = ideviceinfo.c | 33 | ideviceinfo_SOURCES = ideviceinfo.c |
| 34 | ideviceinfo_CFLAGS = $(AM_CFLAGS) | 34 | ideviceinfo_CFLAGS = $(AM_CFLAGS) $(limd_glue_CFLAGS) |
| 35 | ideviceinfo_LDFLAGS = $(AM_LDFLAGS) | 35 | ideviceinfo_LDFLAGS = $(AM_LDFLAGS) $(limd_glue_LIBS) |
| 36 | ideviceinfo_LDADD = $(top_builddir)/src/libimobiledevice-1.0.la $(top_builddir)/common/libinternalcommon.la | 36 | ideviceinfo_LDADD = $(top_builddir)/src/libimobiledevice-1.0.la |
| 37 | 37 | ||
| 38 | idevicename_SOURCES = idevicename.c | 38 | idevicename_SOURCES = idevicename.c |
| 39 | idevicename_CFLAGS = $(AM_CFLAGS) | 39 | idevicename_CFLAGS = $(AM_CFLAGS) |
| @@ -41,13 +41,13 @@ idevicename_LDFLAGS = $(AM_LDFLAGS) | |||
| 41 | idevicename_LDADD = $(top_builddir)/src/libimobiledevice-1.0.la | 41 | idevicename_LDADD = $(top_builddir)/src/libimobiledevice-1.0.la |
| 42 | 42 | ||
| 43 | idevicepair_SOURCES = idevicepair.c | 43 | idevicepair_SOURCES = idevicepair.c |
| 44 | idevicepair_CFLAGS = -I$(top_srcdir) $(AM_CFLAGS) $(ssl_lib_CFLAGS) | 44 | idevicepair_CFLAGS = $(AM_CFLAGS) $(ssl_lib_CFLAGS) |
| 45 | idevicepair_LDFLAGS = $(AM_LDFLAGS) $(libusbmuxd_LIBS) $(ssl_lib_LIBS) | 45 | idevicepair_LDFLAGS = $(AM_LDFLAGS) $(libusbmuxd_LIBS) $(ssl_lib_LIBS) |
| 46 | idevicepair_LDADD = $(top_builddir)/src/libimobiledevice-1.0.la $(top_builddir)/common/libinternalcommon.la | 46 | idevicepair_LDADD = $(top_builddir)/src/libimobiledevice-1.0.la $(top_builddir)/common/libinternalcommon.la |
| 47 | 47 | ||
| 48 | idevicesyslog_SOURCES = idevicesyslog.c | 48 | idevicesyslog_SOURCES = idevicesyslog.c |
| 49 | idevicesyslog_CFLAGS = $(AM_CFLAGS) | 49 | idevicesyslog_CFLAGS = $(AM_CFLAGS) $(limd_glue_CFLAGS) |
| 50 | idevicesyslog_LDFLAGS = $(AM_LDFLAGS) | 50 | idevicesyslog_LDFLAGS = $(AM_LDFLAGS) $(limd_glue_LIBS) |
| 51 | idevicesyslog_LDADD = $(top_builddir)/src/libimobiledevice-1.0.la | 51 | idevicesyslog_LDADD = $(top_builddir)/src/libimobiledevice-1.0.la |
| 52 | 52 | ||
| 53 | idevice_id_SOURCES = idevice_id.c | 53 | idevice_id_SOURCES = idevice_id.c |
| @@ -56,19 +56,19 @@ idevice_id_LDFLAGS = $(AM_LDFLAGS) | |||
| 56 | idevice_id_LDADD = $(top_builddir)/src/libimobiledevice-1.0.la | 56 | idevice_id_LDADD = $(top_builddir)/src/libimobiledevice-1.0.la |
| 57 | 57 | ||
| 58 | idevicebackup_SOURCES = idevicebackup.c | 58 | idevicebackup_SOURCES = idevicebackup.c |
| 59 | idevicebackup_CFLAGS = $(AM_CFLAGS) $(ssl_lib_CFLAGS) | 59 | idevicebackup_CFLAGS = $(AM_CFLAGS) $(ssl_lib_CFLAGS) $(limd_glue_CFLAGS) |
| 60 | idevicebackup_LDFLAGS = $(AM_LDFLAGS) $(ssl_lib_LIBS) | 60 | idevicebackup_LDFLAGS = $(AM_LDFLAGS) $(ssl_lib_LIBS) $(limd_glue_LIBS) |
| 61 | idevicebackup_LDADD = $(top_builddir)/src/libimobiledevice-1.0.la $(top_builddir)/common/libinternalcommon.la | 61 | idevicebackup_LDADD = $(top_builddir)/src/libimobiledevice-1.0.la |
| 62 | 62 | ||
| 63 | idevicebackup2_SOURCES = idevicebackup2.c | 63 | idevicebackup2_SOURCES = idevicebackup2.c |
| 64 | idevicebackup2_CFLAGS = $(AM_CFLAGS) | 64 | idevicebackup2_CFLAGS = $(AM_CFLAGS) $(limd_glue_CFLAGS) |
| 65 | idevicebackup2_LDFLAGS = $(AM_LDFLAGS) | 65 | idevicebackup2_LDFLAGS = $(AM_LDFLAGS) $(limd_glue_LIBS) |
| 66 | idevicebackup2_LDADD = $(top_builddir)/src/libimobiledevice-1.0.la $(top_builddir)/common/libinternalcommon.la | 66 | idevicebackup2_LDADD = $(top_builddir)/src/libimobiledevice-1.0.la |
| 67 | 67 | ||
| 68 | ideviceimagemounter_SOURCES = ideviceimagemounter.c | 68 | ideviceimagemounter_SOURCES = ideviceimagemounter.c |
| 69 | ideviceimagemounter_CFLAGS = $(AM_CFLAGS) | 69 | ideviceimagemounter_CFLAGS = $(AM_CFLAGS) $(limd_glue_CFLAGS) |
| 70 | ideviceimagemounter_LDFLAGS = $(AM_LDFLAGS) | 70 | ideviceimagemounter_LDFLAGS = $(AM_LDFLAGS) $(limd_glue_LIBS) |
| 71 | ideviceimagemounter_LDADD = $(top_builddir)/src/libimobiledevice-1.0.la $(top_builddir)/common/libinternalcommon.la | 71 | ideviceimagemounter_LDADD = $(top_builddir)/src/libimobiledevice-1.0.la |
| 72 | 72 | ||
| 73 | idevicescreenshot_SOURCES = idevicescreenshot.c | 73 | idevicescreenshot_SOURCES = idevicescreenshot.c |
| 74 | idevicescreenshot_CFLAGS = $(AM_CFLAGS) | 74 | idevicescreenshot_CFLAGS = $(AM_CFLAGS) |
| @@ -86,14 +86,14 @@ idevicedate_LDFLAGS = $(AM_LDFLAGS) | |||
| 86 | idevicedate_LDADD = $(top_builddir)/src/libimobiledevice-1.0.la | 86 | idevicedate_LDADD = $(top_builddir)/src/libimobiledevice-1.0.la |
| 87 | 87 | ||
| 88 | ideviceprovision_SOURCES = ideviceprovision.c | 88 | ideviceprovision_SOURCES = ideviceprovision.c |
| 89 | ideviceprovision_CFLAGS = $(AM_CFLAGS) | 89 | ideviceprovision_CFLAGS = $(AM_CFLAGS) $(limd_glue_CFLAGS) |
| 90 | ideviceprovision_LDFLAGS = $(AM_LDFLAGS) | 90 | ideviceprovision_LDFLAGS = $(AM_LDFLAGS) $(limd_glue_LIBS) |
| 91 | ideviceprovision_LDADD = $(top_builddir)/src/libimobiledevice-1.0.la $(top_builddir)/common/libinternalcommon.la | 91 | ideviceprovision_LDADD = $(top_builddir)/src/libimobiledevice-1.0.la |
| 92 | 92 | ||
| 93 | idevicedebugserverproxy_SOURCES = idevicedebugserverproxy.c | 93 | idevicedebugserverproxy_SOURCES = idevicedebugserverproxy.c |
| 94 | idevicedebugserverproxy_CFLAGS = -I$(top_srcdir) $(AM_CFLAGS) | 94 | idevicedebugserverproxy_CFLAGS = $(AM_CFLAGS) $(limd_glue_CFLAGS) |
| 95 | idevicedebugserverproxy_LDFLAGS = $(AM_LDFLAGS) | 95 | idevicedebugserverproxy_LDFLAGS = $(AM_LDFLAGS) $(limd_glue_LIBS) |
| 96 | idevicedebugserverproxy_LDADD = $(top_builddir)/src/libimobiledevice-1.0.la $(top_builddir)/common/libinternalcommon.la | 96 | idevicedebugserverproxy_LDADD = $(top_builddir)/src/libimobiledevice-1.0.la |
| 97 | 97 | ||
| 98 | idevicediagnostics_SOURCES = idevicediagnostics.c | 98 | idevicediagnostics_SOURCES = idevicediagnostics.c |
| 99 | idevicediagnostics_CFLAGS = $(AM_CFLAGS) | 99 | idevicediagnostics_CFLAGS = $(AM_CFLAGS) |
| @@ -101,8 +101,8 @@ idevicediagnostics_LDFLAGS = $(AM_LDFLAGS) | |||
| 101 | idevicediagnostics_LDADD = $(top_builddir)/src/libimobiledevice-1.0.la | 101 | idevicediagnostics_LDADD = $(top_builddir)/src/libimobiledevice-1.0.la |
| 102 | 102 | ||
| 103 | idevicedebug_SOURCES = idevicedebug.c | 103 | idevicedebug_SOURCES = idevicedebug.c |
| 104 | idevicedebug_CFLAGS = $(AM_CFLAGS) | 104 | idevicedebug_CFLAGS = $(AM_CFLAGS) $(limd_glue_CFLAGS) |
| 105 | idevicedebug_LDFLAGS = $(AM_LDFLAGS) | 105 | idevicedebug_LDFLAGS = $(AM_LDFLAGS) $(limd_glue_LIBS) |
| 106 | idevicedebug_LDADD = $(top_builddir)/src/libimobiledevice-1.0.la $(top_builddir)/common/libinternalcommon.la | 106 | idevicedebug_LDADD = $(top_builddir)/src/libimobiledevice-1.0.la $(top_builddir)/common/libinternalcommon.la |
| 107 | 107 | ||
| 108 | idevicenotificationproxy_SOURCES = idevicenotificationproxy.c | 108 | idevicenotificationproxy_SOURCES = idevicenotificationproxy.c |
| @@ -111,11 +111,11 @@ idevicenotificationproxy_LDFLAGS = $(AM_LDFLAGS) | |||
| 111 | idevicenotificationproxy_LDADD = $(top_builddir)/src/libimobiledevice-1.0.la | 111 | idevicenotificationproxy_LDADD = $(top_builddir)/src/libimobiledevice-1.0.la |
| 112 | 112 | ||
| 113 | idevicecrashreport_SOURCES = idevicecrashreport.c | 113 | idevicecrashreport_SOURCES = idevicecrashreport.c |
| 114 | idevicecrashreport_CFLAGS = -I$(top_srcdir) $(AM_CFLAGS) | 114 | idevicecrashreport_CFLAGS = $(AM_CFLAGS) $(limd_glue_CFLAGS) |
| 115 | idevicecrashreport_LDFLAGS = $(AM_LDFLAGS) | 115 | idevicecrashreport_LDFLAGS = $(AM_LDFLAGS) $(limd_glue_LIBS) |
| 116 | idevicecrashreport_LDADD = $(top_builddir)/src/libimobiledevice-1.0.la $(top_builddir)/common/libinternalcommon.la | 116 | idevicecrashreport_LDADD = $(top_builddir)/src/libimobiledevice-1.0.la |
| 117 | 117 | ||
| 118 | idevicesetlocation_SOURCES = idevicesetlocation.c | 118 | idevicesetlocation_SOURCES = idevicesetlocation.c |
| 119 | idevicesetlocation_CFLAGS = $(AM_CFLAGS) | 119 | idevicesetlocation_CFLAGS = $(AM_CFLAGS) |
| 120 | idevicesetlocation_LDFLAGS = $(AM_LDFLAGS) | 120 | idevicesetlocation_LDFLAGS = $(AM_LDFLAGS) |
| 121 | idevicesetlocation_LDADD = $(top_builddir)/src/libimobiledevice-1.0.la $(top_builddir)/common/libinternalcommon.la | 121 | idevicesetlocation_LDADD = $(top_builddir)/src/libimobiledevice-1.0.la |
diff --git a/tools/idevicebackup.c b/tools/idevicebackup.c index 8d0f74b..42f020d 100644 --- a/tools/idevicebackup.c +++ b/tools/idevicebackup.c | |||
| @@ -55,7 +55,7 @@ | |||
| 55 | #include <libimobiledevice/mobilebackup.h> | 55 | #include <libimobiledevice/mobilebackup.h> |
| 56 | #include <libimobiledevice/notification_proxy.h> | 56 | #include <libimobiledevice/notification_proxy.h> |
| 57 | #include <libimobiledevice/afc.h> | 57 | #include <libimobiledevice/afc.h> |
| 58 | #include "common/utils.h" | 58 | #include <libimobiledevice-glue/utils.h> |
| 59 | 59 | ||
| 60 | #define MOBILEBACKUP_SERVICE_NAME "com.apple.mobilebackup" | 60 | #define MOBILEBACKUP_SERVICE_NAME "com.apple.mobilebackup" |
| 61 | #define NP_SERVICE_NAME "com.apple.mobile.notification_proxy" | 61 | #define NP_SERVICE_NAME "com.apple.mobile.notification_proxy" |
diff --git a/tools/idevicebackup2.c b/tools/idevicebackup2.c index 6ed852f..7c8503e 100644 --- a/tools/idevicebackup2.c +++ b/tools/idevicebackup2.c | |||
| @@ -45,7 +45,7 @@ | |||
| 45 | #include <libimobiledevice/installation_proxy.h> | 45 | #include <libimobiledevice/installation_proxy.h> |
| 46 | #include <libimobiledevice/sbservices.h> | 46 | #include <libimobiledevice/sbservices.h> |
| 47 | #include <libimobiledevice/diagnostics_relay.h> | 47 | #include <libimobiledevice/diagnostics_relay.h> |
| 48 | #include "common/utils.h" | 48 | #include <libimobiledevice-glue/utils.h> |
| 49 | 49 | ||
| 50 | #include <endianness.h> | 50 | #include <endianness.h> |
| 51 | 51 | ||
diff --git a/tools/idevicecrashreport.c b/tools/idevicecrashreport.c index 0a03c68..4d3b686 100644 --- a/tools/idevicecrashreport.c +++ b/tools/idevicecrashreport.c | |||
| @@ -33,7 +33,7 @@ | |||
| 33 | #ifndef WIN32 | 33 | #ifndef WIN32 |
| 34 | #include <signal.h> | 34 | #include <signal.h> |
| 35 | #endif | 35 | #endif |
| 36 | #include "common/utils.h" | 36 | #include <libimobiledevice-glue/utils.h> |
| 37 | 37 | ||
| 38 | #include <libimobiledevice/libimobiledevice.h> | 38 | #include <libimobiledevice/libimobiledevice.h> |
| 39 | #include <libimobiledevice/lockdown.h> | 39 | #include <libimobiledevice/lockdown.h> |
diff --git a/tools/idevicedebugserverproxy.c b/tools/idevicedebugserverproxy.c index 15e8deb..b190f63 100644 --- a/tools/idevicedebugserverproxy.c +++ b/tools/idevicedebugserverproxy.c | |||
| @@ -41,8 +41,8 @@ | |||
| 41 | #include <libimobiledevice/libimobiledevice.h> | 41 | #include <libimobiledevice/libimobiledevice.h> |
| 42 | #include <libimobiledevice/debugserver.h> | 42 | #include <libimobiledevice/debugserver.h> |
| 43 | 43 | ||
| 44 | #include "common/socket.h" | 44 | #include <libimobiledevice-glue/socket.h> |
| 45 | #include "common/thread.h" | 45 | #include <libimobiledevice-glue/thread.h> |
| 46 | 46 | ||
| 47 | #define info(...) fprintf(stdout, __VA_ARGS__); fflush(stdout) | 47 | #define info(...) fprintf(stdout, __VA_ARGS__); fflush(stdout) |
| 48 | #define debug(...) if(debug_mode) fprintf(stdout, __VA_ARGS__) | 48 | #define debug(...) if(debug_mode) fprintf(stdout, __VA_ARGS__) |
diff --git a/tools/ideviceimagemounter.c b/tools/ideviceimagemounter.c index 325a9e2..37c2154 100644 --- a/tools/ideviceimagemounter.c +++ b/tools/ideviceimagemounter.c | |||
| @@ -46,7 +46,7 @@ | |||
| 46 | #include <libimobiledevice/notification_proxy.h> | 46 | #include <libimobiledevice/notification_proxy.h> |
| 47 | #include <libimobiledevice/mobile_image_mounter.h> | 47 | #include <libimobiledevice/mobile_image_mounter.h> |
| 48 | #include <asprintf.h> | 48 | #include <asprintf.h> |
| 49 | #include "common/utils.h" | 49 | #include <libimobiledevice-glue/utils.h> |
| 50 | 50 | ||
| 51 | static int list_mode = 0; | 51 | static int list_mode = 0; |
| 52 | static int use_network = 0; | 52 | static int use_network = 0; |
diff --git a/tools/ideviceinfo.c b/tools/ideviceinfo.c index 97ae03a..54ae1d2 100644 --- a/tools/ideviceinfo.c +++ b/tools/ideviceinfo.c | |||
| @@ -37,7 +37,7 @@ | |||
| 37 | 37 | ||
| 38 | #include <libimobiledevice/libimobiledevice.h> | 38 | #include <libimobiledevice/libimobiledevice.h> |
| 39 | #include <libimobiledevice/lockdown.h> | 39 | #include <libimobiledevice/lockdown.h> |
| 40 | #include "common/utils.h" | 40 | #include <libimobiledevice-glue/utils.h> |
| 41 | 41 | ||
| 42 | #define FORMAT_KEY_VALUE 1 | 42 | #define FORMAT_KEY_VALUE 1 |
| 43 | #define FORMAT_XML 2 | 43 | #define FORMAT_XML 2 |
diff --git a/tools/ideviceprovision.c b/tools/ideviceprovision.c index c93a682..36c69b0 100644 --- a/tools/ideviceprovision.c +++ b/tools/ideviceprovision.c | |||
| @@ -44,7 +44,7 @@ | |||
| 44 | #include <libimobiledevice/libimobiledevice.h> | 44 | #include <libimobiledevice/libimobiledevice.h> |
| 45 | #include <libimobiledevice/lockdown.h> | 45 | #include <libimobiledevice/lockdown.h> |
| 46 | #include <libimobiledevice/misagent.h> | 46 | #include <libimobiledevice/misagent.h> |
| 47 | #include "common/utils.h" | 47 | #include <libimobiledevice-glue/utils.h> |
| 48 | 48 | ||
| 49 | static void print_usage(int argc, char **argv) | 49 | static void print_usage(int argc, char **argv) |
| 50 | { | 50 | { |
diff --git a/tools/idevicesyslog.c b/tools/idevicesyslog.c index d9b627f..4eb1605 100644 --- a/tools/idevicesyslog.c +++ b/tools/idevicesyslog.c | |||
| @@ -41,10 +41,10 @@ | |||
| 41 | 41 | ||
| 42 | #include <libimobiledevice/libimobiledevice.h> | 42 | #include <libimobiledevice/libimobiledevice.h> |
| 43 | #include <libimobiledevice/syslog_relay.h> | 43 | #include <libimobiledevice/syslog_relay.h> |
| 44 | #include <libimobiledevice-glue/termcolors.h> | ||
| 44 | 45 | ||
| 45 | static int quit_flag = 0; | 46 | static int quit_flag = 0; |
| 46 | static int exit_on_disconnect = 0; | 47 | static int exit_on_disconnect = 0; |
| 47 | static int use_colors = 0; | ||
| 48 | static int show_device_name = 0; | 48 | static int show_device_name = 0; |
| 49 | 49 | ||
| 50 | static char* udid = NULL; | 50 | static char* udid = NULL; |
| @@ -75,58 +75,6 @@ static char *line = NULL; | |||
| 75 | static int line_buffer_size = 0; | 75 | static int line_buffer_size = 0; |
| 76 | static int lp = 0; | 76 | static int lp = 0; |
| 77 | 77 | ||
| 78 | #ifdef WIN32 | ||
| 79 | static WORD COLOR_RESET = 0; | ||
| 80 | static HANDLE h_stdout = INVALID_HANDLE_VALUE; | ||
| 81 | |||
| 82 | #define COLOR_NORMAL COLOR_RESET | ||
| 83 | #define COLOR_DARK FOREGROUND_INTENSITY | ||
| 84 | #define COLOR_RED FOREGROUND_RED |FOREGROUND_INTENSITY | ||
| 85 | #define COLOR_DARK_RED FOREGROUND_RED | ||
| 86 | #define COLOR_GREEN FOREGROUND_GREEN | FOREGROUND_INTENSITY | ||
| 87 | #define COLOR_DARK_GREEN FOREGROUND_GREEN | ||
| 88 | #define COLOR_YELLOW FOREGROUND_GREEN | FOREGROUND_RED | FOREGROUND_INTENSITY | ||
| 89 | #define COLOR_DARK_YELLOW FOREGROUND_GREEN | FOREGROUND_RED | ||
| 90 | #define COLOR_BLUE FOREGROUND_BLUE | FOREGROUND_INTENSITY | ||
| 91 | #define COLOR_DARK_BLUE FOREGROUND_BLUE | ||
| 92 | #define COLOR_MAGENTA FOREGROUND_BLUE | FOREGROUND_RED | FOREGROUND_INTENSITY | ||
| 93 | #define COLOR_DARK_MAGENTA FOREGROUND_BLUE | FOREGROUND_RED | ||
| 94 | #define COLOR_CYAN FOREGROUND_BLUE | FOREGROUND_GREEN | ||
| 95 | #define COLOR_BRIGHT_CYAN FOREGROUND_BLUE | FOREGROUND_GREEN | FOREGROUND_INTENSITY | ||
| 96 | #define COLOR_DARK_CYAN FOREGROUND_BLUE | FOREGROUND_GREEN | ||
| 97 | #define COLOR_WHITE FOREGROUND_RED | FOREGROUND_GREEN | FOREGROUND_BLUE | FOREGROUND_INTENSITY | ||
| 98 | #define COLOR_DARK_WHITE FOREGROUND_RED | FOREGROUND_GREEN | FOREGROUND_BLUE | ||
| 99 | |||
| 100 | static void TEXT_COLOR(WORD attr) | ||
| 101 | { | ||
| 102 | if (use_colors) { | ||
| 103 | SetConsoleTextAttribute(h_stdout, attr); | ||
| 104 | } | ||
| 105 | } | ||
| 106 | #else | ||
| 107 | |||
| 108 | #define COLOR_RESET "\e[m" | ||
| 109 | #define COLOR_NORMAL "\e[0m" | ||
| 110 | #define COLOR_DARK "\e[2m" | ||
| 111 | #define COLOR_RED "\e[0;31m" | ||
| 112 | #define COLOR_DARK_RED "\e[2;31m" | ||
| 113 | #define COLOR_GREEN "\e[0;32m" | ||
| 114 | #define COLOR_DARK_GREEN "\e[2;32m" | ||
| 115 | #define COLOR_YELLOW "\e[0;33m" | ||
| 116 | #define COLOR_DARK_YELLOW "\e[2;33m" | ||
| 117 | #define COLOR_BLUE "\e[0;34m" | ||
| 118 | #define COLOR_DARK_BLUE "\e[2;34m" | ||
| 119 | #define COLOR_MAGENTA "\e[0;35m" | ||
| 120 | #define COLOR_DARK_MAGENTA "\e[2;35m" | ||
| 121 | #define COLOR_CYAN "\e[0;36m" | ||
| 122 | #define COLOR_BRIGHT_CYAN "\e[1;36m" | ||
| 123 | #define COLOR_DARK_CYAN "\e[2;36m" | ||
| 124 | #define COLOR_WHITE "\e[1;37m" | ||
| 125 | #define COLOR_DARK_WHITE "\e[0;37m" | ||
| 126 | |||
| 127 | #define TEXT_COLOR(x) if (use_colors) { fwrite(x, 1, sizeof(x)-1, stdout); } | ||
| 128 | #endif | ||
| 129 | |||
| 130 | static void add_filter(const char* filterstr) | 78 | static void add_filter(const char* filterstr) |
| 131 | { | 79 | { |
| 132 | int filter_len = strlen(filterstr); | 80 | int filter_len = strlen(filterstr); |
| @@ -201,7 +149,7 @@ static void syslog_callback(char c, void *user_data) | |||
| 201 | do { | 149 | do { |
| 202 | if (lp < 16) { | 150 | if (lp < 16) { |
| 203 | shall_print = 1; | 151 | shall_print = 1; |
| 204 | TEXT_COLOR(COLOR_WHITE); | 152 | cprintf(COLOR_WHITE); |
| 205 | break; | 153 | break; |
| 206 | } else if (line[3] == ' ' && line[6] == ' ' && line[15] == ' ') { | 154 | } else if (line[3] == ' ' && line[6] == ' ' && line[15] == ' ') { |
| 207 | char* end = &line[lp]; | 155 | char* end = &line[lp]; |
| @@ -331,11 +279,7 @@ static void syslog_callback(char c, void *user_data) | |||
| 331 | /* log level */ | 279 | /* log level */ |
| 332 | char* level_start = p; | 280 | char* level_start = p; |
| 333 | char* level_end = p; | 281 | char* level_end = p; |
| 334 | #ifdef WIN32 | ||
| 335 | WORD level_color = COLOR_NORMAL; | ||
| 336 | #else | ||
| 337 | const char* level_color = NULL; | 282 | const char* level_color = NULL; |
| 338 | #endif | ||
| 339 | if (!strncmp(p, "<Notice>:", 9)) { | 283 | if (!strncmp(p, "<Notice>:", 9)) { |
| 340 | level_end += 9; | 284 | level_end += 9; |
| 341 | level_color = COLOR_GREEN; | 285 | level_color = COLOR_GREEN; |
| @@ -353,24 +297,24 @@ static void syslog_callback(char c, void *user_data) | |||
| 353 | } | 297 | } |
| 354 | 298 | ||
| 355 | /* write date and time */ | 299 | /* write date and time */ |
| 356 | TEXT_COLOR(COLOR_DARK_WHITE); | 300 | cprintf(COLOR_LIGHT_GRAY); |
| 357 | fwrite(line, 1, 16, stdout); | 301 | fwrite(line, 1, 16, stdout); |
| 358 | 302 | ||
| 359 | if (show_device_name) { | 303 | if (show_device_name) { |
| 360 | /* write device name */ | 304 | /* write device name */ |
| 361 | TEXT_COLOR(COLOR_DARK_YELLOW); | 305 | cprintf(COLOR_DARK_YELLOW); |
| 362 | fwrite(device_name_start, 1, device_name_end-device_name_start+1, stdout); | 306 | fwrite(device_name_start, 1, device_name_end-device_name_start+1, stdout); |
| 363 | TEXT_COLOR(COLOR_RESET); | 307 | cprintf(COLOR_RESET); |
| 364 | } | 308 | } |
| 365 | 309 | ||
| 366 | /* write process name */ | 310 | /* write process name */ |
| 367 | TEXT_COLOR(COLOR_BRIGHT_CYAN); | 311 | cprintf(COLOR_BRIGHT_CYAN); |
| 368 | fwrite(process_name_start, 1, process_name_end-process_name_start, stdout); | 312 | fwrite(process_name_start, 1, process_name_end-process_name_start, stdout); |
| 369 | TEXT_COLOR(COLOR_CYAN); | 313 | cprintf(COLOR_CYAN); |
| 370 | fwrite(process_name_end, 1, proc_name_end-process_name_end+1, stdout); | 314 | fwrite(process_name_end, 1, proc_name_end-process_name_end+1, stdout); |
| 371 | 315 | ||
| 372 | /* write log level */ | 316 | /* write log level */ |
| 373 | TEXT_COLOR(level_color); | 317 | cprintf(level_color); |
| 374 | if (level_end > level_start) { | 318 | if (level_end > level_start) { |
| 375 | fwrite(level_start, 1, level_end-level_start, stdout); | 319 | fwrite(level_start, 1, level_end-level_start, stdout); |
| 376 | p = level_end; | 320 | p = level_end; |
| @@ -379,17 +323,17 @@ static void syslog_callback(char c, void *user_data) | |||
| 379 | lp -= p - linep; | 323 | lp -= p - linep; |
| 380 | linep = p; | 324 | linep = p; |
| 381 | 325 | ||
| 382 | TEXT_COLOR(COLOR_WHITE); | 326 | cprintf(COLOR_WHITE); |
| 383 | 327 | ||
| 384 | } else { | 328 | } else { |
| 385 | shall_print = 1; | 329 | shall_print = 1; |
| 386 | TEXT_COLOR(COLOR_WHITE); | 330 | cprintf(COLOR_WHITE); |
| 387 | } | 331 | } |
| 388 | } while (0); | 332 | } while (0); |
| 389 | 333 | ||
| 390 | if ((num_msg_filters == 0 && num_proc_filters == 0 && num_pid_filters == 0 && num_trigger_filters == 0 && num_untrigger_filters == 0) || shall_print) { | 334 | if ((num_msg_filters == 0 && num_proc_filters == 0 && num_pid_filters == 0 && num_trigger_filters == 0 && num_untrigger_filters == 0) || shall_print) { |
| 391 | fwrite(linep, 1, lp, stdout); | 335 | fwrite(linep, 1, lp, stdout); |
| 392 | TEXT_COLOR(COLOR_RESET); | 336 | cprintf(COLOR_RESET); |
| 393 | fflush(stdout); | 337 | fflush(stdout); |
| 394 | if (trigger_off) { | 338 | if (trigger_off) { |
| 395 | triggered = 0; | 339 | triggered = 0; |
| @@ -560,14 +504,6 @@ static void print_usage(int argc, char **argv, int is_error) | |||
| 560 | 504 | ||
| 561 | int main(int argc, char *argv[]) | 505 | int main(int argc, char *argv[]) |
| 562 | { | 506 | { |
| 563 | #ifdef WIN32 | ||
| 564 | CONSOLE_SCREEN_BUFFER_INFO csbi; | ||
| 565 | h_stdout = GetStdHandle(STD_OUTPUT_HANDLE); | ||
| 566 | if (GetConsoleScreenBufferInfo(h_stdout, &csbi)) { | ||
| 567 | COLOR_RESET = csbi.wAttributes; | ||
| 568 | } | ||
| 569 | #endif | ||
| 570 | int no_colors = 0; | ||
| 571 | int include_filter = 0; | 507 | int include_filter = 0; |
| 572 | int exclude_filter = 0; | 508 | int exclude_filter = 0; |
| 573 | int include_kernel = 0; | 509 | int include_kernel = 0; |
| @@ -700,7 +636,7 @@ int main(int argc, char *argv[]) | |||
| 700 | return 0; | 636 | return 0; |
| 701 | } | 637 | } |
| 702 | case 2: | 638 | case 2: |
| 703 | no_colors = 1; | 639 | term_colors_set_enabled(0); |
| 704 | break; | 640 | break; |
| 705 | case 'v': | 641 | case 'v': |
| 706 | printf("%s %s\n", TOOL_NAME, PACKAGE_VERSION); | 642 | printf("%s %s\n", TOOL_NAME, PACKAGE_VERSION); |
| @@ -756,10 +692,6 @@ int main(int argc, char *argv[]) | |||
| 756 | argc -= optind; | 692 | argc -= optind; |
| 757 | argv += optind; | 693 | argv += optind; |
| 758 | 694 | ||
| 759 | if (!no_colors && isatty(1)) { | ||
| 760 | use_colors = 1; | ||
| 761 | } | ||
| 762 | |||
| 763 | int num = 0; | 695 | int num = 0; |
| 764 | idevice_info_t *devices = NULL; | 696 | idevice_info_t *devices = NULL; |
| 765 | idevice_get_device_list_extended(&devices, &num); | 697 | idevice_get_device_list_extended(&devices, &num); |
