123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109 |
- // SPDX-License-Identifier: GPL-3.0-or-later
- #ifndef NETDATA_SPAWN_H
- #define NETDATA_SPAWN_H 1
- #include "daemon/common.h"
- #define SPAWN_SERVER_COMMAND_LINE_ARGUMENT "--special-spawn-server"
- typedef enum spawn_protocol {
- SPAWN_PROT_EXEC_CMD = 0,
- SPAWN_PROT_SPAWN_RESULT,
- SPAWN_PROT_CMD_EXIT_STATUS
- } spawn_prot_t;
- struct spawn_prot_exec_cmd {
- uint16_t command_length;
- char command_to_run[];
- };
- struct spawn_prot_spawn_result {
- pid_t exec_pid; /* 0 if failed to spawn */
- time_t exec_run_timestamp; /* time of successfully spawning the command */
- };
- struct spawn_prot_cmd_exit_status {
- int exec_exit_status;
- };
- struct spawn_prot_header {
- spawn_prot_t opcode;
- void *handle;
- };
- #undef SPAWN_DEBUG /* define to enable debug prints */
- #define SPAWN_MAX_OUTSTANDING (32768)
- #define SPAWN_CMD_PROCESSED 0x00000001
- #define SPAWN_CMD_IN_PROGRESS 0x00000002
- #define SPAWN_CMD_FAILED_TO_SPAWN 0x00000004
- #define SPAWN_CMD_DONE 0x00000008
- struct spawn_cmd_info {
- avl_t avl;
- /* concurrency control per command */
- uv_mutex_t mutex;
- uv_cond_t cond; /* users block here until command has finished */
- uint64_t serial;
- char *command_to_run;
- int exit_status;
- pid_t pid;
- unsigned long flags;
- time_t exec_run_timestamp; /* time of successfully spawning the command */
- };
- /* spawn command queue */
- struct spawn_queue {
- avl_tree_type cmd_tree;
- /* concurrency control of command queue */
- uv_mutex_t mutex;
- uv_cond_t cond;
- volatile unsigned size;
- uint64_t latest_serial;
- };
- struct write_context {
- uv_write_t write_req;
- struct spawn_prot_header header;
- struct spawn_prot_cmd_exit_status exit_status;
- struct spawn_prot_spawn_result spawn_result;
- struct spawn_prot_exec_cmd payload;
- };
- extern int spawn_thread_error;
- extern int spawn_thread_shutdown;
- extern uv_async_t spawn_async;
- void spawn_init(void);
- void spawn_server(void);
- void spawn_client(void *arg);
- void destroy_spawn_cmd(struct spawn_cmd_info *cmdinfo);
- uint64_t spawn_enq_cmd(char *command_to_run);
- void spawn_wait_cmd(uint64_t serial, int *exit_status, time_t *exec_run_timestamp);
- void spawn_deq_cmd(struct spawn_cmd_info *cmdinfo);
- struct spawn_cmd_info *spawn_get_unprocessed_cmd(void);
- int create_spawn_server(uv_loop_t *loop, uv_pipe_t *spawn_channel, uv_process_t *process);
- /*
- * Copies from the source buffer to the protocol buffer. It advances the source buffer by the amount copied. It
- * subtracts the amount copied from the source length.
- */
- static inline void copy_to_prot_buffer(char *prot_buffer, unsigned *prot_buffer_len, unsigned max_to_copy,
- char **source, unsigned *source_len)
- {
- unsigned to_copy;
- to_copy = MIN(max_to_copy, *source_len);
- memcpy(prot_buffer + *prot_buffer_len, *source, to_copy);
- *prot_buffer_len += to_copy;
- *source += to_copy;
- *source_len -= to_copy;
- }
- #endif //NETDATA_SPAWN_H
|