diff options
| -rw-r--r-- | tools/idevicedate.c | 91 |
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); | 213 | cleanup: |
| 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 | } | ||
