diff options
Diffstat (limited to 'src/syslog_relay.c')
| -rw-r--r-- | src/syslog_relay.c | 39 |
1 files changed, 37 insertions, 2 deletions
diff --git a/src/syslog_relay.c b/src/syslog_relay.c index 579908c..c137297 100644 --- a/src/syslog_relay.c +++ b/src/syslog_relay.c | |||
| @@ -2,7 +2,8 @@ | |||
| 2 | * syslog_relay.c | 2 | * syslog_relay.c |
| 3 | * com.apple.syslog_relay service implementation. | 3 | * com.apple.syslog_relay service implementation. |
| 4 | * | 4 | * |
| 5 | * Copyright (c) 2013 Martin Szulecki All Rights Reserved. | 5 | * Copyright (c) 2019-2020 Nikias Bassen, All Rights Reserved. |
| 6 | * Copyright (c) 2013-2015 Martin Szulecki, All Rights Reserved. | ||
| 6 | * | 7 | * |
| 7 | * This library is free software; you can redistribute it and/or | 8 | * This library is free software; you can redistribute it and/or |
| 8 | * modify it under the terms of the GNU Lesser General Public | 9 | * modify it under the terms of the GNU Lesser General Public |
| @@ -33,6 +34,7 @@ struct syslog_relay_worker_thread { | |||
| 33 | syslog_relay_client_t client; | 34 | syslog_relay_client_t client; |
| 34 | syslog_relay_receive_cb_t cbfunc; | 35 | syslog_relay_receive_cb_t cbfunc; |
| 35 | void *user_data; | 36 | void *user_data; |
| 37 | int is_raw; | ||
| 36 | }; | 38 | }; |
| 37 | 39 | ||
| 38 | /** | 40 | /** |
| @@ -156,8 +158,12 @@ void *syslog_relay_worker(void *arg) | |||
| 156 | debug_info("Connection to syslog relay interrupted"); | 158 | debug_info("Connection to syslog relay interrupted"); |
| 157 | break; | 159 | break; |
| 158 | } | 160 | } |
| 159 | if(c != 0) { | 161 | if (srwt->is_raw) { |
| 160 | srwt->cbfunc(c, srwt->user_data); | 162 | srwt->cbfunc(c, srwt->user_data); |
| 163 | } else { | ||
| 164 | if (c != 0) { | ||
| 165 | srwt->cbfunc(c, srwt->user_data); | ||
| 166 | } | ||
| 161 | } | 167 | } |
| 162 | } | 168 | } |
| 163 | 169 | ||
| @@ -188,6 +194,35 @@ LIBIMOBILEDEVICE_API syslog_relay_error_t syslog_relay_start_capture(syslog_rela | |||
| 188 | srwt->client = client; | 194 | srwt->client = client; |
| 189 | srwt->cbfunc = callback; | 195 | srwt->cbfunc = callback; |
| 190 | srwt->user_data = user_data; | 196 | srwt->user_data = user_data; |
| 197 | srwt->is_raw = 0; | ||
| 198 | |||
| 199 | if (thread_new(&client->worker, syslog_relay_worker, srwt) == 0) { | ||
| 200 | res = SYSLOG_RELAY_E_SUCCESS; | ||
| 201 | } | ||
| 202 | } | ||
| 203 | |||
| 204 | return res; | ||
| 205 | } | ||
| 206 | |||
| 207 | LIBIMOBILEDEVICE_API syslog_relay_error_t syslog_relay_start_capture_raw(syslog_relay_client_t client, syslog_relay_receive_cb_t callback, void* user_data) | ||
| 208 | { | ||
| 209 | if (!client || !callback) | ||
| 210 | return SYSLOG_RELAY_E_INVALID_ARG; | ||
| 211 | |||
| 212 | syslog_relay_error_t res = SYSLOG_RELAY_E_UNKNOWN_ERROR; | ||
| 213 | |||
| 214 | if (client->worker) { | ||
| 215 | debug_info("Another syslog capture thread appears to be running already."); | ||
| 216 | return res; | ||
| 217 | } | ||
| 218 | |||
| 219 | /* start worker thread */ | ||
| 220 | struct syslog_relay_worker_thread *srwt = (struct syslog_relay_worker_thread*)malloc(sizeof(struct syslog_relay_worker_thread)); | ||
| 221 | if (srwt) { | ||
| 222 | srwt->client = client; | ||
| 223 | srwt->cbfunc = callback; | ||
| 224 | srwt->user_data = user_data; | ||
| 225 | srwt->is_raw = 1; | ||
| 191 | 226 | ||
| 192 | if (thread_new(&client->worker, syslog_relay_worker, srwt) == 0) { | 227 | if (thread_new(&client->worker, syslog_relay_worker, srwt) == 0) { |
| 193 | res = SYSLOG_RELAY_E_SUCCESS; | 228 | res = SYSLOG_RELAY_E_SUCCESS; |
