annotate nsock.c @ 168:a89ff602b30f

Initial import of nsock.c nsock.h
author David Demelier <markand@malikania.fr>
date Thu, 22 Aug 2013 17:40:54 +0200
parents
children 29531c2f8213
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
168
a89ff602b30f Initial import of nsock.c nsock.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
1 /*
a89ff602b30f Initial import of nsock.c nsock.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
2 * nsock.c -- portable BSD sockets wrapper
a89ff602b30f Initial import of nsock.c nsock.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
3 *
a89ff602b30f Initial import of nsock.c nsock.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
4 * Copyright (c) 2013 David Demelier <markand@malikania.fr>
a89ff602b30f Initial import of nsock.c nsock.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
5 *
a89ff602b30f Initial import of nsock.c nsock.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
6 * Permission to use, copy, modify, and/or distribute this software for any
a89ff602b30f Initial import of nsock.c nsock.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
7 * purpose with or without fee is hereby granted, provided that the above
a89ff602b30f Initial import of nsock.c nsock.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
8 * copyright notice and this permission notice appear in all copies.
a89ff602b30f Initial import of nsock.c nsock.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
9 *
a89ff602b30f Initial import of nsock.c nsock.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
10 * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
a89ff602b30f Initial import of nsock.c nsock.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
11 * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
a89ff602b30f Initial import of nsock.c nsock.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
12 * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
a89ff602b30f Initial import of nsock.c nsock.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
13 * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
a89ff602b30f Initial import of nsock.c nsock.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
14 * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
a89ff602b30f Initial import of nsock.c nsock.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
15 * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
a89ff602b30f Initial import of nsock.c nsock.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
16 * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
a89ff602b30f Initial import of nsock.c nsock.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
17 */
a89ff602b30f Initial import of nsock.c nsock.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
18
a89ff602b30f Initial import of nsock.c nsock.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
19 # include <stdio.h>
a89ff602b30f Initial import of nsock.c nsock.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
20 # include <stdlib.h>
a89ff602b30f Initial import of nsock.c nsock.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
21
a89ff602b30f Initial import of nsock.c nsock.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
22 #if !defined(_WIN32)
a89ff602b30f Initial import of nsock.c nsock.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
23 # include <errno.h>
a89ff602b30f Initial import of nsock.c nsock.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
24 # include <string.h>
a89ff602b30f Initial import of nsock.c nsock.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
25 #endif
a89ff602b30f Initial import of nsock.c nsock.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
26
a89ff602b30f Initial import of nsock.c nsock.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
27 #include "nsock.h"
a89ff602b30f Initial import of nsock.c nsock.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
28
a89ff602b30f Initial import of nsock.c nsock.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
29 #define TAILQ_HEAD(name, type) \
a89ff602b30f Initial import of nsock.c nsock.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
30 struct name { \
a89ff602b30f Initial import of nsock.c nsock.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
31 struct type *tqh_first; /* first element */ \
a89ff602b30f Initial import of nsock.c nsock.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
32 struct type **tqh_last; /* addr of last next element */ \
a89ff602b30f Initial import of nsock.c nsock.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
33 size_t noclients; \
a89ff602b30f Initial import of nsock.c nsock.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
34 }
a89ff602b30f Initial import of nsock.c nsock.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
35
a89ff602b30f Initial import of nsock.c nsock.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
36 #define TAILQ_ENTRY(type) \
a89ff602b30f Initial import of nsock.c nsock.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
37 struct { \
a89ff602b30f Initial import of nsock.c nsock.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
38 struct type *tqe_next; /* next element */ \
a89ff602b30f Initial import of nsock.c nsock.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
39 struct type **tqe_prev; /* address of previous next element */ \
a89ff602b30f Initial import of nsock.c nsock.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
40 }
a89ff602b30f Initial import of nsock.c nsock.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
41
a89ff602b30f Initial import of nsock.c nsock.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
42 #define TAILQ_EMPTY(head) ((head)->tqh_first == NULL)
a89ff602b30f Initial import of nsock.c nsock.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
43
a89ff602b30f Initial import of nsock.c nsock.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
44 #define TAILQ_FIRST(head) ((head)->tqh_first)
a89ff602b30f Initial import of nsock.c nsock.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
45
a89ff602b30f Initial import of nsock.c nsock.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
46 #define TAILQ_FOREACH(var, head, field) \
a89ff602b30f Initial import of nsock.c nsock.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
47 for ((var) = TAILQ_FIRST((head)); \
a89ff602b30f Initial import of nsock.c nsock.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
48 (var); \
a89ff602b30f Initial import of nsock.c nsock.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
49 (var) = TAILQ_NEXT((var), field))
a89ff602b30f Initial import of nsock.c nsock.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
50
a89ff602b30f Initial import of nsock.c nsock.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
51 #define TAILQ_FOREACH_SAFE(var, head, field, tvar) \
a89ff602b30f Initial import of nsock.c nsock.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
52 for ((var) = TAILQ_FIRST((head)); \
a89ff602b30f Initial import of nsock.c nsock.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
53 (var) && ((tvar) = TAILQ_NEXT((var), field), 1); \
a89ff602b30f Initial import of nsock.c nsock.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
54 (var) = (tvar))
a89ff602b30f Initial import of nsock.c nsock.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
55
a89ff602b30f Initial import of nsock.c nsock.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
56 #define TAILQ_INIT(head) do { \
a89ff602b30f Initial import of nsock.c nsock.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
57 TAILQ_FIRST((head)) = NULL; \
a89ff602b30f Initial import of nsock.c nsock.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
58 (head)->tqh_last = &TAILQ_FIRST((head)); \
a89ff602b30f Initial import of nsock.c nsock.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
59 } while (0)
a89ff602b30f Initial import of nsock.c nsock.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
60
a89ff602b30f Initial import of nsock.c nsock.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
61 #define TAILQ_INSERT_HEAD(head, elm, field) do { \
a89ff602b30f Initial import of nsock.c nsock.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
62 if ((TAILQ_NEXT((elm), field) = TAILQ_FIRST((head))) != NULL) \
a89ff602b30f Initial import of nsock.c nsock.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
63 TAILQ_FIRST((head))->field.tqe_prev = \
a89ff602b30f Initial import of nsock.c nsock.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
64 &TAILQ_NEXT((elm), field); \
a89ff602b30f Initial import of nsock.c nsock.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
65 else \
a89ff602b30f Initial import of nsock.c nsock.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
66 (head)->tqh_last = &TAILQ_NEXT((elm), field); \
a89ff602b30f Initial import of nsock.c nsock.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
67 TAILQ_FIRST((head)) = (elm); \
a89ff602b30f Initial import of nsock.c nsock.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
68 (elm)->field.tqe_prev = &TAILQ_FIRST((head)); \
a89ff602b30f Initial import of nsock.c nsock.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
69 (head)->noclients ++; \
a89ff602b30f Initial import of nsock.c nsock.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
70 } while (0)
a89ff602b30f Initial import of nsock.c nsock.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
71
a89ff602b30f Initial import of nsock.c nsock.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
72 #define TAILQ_INSERT_TAIL(head, elm, field) do { \
a89ff602b30f Initial import of nsock.c nsock.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
73 TAILQ_NEXT((elm), field) = NULL; \
a89ff602b30f Initial import of nsock.c nsock.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
74 (elm)->field.tqe_prev = (head)->tqh_last; \
a89ff602b30f Initial import of nsock.c nsock.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
75 *(head)->tqh_last = (elm); \
a89ff602b30f Initial import of nsock.c nsock.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
76 (head)->tqh_last = &TAILQ_NEXT((elm), field); \
a89ff602b30f Initial import of nsock.c nsock.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
77 (head)->noclients ++; \
a89ff602b30f Initial import of nsock.c nsock.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
78 } while (0)
a89ff602b30f Initial import of nsock.c nsock.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
79
a89ff602b30f Initial import of nsock.c nsock.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
80 #define TAILQ_NEXT(elm, field) ((elm)->field.tqe_next)
a89ff602b30f Initial import of nsock.c nsock.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
81
a89ff602b30f Initial import of nsock.c nsock.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
82 #define TAILQ_REMOVE(head, elm, field) do { \
a89ff602b30f Initial import of nsock.c nsock.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
83 if ((TAILQ_NEXT((elm), field)) != NULL) \
a89ff602b30f Initial import of nsock.c nsock.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
84 TAILQ_NEXT((elm), field)->field.tqe_prev = \
a89ff602b30f Initial import of nsock.c nsock.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
85 (elm)->field.tqe_prev; \
a89ff602b30f Initial import of nsock.c nsock.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
86 else { \
a89ff602b30f Initial import of nsock.c nsock.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
87 (head)->tqh_last = (elm)->field.tqe_prev; \
a89ff602b30f Initial import of nsock.c nsock.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
88 } \
a89ff602b30f Initial import of nsock.c nsock.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
89 *(elm)->field.tqe_prev = TAILQ_NEXT((elm), field); \
a89ff602b30f Initial import of nsock.c nsock.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
90 (head)->noclients --; \
a89ff602b30f Initial import of nsock.c nsock.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
91 } while (0)
a89ff602b30f Initial import of nsock.c nsock.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
92
a89ff602b30f Initial import of nsock.c nsock.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
93 struct nsock {
a89ff602b30f Initial import of nsock.c nsock.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
94 nsock_socket_t fd;
a89ff602b30f Initial import of nsock.c nsock.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
95 char error[128];
a89ff602b30f Initial import of nsock.c nsock.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
96 };
a89ff602b30f Initial import of nsock.c nsock.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
97
a89ff602b30f Initial import of nsock.c nsock.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
98 struct nsock_ep {
a89ff602b30f Initial import of nsock.c nsock.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
99 struct sockaddr_storage addr;
a89ff602b30f Initial import of nsock.c nsock.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
100 socklen_t addrlen;
a89ff602b30f Initial import of nsock.c nsock.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
101 char error[128];
a89ff602b30f Initial import of nsock.c nsock.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
102 };
a89ff602b30f Initial import of nsock.c nsock.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
103
a89ff602b30f Initial import of nsock.c nsock.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
104 struct nsock_listener {
a89ff602b30f Initial import of nsock.c nsock.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
105 const struct nsock *sock;
a89ff602b30f Initial import of nsock.c nsock.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
106 char error[128];
a89ff602b30f Initial import of nsock.c nsock.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
107 TAILQ_HEAD(, nsock_clt) head;
a89ff602b30f Initial import of nsock.c nsock.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
108 };
a89ff602b30f Initial import of nsock.c nsock.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
109
a89ff602b30f Initial import of nsock.c nsock.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
110 struct nsock_clt {
a89ff602b30f Initial import of nsock.c nsock.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
111 const struct nsock *sock;
a89ff602b30f Initial import of nsock.c nsock.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
112 TAILQ_ENTRY(nsock_clt) link;
a89ff602b30f Initial import of nsock.c nsock.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
113 };
a89ff602b30f Initial import of nsock.c nsock.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
114
a89ff602b30f Initial import of nsock.c nsock.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
115 /* --------------------------------------------------------
a89ff602b30f Initial import of nsock.c nsock.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
116 * Private helpers
a89ff602b30f Initial import of nsock.c nsock.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
117 * -------------------------------------------------------- */
a89ff602b30f Initial import of nsock.c nsock.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
118
a89ff602b30f Initial import of nsock.c nsock.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
119 static void
a89ff602b30f Initial import of nsock.c nsock.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
120 nsock_set_error(char *buffer, size_t bufsize)
a89ff602b30f Initial import of nsock.c nsock.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
121 {
a89ff602b30f Initial import of nsock.c nsock.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
122 memset(buffer, 0, bufsize);
a89ff602b30f Initial import of nsock.c nsock.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
123
a89ff602b30f Initial import of nsock.c nsock.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
124 #if defined(_WIN32)
a89ff602b30f Initial import of nsock.c nsock.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
125 LPSTR str;
a89ff602b30f Initial import of nsock.c nsock.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
126
a89ff602b30f Initial import of nsock.c nsock.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
127 FormatMessageA(
a89ff602b30f Initial import of nsock.c nsock.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
128 FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM,
a89ff602b30f Initial import of nsock.c nsock.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
129 NULL,
a89ff602b30f Initial import of nsock.c nsock.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
130 WSAGetLastError(),
a89ff602b30f Initial import of nsock.c nsock.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
131 MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT),
a89ff602b30f Initial import of nsock.c nsock.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
132 (LPSTR)&str, 0, NULL);
a89ff602b30f Initial import of nsock.c nsock.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
133
a89ff602b30f Initial import of nsock.c nsock.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
134 if (str) {
a89ff602b30f Initial import of nsock.c nsock.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
135 strncpy(buffer, str, bufsize);
a89ff602b30f Initial import of nsock.c nsock.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
136 LocalFree(str);
a89ff602b30f Initial import of nsock.c nsock.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
137 }
a89ff602b30f Initial import of nsock.c nsock.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
138 #else
a89ff602b30f Initial import of nsock.c nsock.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
139 strncpy(buffer, strerror(errno), bufsize);
a89ff602b30f Initial import of nsock.c nsock.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
140 #endif
a89ff602b30f Initial import of nsock.c nsock.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
141 }
a89ff602b30f Initial import of nsock.c nsock.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
142
a89ff602b30f Initial import of nsock.c nsock.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
143 static void
a89ff602b30f Initial import of nsock.c nsock.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
144 nsock_set_errno(char *buffer, size_t bufsize, int no)
a89ff602b30f Initial import of nsock.c nsock.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
145 {
a89ff602b30f Initial import of nsock.c nsock.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
146 memset(buffer, 0, bufsize);
a89ff602b30f Initial import of nsock.c nsock.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
147 strncpy(buffer, strerror(no), bufsize - 1);
a89ff602b30f Initial import of nsock.c nsock.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
148 }
a89ff602b30f Initial import of nsock.c nsock.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
149
a89ff602b30f Initial import of nsock.c nsock.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
150 static struct nsock_clt *
a89ff602b30f Initial import of nsock.c nsock.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
151 nsock_clt_new(const struct nsock *ns)
a89ff602b30f Initial import of nsock.c nsock.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
152 {
a89ff602b30f Initial import of nsock.c nsock.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
153 struct nsock_clt *clt;
a89ff602b30f Initial import of nsock.c nsock.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
154
a89ff602b30f Initial import of nsock.c nsock.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
155 if ((clt = malloc(sizeof (struct nsock_clt))) == NULL)
a89ff602b30f Initial import of nsock.c nsock.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
156 return NULL;
a89ff602b30f Initial import of nsock.c nsock.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
157
a89ff602b30f Initial import of nsock.c nsock.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
158 clt->sock = ns;
a89ff602b30f Initial import of nsock.c nsock.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
159
a89ff602b30f Initial import of nsock.c nsock.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
160 return clt;
a89ff602b30f Initial import of nsock.c nsock.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
161 }
a89ff602b30f Initial import of nsock.c nsock.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
162
a89ff602b30f Initial import of nsock.c nsock.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
163 /* --------------------------------------------------------
a89ff602b30f Initial import of nsock.c nsock.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
164 * Sockets functions
a89ff602b30f Initial import of nsock.c nsock.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
165 * -------------------------------------------------------- */
a89ff602b30f Initial import of nsock.c nsock.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
166
a89ff602b30f Initial import of nsock.c nsock.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
167 void
a89ff602b30f Initial import of nsock.c nsock.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
168 nsock_init(void)
a89ff602b30f Initial import of nsock.c nsock.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
169 {
a89ff602b30f Initial import of nsock.c nsock.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
170 #if defined(_WIN32)
a89ff602b30f Initial import of nsock.c nsock.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
171 WSADATA wsa;
a89ff602b30f Initial import of nsock.c nsock.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
172 WSAStartup(MAKEWORD(2, 2), &wsa);
a89ff602b30f Initial import of nsock.c nsock.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
173 #endif
a89ff602b30f Initial import of nsock.c nsock.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
174 }
a89ff602b30f Initial import of nsock.c nsock.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
175
a89ff602b30f Initial import of nsock.c nsock.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
176 struct nsock *
a89ff602b30f Initial import of nsock.c nsock.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
177 nsock_create(int domain, int type, int protocol)
a89ff602b30f Initial import of nsock.c nsock.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
178 {
a89ff602b30f Initial import of nsock.c nsock.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
179 struct nsock *ns;
a89ff602b30f Initial import of nsock.c nsock.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
180
a89ff602b30f Initial import of nsock.c nsock.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
181 if ((ns = malloc(sizeof (struct nsock))) == NULL)
a89ff602b30f Initial import of nsock.c nsock.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
182 return NULL;
a89ff602b30f Initial import of nsock.c nsock.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
183
a89ff602b30f Initial import of nsock.c nsock.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
184 ns->fd = socket(domain, type, protocol);
a89ff602b30f Initial import of nsock.c nsock.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
185
a89ff602b30f Initial import of nsock.c nsock.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
186 if (ns->fd == INVALID_SOCKET)
a89ff602b30f Initial import of nsock.c nsock.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
187 nsock_set_error(ns->error, sizeof (ns->error));
a89ff602b30f Initial import of nsock.c nsock.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
188
a89ff602b30f Initial import of nsock.c nsock.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
189 return ns;
a89ff602b30f Initial import of nsock.c nsock.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
190 }
a89ff602b30f Initial import of nsock.c nsock.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
191
a89ff602b30f Initial import of nsock.c nsock.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
192 const char *
a89ff602b30f Initial import of nsock.c nsock.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
193 nsock_error(struct nsock *ns)
a89ff602b30f Initial import of nsock.c nsock.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
194 {
a89ff602b30f Initial import of nsock.c nsock.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
195 if (ns == NULL)
a89ff602b30f Initial import of nsock.c nsock.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
196 return strerror(ENOMEM);
a89ff602b30f Initial import of nsock.c nsock.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
197
a89ff602b30f Initial import of nsock.c nsock.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
198 return ns->error;
a89ff602b30f Initial import of nsock.c nsock.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
199 }
a89ff602b30f Initial import of nsock.c nsock.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
200
a89ff602b30f Initial import of nsock.c nsock.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
201 int
a89ff602b30f Initial import of nsock.c nsock.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
202 nsock_bind(struct nsock *ns, const struct nsock_ep *ep)
a89ff602b30f Initial import of nsock.c nsock.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
203 {
a89ff602b30f Initial import of nsock.c nsock.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
204 int ret;
a89ff602b30f Initial import of nsock.c nsock.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
205
a89ff602b30f Initial import of nsock.c nsock.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
206 ret = bind(ns->fd, (const struct sockaddr *)&ep->addr, ep->addrlen);
a89ff602b30f Initial import of nsock.c nsock.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
207
a89ff602b30f Initial import of nsock.c nsock.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
208 if (ret == SOCKET_ERROR)
a89ff602b30f Initial import of nsock.c nsock.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
209 nsock_set_error(ns->error, sizeof (ns->error));
a89ff602b30f Initial import of nsock.c nsock.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
210
a89ff602b30f Initial import of nsock.c nsock.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
211 return ret == SOCKET_ERROR ? -1 : 0;
a89ff602b30f Initial import of nsock.c nsock.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
212 }
a89ff602b30f Initial import of nsock.c nsock.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
213
a89ff602b30f Initial import of nsock.c nsock.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
214 int
a89ff602b30f Initial import of nsock.c nsock.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
215 nsock_listen(struct nsock *ns, int max)
a89ff602b30f Initial import of nsock.c nsock.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
216 {
a89ff602b30f Initial import of nsock.c nsock.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
217 int ret;
a89ff602b30f Initial import of nsock.c nsock.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
218
a89ff602b30f Initial import of nsock.c nsock.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
219 ret = listen(ns->fd, max);
a89ff602b30f Initial import of nsock.c nsock.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
220
a89ff602b30f Initial import of nsock.c nsock.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
221 if (ret == SOCKET_ERROR)
a89ff602b30f Initial import of nsock.c nsock.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
222 nsock_set_error(ns->error, sizeof (ns->error));
a89ff602b30f Initial import of nsock.c nsock.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
223
a89ff602b30f Initial import of nsock.c nsock.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
224 return ret == SOCKET_ERROR ? -1 : 0;
a89ff602b30f Initial import of nsock.c nsock.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
225 }
a89ff602b30f Initial import of nsock.c nsock.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
226
a89ff602b30f Initial import of nsock.c nsock.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
227 int
a89ff602b30f Initial import of nsock.c nsock.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
228 nsock_accept(struct nsock *ns, struct nsock **client, struct nsock_ep **clientinfo)
a89ff602b30f Initial import of nsock.c nsock.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
229 {
a89ff602b30f Initial import of nsock.c nsock.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
230 struct sockaddr_storage *st = NULL;
a89ff602b30f Initial import of nsock.c nsock.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
231 socklen_t *len = NULL;
a89ff602b30f Initial import of nsock.c nsock.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
232 int ret;
a89ff602b30f Initial import of nsock.c nsock.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
233
a89ff602b30f Initial import of nsock.c nsock.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
234 if ((*client = malloc(sizeof (struct nsock))) == NULL) {
a89ff602b30f Initial import of nsock.c nsock.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
235 nsock_set_errno(ns->error, sizeof (ns->error), ENOMEM);
a89ff602b30f Initial import of nsock.c nsock.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
236 return -1;
a89ff602b30f Initial import of nsock.c nsock.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
237 }
a89ff602b30f Initial import of nsock.c nsock.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
238
a89ff602b30f Initial import of nsock.c nsock.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
239 if (clientinfo != NULL) {
a89ff602b30f Initial import of nsock.c nsock.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
240 if ((*clientinfo = malloc(sizeof (struct nsock_ep))) == NULL) {
a89ff602b30f Initial import of nsock.c nsock.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
241 free(client);
a89ff602b30f Initial import of nsock.c nsock.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
242 nsock_set_errno(ns->error, sizeof (ns->error), ENOMEM);
a89ff602b30f Initial import of nsock.c nsock.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
243 return -1;
a89ff602b30f Initial import of nsock.c nsock.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
244 }
a89ff602b30f Initial import of nsock.c nsock.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
245
a89ff602b30f Initial import of nsock.c nsock.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
246 st = &(*clientinfo)->addr;
a89ff602b30f Initial import of nsock.c nsock.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
247 len = &(*clientinfo)->addrlen;
a89ff602b30f Initial import of nsock.c nsock.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
248
a89ff602b30f Initial import of nsock.c nsock.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
249 /* Set the addrlen to sockaddr_storage first */
a89ff602b30f Initial import of nsock.c nsock.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
250 *len = sizeof (struct sockaddr_storage);
a89ff602b30f Initial import of nsock.c nsock.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
251 }
a89ff602b30f Initial import of nsock.c nsock.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
252
a89ff602b30f Initial import of nsock.c nsock.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
253 /* Prepare client */
a89ff602b30f Initial import of nsock.c nsock.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
254 memset((*client)->error, 0, sizeof ((*client)->error));
a89ff602b30f Initial import of nsock.c nsock.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
255 (*client)->fd = accept(ns->fd, (struct sockaddr *)st, len);
a89ff602b30f Initial import of nsock.c nsock.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
256
a89ff602b30f Initial import of nsock.c nsock.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
257 if ((*client)->fd == INVALID_SOCKET) {
a89ff602b30f Initial import of nsock.c nsock.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
258 nsock_set_error(ns->error, sizeof (ns->error));
a89ff602b30f Initial import of nsock.c nsock.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
259
a89ff602b30f Initial import of nsock.c nsock.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
260 /* free clients and set to NULL so user will not use it */
a89ff602b30f Initial import of nsock.c nsock.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
261 free(*client);
a89ff602b30f Initial import of nsock.c nsock.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
262 *client = NULL;
a89ff602b30f Initial import of nsock.c nsock.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
263
a89ff602b30f Initial import of nsock.c nsock.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
264 if (clientinfo != NULL) {
a89ff602b30f Initial import of nsock.c nsock.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
265 free(*clientinfo);
a89ff602b30f Initial import of nsock.c nsock.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
266 *clientinfo = NULL;
a89ff602b30f Initial import of nsock.c nsock.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
267 }
a89ff602b30f Initial import of nsock.c nsock.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
268
a89ff602b30f Initial import of nsock.c nsock.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
269 ret = -1;
a89ff602b30f Initial import of nsock.c nsock.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
270 } else
a89ff602b30f Initial import of nsock.c nsock.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
271 ret = 0;
a89ff602b30f Initial import of nsock.c nsock.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
272
a89ff602b30f Initial import of nsock.c nsock.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
273 return ret;
a89ff602b30f Initial import of nsock.c nsock.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
274 }
a89ff602b30f Initial import of nsock.c nsock.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
275
a89ff602b30f Initial import of nsock.c nsock.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
276 int
a89ff602b30f Initial import of nsock.c nsock.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
277 nsock_connect(struct nsock *ns, const struct nsock_ep *ep)
a89ff602b30f Initial import of nsock.c nsock.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
278 {
a89ff602b30f Initial import of nsock.c nsock.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
279 int ret;
a89ff602b30f Initial import of nsock.c nsock.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
280
a89ff602b30f Initial import of nsock.c nsock.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
281 ret = connect(ns->fd, (const struct sockaddr *)&ep->addr, ep->addrlen);
a89ff602b30f Initial import of nsock.c nsock.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
282
a89ff602b30f Initial import of nsock.c nsock.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
283 if (ret == SOCKET_ERROR)
a89ff602b30f Initial import of nsock.c nsock.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
284 nsock_set_error(ns->error, sizeof (ns->error));
a89ff602b30f Initial import of nsock.c nsock.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
285
a89ff602b30f Initial import of nsock.c nsock.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
286 return ret == SOCKET_ERROR ? -1 : 0;
a89ff602b30f Initial import of nsock.c nsock.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
287 }
a89ff602b30f Initial import of nsock.c nsock.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
288
a89ff602b30f Initial import of nsock.c nsock.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
289 int
a89ff602b30f Initial import of nsock.c nsock.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
290 nsock_set(struct nsock *ns, int level, int name, const void *arg, unsigned arglen)
a89ff602b30f Initial import of nsock.c nsock.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
291 {
a89ff602b30f Initial import of nsock.c nsock.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
292 int ret;
a89ff602b30f Initial import of nsock.c nsock.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
293
a89ff602b30f Initial import of nsock.c nsock.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
294 ret = setsockopt(ns->fd, level, name, (nsock_carg_t)arg, arglen);
a89ff602b30f Initial import of nsock.c nsock.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
295
a89ff602b30f Initial import of nsock.c nsock.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
296 if (ret == SOCKET_ERROR)
a89ff602b30f Initial import of nsock.c nsock.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
297 nsock_set_error(ns->error, sizeof (ns->error));
a89ff602b30f Initial import of nsock.c nsock.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
298
a89ff602b30f Initial import of nsock.c nsock.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
299 return ret == SOCKET_ERROR ? -1 : 0;
a89ff602b30f Initial import of nsock.c nsock.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
300 }
a89ff602b30f Initial import of nsock.c nsock.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
301
a89ff602b30f Initial import of nsock.c nsock.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
302 long
a89ff602b30f Initial import of nsock.c nsock.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
303 nsock_recv(struct nsock *ns, void *data, size_t datasz, int flags)
a89ff602b30f Initial import of nsock.c nsock.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
304 {
a89ff602b30f Initial import of nsock.c nsock.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
305 long nbread;
a89ff602b30f Initial import of nsock.c nsock.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
306
a89ff602b30f Initial import of nsock.c nsock.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
307 nbread = recv(ns->fd, data, datasz, flags);
a89ff602b30f Initial import of nsock.c nsock.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
308
a89ff602b30f Initial import of nsock.c nsock.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
309 if (nbread == -1)
a89ff602b30f Initial import of nsock.c nsock.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
310 nsock_set_error(ns->error, sizeof (ns->error));
a89ff602b30f Initial import of nsock.c nsock.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
311
a89ff602b30f Initial import of nsock.c nsock.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
312 return nbread;
a89ff602b30f Initial import of nsock.c nsock.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
313 }
a89ff602b30f Initial import of nsock.c nsock.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
314
a89ff602b30f Initial import of nsock.c nsock.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
315 long
a89ff602b30f Initial import of nsock.c nsock.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
316 nsock_recvfrom(struct nsock *ns, struct nsock_ep *ep, void *data, size_t datasz, int flags)
a89ff602b30f Initial import of nsock.c nsock.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
317 {
a89ff602b30f Initial import of nsock.c nsock.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
318 struct sockaddr_storage *st = NULL;
a89ff602b30f Initial import of nsock.c nsock.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
319 socklen_t *len = NULL;
a89ff602b30f Initial import of nsock.c nsock.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
320 long nbread;
a89ff602b30f Initial import of nsock.c nsock.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
321
a89ff602b30f Initial import of nsock.c nsock.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
322 if (ep != NULL) {
a89ff602b30f Initial import of nsock.c nsock.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
323 st = &ep->addr;
a89ff602b30f Initial import of nsock.c nsock.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
324 len = &ep->addrlen;
a89ff602b30f Initial import of nsock.c nsock.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
325
a89ff602b30f Initial import of nsock.c nsock.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
326 /* Set the addrlen to sockaddr_storage first */
a89ff602b30f Initial import of nsock.c nsock.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
327 *len = sizeof (struct sockaddr_storage);
a89ff602b30f Initial import of nsock.c nsock.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
328 }
a89ff602b30f Initial import of nsock.c nsock.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
329
a89ff602b30f Initial import of nsock.c nsock.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
330 nbread = recvfrom(ns->fd, data, datasz, flags,
a89ff602b30f Initial import of nsock.c nsock.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
331 (struct sockaddr *)st, len);
a89ff602b30f Initial import of nsock.c nsock.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
332
a89ff602b30f Initial import of nsock.c nsock.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
333 if (nbread == SOCKET_ERROR)
a89ff602b30f Initial import of nsock.c nsock.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
334 nsock_set_error(ns->error, sizeof (ns->error));
a89ff602b30f Initial import of nsock.c nsock.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
335
a89ff602b30f Initial import of nsock.c nsock.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
336 return nbread;
a89ff602b30f Initial import of nsock.c nsock.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
337 }
a89ff602b30f Initial import of nsock.c nsock.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
338
a89ff602b30f Initial import of nsock.c nsock.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
339 long
a89ff602b30f Initial import of nsock.c nsock.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
340 nsock_send(struct nsock *ns, const void *data, size_t datasz, int flags)
a89ff602b30f Initial import of nsock.c nsock.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
341 {
a89ff602b30f Initial import of nsock.c nsock.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
342 long nbsent;
a89ff602b30f Initial import of nsock.c nsock.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
343
a89ff602b30f Initial import of nsock.c nsock.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
344 nbsent = send(ns->fd, data, datasz, flags);
a89ff602b30f Initial import of nsock.c nsock.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
345
a89ff602b30f Initial import of nsock.c nsock.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
346 if (nbsent == -1)
a89ff602b30f Initial import of nsock.c nsock.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
347 nsock_set_error(ns->error, sizeof (ns->error));
a89ff602b30f Initial import of nsock.c nsock.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
348
a89ff602b30f Initial import of nsock.c nsock.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
349 return nbsent;
a89ff602b30f Initial import of nsock.c nsock.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
350 }
a89ff602b30f Initial import of nsock.c nsock.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
351
a89ff602b30f Initial import of nsock.c nsock.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
352 long
a89ff602b30f Initial import of nsock.c nsock.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
353 nsock_sendto(struct nsock *ns, const struct nsock_ep *ep, const void *data, size_t datasz, int flags)
a89ff602b30f Initial import of nsock.c nsock.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
354 {
a89ff602b30f Initial import of nsock.c nsock.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
355 long nbsent;
a89ff602b30f Initial import of nsock.c nsock.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
356
a89ff602b30f Initial import of nsock.c nsock.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
357 nbsent = sendto(ns->fd, data, datasz, flags,
a89ff602b30f Initial import of nsock.c nsock.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
358 (const struct sockaddr *)&ep->addr, ep->addrlen);
a89ff602b30f Initial import of nsock.c nsock.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
359
a89ff602b30f Initial import of nsock.c nsock.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
360 if (nbsent == SOCKET_ERROR)
a89ff602b30f Initial import of nsock.c nsock.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
361 nsock_set_error(ns->error, sizeof (ns->error));
a89ff602b30f Initial import of nsock.c nsock.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
362
a89ff602b30f Initial import of nsock.c nsock.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
363 return nbsent;
a89ff602b30f Initial import of nsock.c nsock.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
364 }
a89ff602b30f Initial import of nsock.c nsock.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
365
a89ff602b30f Initial import of nsock.c nsock.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
366 void
a89ff602b30f Initial import of nsock.c nsock.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
367 nsock_close(struct nsock *ns)
a89ff602b30f Initial import of nsock.c nsock.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
368 {
a89ff602b30f Initial import of nsock.c nsock.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
369 closesocket(ns->fd);
a89ff602b30f Initial import of nsock.c nsock.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
370 }
a89ff602b30f Initial import of nsock.c nsock.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
371
a89ff602b30f Initial import of nsock.c nsock.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
372 void
a89ff602b30f Initial import of nsock.c nsock.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
373 nsock_free(struct nsock *ns)
a89ff602b30f Initial import of nsock.c nsock.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
374 {
a89ff602b30f Initial import of nsock.c nsock.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
375 free(ns);
a89ff602b30f Initial import of nsock.c nsock.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
376 }
a89ff602b30f Initial import of nsock.c nsock.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
377
a89ff602b30f Initial import of nsock.c nsock.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
378 void
a89ff602b30f Initial import of nsock.c nsock.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
379 nsock_finish(void)
a89ff602b30f Initial import of nsock.c nsock.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
380 {
a89ff602b30f Initial import of nsock.c nsock.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
381 #if defined(_WIN32)
a89ff602b30f Initial import of nsock.c nsock.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
382 WSACleanup();
a89ff602b30f Initial import of nsock.c nsock.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
383 #endif
a89ff602b30f Initial import of nsock.c nsock.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
384 }
a89ff602b30f Initial import of nsock.c nsock.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
385
a89ff602b30f Initial import of nsock.c nsock.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
386 /* --------------------------------------------------------
a89ff602b30f Initial import of nsock.c nsock.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
387 * End point functions
a89ff602b30f Initial import of nsock.c nsock.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
388 * -------------------------------------------------------- */
a89ff602b30f Initial import of nsock.c nsock.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
389
a89ff602b30f Initial import of nsock.c nsock.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
390 struct nsock_ep *
a89ff602b30f Initial import of nsock.c nsock.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
391 nsock_ep_create(void)
a89ff602b30f Initial import of nsock.c nsock.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
392 {
a89ff602b30f Initial import of nsock.c nsock.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
393 struct nsock_ep *ep;
a89ff602b30f Initial import of nsock.c nsock.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
394
a89ff602b30f Initial import of nsock.c nsock.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
395 if ((ep = calloc(1, sizeof (struct nsock_ep))) == NULL)
a89ff602b30f Initial import of nsock.c nsock.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
396 return NULL;
a89ff602b30f Initial import of nsock.c nsock.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
397
a89ff602b30f Initial import of nsock.c nsock.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
398 return ep;
a89ff602b30f Initial import of nsock.c nsock.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
399 }
a89ff602b30f Initial import of nsock.c nsock.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
400
a89ff602b30f Initial import of nsock.c nsock.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
401 const char *
a89ff602b30f Initial import of nsock.c nsock.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
402 nsock_ep_error(struct nsock_ep *ep)
a89ff602b30f Initial import of nsock.c nsock.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
403 {
a89ff602b30f Initial import of nsock.c nsock.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
404 if (ep == NULL)
a89ff602b30f Initial import of nsock.c nsock.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
405 return strerror(ENOMEM);
a89ff602b30f Initial import of nsock.c nsock.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
406
a89ff602b30f Initial import of nsock.c nsock.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
407 return ep->error;
a89ff602b30f Initial import of nsock.c nsock.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
408 }
a89ff602b30f Initial import of nsock.c nsock.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
409
a89ff602b30f Initial import of nsock.c nsock.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
410 int
a89ff602b30f Initial import of nsock.c nsock.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
411 nsock_ep_bind_ip(struct nsock_ep *ep, const char *iface, unsigned port, int family)
a89ff602b30f Initial import of nsock.c nsock.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
412 {
a89ff602b30f Initial import of nsock.c nsock.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
413 if (family == AF_INET6) {
a89ff602b30f Initial import of nsock.c nsock.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
414 struct sockaddr_in6 *ptr = (struct sockaddr_in6 *)&ep->addr;
a89ff602b30f Initial import of nsock.c nsock.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
415
a89ff602b30f Initial import of nsock.c nsock.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
416 memset(ptr, 0, sizeof (struct sockaddr_in6));
a89ff602b30f Initial import of nsock.c nsock.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
417 ptr->sin6_family = AF_INET6;
a89ff602b30f Initial import of nsock.c nsock.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
418 ptr->sin6_port = htons(port);
a89ff602b30f Initial import of nsock.c nsock.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
419
a89ff602b30f Initial import of nsock.c nsock.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
420 if (iface == NULL || strcmp(iface, "*") == 0)
a89ff602b30f Initial import of nsock.c nsock.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
421 ptr->sin6_addr = in6addr_any;
a89ff602b30f Initial import of nsock.c nsock.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
422 else if (inet_pton(AF_INET6, iface, &ptr->sin6_addr) <= 0) {
a89ff602b30f Initial import of nsock.c nsock.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
423 nsock_set_error(ep->error, sizeof (ep->error));
a89ff602b30f Initial import of nsock.c nsock.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
424 return -1;
a89ff602b30f Initial import of nsock.c nsock.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
425 }
a89ff602b30f Initial import of nsock.c nsock.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
426
a89ff602b30f Initial import of nsock.c nsock.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
427 ep->addrlen = sizeof (struct sockaddr_in6);
a89ff602b30f Initial import of nsock.c nsock.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
428 } else {
a89ff602b30f Initial import of nsock.c nsock.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
429 struct sockaddr_in *ptr = (struct sockaddr_in *)&ep->addr;
a89ff602b30f Initial import of nsock.c nsock.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
430
a89ff602b30f Initial import of nsock.c nsock.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
431 memset(ptr, 0, sizeof (struct sockaddr_in));
a89ff602b30f Initial import of nsock.c nsock.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
432 ptr->sin_family = AF_INET;
a89ff602b30f Initial import of nsock.c nsock.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
433 ptr->sin_port = htons(port);
a89ff602b30f Initial import of nsock.c nsock.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
434
a89ff602b30f Initial import of nsock.c nsock.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
435 if (iface == NULL || strcmp(iface, "*") == 0)
a89ff602b30f Initial import of nsock.c nsock.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
436 ptr->sin_addr.s_addr = INADDR_ANY;
a89ff602b30f Initial import of nsock.c nsock.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
437 else if (inet_pton(AF_INET, iface, &ptr->sin_addr) <= 0) {
a89ff602b30f Initial import of nsock.c nsock.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
438 nsock_set_error(ep->error, sizeof (ep->error));
a89ff602b30f Initial import of nsock.c nsock.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
439 return -1;
a89ff602b30f Initial import of nsock.c nsock.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
440 }
a89ff602b30f Initial import of nsock.c nsock.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
441
a89ff602b30f Initial import of nsock.c nsock.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
442 ep->addrlen = sizeof (struct sockaddr_in);
a89ff602b30f Initial import of nsock.c nsock.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
443 }
a89ff602b30f Initial import of nsock.c nsock.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
444
a89ff602b30f Initial import of nsock.c nsock.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
445 return 0;
a89ff602b30f Initial import of nsock.c nsock.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
446 }
a89ff602b30f Initial import of nsock.c nsock.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
447
a89ff602b30f Initial import of nsock.c nsock.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
448 int
a89ff602b30f Initial import of nsock.c nsock.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
449 nsock_ep_connect_ip(struct nsock_ep *ep, const char *host, unsigned port, int family)
a89ff602b30f Initial import of nsock.c nsock.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
450 {
a89ff602b30f Initial import of nsock.c nsock.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
451 struct addrinfo hints, *res;
a89ff602b30f Initial import of nsock.c nsock.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
452 char portstr[32];
a89ff602b30f Initial import of nsock.c nsock.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
453 int error;
a89ff602b30f Initial import of nsock.c nsock.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
454
a89ff602b30f Initial import of nsock.c nsock.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
455 memset(&hints, 0, sizeof (hints));
a89ff602b30f Initial import of nsock.c nsock.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
456 hints.ai_family = family;
a89ff602b30f Initial import of nsock.c nsock.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
457 hints.ai_socktype = SOCK_STREAM;
a89ff602b30f Initial import of nsock.c nsock.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
458
a89ff602b30f Initial import of nsock.c nsock.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
459 memset(portstr, 0, sizeof (portstr));
a89ff602b30f Initial import of nsock.c nsock.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
460 sprintf(portstr, "%u", port);
a89ff602b30f Initial import of nsock.c nsock.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
461
a89ff602b30f Initial import of nsock.c nsock.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
462 error = getaddrinfo(host, portstr, &hints, &res);
a89ff602b30f Initial import of nsock.c nsock.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
463 if (error) {
a89ff602b30f Initial import of nsock.c nsock.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
464 memset(ep->error, 0, sizeof (ep->error));
a89ff602b30f Initial import of nsock.c nsock.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
465 strncpy(ep->error, gai_strerrorA(error), sizeof (ep->error) - 1);
a89ff602b30f Initial import of nsock.c nsock.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
466 return -1;
a89ff602b30f Initial import of nsock.c nsock.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
467 }
a89ff602b30f Initial import of nsock.c nsock.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
468
a89ff602b30f Initial import of nsock.c nsock.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
469 memcpy(&ep->addr, res->ai_addr, res->ai_addrlen);
a89ff602b30f Initial import of nsock.c nsock.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
470 ep->addrlen = res->ai_addrlen;
a89ff602b30f Initial import of nsock.c nsock.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
471
a89ff602b30f Initial import of nsock.c nsock.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
472 freeaddrinfo(res);
a89ff602b30f Initial import of nsock.c nsock.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
473
a89ff602b30f Initial import of nsock.c nsock.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
474 return 0;
a89ff602b30f Initial import of nsock.c nsock.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
475 }
a89ff602b30f Initial import of nsock.c nsock.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
476
a89ff602b30f Initial import of nsock.c nsock.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
477 #if !defined(_WIN32)
a89ff602b30f Initial import of nsock.c nsock.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
478
a89ff602b30f Initial import of nsock.c nsock.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
479 void
a89ff602b30f Initial import of nsock.c nsock.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
480 nsock_ep_unix(struct nsock_ep *ep, const char *path)
a89ff602b30f Initial import of nsock.c nsock.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
481 {
a89ff602b30f Initial import of nsock.c nsock.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
482 struct sockaddr_un *ptr= (struct sockaddr_un *)&ep->addr;
a89ff602b30f Initial import of nsock.c nsock.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
483
a89ff602b30f Initial import of nsock.c nsock.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
484 /* Path */
a89ff602b30f Initial import of nsock.c nsock.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
485 memset(ptr, 0, sizeof (struct sockaddr_un));
a89ff602b30f Initial import of nsock.c nsock.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
486 strncpy(ptr->sun_path, path, sizeof (ptr->sun_path) - 1);
a89ff602b30f Initial import of nsock.c nsock.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
487 ptr->sun_family = AF_UNIX;
a89ff602b30f Initial import of nsock.c nsock.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
488
a89ff602b30f Initial import of nsock.c nsock.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
489 /* Len is computed with SUN_LEN */
a89ff602b30f Initial import of nsock.c nsock.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
490 ep->addrlen = SUN_LEN(ptr);
a89ff602b30f Initial import of nsock.c nsock.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
491 }
a89ff602b30f Initial import of nsock.c nsock.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
492
a89ff602b30f Initial import of nsock.c nsock.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
493 #endif
a89ff602b30f Initial import of nsock.c nsock.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
494
a89ff602b30f Initial import of nsock.c nsock.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
495 struct sockaddr *
a89ff602b30f Initial import of nsock.c nsock.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
496 nsock_ep_getaddr(struct nsock_ep *ep)
a89ff602b30f Initial import of nsock.c nsock.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
497 {
a89ff602b30f Initial import of nsock.c nsock.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
498 return (struct sockaddr *)&ep->addr;
a89ff602b30f Initial import of nsock.c nsock.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
499 }
a89ff602b30f Initial import of nsock.c nsock.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
500
a89ff602b30f Initial import of nsock.c nsock.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
501 socklen_t
a89ff602b30f Initial import of nsock.c nsock.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
502 nsock_ep_getaddrlen(const struct nsock_ep *ep)
a89ff602b30f Initial import of nsock.c nsock.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
503 {
a89ff602b30f Initial import of nsock.c nsock.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
504 return ep->addrlen;
a89ff602b30f Initial import of nsock.c nsock.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
505 }
a89ff602b30f Initial import of nsock.c nsock.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
506
a89ff602b30f Initial import of nsock.c nsock.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
507 void
a89ff602b30f Initial import of nsock.c nsock.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
508 nsock_ep_free(struct nsock_ep *ep)
a89ff602b30f Initial import of nsock.c nsock.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
509 {
a89ff602b30f Initial import of nsock.c nsock.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
510 free(ep);
a89ff602b30f Initial import of nsock.c nsock.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
511 }
a89ff602b30f Initial import of nsock.c nsock.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
512
a89ff602b30f Initial import of nsock.c nsock.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
513 /* --------------------------------------------------------
a89ff602b30f Initial import of nsock.c nsock.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
514 * listener functions
a89ff602b30f Initial import of nsock.c nsock.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
515 * -------------------------------------------------------- */
a89ff602b30f Initial import of nsock.c nsock.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
516
a89ff602b30f Initial import of nsock.c nsock.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
517 struct nsock_listener *
a89ff602b30f Initial import of nsock.c nsock.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
518 nsock_lst_create(const struct nsock *ns)
a89ff602b30f Initial import of nsock.c nsock.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
519 {
a89ff602b30f Initial import of nsock.c nsock.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
520 struct nsock_listener *ls;
a89ff602b30f Initial import of nsock.c nsock.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
521
a89ff602b30f Initial import of nsock.c nsock.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
522 if ((ls = malloc(sizeof (struct nsock_listener))) == NULL)
a89ff602b30f Initial import of nsock.c nsock.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
523 return NULL;
a89ff602b30f Initial import of nsock.c nsock.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
524
a89ff602b30f Initial import of nsock.c nsock.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
525 ls->sock = ns;
a89ff602b30f Initial import of nsock.c nsock.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
526 TAILQ_INIT(&ls->head);
a89ff602b30f Initial import of nsock.c nsock.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
527
a89ff602b30f Initial import of nsock.c nsock.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
528 return ls;
a89ff602b30f Initial import of nsock.c nsock.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
529 }
a89ff602b30f Initial import of nsock.c nsock.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
530
a89ff602b30f Initial import of nsock.c nsock.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
531 const char *
a89ff602b30f Initial import of nsock.c nsock.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
532 nsock_lst_error(struct nsock_listener *ls)
a89ff602b30f Initial import of nsock.c nsock.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
533 {
a89ff602b30f Initial import of nsock.c nsock.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
534 if (ls == NULL)
a89ff602b30f Initial import of nsock.c nsock.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
535 return strerror(ENOMEM);
a89ff602b30f Initial import of nsock.c nsock.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
536
a89ff602b30f Initial import of nsock.c nsock.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
537 return ls->error;
a89ff602b30f Initial import of nsock.c nsock.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
538 }
a89ff602b30f Initial import of nsock.c nsock.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
539
a89ff602b30f Initial import of nsock.c nsock.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
540 int
a89ff602b30f Initial import of nsock.c nsock.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
541 nsock_lst_push(struct nsock_listener *ls, struct nsock *ns)
a89ff602b30f Initial import of nsock.c nsock.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
542 {
a89ff602b30f Initial import of nsock.c nsock.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
543 struct nsock_clt *clt;
a89ff602b30f Initial import of nsock.c nsock.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
544
a89ff602b30f Initial import of nsock.c nsock.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
545 if ((clt = nsock_clt_new(ns)) == NULL)
a89ff602b30f Initial import of nsock.c nsock.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
546 return -1;
a89ff602b30f Initial import of nsock.c nsock.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
547
a89ff602b30f Initial import of nsock.c nsock.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
548 TAILQ_INSERT_HEAD(&ls->head, clt, link);
a89ff602b30f Initial import of nsock.c nsock.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
549
a89ff602b30f Initial import of nsock.c nsock.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
550 return 0;
a89ff602b30f Initial import of nsock.c nsock.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
551 }
a89ff602b30f Initial import of nsock.c nsock.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
552
a89ff602b30f Initial import of nsock.c nsock.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
553 int
a89ff602b30f Initial import of nsock.c nsock.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
554 nsock_lst_append(struct nsock_listener *ls, struct nsock *ns)
a89ff602b30f Initial import of nsock.c nsock.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
555 {
a89ff602b30f Initial import of nsock.c nsock.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
556 struct nsock_clt *clt;
a89ff602b30f Initial import of nsock.c nsock.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
557
a89ff602b30f Initial import of nsock.c nsock.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
558 if ((clt = nsock_clt_new(ns)) == NULL)
a89ff602b30f Initial import of nsock.c nsock.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
559 return -1;
a89ff602b30f Initial import of nsock.c nsock.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
560
a89ff602b30f Initial import of nsock.c nsock.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
561 TAILQ_INSERT_TAIL(&ls->head, clt, link);
a89ff602b30f Initial import of nsock.c nsock.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
562
a89ff602b30f Initial import of nsock.c nsock.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
563 return 0;
a89ff602b30f Initial import of nsock.c nsock.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
564 }
a89ff602b30f Initial import of nsock.c nsock.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
565
a89ff602b30f Initial import of nsock.c nsock.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
566 size_t
a89ff602b30f Initial import of nsock.c nsock.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
567 nsock_lst_count(const struct nsock_listener *ls)
a89ff602b30f Initial import of nsock.c nsock.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
568 {
a89ff602b30f Initial import of nsock.c nsock.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
569 return ls->head.noclients;
a89ff602b30f Initial import of nsock.c nsock.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
570 }
a89ff602b30f Initial import of nsock.c nsock.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
571
a89ff602b30f Initial import of nsock.c nsock.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
572 void
a89ff602b30f Initial import of nsock.c nsock.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
573 nsock_lst_remove(struct nsock_listener *ls, const struct nsock *ns)
a89ff602b30f Initial import of nsock.c nsock.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
574 {
a89ff602b30f Initial import of nsock.c nsock.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
575 struct nsock_clt *clt, *tmp;
a89ff602b30f Initial import of nsock.c nsock.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
576
a89ff602b30f Initial import of nsock.c nsock.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
577 TAILQ_FOREACH_SAFE(clt, &ls->head, link, tmp) {
a89ff602b30f Initial import of nsock.c nsock.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
578 if (clt->sock == ns) {
a89ff602b30f Initial import of nsock.c nsock.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
579 TAILQ_REMOVE(&ls->head, clt, link);
a89ff602b30f Initial import of nsock.c nsock.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
580 free(clt);
a89ff602b30f Initial import of nsock.c nsock.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
581 break;
a89ff602b30f Initial import of nsock.c nsock.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
582 }
a89ff602b30f Initial import of nsock.c nsock.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
583 }
a89ff602b30f Initial import of nsock.c nsock.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
584 }
a89ff602b30f Initial import of nsock.c nsock.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
585
a89ff602b30f Initial import of nsock.c nsock.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
586 struct nsock *
a89ff602b30f Initial import of nsock.c nsock.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
587 nsock_lst_select(struct nsock_listener *ls, long sec, long usec)
a89ff602b30f Initial import of nsock.c nsock.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
588 {
a89ff602b30f Initial import of nsock.c nsock.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
589 fd_set fds;
a89ff602b30f Initial import of nsock.c nsock.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
590 struct timeval maxwait, *towait;
a89ff602b30f Initial import of nsock.c nsock.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
591 int error;
a89ff602b30f Initial import of nsock.c nsock.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
592 int fdmax;
a89ff602b30f Initial import of nsock.c nsock.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
593 struct nsock_clt *clt;
a89ff602b30f Initial import of nsock.c nsock.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
594
a89ff602b30f Initial import of nsock.c nsock.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
595 fdmax = TAILQ_FIRST(&ls->head)->sock->fd;
a89ff602b30f Initial import of nsock.c nsock.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
596
a89ff602b30f Initial import of nsock.c nsock.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
597 FD_ZERO(&fds);
a89ff602b30f Initial import of nsock.c nsock.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
598 TAILQ_FOREACH(clt, &ls->head, link) {
a89ff602b30f Initial import of nsock.c nsock.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
599 FD_SET(clt->sock->fd, &fds);
a89ff602b30f Initial import of nsock.c nsock.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
600 if ((int)clt->sock->fd > fdmax)
a89ff602b30f Initial import of nsock.c nsock.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
601 fdmax = clt->sock->fd;
a89ff602b30f Initial import of nsock.c nsock.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
602 }
a89ff602b30f Initial import of nsock.c nsock.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
603
a89ff602b30f Initial import of nsock.c nsock.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
604 maxwait.tv_sec = sec;
a89ff602b30f Initial import of nsock.c nsock.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
605 maxwait.tv_usec = usec;
a89ff602b30f Initial import of nsock.c nsock.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
606
a89ff602b30f Initial import of nsock.c nsock.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
607 // Set to NULL for infinite timeout.
a89ff602b30f Initial import of nsock.c nsock.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
608 towait = (sec == 0 && usec == 0) ? NULL : &maxwait;
a89ff602b30f Initial import of nsock.c nsock.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
609 error = select(fdmax + 1, &fds, NULL, NULL, towait);
a89ff602b30f Initial import of nsock.c nsock.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
610
a89ff602b30f Initial import of nsock.c nsock.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
611 TAILQ_FOREACH(clt, &ls->head, link)
a89ff602b30f Initial import of nsock.c nsock.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
612 if (FD_ISSET(clt->sock->fd, &fds))
a89ff602b30f Initial import of nsock.c nsock.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
613 return (struct nsock *)clt->sock;
a89ff602b30f Initial import of nsock.c nsock.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
614
a89ff602b30f Initial import of nsock.c nsock.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
615 return NULL;
a89ff602b30f Initial import of nsock.c nsock.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
616 }
a89ff602b30f Initial import of nsock.c nsock.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
617
a89ff602b30f Initial import of nsock.c nsock.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
618 void
a89ff602b30f Initial import of nsock.c nsock.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
619 nsock_lst_free(struct nsock_listener *ls)
a89ff602b30f Initial import of nsock.c nsock.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
620 {
a89ff602b30f Initial import of nsock.c nsock.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
621 struct nsock_clt *clt, *tmp;
a89ff602b30f Initial import of nsock.c nsock.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
622
a89ff602b30f Initial import of nsock.c nsock.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
623 TAILQ_FOREACH_SAFE(clt, &ls->head, link, tmp)
a89ff602b30f Initial import of nsock.c nsock.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
624 free(clt);
a89ff602b30f Initial import of nsock.c nsock.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
625
a89ff602b30f Initial import of nsock.c nsock.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
626 free(ls);
a89ff602b30f Initial import of nsock.c nsock.h
David Demelier <markand@malikania.fr>
parents:
diff changeset
627 }