summaryrefslogtreecommitdiff
path: root/source/kit/process.h
blob: 8031cc1414e3e0840d9c9b3170983cc78f686acf (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
//  TODO
//

#ifndef KIT_PROCESS_H
#define KIT_PROCESS_H

#include "types.h"
#include "string_ref.h"

#if !defined(_WIN32) || defined(__CYGWIN__)
#  include <unistd.h>
#else
#endif

#ifdef __cplusplus
extern "C" {
#endif

enum {
  KIT_PROCESS_NO_ARGUMENTS   = 1,
  KIT_PROCESS_NO_ENVIRONMENT = (1 << 1),
  KIT_PROCESS_NO_PIPES       = (1 << 2),
  KIT_PROCESS_FORK           = (1 << 3),
};

typedef struct {
  s32 status;
  u8  exit_code;
  b8  current_is_forked;
#if !defined(_WIN32) || defined(__CYGWIN__)
  b8    _ready;
  b8    _running;
  pid_t _id;
  i32   _stdin;
  i32   _stdout;
  i32   _stderr;
#else
#endif
} kit_process_t;

typedef struct {
  kit_str_t name;
  kit_str_t value;
} kit_process_env_var_t;

typedef KIT_AR(kit_str_t) kit_process_args_t;
typedef KIT_AR(kit_process_env_var_t) kit_process_env_t;

typedef struct {
  u32                flags;
  kit_str_t          file_name;
  kit_process_args_t command_line;
  kit_process_env_t  environment;
  kit_str_t          working_directory;
} kit_process_info_t;

s32  kit_process_init(kit_process_t *p, kit_process_info_t info);
void kit_process_cleanup(kit_process_t *p);

i64 kit_process_write_stdin(kit_process_t *p, kit_str_t in_data);
i64 kit_process_read_stdout(kit_process_t *p, kit_str_t out_data);
i64 kit_process_read_stderr(kit_process_t *p, kit_str_t out_data);
s32 kit_process_terminate(kit_process_t *p);
b8  kit_process_alive(kit_process_t *p);
s32 kit_process_wait(kit_process_t *p);

#ifdef __cplusplus
}
#endif

#endif