summaryrefslogtreecommitdiffstats
path: root/tools/idevicediagnostics.c
diff options
context:
space:
mode:
Diffstat (limited to 'tools/idevicediagnostics.c')
-rw-r--r--tools/idevicediagnostics.c235
1 files changed, 112 insertions, 123 deletions
diff --git a/tools/idevicediagnostics.c b/tools/idevicediagnostics.c
index 66ed589..e699bc4 100644
--- a/tools/idevicediagnostics.c
+++ b/tools/idevicediagnostics.c
@@ -28,6 +28,7 @@
28#include <stdio.h> 28#include <stdio.h>
29#include <string.h> 29#include <string.h>
30#include <stdlib.h> 30#include <stdlib.h>
31#include <getopt.h>
31#include <errno.h> 32#include <errno.h>
32#include <time.h> 33#include <time.h>
33#ifndef WIN32 34#ifndef WIN32
@@ -59,7 +60,34 @@ static void print_xml(plist_t node)
59 } 60 }
60} 61}
61 62
62void print_usage(int argc, char **argv); 63static void print_usage(int argc, char **argv, int is_error)
64{
65 char *name = strrchr(argv[0], '/');
66 fprintf(is_error ? stderr : stdout, "Usage: %s [OPTIONS] COMMAND\n", (name ? name + 1: argv[0]));
67 fprintf(is_error ? stderr : stdout,
68 "\n"
69 "Use diagnostics interface of a device running iOS 4 or later.\n"
70 "\n"
71 "Where COMMAND is one of:\n"
72 " diagnostics [TYPE] print diagnostics information from device by TYPE (All, WiFi, GasGauge, NAND)\n"
73 " mobilegestalt KEY [...] print mobilegestalt keys passed as arguments separated by a space.\n"
74 " ioreg [PLANE] print IORegistry of device, optionally by PLANE (IODeviceTree, IOPower, IOService) (iOS 5+ only)\n"
75 " ioregentry [KEY] print IORegistry entry of device (AppleARMPMUCharger, ASPStorage, ...) (iOS 5+ only)\n"
76 " shutdown shutdown device\n"
77 " restart restart device\n"
78 " sleep put device into sleep mode (disconnects from host)\n"
79 "\n"
80 "The following OPTIONS are accepted:\n"
81 " -u, --udid UDID target specific device by UDID\n"
82 " -n, --network connect to network device\n"
83 " -d, --debug enable communication debugging\n"
84 " -h, --help prints usage information\n"
85 " -v, --version prints version information\n"
86 "\n"
87 "Homepage: <" PACKAGE_URL ">\n"
88 "Bug Reports: <" PACKAGE_BUGREPORT ">\n"
89 );
90}
63 91
64int main(int argc, char **argv) 92int main(int argc, char **argv)
65{ 93{
@@ -69,130 +97,119 @@ int main(int argc, char **argv)
69 lockdownd_error_t ret = LOCKDOWN_E_UNKNOWN_ERROR; 97 lockdownd_error_t ret = LOCKDOWN_E_UNKNOWN_ERROR;
70 lockdownd_service_descriptor_t service = NULL; 98 lockdownd_service_descriptor_t service = NULL;
71 int result = EXIT_FAILURE; 99 int result = EXIT_FAILURE;
72 int i;
73 const char *udid = NULL; 100 const char *udid = NULL;
74 int use_network = 0; 101 int use_network = 0;
75 int cmd = CMD_NONE; 102 int cmd = CMD_NONE;
76 char* cmd_arg = NULL; 103 char* cmd_arg = NULL;
77 plist_t node = NULL; 104 plist_t node = NULL;
78 plist_t keys = NULL; 105 plist_t keys = NULL;
106 int c = 0;
107 const struct option longopts[] = {
108 { "debug", no_argument, NULL, 'd' },
109 { "help", no_argument, NULL, 'h' },
110 { "udid", required_argument, NULL, 'u' },
111 { "network", no_argument, NULL, 'n' },
112 { "version", no_argument, NULL, 'v' },
113 { NULL, 0, NULL, 0}
114 };
79 115
80#ifndef WIN32 116#ifndef WIN32
81 signal(SIGPIPE, SIG_IGN); 117 signal(SIGPIPE, SIG_IGN);
82#endif 118#endif
83 /* parse cmdline args */ 119 /* parse cmdline args */
84 for (i = 1; i < argc; i++) { 120 while ((c = getopt_long(argc, argv, "dhu:nv", longopts, NULL)) != -1) {
85 if (!strcmp(argv[i], "-d") || !strcmp(argv[i], "--debug")) { 121 switch (c) {
122 case 'd':
86 idevice_set_debug_level(1); 123 idevice_set_debug_level(1);
87 continue; 124 break;
88 } 125 case 'u':
89 else if (!strcmp(argv[i], "-u") || !strcmp(argv[i], "--udid")) { 126 if (!*optarg) {
90 i++; 127 fprintf(stderr, "ERROR: UDID argument must not be empty!\n");
91 if (!argv[i] || !*argv[i]) { 128 print_usage(argc, argv, 1);
92 print_usage(argc, argv); 129 return 2;
93 result = EXIT_SUCCESS;
94 goto cleanup;
95 } 130 }
96 udid = argv[i]; 131 udid = optarg;
97 continue; 132 break;
98 } 133 case 'n':
99 else if (!strcmp(argv[i], "-n") || !strcmp(argv[i], "--network")) {
100 use_network = 1; 134 use_network = 1;
101 continue; 135 break;
102 } 136 case 'h':
103 else if (!strcmp(argv[i], "-h") || !strcmp(argv[i], "--help")) { 137 print_usage(argc, argv, 0);
104 print_usage(argc, argv); 138 return 0;
105 result = EXIT_SUCCESS; 139 case 'v':
106 goto cleanup;
107 }
108 else if (!strcmp(argv[i], "-v") || !strcmp(argv[i], "--version")) {
109 printf("%s %s\n", TOOL_NAME, PACKAGE_VERSION); 140 printf("%s %s\n", TOOL_NAME, PACKAGE_VERSION);
110 result = EXIT_SUCCESS; 141 return 0;
111 goto cleanup; 142 default:
143 print_usage(argc, argv, 1);
144 return 2;
112 } 145 }
113 else if (!strcmp(argv[i], "sleep")) { 146 }
114 cmd = CMD_SLEEP; 147 argc -= optind;
115 } 148 argv += optind;
116 else if (!strcmp(argv[i], "restart")) {
117 cmd = CMD_RESTART;
118 }
119 else if (!strcmp(argv[i], "shutdown")) {
120 cmd = CMD_SHUTDOWN;
121 }
122 else if (!strcmp(argv[i], "diagnostics")) {
123 cmd = CMD_DIAGNOSTICS;
124 /* read type */
125 i++;
126 if (!argv[i] || ((strcmp(argv[i], "All") != 0) && (strcmp(argv[i], "WiFi") != 0) && (strcmp(argv[i], "GasGauge") != 0) && (strcmp(argv[i], "NAND") != 0) && (strcmp(argv[i], "HDMI") != 0))) {
127 if (argv[i] == NULL) {
128 cmd_arg = strdup("All");
129 continue;
130 }
131 149
132 if (!strncmp(argv[i], "-", 1)) { 150 if (!argv[0]) {
133 cmd_arg = strdup("All"); 151 fprintf(stderr, "ERROR: No command specified\n");
134 i--; 152 print_usage(argc+optind, argv-optind, 1);
135 continue; 153 return 2;
136 } 154 }
137 155
138 printf("ERROR: Unknown TYPE %s\n", argv[i]); 156 if (!strcmp(argv[0], "sleep")) {
139 print_usage(argc, argv); 157 cmd = CMD_SLEEP;
158 }
159 else if (!strcmp(argv[0], "restart")) {
160 cmd = CMD_RESTART;
161 }
162 else if (!strcmp(argv[0], "shutdown")) {
163 cmd = CMD_SHUTDOWN;
164 }
165 else if (!strcmp(argv[0], "diagnostics")) {
166 cmd = CMD_DIAGNOSTICS;
167 /* read type */
168 if (!argv[1] || ((strcmp(argv[1], "All") != 0) && (strcmp(argv[1], "WiFi") != 0) && (strcmp(argv[1], "GasGauge") != 0) && (strcmp(argv[1], "NAND") != 0) && (strcmp(argv[1], "HDMI") != 0))) {
169 if (argv[1] == NULL) {
170 cmd_arg = strdup("All");
171 } else {
172 fprintf(stderr, "ERROR: Unknown TYPE %s\n", argv[1]);
173 print_usage(argc+optind, argv-optind, 1);
140 goto cleanup; 174 goto cleanup;
141 } 175 }
142
143 cmd_arg = strdup(argv[i]);
144 continue;
145 } 176 }
146 else if (!strcmp(argv[i], "mobilegestalt")) { 177 cmd_arg = strdup(argv[1]);
147 cmd = CMD_MOBILEGESTALT; 178 }
148 /* read keys */ 179 else if (!strcmp(argv[0], "mobilegestalt")) {
149 i++; 180 cmd = CMD_MOBILEGESTALT;
150 181 /* read keys */
151 if (!argv[i] || argv[i] == NULL || (!strncmp(argv[i], "-", 1))) { 182 if (!argv[1] || !*argv[1]) {
152 printf("ERROR: Please supply the key to query.\n"); 183 fprintf(stderr, "ERROR: Please supply the key to query.\n");
153 print_usage(argc, argv); 184 print_usage(argc, argv, 1);
154 goto cleanup; 185 goto cleanup;
155 }
156
157 keys = plist_new_array();
158 while(1) {
159 if (argv[i] && (strlen(argv[i]) >= 2) && (strncmp(argv[i], "-", 1) != 0)) {
160 plist_array_append_item(keys, plist_new_string(argv[i]));
161 i++;
162 } else {
163 i--;
164 break;
165 }
166 }
167 continue;
168 } 186 }
169 else if (!strcmp(argv[i], "ioreg")) { 187 int i = 1;
170 cmd = CMD_IOREGISTRY; 188 keys = plist_new_array();
171 /* read plane */ 189 while (argv[i] && *argv[i]) {
190 plist_array_append_item(keys, plist_new_string(argv[i]));
172 i++; 191 i++;
173 if (argv[i]) {
174 cmd_arg = strdup(argv[i]);
175 }
176 continue;
177 } 192 }
178 else if (!strcmp(argv[i], "ioregentry")) { 193 }
179 cmd = CMD_IOREGISTRY_ENTRY; 194 else if (!strcmp(argv[0], "ioreg")) {
180 /* read key */ 195 cmd = CMD_IOREGISTRY;
181 i++; 196 /* read plane */
182 if (argv[i]) { 197 if (argv[1]) {
183 cmd_arg = strdup(argv[i]); 198 cmd_arg = strdup(argv[1]);
184 }
185 continue;
186 } 199 }
187 else { 200 }
188 print_usage(argc, argv); 201 else if (!strcmp(argv[0], "ioregentry")) {
189 return EXIT_SUCCESS; 202 cmd = CMD_IOREGISTRY_ENTRY;
203 /* read key */
204 if (argv[1]) {
205 cmd_arg = strdup(argv[1]);
190 } 206 }
191 } 207 }
192 208
193 /* verify options */ 209 /* verify options */
194 if (cmd == CMD_NONE) { 210 if (cmd == CMD_NONE) {
195 print_usage(argc, argv); 211 fprintf(stderr, "ERROR: Unsupported command '%s'\n", argv[0]);
212 print_usage(argc+optind, argv-optind, 1);
196 goto cleanup; 213 goto cleanup;
197 } 214 }
198 215
@@ -325,31 +342,3 @@ cleanup:
325 } 342 }
326 return result; 343 return result;
327} 344}
328
329void print_usage(int argc, char **argv)
330{
331 char *name = NULL;
332 name = strrchr(argv[0], '/');
333 printf("Usage: %s [OPTIONS] COMMAND\n", (name ? name + 1: argv[0]));
334 printf("\n");
335 printf("Use diagnostics interface of a device running iOS 4 or later.\n");
336 printf("\n");
337 printf("Where COMMAND is one of:\n");
338 printf(" diagnostics [TYPE]\t\tprint diagnostics information from device by TYPE (All, WiFi, GasGauge, NAND)\n");
339 printf(" mobilegestalt KEY [...]\tprint mobilegestalt keys passed as arguments separated by a space.\n");
340 printf(" ioreg [PLANE]\t\t\tprint IORegistry of device, optionally by PLANE (IODeviceTree, IOPower, IOService) (iOS 5+ only)\n");
341 printf(" ioregentry [KEY]\t\tprint IORegistry entry of device (AppleARMPMUCharger, ASPStorage, ...) (iOS 5+ only)\n");
342 printf(" shutdown\t\t\tshutdown device\n");
343 printf(" restart\t\t\trestart device\n");
344 printf(" sleep\t\t\t\tput device into sleep mode (disconnects from host)\n");
345 printf("\n");
346 printf("The following OPTIONS are accepted:\n");
347 printf(" -u, --udid UDID\ttarget specific device by UDID\n");
348 printf(" -n, --network\t\tconnect to network device\n");
349 printf(" -d, --debug\t\tenable communication debugging\n");
350 printf(" -h, --help\t\tprints usage information\n");
351 printf(" -v, --version\t\tprints version information\n");
352 printf("\n");
353 printf("Homepage: <" PACKAGE_URL ">\n");
354 printf("Bug Reports: <" PACKAGE_BUGREPORT ">\n");
355}