nxt_conn_accept.c (150:09a7b87c743a) nxt_conn_accept.c (312:c156aea91063)
1
2/*
3 * Copyright (C) Igor Sysoev
4 * Copyright (C) NGINX, Inc.
5 */
6
7#include <nxt_main.h>
8

--- 103 unchanged lines hidden (view full) ---

112 goto fail;
113 }
114
115 c->remote = remote;
116
117 sa = ls->sockaddr;
118 remote->type = sa->type;
119 /*
1
2/*
3 * Copyright (C) Igor Sysoev
4 * Copyright (C) NGINX, Inc.
5 */
6
7#include <nxt_main.h>
8

--- 103 unchanged lines hidden (view full) ---

112 goto fail;
113 }
114
115 c->remote = remote;
116
117 sa = ls->sockaddr;
118 remote->type = sa->type;
119 /*
120 * Set address family for unspecified Unix domain,
121 * because these sockaddr's are not be passed to accept().
120 * Set address family for unspecified Unix domain socket,
121 * because these sockaddr's are not updated by old BSD systems,
122 * see comment in nxt_conn_io_accept().
122 */
123 remote->u.sockaddr.sa_family = sa->u.sockaddr.sa_family;
124
125 return c;
126 }
127
128 fail:
129

--- 14 unchanged lines hidden (view full) ---

144
145 lev->accept(task, lev, data);
146}
147
148
149void
150nxt_conn_io_accept(nxt_task_t *task, void *obj, void *data)
151{
123 */
124 remote->u.sockaddr.sa_family = sa->u.sockaddr.sa_family;
125
126 return c;
127 }
128
129 fail:
130

--- 14 unchanged lines hidden (view full) ---

145
146 lev->accept(task, lev, data);
147}
148
149
150void
151nxt_conn_io_accept(nxt_task_t *task, void *obj, void *data)
152{
152 socklen_t len;
153 socklen_t socklen;
153 nxt_conn_t *c;
154 nxt_socket_t s;
155 struct sockaddr *sa;
156 nxt_listen_event_t *lev;
157
158 lev = obj;
159 c = lev->next;
160
161 lev->ready--;
162 lev->socket.read_ready = (lev->ready != 0);
163
154 nxt_conn_t *c;
155 nxt_socket_t s;
156 struct sockaddr *sa;
157 nxt_listen_event_t *lev;
158
159 lev = obj;
160 c = lev->next;
161
162 lev->ready--;
163 lev->socket.read_ready = (lev->ready != 0);
164
164 len = c->remote->socklen;
165 sa = &c->remote->u.sockaddr;
166 socklen = c->remote->socklen;
167 /*
168 * The returned socklen is ignored here, because sockaddr_in and
169 * sockaddr_in6 socklens are not changed. As to unspecified sockaddr_un
170 * it is 3 byte length and already prepared, because old BSDs return zero
171 * socklen and do not update the sockaddr_un at all; Linux returns 2 byte
172 * socklen and updates only the sa_family part; other systems copy 3 bytes
173 * and truncate surplus zero part. Only bound sockaddr_un will be really
174 * truncated here.
175 */
176 s = accept(lev->socket.fd, sa, &socklen);
165
177
166 if (len >= sizeof(struct sockaddr)) {
167 sa = &c->remote->u.sockaddr;
168
169 } else {
170 sa = NULL;
171 len = 0;
172 }
173
174 s = accept(lev->socket.fd, sa, &len);
175
176 if (s == -1) {
177 nxt_conn_accept_error(task, lev, "accept", nxt_socket_errno);
178 return;
179 }
180
181 c->socket.fd = s;
182
183#if (NXT_LINUX)

--- 193 unchanged lines hidden ---
178 if (s == -1) {
179 nxt_conn_accept_error(task, lev, "accept", nxt_socket_errno);
180 return;
181 }
182
183 c->socket.fd = s;
184
185#if (NXT_LINUX)

--- 193 unchanged lines hidden ---