1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23 #define FCGI_VERSION_1 1
24
25 #define FCGI_MAX_LENGTH 0xffff
26
27 #define FCGI_KEEP_CONN 1
28
29 typedef enum _fcgi_role {
30 FCGI_RESPONDER = 1,
31 FCGI_AUTHORIZER = 2,
32 FCGI_FILTER = 3
33 } fcgi_role;
34
35 typedef enum _fcgi_request_type {
36 FCGI_BEGIN_REQUEST = 1,
37 FCGI_ABORT_REQUEST = 2,
38 FCGI_END_REQUEST = 3,
39 FCGI_PARAMS = 4,
40 FCGI_STDIN = 5,
41 FCGI_STDOUT = 6,
42 FCGI_STDERR = 7,
43 FCGI_DATA = 8,
44 FCGI_GET_VALUES = 9,
45 FCGI_GET_VALUES_RESULT = 10
46 } fcgi_request_type;
47
48 typedef enum _fcgi_protocol_status {
49 FCGI_REQUEST_COMPLETE = 0,
50 FCGI_CANT_MPX_CONN = 1,
51 FCGI_OVERLOADED = 2,
52 FCGI_UNKNOWN_ROLE = 3
53 } dcgi_protocol_status;
54
55 typedef struct _fcgi_header {
56 unsigned char version;
57 unsigned char type;
58 unsigned char requestIdB1;
59 unsigned char requestIdB0;
60 unsigned char contentLengthB1;
61 unsigned char contentLengthB0;
62 unsigned char paddingLength;
63 unsigned char reserved;
64 } fcgi_header;
65
66 typedef struct _fcgi_begin_request {
67 unsigned char roleB1;
68 unsigned char roleB0;
69 unsigned char flags;
70 unsigned char reserved[5];
71 } fcgi_begin_request;
72
73 typedef struct _fcgi_begin_request_rec {
74 fcgi_header hdr;
75 fcgi_begin_request body;
76 } fcgi_begin_request_rec;
77
78 typedef struct _fcgi_end_request {
79 unsigned char appStatusB3;
80 unsigned char appStatusB2;
81 unsigned char appStatusB1;
82 unsigned char appStatusB0;
83 unsigned char protocolStatus;
84 unsigned char reserved[3];
85 } fcgi_end_request;
86
87 typedef struct _fcgi_end_request_rec {
88 fcgi_header hdr;
89 fcgi_end_request body;
90 } fcgi_end_request_rec;
91
92
93
94 typedef struct _fcgi_request {
95 int listen_socket;
96 #ifdef _WIN32
97 int tcp;
98 #endif
99 int fd;
100 int id;
101 int keep;
102 int closed;
103
104 int in_len;
105 int in_pad;
106
107 fcgi_header *out_hdr;
108 unsigned char *out_pos;
109 unsigned char out_buf[1024*8];
110 unsigned char reserved[sizeof(fcgi_end_request_rec)];
111
112 HashTable *env;
113 } fcgi_request;
114
115 int fcgi_init(void);
116 void fcgi_shutdown(void);
117 void fcgi_init_request(fcgi_request *req, int listen_socket);
118 int fcgi_accept_request(fcgi_request *req);
119 int fcgi_finish_request(fcgi_request *req, int force_close);
120
121 void fcgi_set_in_shutdown(int);
122 void fcgi_set_allowed_clients(char *);
123 void fcgi_close(fcgi_request *req, int force, int destroy);
124
125 char* fcgi_getenv(fcgi_request *req, const char* var, int var_len);
126 char* fcgi_putenv(fcgi_request *req, char* var, int var_len, char* val);
127
128 int fcgi_read(fcgi_request *req, char *str, int len);
129
130 ssize_t fcgi_write(fcgi_request *req, fcgi_request_type type, const char *str, int len);
131 int fcgi_flush(fcgi_request *req, int close);
132
133 void fcgi_set_mgmt_var(const char * name, size_t name_len, const char * value, size_t value_len);
134 void fcgi_free_mgmt_var_cb(void * ptr);
135
136 const char *fcgi_get_last_client_ip();
137
138
139
140
141
142
143
144
145