diff options
-rw-r--r-- | .gitignore | 6 | ||||
-rw-r--r-- | Makefile | 35 | ||||
-rw-r--r-- | Readme.txt | 34 | ||||
-rw-r--r-- | iproxy.c | 54 | ||||
-rw-r--r-- | main.c (renamed from usbmuxd.c) | 48 | ||||
-rw-r--r-- | sock_stuff.c | 8 | ||||
-rw-r--r-- | sock_stuff.h | 6 | ||||
-rw-r--r-- | testclient.c | 32 | ||||
-rw-r--r-- | usbmuxd.h | 46 |
9 files changed, 157 insertions, 112 deletions
diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..26cda67 --- /dev/null +++ b/.gitignore @@ -0,0 +1,6 @@ +*~ +*.o +.*.swp +iproxy +testclient +usbmuxd @@ -1,26 +1,31 @@ -TARGET=usbmuxd -CFLAGS=-Wall -LDFLAGS=-lpthread -lusb -lrt +TARGETS=usbmuxd iproxy testclient +CFLAGS=-Wall -g +LIBS=-lpthread -lusb -lrt +LDFLAGS= -objects = sock_stuff.o usbmuxd.o iphone.o +all: $(TARGETS) -all: $(TARGET) +main.o: main.c usbmuxd.h sock_stuff.h iphone.h +iphone.o: iproxy.c iphone.h usbmuxd.h sock_stuff.h +sock_stuff.o: sock_stuff.c sock_stuff.h +testclient.o: testclient.c sock_stuff.h -%.o: %.c %.h +%.o: %.c $(CC) -o $@ $(CFLAGS) -c $< -$(TARGET): $(objects) - $(CC) -o $@ $(LDFLAGS) $^ +usbmuxd: main.o sock_stuff.o iphone.o + $(CC) -o $@ $(LDFLAGS) $^ $(LIBS) + +testclient: testclient.o sock_stuff.o + $(CC) -o $@ $(LDFLAGS) $^ $(LIBS) + +iproxy: iproxy.o sock_stuff.o + $(CC) -o $@ $(LDFLAGS) $^ $(LIBS) clean: - rm -f *.o $(TARGET) + rm -f *.o $(TARGETS) realclean: clean rm -f *~ -testclient: testclient.c sock_stuff.o - $(CC) $(LDFLAGS) -o testclient $(CFLAGS) $< sock_stuff.o - -iproxy: iproxy.c sock_stuff.o - $(CC) -lpthread -o iproxy $(CFLAGS) $< sock_stuff.o - +.PHONY: all clean realclean diff --git a/Readme.txt b/Readme.txt new file mode 100644 index 0000000..deece52 --- /dev/null +++ b/Readme.txt @@ -0,0 +1,34 @@ +Build +===== + + make + +Use +=== + + sudo ./usbmuxd & + ./iproxy 2222 22 & + ssh -p 2222 root@localhost + +Muwahahaha. Hopefully you get the normal SSH login prompt. + + Unfortunately, as of 2009-02-24 this only survives for a single + connection. You will have to restart the 'iproxy' part. + +SSH +=== + +If your iphone is rooted, but isn't running SSH, you will need to +mount it with 'ifuse --afc2' (to access the root directory of the +device). + +And then edit: + + /Library/LaunchDaemons/com.openssh.sshd.plist + +to _remove_ the lines: + + <key>Diabled</key> + <true/> + +Reboot the device and then sshd should be running. @@ -34,8 +34,6 @@ #include "usbmuxd.h" #include "sock_stuff.h" -#define SOCKET_FILE "/var/run/usbmuxd" - static uint16_t listen_port = 0; static uint16_t device_port = 0; @@ -50,7 +48,7 @@ struct client_data { int usbmuxd_get_result(int sfd, uint32_t tag, uint32_t *result) { - struct usbmux_result res; + struct usbmuxd_result res; int recv_len; int i; uint32_t rrr[5]; @@ -71,7 +69,7 @@ int usbmuxd_get_result(int sfd, uint32_t tag, uint32_t *result) if ((recv_len == sizeof(res)) && (res.header.length == recv_len) && (res.header.reserved == 0) - && (res.header.type == usbmux_result) + && (res.header.type == USBMUXD_RESULT) ) { *result = res.result; if (res.header.tag == tag) { @@ -185,8 +183,8 @@ void *acceptor_thread(void *arg) int connected; uint32_t pktlen; unsigned char *buf; - struct usbmux_header hello; - struct usbmux_dev_info device_info; + struct usbmuxd_hello hello; + struct usbmuxd_device_info device_info; pthread_t ctos; if (!arg) { @@ -196,26 +194,26 @@ void *acceptor_thread(void *arg) cdata = (struct client_data*)arg; - cdata->sfd = connect_unix_socket(SOCKET_FILE); + cdata->sfd = connect_unix_socket(USBMUXD_SOCKET_FILE); if (cdata->sfd < 0) { printf("error opening socket, terminating.\n"); return NULL; } // send hello - hello.length = sizeof(struct usbmux_header); - hello.reserved = 0; - hello.type = usbmux_hello; - hello.tag = 2; + hello.header.length = sizeof(struct usbmuxd_hello); + hello.header.reserved = 0; + hello.header.type = USBMUXD_HELLO; + hello.header.tag = 2; hello_done = 0; connected = 0; fprintf(stdout, "sending Hello packet\n"); - if (send(cdata->sfd, &hello, hello.length, 0) == hello.length) { + if (send(cdata->sfd, &hello, hello.header.length, 0) == hello.header.length) { uint32_t res = -1; // get response - if (usbmuxd_get_result(cdata->sfd, hello.tag, &res) && (res==0)) { + if (usbmuxd_get_result(cdata->sfd, hello.header.tag, &res) && (res==0)) { fprintf(stdout, "Got Hello Response!\n"); hello_done = 1; } else { @@ -241,7 +239,7 @@ void *acceptor_thread(void *arg) } fprintf(stdout, "Received device data\n"); //log_debug_buffer(stdout, (char*)buf, pktlen); - memcpy(&device_info, buf + sizeof(struct usbmux_header), sizeof(device_info)); + memcpy(&device_info, buf + sizeof(struct usbmuxd_header), sizeof(device_info)); free(buf); } else { // we _should_ have all of them now. @@ -252,17 +250,17 @@ void *acceptor_thread(void *arg) } if (device_info.device_id > 0) { - struct usbmux_connect_request c_req; + struct usbmuxd_connect_request c_req; fprintf(stdout, "Requesting connecion to device %d port %d\n", device_info.device_id, device_port); // try to connect to last device found c_req.header.length = sizeof(c_req); c_req.header.reserved = 0; - c_req.header.type = usbmux_connect; + c_req.header.type = USBMUXD_CONNECT; c_req.header.tag = 3; c_req.device_id = device_info.device_id; - c_req.port = htons(device_port); + c_req.tcp_dport = htons(device_port); c_req.reserved = 0; if (send_buf(cdata->sfd, &c_req, sizeof(c_req)) < 0) { @@ -346,26 +344,26 @@ int main(int argc, char **argv) } /* - sfd = connect_unix_socket(SOCKET_FILE); + sfd = connect_unix_socket(USBMUXD_SOCKET_FILE); if (sfd < 0) { printf("error opening socket, terminating.\n"); return -1; } // send hello - hello.length = sizeof(struct usbmux_header); - hello.reserved = 0; - hello.type = usbmux_hello; - hello.tag = 2; + hello.header.length = sizeof(hello); + hello.header.reserved = 0; + hello.header.type = USBMUXD_HELLO; + hello.header.tag = 2; hello_done = 0; connected = 0; fprintf(stdout, "sending Hello packet\n"); - if (send(sfd, &hello, hello.length, 0) == hello.length) { + if (send(sfd, &hello, hello.header.length, 0) == hello.header.length) { uint32_t res = -1; // get response - if (usbmuxd_get_result(sfd, hello.tag, &res) && (res==0)) { + if (usbmuxd_get_result(sfd, hello.header.tag, &res) && (res==0)) { fprintf(stdout, "Got Hello Response!\n"); hello_done = 1; } else { @@ -390,7 +388,7 @@ int main(int argc, char **argv) } fprintf(stdout, "Received device data\n"); //log_debug_buffer(stdout, (char*)buf, pktlen); - memcpy(&device_info, buf + sizeof(struct usbmux_header), sizeof(device_info)); + memcpy(&device_info, buf + sizeof(struct usbmuxd_header), sizeof(device_info)); free(buf); } else { // we _should_ have all of them now. @@ -401,17 +399,17 @@ int main(int argc, char **argv) } if (device_info.device_id > 0) { - struct usbmux_connect_request c_req; + struct usbmuxd_connect_request c_req; fprintf(stdout, "Requesting connecion to device %d port %d\n", device_info.device_id, device_port); // try to connect to last device found c_req.header.length = sizeof(c_req); c_req.header.reserved = 0; - c_req.header.type = usbmux_connect; + c_req.header.type = USBMUXD_CONNECT; c_req.header.tag = 3; c_req.device_id = device_info.device_id; - c_req.port = htons(device_port); + c_req.tcp_dport = htons(device_port); c_req.reserved = 0; if (send_buf(sfd, &c_req, sizeof(c_req)) < 0) { @@ -39,8 +39,6 @@ #include "iphone.h" -#define SOCKET_FILE "/var/run/usbmuxd" - #define DEFAULT_TIMEOUT 4000 #define DEFAULT_CHILDREN_CAPACITY 10 @@ -163,11 +161,11 @@ static int usbmuxd_get_request(int fd, void *data, size_t len) */ static int usbmuxd_send_result(int fd, uint32_t tag, uint32_t result_code) { - struct usbmux_result res; + struct usbmuxd_result res; res.header.length = sizeof(res); res.header.reserved = 0; - res.header.type = usbmux_result; + res.header.type = USBMUXD_RESULT; res.header.tag = tag; res.result = result_code; @@ -209,7 +207,7 @@ static void *usbmuxd_client_reader_thread(void *arg) fprintf(stdout, "%s[%d:%d]: started\n", __func__, cdata->duinfo->device_id, cdata->duinfo->use_count); while (!quit_flag && !cdata->reader_quit) { - result = check_fd(cdata->socket, fdwrite, DEFAULT_TIMEOUT); + result = check_fd(cdata->socket, FD_WRITE, DEFAULT_TIMEOUT); if (result <= 0) { if (result < 0) { fprintf(stderr, "%s: select error: %s\n", __func__, strerror(errno)); @@ -269,7 +267,7 @@ static int usbmuxd_handleConnectResult(struct client_data *cdata) return -EINVAL; } - result = check_fd(cdata->socket, fdwrite, DEFAULT_TIMEOUT); + result = check_fd(cdata->socket, FD_WRITE, DEFAULT_TIMEOUT); if (result <= 0) { if (result < 0) { fprintf(stderr, "%s: select error: %s\n", __func__, strerror(errno)); @@ -349,7 +347,7 @@ static void *usbmuxd_client_handler_thread(void *arg) } while (!quit_flag && !cdata->reader_dead) { - result = check_fd(cdata->socket, fdread, DEFAULT_TIMEOUT); + result = check_fd(cdata->socket, FD_READ, DEFAULT_TIMEOUT); if (result <= 0) { if (result < 0) { fprintf(stderr, "%s: Error: checkfd: %s\n", __func__, strerror(errno)); @@ -415,9 +413,9 @@ leave: static void *usbmuxd_client_init_thread(void *arg) { struct client_data *cdata; - struct usbmux_header hello; - struct usbmux_dev_info_request dev_info_req; - struct usbmux_connect_request c_req; + struct usbmuxd_hello hello; + struct usbmuxd_device_info_request dev_info_req; + struct usbmuxd_connect_request c_req; struct usb_bus *bus; struct usb_device *dev; @@ -447,15 +445,15 @@ static void *usbmuxd_client_init_thread(void *arg) goto leave; } - if ((recv_len == 16) && (hello.length == 16) - && (hello.reserved == 0) && (hello.type == usbmux_hello)) { + if ((recv_len == sizeof(hello)) && (hello.header.length == sizeof(hello)) + && (hello.header.reserved == 0) && (hello.header.type == USBMUXD_HELLO)) { // send success response - usbmuxd_send_result(cdata->socket, hello.tag, 0); + usbmuxd_send_result(cdata->socket, hello.header.tag, 0); } else { // send error response and exit fprintf(stderr, "%s: Invalid Hello packet received.\n", __func__); // TODO is this required?! - usbmuxd_send_result(cdata->socket, hello.tag, EINVAL); + usbmuxd_send_result(cdata->socket, hello.header.tag, EINVAL); goto leave; } @@ -476,15 +474,15 @@ static void *usbmuxd_client_init_thread(void *arg) // construct packet memset(&dev_info_req, 0, sizeof(dev_info_req)); dev_info_req.header.length = sizeof(dev_info_req); - dev_info_req.header.type = usbmux_device_info; - dev_info_req.dev_info.device_id = dev->devnum; - dev_info_req.dev_info.product_id = dev->descriptor.idProduct; + dev_info_req.header.type = USBMUXD_DEVICE_INFO; + dev_info_req.device_info.device_id = dev->devnum; + dev_info_req.device_info.product_id = dev->descriptor.idProduct; if (dev->descriptor.iSerialNumber) { usb_dev_handle *udev; //pthread_mutex_lock(&usbmux_mutex); udev = usb_open(dev); if (udev) { - usb_get_string_simple(udev, dev->descriptor.iSerialNumber, dev_info_req.dev_info.serial_number, sizeof(dev_info_req.dev_info.serial_number)+1); + usb_get_string_simple(udev, dev->descriptor.iSerialNumber, dev_info_req.device_info.serial_number, sizeof(dev_info_req.device_info.serial_number)+1); usb_close(udev); } //pthread_mutex_unlock(&usbmux_mutex); @@ -515,12 +513,12 @@ static void *usbmuxd_client_init_thread(void *arg) goto leave; } - if (c_req.header.type != usbmux_connect) { + if (c_req.header.type != USBMUXD_CONNECT) { fprintf(stderr, "%s: Unexpected packet of type %d received.\n", __func__, c_req.header.type); goto leave; } - fprintf(stdout, "%s: Setting up connection to usb device #%d on port %d\n", __func__, c_req.device_id, ntohs(c_req.port)); + fprintf(stdout, "%s: Setting up connection to usb device #%d on port %d\n", __func__, c_req.device_id, ntohs(c_req.tcp_dport)); // find the device, and open usb connection phone = NULL; @@ -569,7 +567,7 @@ static void *usbmuxd_client_init_thread(void *arg) // setup connection to iPhone/iPod // pthread_mutex_lock(&usbmux_mutex); - res = iphone_mux_new_client(cur_dev->phone, 0, ntohs(c_req.port), &(cdata->muxclient)); + res = iphone_mux_new_client(cur_dev->phone, 0, ntohs(c_req.tcp_dport), &(cdata->muxclient)); // pthread_mutex_unlock(&usbmux_mutex); if (res != 0) { @@ -707,7 +705,7 @@ static void *usbmuxd_accept_thread(void *arg) while (!quit_flag) { // Check the file descriptor before accepting a connection. // If no connection attempt is made, just repeat... - result = check_fd(fsock, fdread, 1000); + result = check_fd(fsock, FD_READ, 1000); if (result <= 0) { if (result == 0) { // cleanup @@ -814,13 +812,13 @@ int main(int argc, char **argv) // TODO: Parameter checking. - fsock = create_unix_socket(SOCKET_FILE); + fsock = create_unix_socket(USBMUXD_SOCKET_FILE); if (fsock < 0) { fprintf(stderr, "Could not create socket, exiting\n"); return -1; } - chmod(SOCKET_FILE, 0666); + chmod(USBMUXD_SOCKET_FILE, 0666); if (!foreground) { if (daemonize() < 0) { @@ -848,7 +846,7 @@ int main(int argc, char **argv) close(fsock); } - unlink(SOCKET_FILE); + unlink(USBMUXD_SOCKET_FILE); return 0; } diff --git a/sock_stuff.c b/sock_stuff.c index 1a23bc1..3d11a27 100644 --- a/sock_stuff.c +++ b/sock_stuff.c @@ -208,13 +208,13 @@ int check_fd(int fd, fd_mode fdm, unsigned int timeout) do { eagain = 0; switch(fdm) { - case fdread: + case FD_READ: sret = select(fd+1,&fds,NULL,NULL,&to); break; - case fdwrite: + case FD_WRITE: sret = select(fd+1,NULL,&fds,NULL,&to); break; - case fdexcept: + case FD_EXCEPT: sret = select(fd+1,NULL,NULL,&fds,&to); break; } @@ -255,7 +255,7 @@ int recv_buf_timeout(int fd, void *data, size_t length, int flags, unsigned int int result; // check if data is available - res = check_fd(fd, fdread, timeout); + res = check_fd(fd, FD_READ, timeout); if (res <= 0) { return res; } diff --git a/sock_stuff.h b/sock_stuff.h index 01082d1..9965f4e 100644 --- a/sock_stuff.h +++ b/sock_stuff.h @@ -5,9 +5,9 @@ enum fd_mode { - fdread, - fdwrite, - fdexcept + FD_READ, + FD_WRITE, + FD_EXCEPT }; typedef enum fd_mode fd_mode; diff --git a/testclient.c b/testclient.c index fafbf23..679b6d0 100644 --- a/testclient.c +++ b/testclient.c @@ -10,11 +10,9 @@ #include "usbmuxd.h" #include "sock_stuff.h" -#define SOCKET_FILE "/var/run/usbmuxd" - int usbmuxd_get_result(int sfd, uint32_t tag, uint32_t *result) { - struct usbmux_result res; + struct usbmuxd_result res; int recv_len; if (!result) { @@ -28,7 +26,7 @@ int usbmuxd_get_result(int sfd, uint32_t tag, uint32_t *result) if ((recv_len == sizeof(res)) && (res.header.length == recv_len) && (res.header.reserved == 0) - && (res.header.type == usbmux_result) + && (res.header.type == USBMUXD_RESULT) ) { *result = res.result; if (res.header.tag == tag) { @@ -50,29 +48,29 @@ int main(int argc, char **argv) int connected; uint32_t pktlen; unsigned char *buf; - struct usbmux_header hello; - struct usbmux_dev_info device_info; + struct usbmuxd_hello hello; + struct usbmuxd_device_info device_info; - sfd = connect_unix_socket(SOCKET_FILE); + sfd = connect_unix_socket(USBMUXD_SOCKET_FILE); if (sfd < 0) { printf("error opening socket, terminating.\n"); return -1; } // send hello - hello.length = sizeof(struct usbmux_header); - hello.reserved = 0; - hello.type = usbmux_hello; - hello.tag = 2; + hello.header.length = sizeof(struct usbmuxd_hello); + hello.header.reserved = 0; + hello.header.type = USBMUXD_HELLO; + hello.header.tag = 2; hello_done = 0; connected = 0; fprintf(stdout, "sending Hello packet\n"); - if (send(sfd, &hello, hello.length, 0) == hello.length) { + if (send(sfd, &hello, hello.header.length, 0) == hello.header.length) { uint32_t res = -1; // get response - if (usbmuxd_get_result(sfd, hello.tag, &res) && (res==0)) { + if (usbmuxd_get_result(sfd, hello.header.tag, &res) && (res==0)) { fprintf(stdout, "Got Hello Response!\n"); hello_done = 1; } else { @@ -97,7 +95,7 @@ int main(int argc, char **argv) } fprintf(stdout, "got device data:\n"); //log_debug_buffer(stdout, (char*)buf, pktlen); - memcpy(&device_info, buf + sizeof(struct usbmux_header), sizeof(device_info)); + memcpy(&device_info, buf + sizeof(struct usbmuxd_header), sizeof(device_info)); free(buf); } else { // we _should_ have all of them now. @@ -108,15 +106,15 @@ int main(int argc, char **argv) } if (device_info.device_id > 0) { - struct usbmux_connect_request c_req; + struct usbmuxd_connect_request c_req; // try to connect to last device found c_req.header.length = sizeof(c_req); c_req.header.reserved = 0; - c_req.header.type = usbmux_connect; + c_req.header.type = USBMUXD_CONNECT; c_req.header.tag = 3; c_req.device_id = device_info.device_id; - c_req.port = htons(22); + c_req.tcp_dport = htons(22); c_req.reserved = 0; if (send_buf(sfd, &c_req, sizeof(c_req)) < 0) { @@ -3,42 +3,48 @@ #include <stdint.h> -struct usbmux_header { +#define USBMUXD_SOCKET_FILE "/var/run/usbmuxd" + +struct usbmuxd_header { uint32_t length; // length of message, including header uint32_t reserved; // always zero uint32_t type; // message type uint32_t tag; // responses to this query will echo back this tag -}; +} __attribute__((__packed__)); -struct usbmux_result { - struct usbmux_header header; +struct usbmuxd_result { + struct usbmuxd_header header; uint32_t result; -}; +} __attribute__((__packed__)); -struct usbmux_connect_request { - struct usbmux_header header; +struct usbmuxd_connect_request { + struct usbmuxd_header header; uint32_t device_id; - uint16_t port; // TCP port number + uint16_t tcp_dport; // TCP port number uint16_t reserved; // set to zero -}; +} __attribute__((__packed__)); -struct usbmux_dev_info { +struct usbmuxd_device_info { uint32_t device_id; uint16_t product_id; char serial_number[40]; -}; +} __attribute__((__packed__)); -struct usbmux_dev_info_request { - struct usbmux_header header; - struct usbmux_dev_info dev_info; - unsigned char padding[222]; -}; +struct usbmuxd_device_info_request { + struct usbmuxd_header header; + struct usbmuxd_device_info device_info; + char padding[222]; +} __attribute__((__packed__)); + +struct usbmuxd_hello { + struct usbmuxd_header header; +} __attribute__((__packed__)); enum { - usbmux_result = 1, - usbmux_connect = 2, - usbmux_hello = 3, - usbmux_device_info = 4, + USBMUXD_RESULT = 1, + USBMUXD_CONNECT = 2, + USBMUXD_HELLO = 3, + USBMUXD_DEVICE_INFO = 4, }; #endif |