diff options
Diffstat (limited to 'src')
| -rw-r--r-- | src/heartbeat.c | 33 | ||||
| -rw-r--r-- | src/service.c | 24 | ||||
| -rw-r--r-- | src/service.h | 4 |
3 files changed, 21 insertions, 40 deletions
diff --git a/src/heartbeat.c b/src/heartbeat.c index 817c6ad..0f8d2f3 100644 --- a/src/heartbeat.c +++ b/src/heartbeat.c | |||
| @@ -112,36 +112,9 @@ heartbeat_error_t heartbeat_client_new(idevice_t device, lockdownd_service_descr | |||
| 112 | */ | 112 | */ |
| 113 | heartbeat_error_t heartbeat_client_start_service(idevice_t device, heartbeat_client_t * client, const char* label) | 113 | heartbeat_error_t heartbeat_client_start_service(idevice_t device, heartbeat_client_t * client, const char* label) |
| 114 | { | 114 | { |
| 115 | *client = NULL; | 115 | heartbeat_error_t err = HEARTBEAT_E_UNKNOWN_ERROR; |
| 116 | 116 | service_client_factory_start_service(device, HEARTBEAT_SERVICE_NAME, (void**)client, label, SERVICE_CONSTRUCTOR(heartbeat_client_new), &err); | |
| 117 | lockdownd_client_t lckd = NULL; | 117 | return err; |
| 118 | if (LOCKDOWN_E_SUCCESS != lockdownd_client_new_with_handshake(device, &lckd, label)) { | ||
| 119 | idevice_free(device); | ||
| 120 | debug_info("Could not create a lockdown client."); | ||
| 121 | return HEARTBEAT_E_UNKNOWN_ERROR; | ||
| 122 | } | ||
| 123 | |||
| 124 | lockdownd_service_descriptor_t service = NULL; | ||
| 125 | lockdownd_start_service(lckd, HEARTBEAT_SERVICE_NAME, &service); | ||
| 126 | lockdownd_client_free(lckd); | ||
| 127 | |||
| 128 | if (service->port <= 0) { | ||
| 129 | debug_info("Could not start heartbeat service!"); | ||
| 130 | return HEARTBEAT_E_UNKNOWN_ERROR; | ||
| 131 | } | ||
| 132 | |||
| 133 | heartbeat_error_t res = heartbeat_client_new(device, service, client); | ||
| 134 | if (res != HEARTBEAT_E_SUCCESS) { | ||
| 135 | debug_info("Could not connect to heartbeat! Port: %i, error: %i", service->port, res); | ||
| 136 | return res; | ||
| 137 | } | ||
| 138 | |||
| 139 | if (service) { | ||
| 140 | lockdownd_service_descriptor_free(service); | ||
| 141 | service = NULL; | ||
| 142 | } | ||
| 143 | |||
| 144 | return HEARTBEAT_E_SUCCESS; | ||
| 145 | } | 118 | } |
| 146 | 119 | ||
| 147 | /** | 120 | /** |
diff --git a/src/service.c b/src/service.c index af37a83..738db02 100644 --- a/src/service.c +++ b/src/service.c | |||
| @@ -103,7 +103,7 @@ service_error_t service_client_new(idevice_t device, lockdownd_service_descripto | |||
| 103 | * @return SERVICE_E_SUCCESS on success, or a SERVICE_E_* error code | 103 | * @return SERVICE_E_SUCCESS on success, or a SERVICE_E_* error code |
| 104 | * otherwise. | 104 | * otherwise. |
| 105 | */ | 105 | */ |
| 106 | service_error_t service_client_start_service(idevice_t device, const char* service_name, service_client_t *client, const char* label) | 106 | service_error_t service_client_factory_start_service(idevice_t device, const char* service_name, void **client, const char* label, uint16_t (*constructor_func)(idevice_t, lockdownd_service_descriptor_t, void**), uint16_t *error_code) |
| 107 | { | 107 | { |
| 108 | *client = NULL; | 108 | *client = NULL; |
| 109 | 109 | ||
| @@ -122,18 +122,24 @@ service_error_t service_client_start_service(idevice_t device, const char* servi | |||
| 122 | return SERVICE_E_START_SERVICE_ERROR; | 122 | return SERVICE_E_START_SERVICE_ERROR; |
| 123 | } | 123 | } |
| 124 | 124 | ||
| 125 | service_error_t res = service_client_new(device, service, client); | 125 | uint16_t ec; |
| 126 | if (res != SERVICE_E_SUCCESS) { | 126 | if (constructor_func) { |
| 127 | debug_info("Could not connect to service %s! Port: %i, error: %i", service_name, service->port, res); | 127 | ec = (uint16_t)constructor_func(device, service, client); |
| 128 | return res; | 128 | } else { |
| 129 | ec = service_client_new(device, service, (service_client_t*)client); | ||
| 130 | } | ||
| 131 | if (error_code) { | ||
| 132 | *error_code = ec; | ||
| 129 | } | 133 | } |
| 130 | 134 | ||
| 131 | if (service) { | 135 | if (ec != SERVICE_E_SUCCESS) { |
| 132 | lockdownd_service_descriptor_free(service); | 136 | debug_info("Could not connect to service %s! Port: %i, error: %i", service_name, service->port, ec); |
| 133 | service = NULL; | ||
| 134 | } | 137 | } |
| 135 | 138 | ||
| 136 | return SERVICE_E_SUCCESS; | 139 | lockdownd_service_descriptor_free(service); |
| 140 | service = NULL; | ||
| 141 | |||
| 142 | return (ec == SERVICE_E_SUCCESS) ? SERVICE_E_SUCCESS : SERVICE_E_START_SERVICE_ERROR; | ||
| 137 | } | 143 | } |
| 138 | 144 | ||
| 139 | /** | 145 | /** |
diff --git a/src/service.h b/src/service.h index 982f96a..3a22bed 100644 --- a/src/service.h +++ b/src/service.h | |||
| @@ -40,9 +40,11 @@ typedef struct service_client_private *service_client_t; | |||
| 40 | 40 | ||
| 41 | typedef int16_t service_error_t; | 41 | typedef int16_t service_error_t; |
| 42 | 42 | ||
| 43 | #define SERVICE_CONSTRUCTOR(x) (uint16_t (*)(idevice_t, lockdownd_service_descriptor_t, void**))(x) | ||
| 44 | |||
| 43 | /* creation and destruction */ | 45 | /* creation and destruction */ |
| 44 | service_error_t service_client_new(idevice_t device, lockdownd_service_descriptor_t service, service_client_t *client); | 46 | service_error_t service_client_new(idevice_t device, lockdownd_service_descriptor_t service, service_client_t *client); |
| 45 | service_error_t service_client_start_service(idevice_t device, const char* service_name, service_client_t *client, const char* label); | 47 | service_error_t service_client_factory_start_service(idevice_t device, const char* service_name, void **client, const char* label, uint16_t (*constructor_func)(idevice_t, lockdownd_service_descriptor_t, void**), uint16_t *error_code); |
| 46 | service_error_t service_client_free(service_client_t client); | 48 | service_error_t service_client_free(service_client_t client); |
| 47 | 49 | ||
| 48 | /* sending */ | 50 | /* sending */ |
