process.h 4.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127
  1. /* Copyright (c) 2003-2004, Roger Dingledine
  2. * Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson.
  3. * Copyright (c) 2007-2018, The Tor Project, Inc. */
  4. /* See LICENSE for licensing information */
  5. /**
  6. * \file process.h
  7. * \brief Header for process.c
  8. **/
  9. #ifndef TOR_PROCESS_H
  10. #define TOR_PROCESS_H
  11. #include "orconfig.h"
  12. #include "lib/malloc/malloc.h"
  13. #include "lib/string/printf.h"
  14. /** Maximum number of bytes to write to a process' stdin. */
  15. #define PROCESS_MAX_WRITE (1024)
  16. /** Maximum number of bytes to read from a process' stdout/stderr. */
  17. #define PROCESS_MAX_READ (1024)
  18. typedef enum {
  19. /** The process is not running. */
  20. PROCESS_STATUS_NOT_RUNNING,
  21. /** The process is running. */
  22. PROCESS_STATUS_RUNNING,
  23. /** The process is in an erroneous state. */
  24. PROCESS_STATUS_ERROR
  25. } process_status_t;
  26. const char *process_status_to_string(process_status_t status);
  27. typedef enum {
  28. /** Pass complete \n-terminated lines to the
  29. * callback (with the \n or \r\n removed). */
  30. PROCESS_PROTOCOL_LINE,
  31. /** Pass the raw response from read() to the callback. */
  32. PROCESS_PROTOCOL_RAW
  33. } process_protocol_t;
  34. const char *process_protocol_to_string(process_protocol_t protocol);
  35. struct process_t;
  36. typedef struct process_t process_t;
  37. typedef uint64_t process_exit_code_t;
  38. typedef void (*process_read_callback_t)(process_t *,
  39. char *,
  40. size_t);
  41. typedef void (*process_exit_callback_t)(process_t *,
  42. process_exit_code_t);
  43. void process_init(void);
  44. void process_free_all(void);
  45. const smartlist_t *process_get_all_processes(void);
  46. process_t *process_new(const char *command);
  47. void process_free_(process_t *process);
  48. #define process_free(s) FREE_AND_NULL(process_t, process_free_, (s))
  49. process_status_t process_exec(process_t *process);
  50. void process_set_stdout_read_callback(process_t *,
  51. process_read_callback_t);
  52. void process_set_stderr_read_callback(process_t *,
  53. process_read_callback_t);
  54. void process_set_exit_callback(process_t *,
  55. process_exit_callback_t);
  56. const char *process_get_command(const process_t *process);
  57. void process_append_argument(process_t *process, const char *argument);
  58. const smartlist_t *process_get_arguments(const process_t *process);
  59. char **process_get_argv(const process_t *process);
  60. void process_set_environment(process_t *process,
  61. const char *key,
  62. const char *value);
  63. struct process_environment_t;
  64. struct process_environment_t *process_get_environment(const process_t *);
  65. void process_set_protocol(process_t *process, process_protocol_t protocol);
  66. process_protocol_t process_get_protocol(const process_t *process);
  67. void process_set_data(process_t *process, void *data);
  68. void *process_get_data(const process_t *process);
  69. void process_set_status(process_t *process, process_status_t status);
  70. process_status_t process_get_status(const process_t *process);
  71. void process_write(process_t *process,
  72. const uint8_t *data, size_t size);
  73. void process_vprintf(process_t *process,
  74. const char *format, va_list args) CHECK_PRINTF(2, 0);
  75. void process_printf(process_t *process,
  76. const char *format, ...) CHECK_PRINTF(2, 3);
  77. void process_notify_event_stdout(process_t *process);
  78. void process_notify_event_stderr(process_t *process);
  79. void process_notify_event_stdin(process_t *process);
  80. void process_notify_event_exit(process_t *process,
  81. process_exit_code_t);
  82. #ifdef PROCESS_PRIVATE
  83. MOCK_DECL(STATIC int, process_read_stdout, (process_t *, buf_t *));
  84. MOCK_DECL(STATIC int, process_read_stderr, (process_t *, buf_t *));
  85. MOCK_DECL(STATIC void, process_write_stdin, (process_t *, buf_t *));
  86. STATIC void process_read_data(process_t *process,
  87. buf_t *buffer,
  88. process_read_callback_t callback);
  89. STATIC void process_read_buffer(process_t *process,
  90. buf_t *buffer,
  91. process_read_callback_t callback);
  92. STATIC void process_read_lines(process_t *process,
  93. buf_t *buffer,
  94. process_read_callback_t callback);
  95. #endif /* defined(PROCESS_PRIVATE). */
  96. #endif /* defined(TOR_PROCESS_H). */