summaryrefslogtreecommitdiffstats
path: root/tools/idevicedate.c
diff options
context:
space:
mode:
authorGravatar Martin Szulecki2013-12-17 21:31:17 +0100
committerGravatar Martin Szulecki2013-12-17 21:31:17 +0100
commit67d7fb8a70b9e8aa0903c8ae2be108b6d792d7d4 (patch)
tree5553ec67698da39a65c1f78386cdce930e49629f /tools/idevicedate.c
parent8238bdb59ff99deedec4da7daf6dfa54366dfcac (diff)
downloadlibimobiledevice-67d7fb8a70b9e8aa0903c8ae2be108b6d792d7d4.tar.gz
libimobiledevice-67d7fb8a70b9e8aa0903c8ae2be108b6d792d7d4.tar.bz2
idevicedate: Add support to set nodes of PLIST_REAL type and refactor a bit
Diffstat (limited to 'tools/idevicedate.c')
-rw-r--r--tools/idevicedate.c91
1 files changed, 61 insertions, 30 deletions
diff --git a/tools/idevicedate.c b/tools/idevicedate.c
index bde6786..5660e76 100644
--- a/tools/idevicedate.c
+++ b/tools/idevicedate.c
@@ -60,11 +60,13 @@ int main(int argc, char *argv[])
60 const char* udid = NULL; 60 const char* udid = NULL;
61 time_t setdate = 0; 61 time_t setdate = 0;
62 plist_t node = NULL; 62 plist_t node = NULL;
63 int node_type = -1;
63 uint64_t datetime = 0; 64 uint64_t datetime = 0;
64 time_t rawtime; 65 time_t rawtime;
65 struct tm * tmp; 66 struct tm * tmp;
66 char const *format = NULL; 67 char const *format = NULL;
67 char buffer[80]; 68 char buffer[80];
69 int result = 0;
68 70
69 /* parse cmdline args */ 71 /* parse cmdline args */
70 for (i = 1; i < argc; i++) { 72 for (i = 1; i < argc; i++) {
@@ -134,57 +136,86 @@ int main(int argc, char *argv[])
134 } 136 }
135 137
136 if (LOCKDOWN_E_SUCCESS != lockdownd_client_new_with_handshake(device, &client, "idevicedate")) { 138 if (LOCKDOWN_E_SUCCESS != lockdownd_client_new_with_handshake(device, &client, "idevicedate")) {
137 idevice_free(device); 139 result = -1;
138 return -1; 140 goto cleanup;
141 }
142
143 if(lockdownd_get_value(client, NULL, "TimeIntervalSince1970", &node) != LOCKDOWN_E_SUCCESS) {
144 fprintf(stderr, "ERROR: Unable to retrieve 'TimeIntervalSince1970' node from device.\n");
145 result = -1;
146 goto cleanup;
139 } 147 }
140 148
149 if (node == NULL) {
150 fprintf(stderr, "ERROR: Empty node for 'TimeIntervalSince1970' received.\n");
151 result = -1;
152 goto cleanup;
153 }
154
155 node_type = plist_get_node_type(node);
156
141 /* get or set? */ 157 /* get or set? */
142 if (setdate == 0) { 158 if (setdate == 0) {
143 /* get time value from device */ 159 /* get time value from device */
144 if(lockdownd_get_value(client, NULL, "TimeIntervalSince1970", &node) == LOCKDOWN_E_SUCCESS) { 160 switch (node_type) {
145 if (node) { 161 case PLIST_UINT:
146 switch (plist_get_node_type(node)) { 162 plist_get_uint_val(node, &datetime);
147 case PLIST_UINT: 163 break;
148 plist_get_uint_val(node, &datetime); 164 case PLIST_REAL:
149 break; 165 {
150 case PLIST_REAL:
151 {
152 double rv = 0; 166 double rv = 0;
153 plist_get_real_val(node, &rv); 167 plist_get_real_val(node, &rv);
154 datetime = rv; 168 datetime = rv;
155 }
156 break;
157 default:
158 fprintf(stderr, "Unexpected node type for 'TimeIntervalSince1970'\n");
159 break;
160 } 169 }
161 plist_free(node); 170 break;
162 node = NULL; 171 default:
172 fprintf(stderr, "ERROR: Unexpected node type for 'TimeIntervalSince1970'\n");
173 break;
174 }
175 plist_free(node);
176 node = NULL;
163 177
164 /* date/time calculations */ 178 /* date/time calculations */
165 rawtime = (time_t)datetime; 179 rawtime = (time_t)datetime;
166 tmp = localtime(&rawtime); 180 tmp = localtime(&rawtime);
167 181
168 /* finally we format and print the current date */ 182 /* finally we format and print the current date */
169 strftime(buffer, 80, format, tmp); 183 strftime(buffer, 80, format, tmp);
170 puts(buffer); 184 puts(buffer);
171 }
172 }
173 } else { 185 } else {
174 datetime = setdate; 186 datetime = setdate;
175 187
176 if(lockdownd_set_value(client, NULL, "TimeIntervalSince1970", plist_new_uint(datetime)) == LOCKDOWN_E_SUCCESS) { 188 plist_free(node);
189 node = NULL;
190
191 switch (node_type) {
192 case PLIST_UINT:
193 node = plist_new_uint(datetime);
194 break;
195 case PLIST_REAL:
196 node = plist_new_real((double)datetime);
197 break;
198 default:
199 fprintf(stderr, "ERROR: Unexpected node type for 'TimeIntervalSince1970'\n");
200 break;
201 }
202
203 if(lockdownd_set_value(client, NULL, "TimeIntervalSince1970", node) == LOCKDOWN_E_SUCCESS) {
177 tmp = localtime(&setdate); 204 tmp = localtime(&setdate);
178 strftime(buffer, 80, format, tmp); 205 strftime(buffer, 80, format, tmp);
179 puts(buffer); 206 puts(buffer);
180 } else { 207 } else {
181 printf("ERROR: Failed to set date on device.\n"); 208 printf("ERROR: Failed to set date on device.\n");
182 } 209 }
210 node = NULL;
183 } 211 }
184 212
185 lockdownd_client_free(client); 213cleanup:
186 idevice_free(device); 214 if (client)
215 lockdownd_client_free(client);
187 216
188 return 0; 217 if (device)
189} 218 idevice_free(device);
190 219
220 return result;
221}