grpc
third_party
libuv
docs
code
cgi
libuv/docs/code/cgi/main.c
Go to the documentation of this file.
1
#include <inttypes.h>
2
#include <stdio.h>
3
#include <stdlib.h>
4
#include <
string.h
>
5
#include <
uv.h
>
6
7
uv_loop_t
*
loop
;
8
uv_process_t
child_req
;
9
uv_process_options_t
options
;
10
11
void
cleanup_handles
(
uv_process_t
*
req
,
int64_t
exit_status,
int
term_signal) {
12
fprintf(
stderr
,
"Process exited with status %"
PRId64
", signal %d\n"
, exit_status, term_signal);
13
uv_close
((
uv_handle_t
*)
req
->data, NULL);
14
uv_close
((
uv_handle_t
*)
req
, NULL);
15
}
16
17
void
invoke_cgi_script
(
uv_tcp_t
*
client
) {
18
size_t
size
= 500;
19
char
path
[
size
];
20
uv_exepath
(
path
, &
size
);
21
strcpy(
path
+ (strlen(
path
) - strlen(
"cgi"
)),
"tick"
);
22
23
char
*
args
[2];
24
args
[0] =
path
;
25
args
[1] = NULL;
26
27
/* ... finding the executable path and setting up arguments ... */
28
29
options
.
stdio_count
= 3;
30
uv_stdio_container_t
child_stdio[3];
31
child_stdio[0].
flags
=
UV_IGNORE
;
32
child_stdio[1].
flags
=
UV_INHERIT_STREAM
;
33
child_stdio[1].
data
.
stream
= (
uv_stream_t
*)
client
;
34
child_stdio[2].
flags
=
UV_IGNORE
;
35
options
.
stdio
= child_stdio;
36
37
options
.
exit_cb
=
cleanup_handles
;
38
options
.
file
=
args
[0];
39
options
.
args
=
args
;
40
41
// Set this so we can close the socket after the child process exits.
42
child_req
.data = (
void
*)
client
;
43
int
r
;
44
if
((
r
=
uv_spawn
(
loop
, &
child_req
, &
options
))) {
45
fprintf(
stderr
,
"%s\n"
,
uv_strerror
(
r
));
46
return
;
47
}
48
}
49
50
void
on_new_connection
(
uv_stream_t
*
server
,
int
status
) {
51
if
(
status
== -1) {
52
// error!
53
return
;
54
}
55
56
uv_tcp_t
*
client
= (
uv_tcp_t
*) malloc(
sizeof
(
uv_tcp_t
));
57
uv_tcp_init
(
loop
,
client
);
58
if
(
uv_accept
(
server
, (
uv_stream_t
*)
client
) == 0) {
59
invoke_cgi_script
(
client
);
60
}
61
else
{
62
uv_close
((
uv_handle_t
*)
client
, NULL);
63
}
64
}
65
66
int
main
() {
67
loop
=
uv_default_loop
();
68
69
uv_tcp_t
server
;
70
uv_tcp_init
(
loop
, &
server
);
71
72
struct
sockaddr_in bind_addr;
73
uv_ip4_addr
(
"0.0.0.0"
, 7000, &bind_addr);
74
uv_tcp_bind
(&
server
, (
const
struct
sockaddr *)&bind_addr, 0);
75
int
r
=
uv_listen
((
uv_stream_t
*) &
server
, 128,
on_new_connection
);
76
if
(
r
) {
77
fprintf(
stderr
,
"Listen error %s\n"
,
uv_err_name
(
r
));
78
return
1;
79
}
80
return
uv_run
(
loop
,
UV_RUN_DEFAULT
);
81
}
uv_process_options_s
Definition:
uv.h:940
uv_process_s
Definition:
uv.h:1037
loop
uv_loop_t * loop
Definition:
libuv/docs/code/cgi/main.c:7
UV_IGNORE
@ UV_IGNORE
Definition:
uv.h:911
client
Definition:
examples/python/async_streaming/client.py:1
string.h
uv_listen
UV_EXTERN int uv_listen(uv_stream_t *stream, int backlog, uv_connection_cb cb)
Definition:
unix/stream.c:656
uv_process_options_s::exit_cb
uv_exit_cb exit_cb
Definition:
uv.h:941
main
int main()
Definition:
libuv/docs/code/cgi/main.c:66
on_new_connection
void on_new_connection(uv_stream_t *server, int status)
Definition:
libuv/docs/code/cgi/main.c:50
status
absl::Status status
Definition:
rls.cc:251
uv_strerror
const UV_EXTERN char * uv_strerror(int err)
Definition:
uv-common.c:212
check_documentation.path
path
Definition:
check_documentation.py:57
uv_run
UV_EXTERN int uv_run(uv_loop_t *, uv_run_mode mode)
Definition:
unix/core.c:361
uv_tcp_bind
UV_EXTERN int uv_tcp_bind(uv_tcp_t *handle, const struct sockaddr *addr, unsigned int flags)
Definition:
uv-common.c:277
python_utils.port_server.stderr
stderr
Definition:
port_server.py:51
uv_close
UV_EXTERN void uv_close(uv_handle_t *handle, uv_close_cb close_cb)
Definition:
unix/core.c:112
uv_stream_s
Definition:
uv.h:491
uv_ip4_addr
UV_EXTERN int uv_ip4_addr(const char *ip, int port, struct sockaddr_in *addr)
Definition:
uv-common.c:221
uv_process_options_s::file
const char * file
Definition:
uv.h:942
child_req
uv_process_t child_req
Definition:
libuv/docs/code/cgi/main.c:8
server
std::unique_ptr< Server > server
Definition:
channelz_service_test.cc:330
uv_default_loop
UV_EXTERN uv_loop_t * uv_default_loop(void)
Definition:
uv-common.c:733
asyncio_get_stats.args
args
Definition:
asyncio_get_stats.py:40
uv_stdio_container_s::flags
uv_stdio_flags flags
Definition:
uv.h:932
uv_process_options_s::stdio
uv_stdio_container_t * stdio
Definition:
uv.h:975
int64_t
signed __int64 int64_t
Definition:
stdint-msvc2008.h:89
uv_process_options_s::args
char ** args
Definition:
uv.h:949
req
static uv_connect_t req
Definition:
test-connection-fail.c:30
UV_RUN_DEFAULT
@ UV_RUN_DEFAULT
Definition:
uv.h:254
uv_process_options_s::stdio_count
int stdio_count
Definition:
uv.h:974
UV_INHERIT_STREAM
@ UV_INHERIT_STREAM
Definition:
uv.h:914
options
uv_process_options_t options
Definition:
libuv/docs/code/cgi/main.c:9
uv_tcp_init
UV_EXTERN int uv_tcp_init(uv_loop_t *, uv_tcp_t *handle)
Definition:
unix/tcp.c:143
uv_accept
UV_EXTERN int uv_accept(uv_stream_t *server, uv_stream_t *client)
Definition:
unix/stream.c:591
uv_stdio_container_s
Definition:
uv.h:931
uv_tcp_s
Definition:
uv.h:544
uv_spawn
UV_EXTERN int uv_spawn(uv_loop_t *loop, uv_process_t *handle, const uv_process_options_t *options)
Definition:
unix/process.c:408
uv_exepath
UV_EXTERN int uv_exepath(char *buffer, size_t *size)
Definition:
aix-common.c:79
uv_stdio_container_s::stream
uv_stream_t * stream
Definition:
uv.h:935
uv.h
server
Definition:
examples/python/async_streaming/server.py:1
fix_build_deps.r
r
Definition:
fix_build_deps.py:491
uv_stdio_container_s::data
union uv_stdio_container_s::@399 data
uv_handle_s
Definition:
uv.h:441
uv_loop_s
Definition:
uv.h:1767
size
voidpf void uLong size
Definition:
bloaty/third_party/zlib/contrib/minizip/ioapi.h:136
uv_err_name
const UV_EXTERN char * uv_err_name(int err)
Definition:
uv-common.c:189
cleanup_handles
void cleanup_handles(uv_process_t *req, int64_t exit_status, int term_signal)
Definition:
libuv/docs/code/cgi/main.c:11
invoke_cgi_script
void invoke_cgi_script(uv_tcp_t *client)
Definition:
libuv/docs/code/cgi/main.c:17
grpc
Author(s):
autogenerated on Fri May 16 2025 02:59:17