Rizin
unix-like reverse engineering framework and cli tools
worker.c File Reference
#include <assert.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <uv.h>

Go to the source code of this file.

Classes

struct  write_req_t
 

Functions

void free_write_req (uv_write_t *req)
 
void alloc_buffer (uv_handle_t *handle, size_t suggested_size, uv_buf_t *buf)
 
void echo_write (uv_write_t *req, int status)
 
void echo_read (uv_stream_t *client, ssize_t nread, const uv_buf_t *buf)
 
void on_new_connection (uv_stream_t *q, ssize_t nread, const uv_buf_t *buf)
 
int main ()
 

Variables

uv_loop_tloop
 
uv_pipe_t queue
 

Function Documentation

◆ alloc_buffer()

void alloc_buffer ( uv_handle_t handle,
size_t  suggested_size,
uv_buf_t buf 
)

Definition at line 22 of file worker.c.

22  {
23  buf->base = malloc(suggested_size);
24  buf->len = suggested_size;
25 }
voidpf void * buf
Definition: ioapi.h:138
void * malloc(size_t size)
Definition: malloc.c:123

References malloc().

Referenced by main(), and on_new_connection().

◆ echo_read()

void echo_read ( uv_stream_t client,
ssize_t  nread,
const uv_buf_t buf 
)

Definition at line 34 of file worker.c.

34  {
35  if (nread > 0) {
37  req->buf = uv_buf_init(buf->base, nread);
38  uv_write((uv_write_t*) req, client, &req->buf, 1, echo_write);
39  return;
40  }
41 
42  if (nread < 0) {
43  if (nread != UV_EOF)
44  fprintf(stderr, "Read error %s\n", uv_err_name(nread));
45  uv_close((uv_handle_t*) client, NULL);
46  }
47 
48  free(buf->base);
49 }
#define NULL
Definition: cris-opc.c:27
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
Definition: uv.h:525
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 const char * uv_err_name(int err)
Definition: uv-common.c:189
UV_EXTERN void uv_close(uv_handle_t *handle, uv_close_cb close_cb)
Definition: core.c:108
void echo_write(uv_write_t *req, int status)
Definition: worker.c:27

References echo_write(), free(), malloc(), NULL, req, uv_buf_init(), uv_close(), uv_err_name(), and uv_write().

Referenced by on_new_connection().

◆ echo_write()

void echo_write ( uv_write_t req,
int  status 
)

Definition at line 27 of file worker.c.

27  {
28  if (status) {
29  fprintf(stderr, "Write error %s\n", uv_err_name(status));
30  }
32 }
static const char struct stat static buf struct stat static buf static vhangup int status
Definition: sflib.h:145
void free_write_req(uv_write_t *req)
Definition: worker.c:16

References free_write_req(), req, status, and uv_err_name().

Referenced by echo_read().

◆ free_write_req()

void free_write_req ( uv_write_t req)

Definition at line 16 of file worker.c.

16  {
17  write_req_t *wr = (write_req_t*) req;
18  free(wr->buf.base);
19  free(wr);
20 }
char * base
Definition: unix.h:124
uv_buf_t buf
Definition: worker.c:13

References uv_buf_t::base, write_req_t::buf, free(), and req.

Referenced by echo_write().

◆ main()

int main ( void  )

Definition at line 81 of file worker.c.

81  {
83 
84  uv_pipe_init(loop, &queue, 1 /* ipc */);
85  uv_pipe_open(&queue, 0);
87  return uv_run(loop, UV_RUN_DEFAULT);
88 }
@ UV_RUN_DEFAULT
Definition: uv.h:255
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_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 uv_loop_t * uv_default_loop(void)
Definition: uv-common.c:763
UV_EXTERN int uv_pipe_open(uv_pipe_t *, uv_file file)
Definition: pipe.c:137
void on_new_connection(uv_stream_t *q, ssize_t nread, const uv_buf_t *buf)
Definition: worker.c:51
uv_pipe_t queue
Definition: worker.c:9
void alloc_buffer(uv_handle_t *handle, size_t suggested_size, uv_buf_t *buf)
Definition: worker.c:22
uv_loop_t * loop
Definition: worker.c:8

References alloc_buffer(), loop, on_new_connection(), queue, uv_default_loop(), uv_pipe_init(), uv_pipe_open(), uv_read_start(), uv_run(), and UV_RUN_DEFAULT.

◆ on_new_connection()

void on_new_connection ( uv_stream_t q,
ssize_t  nread,
const uv_buf_t buf 
)

Definition at line 51 of file worker.c.

51  {
52  if (nread < 0) {
53  if (nread != UV_EOF)
54  fprintf(stderr, "Read error %s\n", uv_err_name(nread));
55  uv_close((uv_handle_t*) q, NULL);
56  return;
57  }
58 
59  uv_pipe_t *pipe = (uv_pipe_t*) q;
61  fprintf(stderr, "No pending count\n");
62  return;
63  }
64 
66  assert(pending == UV_TCP);
67 
68  uv_tcp_t *client = (uv_tcp_t*) malloc(sizeof(uv_tcp_t));
69  uv_tcp_init(loop, client);
70  if (uv_accept(q, (uv_stream_t*) client) == 0) {
71  uv_os_fd_t fd;
72  uv_fileno((const uv_handle_t*) client, &fd);
73  fprintf(stderr, "Worker %d: Accepted fd %d\n", getpid(), fd);
75  }
76  else {
77  uv_close((uv_handle_t*) client, NULL);
78  }
79 }
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 pipe
Definition: sflib.h:73
assert(limit<=UINT32_MAX/2)
Definition: uv.h:767
Definition: uv.h:547
int uv_os_fd_t
Definition: unix.h:130
uv_handle_type
Definition: uv.h:189
UV_EXTERN int uv_pipe_pending_count(uv_pipe_t *handle)
Definition: pipe.c:298
UV_EXTERN uv_handle_type uv_pipe_pending_type(uv_pipe_t *handle)
Definition: pipe.c:315
UV_EXTERN int uv_accept(uv_stream_t *server, uv_stream_t *client)
Definition: stream.c:591
UV_EXTERN int uv_tcp_init(uv_loop_t *, uv_tcp_t *handle)
Definition: tcp.c:143
UV_EXTERN int uv_fileno(const uv_handle_t *handle, uv_os_fd_t *fd)
Definition: core.c:767
void echo_read(uv_stream_t *client, ssize_t nread, const uv_buf_t *buf)
Definition: worker.c:34
static const z80_opcode fd[]
Definition: z80_tab.h:997

References alloc_buffer(), assert(), echo_read(), fd, loop, malloc(), NULL, pipe, uv_accept(), uv_close(), uv_err_name(), uv_fileno(), uv_pipe_pending_count(), uv_pipe_pending_type(), uv_read_start(), and uv_tcp_init().

Referenced by main().

Variable Documentation

◆ loop

uv_loop_t* loop

Definition at line 8 of file worker.c.

Referenced by main(), and on_new_connection().

◆ queue