37 #endif |
37 #endif |
38 |
38 |
39 typedef struct { |
39 typedef struct { |
40 int in[2]; |
40 int in[2]; |
41 int out[2]; |
41 int out[2]; |
|
42 int err[2]; |
42 pid_t pid; |
43 pid_t pid; |
43 } CGIProcess; |
44 } CGIProcess; |
44 |
45 |
45 typedef struct { |
46 typedef struct { |
46 Session *sn; |
47 Session *sn; |
47 Request *rq; |
48 Request *rq; |
48 CxBuffer tmp; |
49 CxBuffer tmp; |
49 int status; |
50 int status; |
50 char *msg; |
51 char *msg; |
|
52 size_t response_length; |
|
53 WSBool cgiheader; |
51 } CGIResponseParser; |
54 } CGIResponseParser; |
|
55 |
|
56 typedef struct CGIHandler { |
|
57 CGIProcess process; |
|
58 CGIResponseParser *parser; |
|
59 char *path; |
|
60 Event *writeev; |
|
61 char *stderr_tmp; |
|
62 int result; |
|
63 } CGIHandler; |
52 |
64 |
53 int send_cgi(pblock *pb, Session *sn, Request *rq); |
65 int send_cgi(pblock *pb, Session *sn, Request *rq); |
54 |
66 |
55 char** cgi_add_vars(char **env, Session *sn, Request *rq); |
67 char** cgi_add_vars(char **env, Session *sn, Request *rq); |
56 |
68 |
57 int cgi_start(CGIProcess *p, char *path, char *const argv[], char *const envp[]); |
69 int cgi_start(CGIProcess *p, char *path, char *const argv[], char *const envp[]); |
58 |
70 |
59 int cgi_close(CGIProcess *p); |
71 int cgi_close(CGIProcess *p); |
|
72 |
|
73 int cgi_stdout_readevent(EventHandler *ev, Event *event); |
|
74 int cgi_stderr_readevent(EventHandler *ev, Event *event); |
|
75 int cgi_event_finish(EventHandler *ev, Event *event); |
60 |
76 |
61 CGIResponseParser* cgi_parser_new(Session *sn, Request *rq); |
77 CGIResponseParser* cgi_parser_new(Session *sn, Request *rq); |
62 void cgi_parser_free(CGIResponseParser *parser); |
78 void cgi_parser_free(CGIResponseParser *parser); |
63 int cgi_parse_response(CGIResponseParser *parser, char *buf, size_t len, size_t *bpos); |
79 int cgi_parse_response(CGIResponseParser *parser, char *buf, size_t len, size_t *bpos); |
64 |
80 |