summaryrefslogtreecommitdiffstats
path: root/src/libnetdata/spawn_server/spawn_popen.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/libnetdata/spawn_server/spawn_popen.c')
-rw-r--r--src/libnetdata/spawn_server/spawn_popen.c115
1 files changed, 89 insertions, 26 deletions
diff --git a/src/libnetdata/spawn_server/spawn_popen.c b/src/libnetdata/spawn_server/spawn_popen.c
index f354b1f2a..b8ea0afe6 100644
--- a/src/libnetdata/spawn_server/spawn_popen.c
+++ b/src/libnetdata/spawn_server/spawn_popen.c
@@ -2,6 +2,12 @@
#include "spawn_popen.h"
+struct popen_instance {
+ SPAWN_INSTANCE *si;
+ FILE *child_stdin_fp;
+ FILE *child_stdout_fp;
+};
+
SPAWN_SERVER *netdata_main_spawn_server = NULL;
static SPINLOCK netdata_main_spawn_server_spinlock = NETDATA_SPINLOCK_INITIALIZER;
@@ -27,6 +33,30 @@ void netdata_main_spawn_server_cleanup(void) {
}
}
+FILE *spawn_popen_stdin(POPEN_INSTANCE *pi) {
+ if(!pi->child_stdin_fp)
+ pi->child_stdin_fp = fdopen(spawn_server_instance_write_fd(pi->si), "w");
+
+ if(!pi->child_stdin_fp)
+ nd_log(NDLS_COLLECTORS, NDLP_ERR,
+ "Cannot open FILE on child's stdin on fd %d.",
+ spawn_server_instance_write_fd(pi->si));
+
+ return pi->child_stdin_fp;
+}
+
+FILE *spawn_popen_stdout(POPEN_INSTANCE *pi) {
+ if(!pi->child_stdout_fp)
+ pi->child_stdout_fp = fdopen(spawn_server_instance_read_fd(pi->si), "r");
+
+ if(!pi->child_stdout_fp)
+ nd_log(NDLS_COLLECTORS, NDLP_ERR,
+ "Cannot open FILE on child's stdout on fd %d.",
+ spawn_server_instance_read_fd(pi->si));
+
+ return pi->child_stdout_fp;
+}
+
POPEN_INSTANCE *spawn_popen_run_argv(const char **argv) {
netdata_main_spawn_server_init(NULL, 0, NULL);
@@ -35,29 +65,9 @@ POPEN_INSTANCE *spawn_popen_run_argv(const char **argv) {
if(si == NULL) return NULL;
- POPEN_INSTANCE *pi = mallocz(sizeof(*pi));
+ POPEN_INSTANCE *pi = callocz(1, sizeof(*pi));
pi->si = si;
- pi->child_stdin_fp = fdopen(spawn_server_instance_write_fd(si), "w");
- pi->child_stdout_fp = fdopen(spawn_server_instance_read_fd(si), "r");
-
- if(!pi->child_stdin_fp) {
- nd_log(NDLS_COLLECTORS, NDLP_ERR, "Cannot open FILE on child's stdin on fd %d.", spawn_server_instance_write_fd(si));
- goto cleanup;
- }
-
- if(!pi->child_stdout_fp) {
- nd_log(NDLS_COLLECTORS, NDLP_ERR, "Cannot open FILE on child's stdout on fd %d.", spawn_server_instance_read_fd(si));
- goto cleanup;
- }
-
return pi;
-
-cleanup:
- if(pi->child_stdin_fp) { fclose(pi->child_stdin_fp); spawn_server_instance_write_fd(si); }
- if(pi->child_stdout_fp) { fclose(pi->child_stdout_fp); spawn_server_instance_read_fd_unset(si); }
- spawn_server_exec_kill(netdata_main_spawn_server, si);
- freez(pi);
- return NULL;
}
POPEN_INSTANCE *spawn_popen_run_variadic(const char *cmd, ...) {
@@ -92,7 +102,33 @@ POPEN_INSTANCE *spawn_popen_run_variadic(const char *cmd, ...) {
POPEN_INSTANCE *spawn_popen_run(const char *cmd) {
if(!cmd || !*cmd) return NULL;
-
+
+//#if defined(OS_WINDOWS)
+// if(strncmp(cmd, "exec ", 5) == 0) {
+// size_t len = strlen(cmd);
+// char cmd_copy[strlen(cmd) + 1];
+// memcpy(cmd_copy, cmd, len + 1);
+// char *words[100];
+// size_t num_words = quoted_strings_splitter(cmd_copy, words, 100, isspace_map_pluginsd);
+// char *exec = get_word(words, num_words, 0);
+// char *prog = get_word(words, num_words, 1);
+// if (strcmp(exec, "exec") == 0 &&
+// prog &&
+// strendswith(prog, ".plugin") &&
+// !strendswith(prog, "charts.d.plugin") &&
+// !strendswith(prog, "ioping.plugin")) {
+// const char *argv[num_words - 1 + 1]; // remove exec, add terminator
+//
+// size_t dst = 0;
+// for (size_t i = 1; i < num_words; i++)
+// argv[dst++] = get_word(words, num_words, i);
+//
+// argv[dst] = NULL;
+// return spawn_popen_run_argv(argv);
+// }
+// }
+//#endif
+
const char *argv[] = {
"/bin/sh",
"-c",
@@ -121,11 +157,24 @@ static int spawn_popen_status_rc(int status) {
return -1;
}
+static void spawn_popen_close_files(POPEN_INSTANCE *pi) {
+ if(pi->child_stdin_fp) {
+ fclose(pi->child_stdin_fp);
+ pi->child_stdin_fp = NULL;
+ spawn_server_instance_write_fd_unset(pi->si);
+ }
+
+ if(pi->child_stdout_fp) {
+ fclose(pi->child_stdout_fp);
+ pi->child_stdout_fp = NULL;
+ spawn_server_instance_read_fd_unset(pi->si);
+ }
+}
+
int spawn_popen_wait(POPEN_INSTANCE *pi) {
if(!pi) return -1;
- fclose(pi->child_stdin_fp); pi->child_stdin_fp = NULL; spawn_server_instance_write_fd_unset(pi->si);
- fclose(pi->child_stdout_fp); pi->child_stdout_fp = NULL; spawn_server_instance_read_fd_unset(pi->si);
+ spawn_popen_close_files(pi);
int status = spawn_server_exec_wait(netdata_main_spawn_server, pi->si);
freez(pi);
return spawn_popen_status_rc(status);
@@ -134,9 +183,23 @@ int spawn_popen_wait(POPEN_INSTANCE *pi) {
int spawn_popen_kill(POPEN_INSTANCE *pi) {
if(!pi) return -1;
- fclose(pi->child_stdin_fp); pi->child_stdin_fp = NULL; spawn_server_instance_write_fd_unset(pi->si);
- fclose(pi->child_stdout_fp); pi->child_stdout_fp = NULL; spawn_server_instance_read_fd_unset(pi->si);
+ spawn_popen_close_files(pi);
int status = spawn_server_exec_kill(netdata_main_spawn_server, pi->si);
freez(pi);
return spawn_popen_status_rc(status);
}
+
+pid_t spawn_popen_pid(POPEN_INSTANCE *pi) {
+ if(!pi) return -1;
+ return spawn_server_instance_pid(pi->si);
+}
+
+int spawn_popen_read_fd(POPEN_INSTANCE *pi) {
+ if(!pi) return -1;
+ return spawn_server_instance_read_fd(pi->si);
+}
+
+int spawn_popen_write_fd(POPEN_INSTANCE *pi) {
+ if(!pi) return -1;
+ return spawn_server_instance_write_fd(pi->si);
+}