|
|
|
@ -307,10 +307,7 @@ static size_t cb_curl_write(char *ptr, size_t size, size_t nmemb, void *userdata |
|
|
|
|
|
|
|
void xmlrpc_kill_calls(void *p) { |
|
|
|
struct xmlrpc_helper *xh = p; |
|
|
|
pid_t pid; |
|
|
|
sigset_t ss; |
|
|
|
int i = 0; |
|
|
|
int status; |
|
|
|
unsigned int tries = 0; |
|
|
|
|
|
|
|
int els_per_ent = 2; |
|
|
|
if (xh->fmt == XF_SEMS) |
|
|
|
@ -332,57 +329,12 @@ void xmlrpc_kill_calls(void *p) { |
|
|
|
tag2 = xh->strings.head->next->next->next->data; |
|
|
|
} |
|
|
|
|
|
|
|
if (tag) |
|
|
|
ilog(LOG_INFO, "Forking child to close call (ID " STR_FORMAT_M ", tag " STR_FORMAT_M ") via XMLRPC call to %s", |
|
|
|
STR_FMT_M(call_id), STR_FMT_M(tag), url); |
|
|
|
else |
|
|
|
ilog(LOG_INFO, "Forking child to close call (ID " STR_FORMAT_M ") via XMLRPC call to %s", |
|
|
|
STR_FMT_M(call_id), url); |
|
|
|
pid = fork(); |
|
|
|
|
|
|
|
if (pid) { |
|
|
|
retry: |
|
|
|
pid = waitpid(pid, &status, 0); |
|
|
|
if ((pid > 0 && WIFEXITED(status) && WEXITSTATUS(status) == 0) || i >= 3) { |
|
|
|
for (int j = 0; j < els_per_ent; j++) |
|
|
|
free(g_queue_pop_head(&xh->strings)); |
|
|
|
i = 0; |
|
|
|
} |
|
|
|
else { |
|
|
|
if (pid == -1 && errno == EINTR) |
|
|
|
goto retry; |
|
|
|
ilog(LOG_INFO, "XMLRPC child exited with status %i", status); |
|
|
|
i++; |
|
|
|
} |
|
|
|
continue; |
|
|
|
} |
|
|
|
|
|
|
|
/* child process */ |
|
|
|
alarm(1); /* syslog functions contain a lock, which may be locked at |
|
|
|
this point and can't be unlocked */ |
|
|
|
rlim(RLIMIT_CORE, 0); |
|
|
|
sigemptyset(&ss); |
|
|
|
sigprocmask(SIG_SETMASK, &ss, NULL); |
|
|
|
closelog(); |
|
|
|
|
|
|
|
for (i = 0; i < 100; i++) { |
|
|
|
if (i == 2 && rtpe_config.common.log_stderr) |
|
|
|
continue; |
|
|
|
close(i); |
|
|
|
} |
|
|
|
|
|
|
|
if (!rtpe_config.common.log_stderr) { |
|
|
|
openlog("rtpengine/child", LOG_PID | LOG_NDELAY, LOG_DAEMON); |
|
|
|
} |
|
|
|
|
|
|
|
if (tag) |
|
|
|
ilog(LOG_INFO, "Initiating XMLRPC for call (ID " STR_FORMAT_M ", tag " STR_FORMAT_M ")", |
|
|
|
STR_FMT_M(call_id), STR_FMT_M(tag)); |
|
|
|
else |
|
|
|
ilog(LOG_INFO, "Initiating XMLRPC for call (ID " STR_FORMAT_M ")", STR_FMT_M(call_id)); |
|
|
|
|
|
|
|
alarm(5); |
|
|
|
|
|
|
|
g_autoptr(GString) body = g_string_new(""); |
|
|
|
g_autoptr(GString) response = g_string_new(""); |
|
|
|
|
|
|
|
@ -398,6 +350,8 @@ retry: |
|
|
|
goto fault; |
|
|
|
if ((ret = curl_easy_setopt(curl, CURLOPT_WRITEDATA, response)) != CURLE_OK) |
|
|
|
goto fault; |
|
|
|
if ((ret = curl_easy_setopt(curl, CURLOPT_TIMEOUT, 5)) != CURLE_OK) |
|
|
|
goto fault; |
|
|
|
if ((ret = curl_easy_setopt(curl, CURLOPT_HTTPHEADER, &(struct curl_slist) |
|
|
|
{.data = "Content-type: text/xml"})) != CURLE_OK) |
|
|
|
goto fault; |
|
|
|
@ -456,17 +410,19 @@ retry: |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
for (int j = 0; j < els_per_ent; j++) |
|
|
|
free(g_queue_pop_head(&xh->strings)); |
|
|
|
|
|
|
|
fault: |
|
|
|
curl_easy_cleanup(curl); |
|
|
|
|
|
|
|
if (ret != CURLE_OK) { |
|
|
|
ilog(LOG_WARNING, "XMLRPC fault occurred: %s", curl_easy_strerror(ret)); |
|
|
|
_exit(1); |
|
|
|
tries++; |
|
|
|
} |
|
|
|
|
|
|
|
if (ret == CURLE_OK || tries >= 3) { |
|
|
|
for (int j = 0; j < els_per_ent; j++) |
|
|
|
free(g_queue_pop_head(&xh->strings)); |
|
|
|
tries = 0; |
|
|
|
} |
|
|
|
_exit(0); |
|
|
|
} |
|
|
|
|
|
|
|
g_free(xh); |
|
|
|
|