Rizin
unix-like reverse engineering framework and cli tools
main.c
Go to the documentation of this file.
1 #include <stdio.h>
2 #include <stdlib.h>
3 #include <string.h>
4 #include <uv.h>
5 
6 #ifdef _WIN32
7 #define PIPENAME "\\\\?\\pipe\\echo.sock"
8 #else
9 #define PIPENAME "/tmp/echo.sock"
10 #endif
11 
13 
14 typedef struct {
16  uv_buf_t buf;
17 } write_req_t;
18 
20  write_req_t *wr = (write_req_t*) req;
21  free(wr->buf.base);
22  free(wr);
23 }
24 
25 void alloc_buffer(uv_handle_t *handle, size_t suggested_size, uv_buf_t *buf) {
26  buf->base = malloc(suggested_size);
27  buf->len = suggested_size;
28 }
29 
31  if (status < 0) {
32  fprintf(stderr, "Write error %s\n", uv_err_name(status));
33  }
35 }
36 
37 void echo_read(uv_stream_t *client, ssize_t nread, const uv_buf_t *buf) {
38  if (nread > 0) {
40  req->buf = uv_buf_init(buf->base, nread);
41  uv_write((uv_write_t*) req, client, &req->buf, 1, echo_write);
42  return;
43  }
44 
45  if (nread < 0) {
46  if (nread != UV_EOF)
47  fprintf(stderr, "Read error %s\n", uv_err_name(nread));
48  uv_close((uv_handle_t*) client, NULL);
49  }
50 
51  free(buf->base);
52 }
53 
54 void on_new_connection(uv_stream_t *server, int status) {
55  if (status == -1) {
56  // error!
57  return;
58  }
59 
60  uv_pipe_t *client = (uv_pipe_t*) malloc(sizeof(uv_pipe_t));
61  uv_pipe_init(loop, client, 0);
62  if (uv_accept(server, (uv_stream_t*) client) == 0) {
64  }
65  else {
66  uv_close((uv_handle_t*) client, NULL);
67  }
68 }
69 
70 void remove_sock(int sig) {
71  uv_fs_t req;
73  exit(0);
74 }
75 
76 int main() {
78 
79  uv_pipe_t server;
80  uv_pipe_init(loop, &server, 0);
81 
82  signal(SIGINT, remove_sock);
83 
84  int r;
85  if ((r = uv_pipe_bind(&server, PIPENAME))) {
86  fprintf(stderr, "Bind error %s\n", uv_err_name(r));
87  return 1;
88  }
89  if ((r = uv_listen((uv_stream_t*) &server, 128, on_new_connection))) {
90  fprintf(stderr, "Listen error %s\n", uv_err_name(r));
91  return 2;
92  }
93  return uv_run(loop, UV_RUN_DEFAULT);
94 }
static mcore_handle handle
Definition: asm_mcore.c:8
#define NULL
Definition: cris-opc.c:27
#define r
Definition: crypto_rc6.c:12
static static sync static getppid static getegid const char static filename char static len const char char static bufsiz static mask static vfork const void static prot static getpgrp const char static swapflags static arg static fd static protocol static who struct sockaddr static addrlen static backlog struct timeval struct timezone static tz const struct iovec static count static mode const void const struct sockaddr static tolen const char static pathname void static offset struct stat static buf void long static basep static whence static length const void static len static semflg const void static shmflg const struct timespec req
Definition: sflib.h:128
RZ_API void Ht_() free(HtName_(Ht) *ht)
Definition: ht_inc.c:130
voidpf void * buf
Definition: ioapi.h:138
int main(int argc, const char **argv)
Definition: main.c:340
void * malloc(size_t size)
Definition: malloc.c:123
static static fork const void static count static fd const char static mode const char static pathname const char static path const char static dev const char static group static getpid static getuid void void static data static pause const char static mode static sync const char const char static newpath const char static pathname unsigned long static filedes void static end_data_segment signal
Definition: sflib.h:79
static const char struct stat static buf struct stat static buf static vhangup int status
Definition: sflib.h:145
int ssize_t
Definition: sftypes.h:39
Definition: unix.h:123
char * base
Definition: unix.h:124
Definition: uv.h:1306
Definition: uv.h:1780
Definition: uv.h:767
Definition: uv.h:525
uv_buf_t buf
Definition: worker.c:13
void on_new_connection(uv_stream_t *server, int status)
Definition: main.c:50
uv_loop_t * loop
Definition: main.c:7
void alloc_buffer(uv_handle_t *handle, size_t suggested_size, uv_buf_t *buf)
Definition: main.c:8
void echo_write(uv_write_t *req, int status)
Definition: main.c:30
void remove_sock(int sig)
Definition: main.c:70
void echo_read(uv_stream_t *client, ssize_t nread, const uv_buf_t *buf)
Definition: main.c:37
#define PIPENAME
Definition: main.c:9
void free_write_req(uv_write_t *req)
Definition: main.c:19
@ UV_RUN_DEFAULT
Definition: uv.h:255
UV_EXTERN int uv_write(uv_write_t *req, uv_stream_t *handle, const uv_buf_t bufs[], unsigned int nbufs, uv_write_cb cb)
Definition: stream.c:1492
UV_EXTERN uv_buf_t uv_buf_init(char *base, unsigned int len)
Definition: uv-common.c:157
UV_EXTERN int uv_read_start(uv_stream_t *, uv_alloc_cb alloc_cb, uv_read_cb read_cb)
Definition: stream.c:1555
UV_EXTERN int uv_listen(uv_stream_t *stream, int backlog, uv_connection_cb cb)
Definition: stream.c:656
UV_EXTERN int uv_pipe_init(uv_loop_t *, uv_pipe_t *handle, int ipc)
Definition: pipe.c:33
UV_EXTERN int uv_run(uv_loop_t *, uv_run_mode mode)
Definition: core.c:365
UV_EXTERN const char * uv_err_name(int err)
Definition: uv-common.c:189
UV_EXTERN int uv_pipe_bind(uv_pipe_t *handle, const char *name)
Definition: pipe.c:43
UV_EXTERN void uv_close(uv_handle_t *handle, uv_close_cb close_cb)
Definition: core.c:108
UV_EXTERN int uv_accept(uv_stream_t *server, uv_stream_t *client)
Definition: stream.c:591
UV_EXTERN int uv_fs_unlink(uv_loop_t *loop, uv_fs_t *req, const char *path, uv_fs_cb cb)
Definition: fs.c:2020
UV_EXTERN uv_loop_t * uv_default_loop(void)
Definition: uv-common.c:763