MCPcopy Create free account
hub / github.com/acl-dev/acl / sane_socketpair

Function sane_socketpair

lib_fiber/c/src/common/socketpair.c:156–229  ·  view source on GitHub ↗

Source from the content-addressed store, hash-verified

154#endif /* HAS_POLL */
155
156int sane_socketpair(int domain, int type, int protocol, socket_t result[2])
157{
158 socket_t listener = inet_listen("127.0.0.1", 0, 10), client;
159 struct sockaddr_in addr;
160 struct sockaddr *sa = (struct sockaddr*) &addr;
161 socklen_t len = sizeof(addr);
162
163 if (listener == INVALID_SOCKET) {
164 return -1;
165 }
166
167 result[0] = INVALID_SOCKET;
168 result[1] = INVALID_SOCKET;
169
170 if (listener == INVALID_SOCKET) {
171 msg_error("%s(%d), %s: listen error %s",
172 __FILE__, __LINE__, __FUNCTION__, last_serror());
173 return -1;
174 }
175
176 tcp_nodelay(listener, 1);
177 if (getsockname(listener, sa, &len) < 0) {
178 msg_error("%s(%d), %s: getoskname error %s",
179 __FILE__, __LINE__, __FUNCTION__, last_serror());
180 CLOSE_SOCKET(listener);
181 return -1;
182 }
183
184 client = socket(AF_INET, SOCK_STREAM, 0);
185 if (client == INVALID_SOCKET) {
186 msg_error("%s(%d), %s: create socket %s error %s",
187 __FILE__, __LINE__, __FUNCTION__, addr, last_serror());
188 CLOSE_SOCKET(listener);
189 return -1;
190 }
191
192 non_blocking(client, NON_BLOCKING);
193
194 if (!var_hook_sys_api) {
195 if (connect(client, sa, len) == -1) {
196 int err = acl_fiber_last_error();
197 if (err != FIBER_EINPROGRESS && !error_again(err)) {
198 msg_error("%s(%d), %s: connect error %s",
199 __FILE__, __LINE__, __FUNCTION__, last_serror());
200 CLOSE_SOCKET(listener);
201 CLOSE_SOCKET(client);
202 return -1;
203 }
204 }
205 } else if ((*sys_connect)(client, sa, len) == -1) {
206 int err = acl_fiber_last_error();
207 if (err != FIBER_EINPROGRESS && !error_again(err)) {
208 msg_error("%s(%d), %s: connect error %s",
209 __FILE__, __LINE__, __FUNCTION__, last_serror());
210 CLOSE_SOCKET(listener);
211 CLOSE_SOCKET(client);
212 return -1;
213 }

Callers 2

fbase_event_openFunction · 0.85
mbox_createFunction · 0.85

Calls 12

inet_listenFunction · 0.85
tcp_nodelayFunction · 0.85
non_blockingFunction · 0.85
acl_fiber_last_errorFunction · 0.85
msg_warnFunction · 0.85
msg_errorFunction · 0.70
last_serrorFunction · 0.70
checkFunction · 0.70
socketFunction · 0.50
connectFunction · 0.50
socketpairFunction · 0.50
sleepFunction · 0.50

Tested by

no test coverage detected

Used in the wild real call sites across dependent graphs

searching dependent graphs…