-
Notifications
You must be signed in to change notification settings - Fork 104
/
socket.h
152 lines (119 loc) · 5.88 KB
/
socket.h
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
/* Cherokee
*
* Authors:
* Alvaro Lopez Ortega <alvaro@alobbs.com>
*
* Copyright (C) 2001-2013 Alvaro Lopez Ortega
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of version 2 of the GNU General Public
* License as published by the Free Software Foundation.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
* 02110-1301, USA.
*/
#ifndef CHEROKEE_SOCKET_H
#define CHEROKEE_SOCKET_H
#include "common-internal.h"
#include "socket_lowlevel.h"
#include "buffer.h"
#include "virtual_server.h"
#include "fdpoll.h"
#include "cryptor.h"
/* Socket status
*/
typedef enum {
socket_reading = FDPOLL_MODE_READ,
socket_writing = FDPOLL_MODE_WRITE,
socket_closed = FDPOLL_MODE_NONE
} cherokee_socket_status_t;
/* Socket crypt
*/
typedef enum {
non_TLS,
TLS
} cherokee_socket_type_t;
/* Socket address
*/
typedef union {
struct sockaddr sa;
struct sockaddr_in sa_in;
#ifdef HAVE_SOCKADDR_UN
struct sockaddr_un sa_un;
#endif
#ifdef HAVE_SOCKADDR_IN6
struct sockaddr_in6 sa_in6;
#endif
} cherokee_sockaddr_t;
/* Socket
*/
typedef struct {
int socket;
cherokee_sockaddr_t client_addr;
socklen_t client_addr_len;
cherokee_socket_status_t status;
cherokee_socket_type_t is_tls;
cherokee_cryptor_socket_t *cryptor;
} cherokee_socket_t;
#define S_SOCKET(s) ((cherokee_socket_t)(s))
#define S_SOCKET_FD(s) ((s).socket)
#define SOCKET(s) ((cherokee_socket_t *)(s))
#define SOCKET_FD(s) (SOCKET(s)->socket)
#define SOCKET_AF(s) (SOCKET(s)->client_addr.sa.sa_family)
#define SOCKET_STATUS(s) (SOCKET(s)->status)
#define SOCKET_ADDR(s) (SOCKET(s)->client_addr)
#define SOCKET_ADDR_UNIX(s) ((struct sockaddr_un *) &SOCKET_ADDR(s))
#define SOCKET_ADDR_IPv4(s) ((struct sockaddr_in *) &SOCKET_ADDR(s))
#define SOCKET_ADDR_IPv6(s) ((struct sockaddr_in6 *) &SOCKET_ADDR(s))
#define SOCKET_SIN_PORT(s) (SOCKET(s)->client_addr.sa_in.sin_port)
#define SOCKET_SIN_ADDR(s) (SOCKET(s)->client_addr.sa_in.sin_addr)
#define SOCKET_SIN6_ADDR(s) (SOCKET(s)->client_addr.sa_in6.sin6_addr)
#define SOCKET_SUN_PATH(s) (SOCKET(s)->client_addr.sa_un.sun_path)
#define SOCKET_ADDRESS_IPv4(s) (SOCKET_ADDR_IPv4(s)->sin_addr.s_addr)
#define SOCKET_ADDRESS_IPv6(s) (SOCKET_ADDR_IPv6(s)->sin6_addr.s6_addr)
#define cherokee_socket_configured(c) (SOCKET_FD(c) >= 0)
#define cherokee_socket_is_connected(c) (cherokee_socket_configured(c) && \
(SOCKET_STATUS(c) != socket_closed))
ret_t cherokee_socket_init (cherokee_socket_t *socket);
ret_t cherokee_socket_mrproper (cherokee_socket_t *socket);
ret_t cherokee_socket_clean (cherokee_socket_t *socket);
ret_t cherokee_socket_init_tls (cherokee_socket_t *socket, cherokee_virtual_server_t *vserver, cherokee_connection_t *conn, cherokee_socket_status_t *blocking);
ret_t cherokee_socket_init_client_tls (cherokee_socket_t *socket, cherokee_buffer_t *host);
ret_t cherokee_socket_close (cherokee_socket_t *socket);
ret_t cherokee_socket_shutdown (cherokee_socket_t *socket, int how);
ret_t cherokee_socket_reset (cherokee_socket_t *socket);
ret_t cherokee_socket_accept (cherokee_socket_t *socket, cherokee_socket_t *server_socket);
ret_t cherokee_socket_accept_fd (cherokee_socket_t *socket, int *new_fd, cherokee_sockaddr_t *sa);
int cherokee_socket_pending_read (cherokee_socket_t *socket);
ret_t cherokee_socket_flush (cherokee_socket_t *socket);
ret_t cherokee_socket_test_read (cherokee_socket_t *socket);
ret_t cherokee_socket_create_fd (cherokee_socket_t *socket, unsigned short int family);
ret_t cherokee_socket_bind (cherokee_socket_t *socket, int port, cherokee_buffer_t *listen_to);
ret_t cherokee_socket_listen (cherokee_socket_t *socket, int backlog);
ret_t cherokee_socket_bufwrite (cherokee_socket_t *socket, cherokee_buffer_t *buf, size_t *written);
ret_t cherokee_socket_bufread (cherokee_socket_t *socket, cherokee_buffer_t *buf, size_t count, size_t *read);
ret_t cherokee_socket_sendfile (cherokee_socket_t *socket, int fd, size_t size, off_t *offset, ssize_t *sent);
ret_t cherokee_socket_connect (cherokee_socket_t *socket);
ret_t cherokee_socket_ntop (cherokee_socket_t *socket, char *buf, size_t buf_size);
ret_t cherokee_socket_pton (cherokee_socket_t *socket, cherokee_buffer_t *buf);
ret_t cherokee_socket_gethostbyname (cherokee_socket_t *socket, cherokee_buffer_t *hostname);
ret_t cherokee_socket_set_status (cherokee_socket_t *socket, cherokee_socket_status_t status);
ret_t cherokee_socket_set_cork (cherokee_socket_t *socket, cherokee_boolean_t enable);
/* Low level functions
*/
ret_t cherokee_socket_read (cherokee_socket_t *socket, char *buf, int buf_size, size_t *pcnt_read);
ret_t cherokee_socket_write (cherokee_socket_t *socket, const char *buf, int len, size_t *pcnt_written);
ret_t cherokee_socket_writev (cherokee_socket_t *socket, const struct iovec *vector, uint16_t vector_len, size_t *pcnt_written);
/* Extra
*/
ret_t cherokee_socket_set_sockaddr (cherokee_socket_t *socket, int fd, cherokee_sockaddr_t *sa);
ret_t cherokee_socket_update_from_addrinfo (cherokee_socket_t *socket, const struct addrinfo *addr_info, cuint_t num);
#endif /* CHEROKEE_SOCKET_H */