summaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/heartbeat.c33
-rw-r--r--src/service.c24
-rw-r--r--src/service.h4
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 */
113heartbeat_error_t heartbeat_client_start_service(idevice_t device, heartbeat_client_t * client, const char* label) 113heartbeat_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 */
106service_error_t service_client_start_service(idevice_t device, const char* service_name, service_client_t *client, const char* label) 106service_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
41typedef int16_t service_error_t; 41typedef 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 */
44service_error_t service_client_new(idevice_t device, lockdownd_service_descriptor_t service, service_client_t *client); 46service_error_t service_client_new(idevice_t device, lockdownd_service_descriptor_t service, service_client_t *client);
45service_error_t service_client_start_service(idevice_t device, const char* service_name, service_client_t *client, const char* label); 47service_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);
46service_error_t service_client_free(service_client_t client); 48service_error_t service_client_free(service_client_t client);
47 49
48/* sending */ 50/* sending */