Mercurial > code
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 |
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 } |