(sock &&
error< 0) {
365errbuf,
sizeof(errbuf));
366 if(strerr && *strerr)
367 returnERR_STRDUP(strerr);
370 returns_StrErrorInternal(
error);
384rv = FormatMessage(FORMAT_MESSAGE_ALLOCATE_BUFFER |
385FORMAT_MESSAGE_FROM_SYSTEM |
386FORMAT_MESSAGE_MAX_WIDTH_MASK |
387FORMAT_MESSAGE_IGNORE_INSERTS,
389MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT),
392LocalFree((HLOCAL)
str);
420 #if defined(_DEBUG) && !defined(NDEBUG) 421 # if !defined(__GNUC__) && !defined(offsetof) 422 # define offsetof(T, F) ((size_t)((char*) &(((T*) 0)->F) - (char*) 0)) 426 #if defined(_DEBUG) && !defined(NDEBUG) 427 # define SOCK_HAVE_SHOWDATALAYOUT 1 430 #ifdef SOCK_HAVE_SHOWDATALAYOUT 432 # define extentof(T, F) (sizeof(((T*) 0)->F)) 434 # define infof(T, F) (unsigned int) offsetof(T, F), \ 435 (unsigned int) extentof(T, F) 439 static const charkLayoutFormat[] = {
440 "SOCK data layout:\n" 441 " Sizeof(TRIGGER_struct) = %u\n" 442 " Sizeof(LSOCK_struct) = %u\n" 443 " Sizeof(SOCK_struct) = %u, offsets (sizes) follow\n" 446 "\tisset: %3u (%u)\n" 447 "\thost_: %3u (%u)\n" 449 "\tmyport: %3u (%u)\n" 452 # ifdef NCBI_OS_MSWIN 453 "\tevent: %3u (%u)\n" 455 "\tsslctx: %3u (%u)\n" 463 "\tr_buf: %3u (%u)\n" 464 "\tw_buf: %3u (%u)\n" 465 "\tr_len: %3u (%u)\n" 466 "\tw_len: %3u (%u)\n" 467 "\tn_read: %3u (%u)\n" 468 "\tn_written: %3u (%u)\n" 475 # ifdef NCBI_OS_MSWIN 476 # define SOCK_SHOWDATALAYOUT_PARAMS \ 477 infof(SOCK_struct, sock), \ 478 infof(SOCK_struct, id), \ 479 infof(TRIGGER_struct, isset), \ 480 infof(SOCK_struct, host_), \ 481 infof(SOCK_struct, port), \ 482 infof(SOCK_struct, myport), \ 483 infof(SOCK_struct, err), \ 484 infof(SOCK_struct, event), \ 485 infof(SOCK_struct, sslctx), \ 486 infof(SOCK_struct, addr), \ 487 infof(SOCK_struct, r_tv), \ 488 infof(SOCK_struct, w_tv), \ 489 infof(SOCK_struct, c_tv), \ 490 infof(SOCK_struct, r_to), \ 491 infof(SOCK_struct, w_to), \ 492 infof(SOCK_struct, c_to), \ 493 infof(SOCK_struct, r_buf), \ 494 infof(SOCK_struct, w_buf), \ 495 infof(SOCK_struct, r_len), \ 496 infof(SOCK_struct, w_len), \ 497 infof(SOCK_struct, n_read), \ 498 infof(SOCK_struct, n_written), \ 499 infof(SOCK_struct, n_in), \ 500 infof(SOCK_struct, n_out) 502 # define SOCK_SHOWDATALAYOUT_PARAMS \ 503 infof(SOCK_struct, sock), \ 504 infof(SOCK_struct, id), \ 505 infof(TRIGGER_struct, isset), \ 506 infof(SOCK_struct, host_), \ 507 infof(SOCK_struct, port), \ 508 infof(SOCK_struct, myport), \ 509 infof(SOCK_struct, err), \ 510 infof(SOCK_struct, sslctx), \ 511 infof(SOCK_struct, addr), \ 512 infof(SOCK_struct, r_tv), \ 513 infof(SOCK_struct, w_tv), \ 514 infof(SOCK_struct, c_tv), \ 515 infof(SOCK_struct, r_to), \ 516 infof(SOCK_struct, w_to), \ 517 infof(SOCK_struct, c_to), \ 518 infof(SOCK_struct, r_buf), \ 519 infof(SOCK_struct, w_buf), \ 520 infof(SOCK_struct, r_len), \ 521 infof(SOCK_struct, w_len), \ 522 infof(SOCK_struct, n_read), \ 523 infof(SOCK_struct, n_written), \ 524 infof(SOCK_struct, n_in), \ 525 infof(SOCK_struct, n_out), \ 526 infof(SOCK_struct, path) 534 # undef SOCK_SHOWDATALAYOUT_PARAMS 552 #ifdef SOCK_HAVE_SHOWDATALAYOUT 557 #if defined(_DEBUG) && !defined(NDEBUG) 559 assert(
sizeof(((
structsockaddr_in*) 0)->sin_addr.s_addr) ==
sizeof(
unsigned int));
566 # ifdef NCBI_OS_MSWIN 568 assert(WSA_INVALID_EVENT == 0);
573 #if defined(NCBI_OS_UNIX) 576 if(sigaction(SIGPIPE, 0, &sa) != 0 || sa.sa_handler == SIG_DFL) {
577memset(&sa, 0,
sizeof(sa));
578sa.sa_handler = SIG_IGN;
579sigaction(SIGPIPE, &sa, 0);
582 #elif defined(NCBI_OS_MSWIN) 585 int error= WSAStartup(MAKEWORD(2, 2), &wsadata);
587|| LOBYTE(wsadata.wVersion) != 2
588|| HIBYTE(wsadata.wVersion) != 2) {
594 error, strerr ? strerr :
"",
595 "[SOCK::InitializeAPI] " 596 " Failed WSAStartup()");
607 #ifndef NCBI_OS_MSWIN 609 static void*
volatiles_AtExitSet = 0
;
613 "Failed to register exit handler");
653 const char* what = 0;
658what = (
const char*)(-1L);
670 const char* provider;
672 if(what != (
const char*)(-1L)) {
673provider = *what ? what :
"???";
674what =
"initialize";
677what =
"re-initialize";
684(
"Failed to %s SSL provider%s%s: %s", what,
688 static void*
volatiles_Once = 0
;
691 " been properly initialized in the NCBI Toolkit. " 692 " Have you forgotten to call SOCK_SetupSSL[Ex]()?");
709memset(&
info, 0,
sizeof(
info));
711 info.status = status;
737memset(&
info, 0,
sizeof(
info));
739 info.status = status;
771 error, strerr ? strerr :
"",
772 "[SOCK::ShutdownAPI] " 773 " Failed WSACleanup()");
807 error, strerr ? strerr :
"",
808 "[SOCK_gethostname] " 809 " Failed gethostname()");
816(
"[SOCK_gethostname] " 817 " Buffer too small (%lu) for \"%.*s\"",
825(
"[SOCK_gethostname] " 826 " Hostname with spaces \"%s\"",
buf));
838 failed?
" (failed)":
""));
841 return*
buf? 0
: -1
;
852 if(!
empty&& family == AF_UNSPEC)
868 return!((
ip& 0xFFFF0000) ^ 0xA9FE0000);
875 for(
n= 0; addrs[
n]; ++
n) {
877memcpy(&
ip, addrs[
n],
sizeof(
ip));
900memset(
addr, 0,
sizeof(*
addr));
910family == AF_INET ?
"(IPv4)":
911family == AF_INET6 ?
"(IPv6)":
"",
914 if(family != AF_INET6) {
915 #ifdef NCBI_OS_DARWIN 916 if(strspn(host,
".0123456789") ==
len) {
919memset(
addr, 0,
sizeof(*
addr));
925 if(!not_ip && (ipv4 = inet_addr(host)) != htonl(
INADDR_NONE)) {
933memset(
addr, 0,
sizeof(*
addr));
944 if(family == AF_INET6) {
950}
else if(family == AF_INET)
955memset(
addr, 0,
sizeof(*
addr));
961 #if defined(HAVE_GETADDRINFO) 963memset(&hints, 0,
sizeof(hints));
964hints.ai_family = family;
967 const structsockaddr* sa;
968 const structsockaddr_in*
in;
969 const structsockaddr_in6* in6;
972 if(family != AF_INET6) {
978u.sa =
tmp->ai_addr;
979 if(u.sa->sa_family == AF_INET) {
980addrs[
n++] = (
char*) &u.in->sin_addr;
984 if(!(
tmp=
tmp->ai_next))
986}
while(
n<
sizeof(addrs) /
sizeof(addrs[0]) - 1);
990: addrs[0],
sizeof(ipv4));
999u.sa =
tmp->ai_addr;
1000 if(u.sa->sa_family == AF_INET6) {
1005 if((temp->
octet[0] & 0xE0) &&
1006(temp->
octet[0] ^ 0xE0)) {
1015u.sa =
tmp->ai_addr;
1016 if(u.sa->sa_family == AF_INET6) {
1017memcpy(
addr, &u.in6->sin6_addr,
sizeof(*
addr));
1020 assert(family == AF_INET6 || family == AF_UNSPEC);
1024 const char* strerr;
1026 if(
error== EAI_SYSTEM)
1036 error, strerr ? strerr :
"",
1037(
"[SOCK_gethostbyname] " 1038 " Failed getaddrinfo(\"%.*s\")",
1047 # ifdef NCBI_HAVE_GETHOSTBYNAME_R 1048 static const charsuffix[] =
"_r";
1049 structhostent x_he;
1053 # if NCBI_HAVE_GETHOSTBYNAME_R == 5 1054he = gethostbyname_r(host, &x_he, x_buf,
sizeof(x_buf), &
error);
1055 # elif NCBI_HAVE_GETHOSTBYNAME_R == 6 1056 if(gethostbyname_r(host, &x_he, x_buf,
sizeof(x_buf), &he, &
error) != 0) {
1062 # error "Unknown NCBI_HAVE_GETHOSTBYNAME_R value" 1071 static const charsuffix[] =
"";
1073 # ifndef SOCK_GHBX_MT_SAFE 1077he = gethostbyname(host);
1078 error= he ? 0 : h_errno + DNS_BASE;
1082|| (family == AF_INET6 && he->h_addrtype == AF_INET)
1083|| (family == AF_INET && he->h_addrtype == AF_INET6)) {
1088}
else switch(he->h_addrtype) {
1090 if(he->h_length !=
sizeof(ipv4)) {
1101 if(he->h_length !=
sizeof(*
addr)) {
1105memcpy(
addr, he->h_addr,
sizeof(*
addr));
1113 # ifndef NCBI_HAVE_GETHOSTBYNAME_R 1114 # ifndef SOCK_GHBX_MT_SAFE 1120 # ifdef NETDB_INTERNAL 1121 if(
error== NETDB_INTERNAL + DNS_BASE)
1124 if(
error== ERANGE)
1129 error, strerr ? strerr :
"",
1130(
"[SOCK_gethostbyname] " 1131 " Failed gethostbyname%s(\"%.*s\")",
1142 #if defined(_DEBUG) && !defined(NDEBUG) 1146 CORE_TRACEF((
"[SOCK::gethostbyname%s] \"%s\" @ %s",
1147family == AF_INET ?
"(IPv4)":
1148family == AF_INET6 ?
"(IPv6)":
"",
1152 returnparsed ?
addr: 0
;
1163 static volatile struct{
1166} s_LocalHostAddress[2] = { 0 };
1167 static void*
volatiles_Once = 0
;
1172 n= !(family != AF_INET6);
1173 if(reget !=
eOn) {
1174 int i, m = family == AF_UNSPEC ? 2 : 1;
1175 for(
i= 0;
i< m; ++
i) {
1178isset = s_LocalHostAddress[
n].isset;
1179*
addr= s_LocalHostAddress[
n].addr;
1181 if(!(
i| isset)) {
1192 if(reget !=
eOff) {
1198s_LocalHostAddress[
n].addr = *
addr;
1199s_LocalHostAddress[
n].isset = 1;
1207(
"[SOCK::GetLocalHostAddress%s] " 1208 " Cannot obtain local host address%s",
1209family == AF_INET ?
"(IPv4)":
1210family == AF_INET6 ?
"(IPv6)":
"",
1211reget ==
eDefault?
", using loopback instead":
""));
1214 if(family == AF_INET6)
1230 static void*
volatiles_Once = 0
;
1239memset(&
info, 0,
sizeof(
info));
1246}
else if(!s_Once && !host
1251(
"[SOCK::gethostbyname] " 1252 " Got loopback address %s for local host name", addrstr));
1278family == AF_INET ?
"(IPv4)":
1279family == AF_INET6 ?
"(IPv6)":
"",
1285 #if defined(HAVE_GETNAMEINFO) 1288 structsockaddr_in
in;
1289 structsockaddr_in6 in6;
1295memset(&u, 0, addrlen);
1296u.sa.sa_family = ipv4 ? AF_INET : AF_INET6;
1297 # ifdef HAVE_SIN_LEN 1298u.sa.sa_len = addrlen;
1303memcpy(&u.in6.sin6_addr,
addr,
sizeof(u.in6.sin6_addr));
1304 if((ipv4 && u.in.sin_addr.s_addr == htonl(
INADDR_NONE))
13070, 0, NI_NAMEREQD)) != 0
1310 if(
error== EAI_NONAME)
1313 if(
error== EAI_SYSTEM)
1330 error, strerr ? strerr :
"",
1331(
"[SOCK_gethostbyaddr] " 1332 " Failed getnameinfo(%s)",
1343 char* x_addr = ipv4 ? (
char*) &temp : (
char*)
addr;
1344 # ifdef NCBI_HAVE_GETHOSTBYADDR_R 1345 static const charsuffix[] =
"_r";
1346 structhostent x_he;
1349 # if NCBI_HAVE_GETHOSTBYADDR_R == 7 1350he = gethostbyaddr_r(x_addr, addrlen, ipv4 ? AF_INET : AF_INET6,
1351&x_he, x_buf,
sizeof(x_buf), &
error);
1352 # elif NCBI_HAVE_GETHOSTBYADDR_R == 8 1353 if(gethostbyaddr_r(x_addr, addrlen, ipv4 ? AF_INET : AF_INET6,
1354&x_he, x_buf,
sizeof(x_buf), &he, &
error) != 0) {
1360 # error "Unknown NCBI_HAVE_GETHOSTBYADDR_R value" 1369 static const charsuffix[] =
"";
1371 # ifndef SOCK_GHBX_MT_SAFE 1375he = gethostbyaddr(x_addr, addrlen, ipv4 ? AF_INET : AF_INET6);
1376 error= he ? 0 : h_errno + DNS_BASE;
1381 if(!he || (
len= strlen(he->h_name)) >=
bufsize) {
1389memcpy(
buf, he->h_name,
len+ 1);
1391 # ifndef NCBI_HAVE_GETHOSTBYADDR_R 1392 # ifndef SOCK_GHBX_MT_SAFE 1398 # ifdef NETDB_INTERNAL 1399 if(
error== NETDB_INTERNAL + DNS_BASE)
1402 if(
error== ERANGE)
1408 error, strerr ? strerr :
"",
1409(
"[SOCK_gethostbyaddr] " 1410 " Failed gethostbyaddr%s(%s)",
1422 #if defined(_DEBUG) && !defined(NDEBUG) 1424 CORE_TRACEF((
"[SOCK::gethostbyaddr%s] %s @ %s%s%s",
1425family == AF_INET ?
"(IPv4)":
1426family == AF_INET6 ?
"(IPv6)":
"",
1429&
"\""[!
buf],
buf?
buf:
"(none)", &
"\""[!
buf]));
1441 static void*
volatiles_Once = 0
;
1452(
"[SOCK::gethostbyaddr] " 1463 unsigned short* port,
1467 const char*s, *
t, *q;
1472memset(
addr, 0,
sizeof(*
addr));
1482 for(s =
str; *s; ++s) {
1483 if(!
isspace((
unsigned char)(*s)))
1489 if(!(
t= strchr(++s,
']')) ||
t== s)
1501}
else if((q = strchr(s,
':')) == s) {
1502 if(family == AF_INET)
1505memset(&temp, 0,
sizeof(temp));
1509 if(q && *q ==
':') {
1512 if(!
isdigit((
unsigned char) q[1]))
1515 i= strtol(++q, &e, 10);
1516 if(errno || q == e || (
i^ (
i& 0xFFFF))
1517|| (*e && !
isspace((
unsigned char)(*e)))) {
1520p = (
unsignedshort)
i;
1522}
else if(!q || !*q ||
isspace((
unsigned char)(*q))) {
1532 for(
t= s; *
t&& *
t!=
':'; ++
t) {
1533 if(
isspace((
unsigned char)(*
t)))
1537 if((
len= (
size_t)(
t- s)) >=
sizeof(x_buf))
1539memcpy(x_buf, s,
len);
1540x_buf[
len] =
'\0';
1550 assert(family == AF_INET || family == AF_INET6);
1551 if((ipv4 && family == AF_INET6) || (!ipv4 && family == AF_INET))
1565 unsigned shortport,
1576 intbare = (ipv4 && family != AF_INET6) || !port;
1586 len= (size_t)(end -
buf);
1592 if(port || !
len) {
1594 size_tx_len = (size_t) sprintf(x_buf,
":%hu", port);
1596memcpy(
buf+
len, x_buf, x_len);
1605 #define s_HostPortToString(a,b,c,d) s_HostPortToStringEx((a),s_IPVersion,(b),(c),(d)) 1625 unsigned shortport,
1641 unsigned shortport,
1650strcpy(
buf+ 1,
"::");
1659sprintf(
buf+
len,
":%hu", port);
1661strcpy(
buf+
len,
":?");
1678 switch(sock->
type) {
1692 if(sock->
path[0])
1693sname = sock->
sslctx?
"SUSOCK":
"USOCK";
1711cp = ((
LSOCK) sock)->path;
1725sprintf(fd,
"%u", (
unsigned int) sock->
sock);
1728 len= cp && *cp ? strlen(cp) : 0;
1730sprintf(
buf,
"%s#%u[%s]%s%s%.*s: ", sname, sock->
id, fd,
1731&
"@"[!
n], (
size_t)
n<
len?
"...":
"",
n, cp +
len-
n);
1741 structsockaddr_in
in;
1742 structsockaddr_in6 in6;
1745memset(&u, 0,
sizeof(u.sa));
1747u.sa.sa_len = addrlen;
1749 if(getsockname(fd, &u.sa, &addrlen) == 0) {
1750 switch(u.sa.sa_family) {
1752 returnntohs(u.in.sin_port);
1754 returnntohs(u.in6.sin6_port);
1766 const void*
data,
size_t size,
const void* ptr)
1769 const structsockaddr* sa;
1770 const structsockaddr_in*
in;
1771 const structsockaddr_in6* in6;
1773 const char* what, *strerr;
1786 unsigned shortport;
1788what = ptr ? (
const char*) ptr :
"Connecting";
1789strcpy(
head, *what ? what :
"Re-using");
1792strcpy(
head,
"Accepted");
1795strcpy(
head,
"Created");
1800 if(!sock->
path[0])
1805sprintf(tail,
" @:%hu", port);
1813}
else if(!(u.sa = (
const structsockaddr*) ptr)) {
1814strcpy(
head,
"Created");
1816}
else if(!
data) {
1817 unsigned shortport;
1818 switch(u.sa->sa_family) {
1820port = ntohs(u.in->sin_port);
1823port = ntohs(u.in6->sin6_port);
1830strcpy(
head,
"Bound @");
1831sprintf(tail,
"(:%hu)", port);
1832}
else if(u.sa->sa_family) {
1834 unsigned shortport;
1835 switch(u.sa->sa_family) {
1838port = ntohs(u.in->sin_port);
1841memcpy(&
addr, &u.in6->sin6_addr,
sizeof(
addr));
1842port = ntohs(u.in6->sin6_port);
1845memset(&
addr, 0,
sizeof(
addr));
1850strcpy(
head,
"Associated ");
1853strcpy(
head,
"Disassociated");
1857(
"%s%s%s",
s_ID(sock, _id),
head, tail));
1867:
data? strerr :
"EOF hit")
1873 n= (
int) strlen(what);
1874 while(
n&&
isspace((
unsigned char) what[
n- 1]))
1876 if(
n> 1 && what[
n- 1] ==
'.')
1879u.sa = (
const structsockaddr*) ptr;
1881 unsigned shortport;
1882 assert(u.sa && (u.sa->sa_family == AF_INET ||
1883u.sa->sa_family == AF_INET6));
1884 switch(u.sa->sa_family) {
1887port = ntohs(u.in->sin_port);
1890memcpy(&
addr, &u.in6->sin6_addr,
sizeof(
addr));
1891port = ntohs(u.in6->sin6_port);
1894memset(&
addr, 0,
sizeof(
addr));
1902}
else if(!ptr || !*((
char*) ptr)) {
1905strcpy(tail, !ptr ?
"":
" [OOB]");
1912(
"%s%.*s%s%s%s",
s_ID(sock, _id),
n, what,
1914? (event ==
eIO_Read?
" from ":
" to ")
1917?
" while reading":
" while writing")
1932&
"s"[sock->
n_in== 1]);
1941&
"s"[sock->
n_out== 1]);
1944(
"%s%s (in: %s, out: %s)",
s_ID(sock, _id),
1945ptr ? (
const char*) ptr :
1946sock->
keep?
"Leaving":
"Closing",
1952(
"%s[SOCK::DoLog] " 1953 " Invalid event #%u",
1954 s_ID(sock, _id), (
unsigned int) event));
1975to->
sec= (
unsigned int) tv->tv_sec;
1976to->
usec= (
unsigned int) tv->tv_usec;
1988tv->tv_sec = to->
usec/ 1000000 + to->
sec;
1989tv->tv_usec = to->
usec% 1000000;
2052 static structtimeval s_New;
2064 #ifndef NCBI_OS_MSWIN 2065 # if !defined(HAVE_POLL_H) || defined(NCBI_OS_DARWIN) 2068 " Poll API requested but not supported on this platform");
2103memset(&
info, 0,
sizeof(
info));
2117 " Seeking approval for %s %s%s%s%s%s%s",
2121!host && !*cp ?
"":
2123&
"\""[!host], host ? host :
"", &
"\""[!host], cp));
2129(
"%s[SOCK::ApproveHook] " 2130 " Approval denied for %s %s%s%s%s%s%s: %s",
2134!host && !*cp ?
"":
2136&
"\""[!host], host ? host :
"", &
"\""[!host], cp,
2140 if(status ==
eIO_Timeout|| status == eIO_Closed)
2155 #if defined(NCBI_OS_MSWIN) 2156 unsigned longarg = nonblock ? 1 : 0;
2157 returnioctlsocket(sock, FIONBIO, &arg) == 0;
2158 #elif defined(NCBI_OS_UNIX) 2159 int flags= fcntl(sock, F_GETFL, 0);
2162 if(!nonblock == !(
flags& O_NONBLOCK))
2164 returnfcntl(sock, F_SETFL, nonblock
2165?
flags| O_NONBLOCK
2166:
flags& (
int) ~O_NONBLOCK) == 0;
2168 # error "Unsupported platform" 2181 #if defined(NCBI_OS_UNIX) 2182 int flags= fcntl(x_sock, F_GETFD, 0);
2185 if(!cloexec == !(
flags& FD_CLOEXEC))
2187 returnfcntl(x_sock, F_SETFD, cloexec
2188?
flags| FD_CLOEXEC
2189:
flags& (
int) ~FD_CLOEXEC) == 0;
2190 #elif defined(NCBI_OS_MSWIN) 2191 returnSetHandleInformation((
HANDLE)x_sock, HANDLE_FLAG_INHERIT, !cloexec);
2193 # error "Unsupported platform" 2205 #if defined(NCBI_OS_UNIX) || defined(NCBI_OS_MSWIN) 2206 # ifdef NCBI_OS_MSWIN 2209 intreuse_addr = on_off ? 1 : 0;
2211 returnsetsockopt(x_sock, SOL_SOCKET, SO_REUSEADDR,
2212(
char*) &reuse_addr,
sizeof(reuse_addr)) == 0;
2228 # ifdef NCBI_OS_MSWIN 2231 intkeepalive = on_off ? 1
: 0
;
2233 returnsetsockopt(x_sock, SOL_SOCKET, SO_KEEPALIVE,
2234(
char*) &keepalive,
sizeof(keepalive)) == 0;
2246 # ifdef NCBI_OS_MSWIN 2249 intoobinline = on_off ? 1
: 0
;
2251 returnsetsockopt(x_sock, SOL_SOCKET, SO_OOBINLINE,
2252(
char*) &oobinline,
sizeof(oobinline)) == 0;
2262 const structtimeval* t2)
2268 if(t1->tv_sec > t2->tv_sec)
2270 if(t1->tv_sec < t2->tv_sec)
2272 returnt1->tv_usec < t2->tv_usec;
2290 #if !defined(NCBI_OS_MSWIN) && defined(FD_SETSIZE) 2291 static intx_TryLowerSockFileno(
SOCKsock)
2293 # ifdef STDERR_FILENO 2294 # define SOCK_DUPOVER STDERR_FILENO 2296 # define SOCK_DUPOVER 2 2298 # ifdef F_DUPFD_CLOEXEC 2299 intfd = fcntl(sock->
sock, F_DUPFD_CLOEXEC, SOCK_DUPOVER + 1);
2301 intfd = fcntl(sock->
sock, F_DUPFD, SOCK_DUPOVER + 1);
2306 # ifndef F_DUPFD_CLOEXEC 2307 intcloexec = fcntl(sock->
sock, F_GETFD, 0);
2308 if(cloexec == -1 || ((cloexec & FD_CLOEXEC)
2309&& fcntl(fd, F_SETFD, cloexec) != 0)) {
2315(
"%s[SOCK::Select] " 2316 " File descriptor has been lowered to %d",
2317 s_ID(sock, _id), fd));
2330 #if !defined(NCBI_OS_MSWIN) || !defined(NCBI_CXX_TOOLKIT) 2336 static intx_IsInterruptiblePoll(
SOCKsock0)
2344 const structtimeval* tv,
2355 structtimeval x_tv;
2358 # ifdef NCBI_OS_MSWIN 2361tv ? tv->tv_sec * 1000 + (tv->tv_usec + 500) / 1000 : INFINITE;
2370memset(&x_tv, 0,
sizeof(x_tv));
2374 # ifdef NCBI_OS_MSWIN 2375 unsigned int count= 0;
2377 structtimeval xx_tv;
2385 for(
i= 0;
i<
n; ++
i) {
2392 if(!(sock = polls[
i].sock) || !(event = polls[
i].event)) {
2403 if(polls[
i].revent) {
2408 event= (
EIO_Event)(event & ~polls[
i].revent);
2413 # if !defined(NCBI_OS_MSWIN) && defined(FD_SETSIZE) 2415 if(!x_TryLowerSockFileno(sock)) {
2418(
"%s[SOCK::Select] " 2419 " Socket file descriptor must " 2445|| (sock->r_on_w ==
eOff 2454|| (sock->r_status != eIO_Closed && !sock->eof)) {
2462|| sock->w_status == eIO_Closed
2463|| !(sock->pending | sock->w_len)) {
2479 if(nfds < (
int) fd)
2482 # ifdef NCBI_OS_MSWIN 2484 if(!FD_ISSET(fd, &efds)) {
2488 " Too many sockets in select()," 2489 " must be fewer than %u",
count));
2505memset(&xx_tv, 0,
sizeof(xx_tv));
2513write_only ? 0 : &rfds,
2514read_only ? 0 : &wfds, &efds,
2529x_tv.tv_usec += 1000000;
2542 error, strerr ? strerr :
"",
2543(
"%s[SOCK::Select] " 2544 " Failed select()",
2545 n== 1 ?
s_ID(polls[0].sock, _id) :
""));
2549}
else if(x_IsInterruptiblePoll(
n== 1 ? polls[0].sock : 0)) {
2563 for(ready = 0,
i= 0;
i<
n; ++
i) {
2567 if(!(sock = polls[
i].sock) || !(event = polls[
i].event)) {
2580 # if !defined(NCBI_OS_MSWIN) && defined(FD_SETSIZE) 2583 if(FD_ISSET(fd, &efds)) {
2585 # ifdef NCBI_OS_MSWIN 2587sock->readable = 1
;
2589sock->writable = 1
;
2592 if(!write_only && FD_ISSET(fd, &rfds)) {
2594 # ifdef NCBI_OS_MSWIN 2595sock->readable = 1
;
2598 if(!read_only && FD_ISSET(fd, &wfds)) {
2600 # ifdef NCBI_OS_MSWIN 2601sock->writable = 1
;
2621 # if defined(NCBI_OS_UNIX) && defined(HAVE_POLL_H) && !defined(NCBI_OS_DARWIN) 2623 # define NPOLLS ((3 * sizeof(fd_set)) / sizeof(struct pollfd)) 2626 static size_tx_AutoCountPolls(
size_t n,
SSOCK_Pollpolls[])
2634 for(
i= 0;
i<
n; ++
i) {
2635 if(!polls[
i].sock) {
2643 if(!polls[
i].event) {
2654&& !x_TryLowerSockFileno(polls[
i].sock)) {
2660 returngood && (
count<= NPOLLS || bigfd) ?
count: 0;
2666 const structtimeval* tv,
2669 struct pollfdxx_polls[NPOLLS];
2686 if(!(m = x_AutoCountPolls(
n, polls)))
2687 returns_Select_(
n, polls, tv, asis);
2691 else if(!(x_polls = (
struct pollfd*)
malloc(m *
sizeof(*x_polls)))) {
2693(
"%s[SOCK::Select] " 2694 " Cannot allocate poll vector(%lu)",
2695 n== 1 ?
s_ID(polls[0].sock, _id) :
"",
2696(
unsigned long) m));
2701wait = tv ? (
int)(tv->tv_sec * 1000 + (tv->tv_usec + 500) / 1000) : -1;
2707 for(
i= 0;
i<
n; ++
i) {
2715 if(!(sock = polls[
i].sock) || !(
event= polls[
i].
event)) {
2724 if(polls[
i].revent) {
2729 event= (
EIO_Event)(event & ~polls[
i].revent);
2741bitset |= POLL_WRITE;
2744|| (sock->r_on_w ==
eOff 2753|| (sock->r_status != eIO_Closed && !sock->eof))
2754bitset |= POLL_READ;
2756|| sock->w_status == eIO_Closed
2757|| !(sock->pending | sock->w_len)) {
2760bitset |= POLL_WRITE;
2785 if(wait != -1 && wait < slice)
2789 if(
count|| !ready) {
2790x_ready =
poll(x_polls,
count, slice);
2793 # ifdef NCBI_OS_DARWIN 2795 if(x_ready > (
int)
count)
2799ready = (nfds_t) x_ready;
2822 const char* strerr =
2825x_ready, strerr ? strerr :
"",
2826(
"%s[SOCK::Select] " 2828 n== 1 ?
s_ID(polls[0].sock, _id) :
""));
2834}
else if(x_IsInterruptiblePoll(
n== 1 ? polls[0].sock : 0)) {
2851 for(m = 0,
i= 0;
i<
n; ++
i) {
2855 if(!sock || !polls[
i].event) {
2869 if(scanned < ready) {
2870nfds_t x_scanned = 0;
2873 for(j = (nfds_t) m; j <
count; ++j) {
2876 if(x_polls[j].
fd==
fd) {
2879scanned += x_scanned;
2887 if(!(
revents& POLL_ERROR)) {
2890 if((
events& POLL_WRITE) && (
revents& POLL_WRITE_READY))
2901 assert(scanned <= ready);
2902 assert(x_ready >= ready);
2906 if(x_polls != xx_polls)
2954 const structtimeval* tv,
2957 #if defined(NCBI_OS_MSWIN) && defined(NCBI_CXX_TOOLKIT) 2958 DWORDwait = tv ? tv->tv_sec * 1000 + (tv->tv_usec + 500)/1000 : INFINITE;
2959 HANDLEwhat[MAXIMUM_WAIT_OBJECTS];
2960 longwant[MAXIMUM_WAIT_OBJECTS];
2970 for(
i= 0;
i<
n; ++
i) {
2977 if(!(sock = polls[
i].sock) || !(
event= polls[
i].
event)) {
2988 if(polls[
i].revent) {
2993 event= (
EIO_Event)(event & ~polls[
i].revent);
3007|| sock->
w_status!= eIO_Closed) {
3013bitset |= FD_CONNECT
;
3014bitset |= FD_WRITE
;
3027|| (sock->
r_status!= eIO_Closed && !sock->
eof)) {
3037bitset |= FD_ACCEPT
;
3048bitset |= FD_WRITE
;
3062 if(
count>=
sizeof(what) /
sizeof(what[0])) {
3066 " Too many objects exceeding %u",
3067(
unsigned int)
count));
3072want[
count] = bitset;
3086 if(wait != INFINITE && wait < slice)
3097 r= WaitForMultipleObjects(c,
3101 if(
r== WAIT_FAILED) {
3102 DWORDerr = GetLastError();
3105err, strerr ? strerr :
"",
3107 " Failed WaitForMultipleObjects(%u)",
3108(
unsigned int) c));
3112 if(
r== WAIT_TIMEOUT)
3114 if(
r< WAIT_OBJECT_0 || WAIT_OBJECT_0 + c <=
r) {
3117 " WaitForMultipleObjects(%u) returned %d",
3118(
unsigned int) c, (
int)(
r- WAIT_OBJECT_0)));
3122m +=
r- WAIT_OBJECT_0;
3126 for(j =
i; j <
n; ++j) {
3130 if(!sock || !polls[j].event)
3142 if(what[m] != ((
TRIGGER) sock)->
fd)
3149 if(what[m] != sock->
event)
3152 if(!WSAResetEvent(what[m])) {
3158 if(WSAEnumNetworkEvents(sock->
sock, what[m], &e) != 0) {
3162 error, strerr ? strerr :
"",
3163(
"%s[SOCK::Select] " 3164 " Failed WSAEnumNetworkEvents",
3172 if(!(bitset = e.lNetworkEvents)) {
3173 if(ready || !slice) {
3183 if(lsock->
away< 10) {
3189(
"%s[SOCK::Select] " 3190 " Run-away connection detected",
3195 if(bitset & FD_CLOSE
) {
3204 if(bitset & (FD_CONNECT | FD_WRITE)) {
3208 if(bitset & (FD_ACCEPT | FD_OOB | FD_READ))
3212 if((bitset & (FD_CONNECT | FD_WRITE))
3218 if((bitset & (FD_ACCEPT | FD_OOB | FD_READ))
3224 if(!polls[j].revent) {
3226 if((e.lNetworkEvents & FD_CLOSE)
3227&& !e.iErrorCode[FD_CLOSE_BIT]) {
3230}
else for(k = 0; k < FD_MAX_EVENTS; ++k) {
3231 if(!(e.lNetworkEvents & (1 << k)))
3233 if(e.iErrorCode[k]) {
3235errno = e.iErrorCode[k];
3249 if(ready || !slice)
3251}
while(m <
count);
3256 if(
r== WAIT_FAILED)
3264 if(wait != INFINITE) {
3278 # if defined(NCBI_OS_UNIX) && defined(HAVE_POLL_H) && !defined(NCBI_OS_DARWIN) 3280 returns_Poll_(
n, polls, tv, asis);
3283 returns_Select_(
n, polls, tv, asis);
3289 #if defined(NCBI_COMPILER_GCC) || defined(NCBI_COMPILER_ANY_CLANG) 3290 # pragma GCC diagnostic push 3291 # pragma GCC diagnostic ignored "-Wmaybe-uninitialized" 3292 static inline void x_tvcpy(
structtimeval* dst,
structtimeval* src)
3294memcpy(dst, src,
sizeof(*dst));
3296 # pragma GCC diagnostic warning "-Wmaybe-uninitialized" 3297 # pragma GCC diagnostic pop 3299 # define x_tvcpy(d, s) (void) memcpy((d), (s), sizeof(*(d))) 3308 const structtimeval* tv,
3336 #if defined(NCBI_OS_UNIX) || defined(NCBI_OS_MSWIN) 3340 if(getsockopt(sock->
sock, SOL_SOCKET, SO_ERROR, (
void*)
error, &
len)
3341!= 0 || *
error!= 0) {
3351 # ifdef NCBI_OS_MSWIN 3365 #if defined(_DEBUG) && !defined(NDEBUG) 3369 char* x_m = (
char*) &m;
3371 # if defined(IPPROTO_IP) && defined(IP_MTU) 3379 # if (defined(NCBI_OS_MSWIN) || defined(IPPROTO_IPV6)) && defined(IPV6_MTU) 3387 if(x_m && sock->
port) {
3389 if(getsockopt(sock->
sock, lev, opt, x_m, &mlen) != 0) {
3391sprintf(mtu,
", MTU ?? (%.80s)", strerr ? strerr :
"??");
3394sprintf(mtu,
", MTU = %d", m);
3398 static const char* mtu =
"";
3401(
"%sConnection established%s",
s_ID(sock, _id), mtu));
3411x_error, strerr ? strerr :
"",
3412(
"%s[SOCK::IsConnected] " 3413 " Failed setsockopt(REUSEADDR)",
3428 const unsigned intrtv_set = sock->
r_tv_set;
3429 const unsigned intwtv_set = sock->
w_tv_set;
3440want_desc ? &desc : 0);
3441 if((sock->
w_tv_set= wtv_set & 1) != 0)
3443 if((sock->
r_tv_set= rtv_set & 1) != 0)
3449(
"%sSSL session created%s%s%s%s%s",
3454&
" "[!desc], desc ? desc :
""));
3459*what =
"SSL handshake";
3471 const structtimeval* tv)
3479memset(&
info, 0,
sizeof(
info));
3492 info.status = status;
3527 #ifdef NCBI_OS_MSWIN 3540 if((x_read < 0 && sock->
log!=
eOff) ||
3542&& (!sock->
sslctx|| flag > 0))) {
3547x_read < 0 ? (
void*) &
error:
3548x_read > 0 ?
buf: 0,
3549(
size_t)(x_read < 0 ? 0 : x_read), 0);
3555*n_read = (size_t) x_read;
3565 #ifdef NCBI_OS_MSWIN 3584 " Spurious false indication of read-ready",
3608 error, strerr ? strerr :
"",
3645 unsigned intrtv_set;
3659 returnstatus == eIO_Closed ?
eIO_Unknown: status;
3661 if(!
size&& peek >= 0) {
3663 if(status == eIO_Closed)
3665 else if(sock->
eof)
3666status = eIO_Closed;
3676 if(
size&& !*n_read) {
3682 if(*n_read && (*n_read ==
size|| !peek))
3690 if(status == eIO_Closed) {
3692 " Socket already shut down for reading",
3701 if((rtv_set = sock->
r_tv_set) != 0)
3705memset(&sock->
r_tv, 0,
sizeof(sock->
r_tv));
3709 assert(!*n_read || peek > 0);
3713 size_tx_todo, x_read, x_save;
3716x_buf = (
char*)
buf+ *n_read;
3719x_todo =
sizeof(xx_buf);
3725 assert(x_buf && x_todo);
3736x_buf, x_todo, &x_read, &
error);
3739 assert(x_read <= x_todo);
3746status != eIO_Closed || !sock->
eof?
3747(
void*) &
error: 0,
3749x_read ?
" [decrypt]": 0);
3752 if(status == eIO_Closed && !sock->
eof)
3756status =
s_Recv(sock, x_buf, x_todo, &x_read, 0);
3758 assert(x_read <= x_todo);
3764status = eIO_Closed
;
3769 if(x_read < x_todo)
3774x_todo =
size- *n_read;
3775 if(x_todo > x_read)
3777 if(
buf&& (p_buf || x_buf == xx_buf))
3778memcpy((
char*)
buf+ *n_read, x_buf, x_todo);
3779x_save = peek ? x_read : x_read - x_todo;
3786peek ? x_buf : x_buf + x_todo,
3794peek ? p_buf : p_buf + x_todo,
3802 " Cannot save %lu byte%s of unread data",
3803 s_ID(sock, _id), (
unsigned long) x_save,
3804&
"s"[x_save == 1]));
3806x_read = peek >= 0 ? x_todo : 0;
3808}
else if(peek >= 0)
3817 if((rtv_set = sock->
r_tv_set) != 0)
3821memset(&sock->
r_tv, 0,
sizeof(sock->
r_tv));
3823}
while(peek < 0
|| (!
buf&& *n_read <
size));
3824 if(!(rtv_set & 2) && (sock->
r_tv_set= rtv_set & 1) != 0)
3842memset(&
info, 0,
sizeof(
info));
3855 info.status = status;
3876 const structtimeval* tv,
3896 for(
i= 0;
i<
n; ++
i) {
3901 if(polls[
i].revent & polls[
i].event) {
3903= (
EIO_Event)(polls[
i].revent & polls[
i].event);
3906 if(polls[
i].revent && !pending) {
3919 for(
i= k;
i<
n; ++
i) {
3923 static const structtimeval zero = { 0 };
3924sock = polls[
i].
sock;
3931 if(sock->
r_status== eIO_Closed || sock->
eof) {
3941sock = polls[
i].
sock;
3952 if(sock->
w_status== eIO_Closed) {
3964 for( ;
i<
n; ++
i) {
3967 if(!polls[
i].revent)
3988 poll.event = event;
4001 #ifdef NCBI_OS_MSWIN 4006tv->tv_usec += (ms_addend % 1000) * 1000;
4007tv->tv_sec += ms_addend / 1000;
4008 if(tv->tv_usec >= 10000000) {
4009tv->tv_sec += tv->tv_usec / 10000000;
4010tv->tv_usec %= 10000000;
4017 #ifdef SOCK_SEND_SLICE 4018 # define s_Send s_Send_ 4035 #ifdef NCBI_OS_MSWIN 4036 intwait_buf_ms = 0;
4037 structtimeval waited;
4038memset(&waited, 0,
sizeof(waited));
4055(flag < 0 ? MSG_OOB : 0));
4057 if(x_written >= 0 ||
4066 if((x_written <= 0 && sock->
log!=
eOff) ||
4068&& (!sock->
sslctx|| flag > 0))) {
4073x_written <= 0 ? (
void*) &
error:
data,
4074(
size_t)(x_written <= 0 ? 0 : x_written),
4078 if(x_written > 0) {
4080*n_written = (size_t) x_written;
4084 if(x_written < 0) {
4092 if(flag < 0
|| !x_written)
4099||
error== WSAENOBUFS
4104 const structtimeval* timeout;
4106 #ifdef NCBI_OS_MSWIN 4107 structtimeval slice;
4108 unsigned intwritable = sock->
writable;
4112 if(
error== WSAENOBUFS) {
4120 if(wait_buf_ms == 0)
4122 else if(wait_buf_ms < 500
)
4125slice.tv_usec = wait_buf_ms * 1000;
4128memset(&slice, 0,
sizeof(slice));
4135memset(&waited, 0,
sizeof(waited));
4151 " Spurious false indication of write-ready",
4160 #ifdef NCBI_OS_MSWIN 4161 if(
error== WSAENOBUFS) {
4162 assert(timeout == &slice);
4184 error, strerr ? strerr :
"",
4210 #ifdef SOCK_SEND_SLICE 4213 const void* x_data,
4219 const unsigned char*
data= (
const unsigned char*) x_data;
4220 unsigned intwtv_set = 2;
4227 size_tn_todo =
size> SOCK_SEND_SLICE ? SOCK_SEND_SLICE :
size;
4229status = s_Send_(sock,
data, n_todo, &n_done, flag);
4231 assert(n_done <= n_todo);
4234*n_written += n_done;
4235 if(n_todo != n_done)
4237 if(!(
size-= n_done))
4241 if((wtv_set = sock->
w_tv_set) != 0)
4245memset(&sock->
w_tv, 0,
sizeof(sock->
w_tv));
4248 if(!(wtv_set & 2) && (sock->
w_tv_set= wtv_set & 1) != 0)
4270 if(!sslwrite || oob) {
4284*n_written > 0 ?
" [encrypt]": 0);
4287 if(status == eIO_Closed)
4310 size_tn_written = 0;
4321n_written += x_written;
4323 data= (
const char*)
data+ x_written;
4333 const structtimeval* tv,
4338 unsigned intwtv_set;
4353 error, strerr ? strerr :
"",
4354(
"%s[SOCK::WritePending] " 4357what ? what :
"pending connect()",
4372 if(tv != &sock->
w_tv) {
4373 if((wtv_set = sock->
w_tv_set) != 0)
4386 if(!(wtv_set & 2) && (sock->
w_tv_set= wtv_set & 1) != 0)
4419 " Failed to %s message (%lu + %lu byte%s)",
4421oob ?
"[DSOCK::SendMsg]":
"[SOCK::Write]",
4422oob ?
"finalize":
"store",
4424(
unsigned long)
size, &
"s"[
size== 1]));
4431 if(sock->
w_status== eIO_Closed) {
4434 " Socket already shut down for writing",
4444 if(status ==
eIO_Timeout|| status == eIO_Closed)
4464memset(&
info, 0,
sizeof(
info));
4477 info.status = status;
4488 const structtimeval* tv)
4530 if(sock->
w_status!= eIO_Closed) {
4533 CORE_LOGF_X(13, !tv || (tv->tv_sec | tv->tv_usec)
4536 " %s with output (%lu byte%s) still pending" 4537 " (%s)",
s_ID(sock, _id),
4541?
"Shutting down for write" 4542:
"Shutting down for read/write",
4543(
unsigned long) sock->
w_len,
4544&
"s"[sock->
w_len== 1],
4552 const unsigned intrtv_set = sock->
r_tv_set;
4553 const unsigned intwtv_set = sock->
w_tv_set;
4563 if((sock->
w_tv_set= wtv_set & 1) != 0)
4565 if((sock->
r_tv_set= rtv_set & 1) != 0)
4570 error, strerr ? strerr :
"",
4572 " Failed SSL teardown",
4575?
"Shutdown":
"Close"));
4616 error, strerr ? strerr :
"",
4617(
"%s[SOCK::Shutdown] " 4618 " Failed shutdown(%s)",
4664 #if (defined(NCBI_OS_UNIX) && !defined(NCBI_OS_BEOS)) || defined(NCBI_OS_MSWIN) 4679 lgr.l_linger = 120;
4681}
else if(sock->
c_tv.tv_sec | sock->
c_tv.tv_usec) {
4682 intseconds = (
int)(sock->
c_tv.tv_sec +
4683(sock->
c_tv.tv_usec + 500000) / 1000000);
4686 lgr.l_linger = seconds;
4693&& setsockopt(sock->
sock, SOL_SOCKET, SO_LINGER,
4694(
char*) &
lgr,
sizeof(
lgr)) != 0
4698 error, strerr ? strerr :
"",
4700 " Failed setsockopt(SO_LINGER)",
4702 abort?
"Abort":
"Close"));
4709 if(setsockopt(sock->
sock, IPPROTO_TCP, TCP_LINGER2,
4710(
char*) &no,
sizeof(no)) != 0
4714 error, strerr ? strerr :
"",
4715(
"%s[SOCK::Close] " 4716 " Failed setsockopt(TCP_LINGER2)",
4765 #ifdef NCBI_OS_MSWIN 4767WSAEventSelect(sock->
sock, sock->
event, 0
);
4776 error, strerr ? strerr :
"",
4777(
"%s[SOCK::Close] " 4778 " Cannot set socket back to blocking mode",
4789g_MONKEY_Close(sock->
sock);
4798 #ifdef NCBI_OS_MSWIN 4799 if(
error== WSANOTINITIALISED) {
4814 error, strerr ? strerr :
"",
4818 abort?
"Abort":
"Close"));
4830 #ifdef NCBI_OS_MSWIN 4831WSASetEvent(sock->
event);
4836 #ifdef NCBI_OS_MSWIN 4838WSACloseEvent(sock->
event);
4853 assert(!reclose || !keep);
4854status =
s_Close_(sock, reclose << 1, keep);
4858memset(&
info, 0,
sizeof(
info));
4871 info.status = status;
4887 unsigned shortport,
4892 structsockaddr_in
in;
4893 structsockaddr_in6 in6;
4895 structsockaddr_un un;
4916 if(sock->
path[0]) {
4917 size_tpathlen = strlen(sock->
path) + 1
;
4918 if(
sizeof(u.un.sun_path) < pathlen) {
4920(
"%s[SOCK::Connect] " 4921 " Path too long (%lu vs %lu bytes allowed)",
4922 s_ID(sock, _id), (
unsigned long) pathlen,
4923(
unsigned long)
sizeof(u.un.sun_path)));
4926addrlen =
sizeof(u.un);
4927memset(&u, 0, addrlen);
4928u.un.sun_family = AF_UNIX;
4929 # ifdef HAVE_SIN_LEN 4930u.un.sun_len = addrlen;
4932memcpy(u.un.sun_path, sock->
path, pathlen);
4947(
"%s[SOCK::Connect] " 4948 " Failed SOCK_gethostbyname(\"%.*s\")",
4953addrlen = ipv4 ?
sizeof(u.in) :
sizeof(u.in6);
4954memset(&u, 0, addrlen);
4955u.sa.sa_family = ipv4 ? AF_INET : AF_INET6;
4957u.sa.sa_len = addrlen;
4961u.in.sin_port = htons(sock->
port);
4963memcpy(&u.in6.sin6_addr, &sock->
addr,
sizeof(u.in6.sin6_addr));
4964u.in6.sin6_port = htons(sock->
port);
4977 #ifdef SOCK_NONBLOCK 4978 type|= SOCK_NONBLOCK;
4982 type|= SOCK_CLOEXEC;
4987 error, strerr ? strerr :
"",
4988(
"%s[SOCK::Connect] " 4989 " Cannot create socket",
4999 if(g_MONKEY_SockHasSocket)
5000g_MONKEY_SockHasSocket(sock, fd);
5003 #if defined(NCBI_OS_MSWIN) 5005 if(!(sock->
event= WSACreateEvent())) {
5006 DWORDerr = GetLastError();
5009err, strerr ? strerr :
"",
5010(
"%s[SOCK::Connect] " 5011 " Failed to create IO event",
5018 if(WSAEventSelect(sock->
sock, sock->
event, SOCK_EVENTS) != 0) {
5021 error, strerr ? strerr :
"",
5022(
"%s[SOCK::Connect] " 5023 " Failed to bind IO event",
5029 #elif !defined(SOCK_NONBLOCK) 5034 error, strerr ? strerr :
"",
5035(
"%s[SOCK::Connect] " 5036 " Cannot set socket to non-blocking mode",
5046 if(sock->
keepalive&& !s_SetKeepAlive(fd, 1
)) {
5049 error, strerr ? strerr :
"",
5050(
"%s[SOCK::Connect] " 5051 " Failed setsockopt(KEEPALIVE)",
5057 if(!s_SetOobInline(fd, 1
)) {
5060 error, strerr ? strerr :
"",
5061(
"%s[SOCK::Connect] " 5062 " Failed setsockopt(OOBINLINE)",
5069 #ifndef SOCK_CLOEXEC 5071 const char* strerr;
5072 # ifdef NCBI_OS_MSWIN 5073 DWORDerr = GetLastError();
5081 error, strerr ? strerr :
"",
5082(
"%s[SOCK::Connect] " 5083 " Cannot set socket close-on-exec mode",
5085 # ifdef NCBI_OS_MSWIN 5098sslctx->
sock= sock;
5102 if(!sslctx->
sess) {
5105 error, strerr ? strerr :
"",
5106(
"%s[SOCK::Connect] " 5107 " %s to initialize secure session%s%s",
5109sslcreate ?
"Failed":
"Unable",
5110sslctx->
host?
" with ":
"",
5111sslctx->
host? sslctx->
host: 0));
5124 #ifdef NCBI_OS_MSWIN 5130 for(
n= 0; ;
n= 1) {
5131 if(connect(fd, &u.sa, addrlen) == 0) {
5152 error, strerr ? strerr :
"",
5153(
"%s[SOCK::Connect] " 5154 " Failed connect()",
5162status = eIO_Closed;
5172 if(!
error|| !timeout || (timeout->
sec| timeout->
usec)) {
5175 const structtimeval* x_tv =
s_to2tv(timeout, &tv);
5180 const char* reason;
5183sprintf(
buf,
"%s[%u.%06u]",
5185(
unsigned int) x_tv->tv_sec,
5186(
unsigned int) x_tv->tv_usec);
5194 error, strerr ? strerr :
"",
5195(
"%s[SOCK::Connect] " 5196 " Failed %s: %s",
s_ID(sock, _id),
5197what ? what :
"pending connect()",
5214 unsigned shortport,
5221memset(&
info, 0,
sizeof(
info));
5226 if(sock->
path[0]) {
5238 info.port = port ? port : sock->
port;
5240 info.status = status;
5254 if(!vhost || !*vhost)
5268 unsigned shortport,
5274 size_t size= port ? 0 : strlen(hostpath);
5299x_sock->
sslctx= sslctx;
5313memcpy(x_sock->
path, hostpath,
size+ 1);
5323(
"%s[SOCK::Create] " 5324 " Cannot store initial data (%lu byte%s)",
5325 s_ID(x_sock, _id), (
unsigned long)
size,
5326&
"s"[
size== 1]));
5332status =
s_Connect(x_sock, hostpath, port, timeout);
5345memset(&temp, 0,
sizeof(temp));
5348temp.
sock= x_sock;
5361 structsockaddr_in
in;
5362 structsockaddr_in6 in6;
5364 structsockaddr_un un;
5372 #ifdef NCBI_OS_MSWIN 5376 unsigned shortmyport = 0;
5378 SOCKx_sock, x_orig = 0;
5385 if(!handle || (handle_size && handle_size !=
sizeof(fd))) {
5387(
"SOCK#%u[?]: [SOCK::CreateOnTop] " 5388 " Invalid handle%s %lu",
5390handle ?
" size":
"",
5391handle ? (
unsigned long) handle_size : 0UL));
5398x_orig = (
SOCK) handle;
5403fd = x_orig->
sock;
5406 if(!x_orig->
keep) {
5414oldctx = x_orig->
sslctx;
5417myport = x_orig->
myport;
5419 #ifdef NCBI_OS_MSWIN 5420 event= x_orig->
event;
5427memcpy(&fd, handle,
sizeof(fd));
5436memset(&u, 0,
sizeof(u));
5438addrlen =
sizeof(u);
5440u.sa.sa_len = addrlen;
5442 if(getpeername(fd, &u.sa, &addrlen) != 0) {
5445 error, strerr ? strerr :
"",
5446(
"SOCK#%u[%u]: [SOCK::CreateOnTop] " 5448x_id, (
unsigned int) fd,
5450?
"Unconnected":
"Invalid",
5451x_orig ?
"SOCK":
"OS socket"));
5456 if(u.sa.sa_family != AF_INET && u.sa.sa_family != AF_INET6
5457&& u.sa.sa_family != AF_UNIX)
5458 # if defined(NCBI_OS_BSD) || \ 5459 defined(NCBI_OS_DARWIN) || \ 5460 defined(NCBI_OS_IRIX) 5461 if(u.sa.sa_family != AF_UNSPEC
)
5464 if(u.sa.sa_family != AF_INET && u.sa.sa_family != AF_INET6)
5470 if(x_orig && x_orig->
path[0])
5471socklen = strlen(x_orig->
path);
5472 else if(!x_orig && (
5473#
ifdefined(NCBI_OS_BSD) || \
5475defined(NCBI_OS_IRIX)
5476u.sa.sa_family == AF_UNSPEC
||
5478u.sa.sa_family == AF_UNIX)) {
5479 if(addrlen ==
sizeof(u.sa.sa_family) || !u.un.sun_path[0]) {
5480memset(&u, 0,
sizeof(u));
5481addrlen =
sizeof(u);
5482 # ifdef HAVE_SIN_LEN 5483u.sa.sa_len = addrlen;
5485 if(getsockname(fd, &u.sa, &addrlen) != 0)
5487 assert(u.sa.sa_family == AF_UNIX);
5488 if(addrlen ==
sizeof(u.sa.sa_family) || !u.un.sun_path[0]) {
5490(
"SOCK#%u[%u]: [SOCK::CreateOnTop] " 5491 " %s UNIX socket handle",
5492x_id, (
unsigned int) fd,
5493addrlen ==
sizeof(u.sa.sa_family)
5494?
"Unnamed":
"Abstract"));
5498socklen =
strnlen(u.un.sun_path,
sizeof(u.un.sun_path));
5507 #ifdef NCBI_OS_MSWIN 5510 if(!(event = WSACreateEvent())) {
5511 DWORDerr = GetLastError();
5514err, strerr ? strerr :
"",
5515(
"SOCK#%u[%u]: [SOCK::CreateOnTop] " 5516 " Failed to create IO event",
5517x_id, (
unsigned int) fd));
5522 if(WSAEventSelect(fd, event, SOCK_EVENTS) != 0) {
5525 error, strerr ? strerr :
"",
5526(
"SOCK#%u[%u]: [SOCK::CreateOnTop] " 5527 " Failed to bind IO event",
5528x_id, (
unsigned int) fd));
5539 error, strerr ? strerr :
"",
5540(
"SOCK#%u[%u]: [SOCK::CreateOnTop] " 5541 " Cannot set socket to non-blocking mode",
5542x_id, (
unsigned int) fd));
5556(
"SOCK#%u[%u]: [SOCK::CreateOnTop] " 5557 " Cannot store initial data (%lu byte%s)",
5558x_id, (
unsigned int) fd, (
unsigned long)
size,
5559&
"s"[
size== 1]));
5568 if(!(x_sock = (
SOCK)
calloc(1,
sizeof(*x_sock) + socklen)))
5575x_orig ? x_orig->
path: u.un.sun_path, socklen);
5579 assert(x_orig || u.sa.sa_family == AF_INET || u.sa.sa_family == AF_INET6);
5583}
else switch(u.sa.sa_family) {
5586x_sock->
port= ntohs(u.in.sin_port);
5589memcpy(&x_sock->
addr, &u.in6.sin6_addr,
sizeof(x_sock->
addr));
5590x_sock->
port= ntohs(u.in6.sin6_port);
5598x_sock->
myport= myport;
5606 #ifdef NCBI_OS_MSWIN 5607x_sock->
event= event;
5614x_sock->
w_buf= w_buf;
5615 if(oldctx && sslctx) {
5618 if(!oldctx->sess &&
init) {
5623cred = oldctx->cred;
5624host = oldctx->host;
5627x_sock->
sslctx= oldctx;
5629x_orig->
sslctx= sslctx;
5634sslctx = x_sock->
sslctx;
5635}
else if(sslctx) {
5638x_sock->
sslctx= sslctx;
5646 if(!sslctx->
sess) {
5654 if(!sslctx->
sess) {
5657 error, strerr ? strerr :
"",
5658(
"%s[SOCK::CreateOnTop] " 5659 " %s to initialize secure session%s%s",
5661sslcreate ?
"Failed":
"Unable",
5662sslctx->
host?
" with ":
"",
5663sslctx->
host? sslctx->
host:
""));
5666 #ifdef NCBI_OS_MSWIN 5667WSAEventSelect(fd, event, 0
);
5668WSACloseEvent(event);
5679(
"%sSSL session re-acquired%s%s%s",
5681sslctx->
host?
" \"":
"",
5682sslctx->
host? sslctx->
host:
"",
5683&
"\""[!sslctx->
host]));
5697 if(x_sock->
w_buf) {
5702x_sock->
w_buf= w_buf;
5707 if(!x_orig && x_sock->
port) {
5709 if(!s_SetKeepAlive(fd, x_sock->
keepalive)) {
5712 error, strerr ? strerr :
"",
5713(
"%s[SOCK::CreateOnTop] " 5714 " Failed setsockopt(KEEPALIVE)",
5715 s_ID(x_sock, _id)));
5720 if(!s_SetOobInline(fd, 1
)) {
5723 error, strerr ? strerr :
"",
5724(
"%s[SOCK::CreateOnTop] " 5725 " Failed setsockopt(OOBINLINE)",
5726 s_ID(x_sock, _id)));
5736 const char* strerr;
5737 #ifdef NCBI_OS_MSWIN 5738 DWORDerr = GetLastError();
5746 error, strerr ? strerr :
"",
5747(
"%s[SOCK::CreateOnTop] " 5748 " Cannot modify socket close-on-exec mode",
5749 s_ID(x_sock, _id)));
5750 #ifdef NCBI_OS_MSWIN 5759memset(&
lgr, 0,
sizeof(
lgr));
5760 if(setsockopt(fd, SOL_SOCKET, SO_LINGER,
5761(
char*) &
lgr,
sizeof(
lgr)) != 0) {
5764 error, strerr ? strerr :
"",
5765(
"%s[SOCK::CreateOnTop] " 5766 " Failed setsockopt(SO_NOLINGER)",
5767 s_ID(x_sock, _id)));
5783 assert(!oldctx || oldctx != sslctx);
5791x_orig->
sock= oldfd;
5792 #ifdef NCBI_OS_MSWIN 5793x_orig->
event= event;
5802 unsigned shortport,
5803 unsigned shortbacklog,
5810 structsockaddr_in
in;
5811 structsockaddr_in6 in6;
5813 structsockaddr_un un;
5823 #ifdef NCBI_OS_MSWIN 5839pathlen = strlen(path) + 1
;
5840 if(
sizeof(u.un.sun_path) < pathlen) {
5842(
"LSOCK#%u[?]@%s: [LSOCK::Create] " 5843 " Path too long (%lu vs %lu bytes allowed)",
5844x_id, path, (
unsigned long) pathlen,
5845(
unsigned long)
sizeof(u.un.sun_path)));
5849addrlen =
sizeof(u.un);
5850memset(&
addr, 0,
sizeof(
addr));
5875addrlen =
sizeof(u.in);
5881memset(&
addr, 0,
sizeof(
addr));
5882addrlen =
sizeof(u.in6);
5900 #ifdef SOCK_NONBLOCK 5901 type|= SOCK_NONBLOCK;
5905 type|= SOCK_CLOEXEC;
5911 error, strerr ? strerr :
"",
5912(
"LSOCK#%u[?]@%s: [LSOCK::Create] " 5913 " Failed socket()", x_id, cp));
5920 #if defined(NCBI_OS_MSWIN) && defined(SO_EXCLUSIVEADDRUSE) 5930 if(setsockopt(fd, SOL_SOCKET, SO_EXCLUSIVEADDRUSE,
5931(
char*) &excl,
sizeof(excl)) != 0) {
5932 failed=
"EXCLUSIVEADDRUSE";
5934 #elif !defined(NCBI_OS_MSWIN) 5953 error, strerr ? strerr :
"",
5954(
"LSOCK#%u[%u]@%s: [LSOCK::Create] " 5955 " Failed setsockopt(%s)", x_id,
5956(
unsigned int) fd, cp,
failed));
5964memset(&u, 0, addrlen);
5965u.sa.sa_family = family;
5967u.sa.sa_len = addrlen;
5971 assert(family == AF_UNIX);
5972memcpy(u.un.sun_path, path, pathlen);
5978 assert(family == AF_INET);
5980u.in.sin_port = htons(port);
5982 assert(family == AF_INET6);
5983u.in6.sin6_port = htons(port);
5984memcpy(&u.in6.sin6_addr, &
addr,
sizeof(u.in6.sin6_addr));
6001 error, strerr ? strerr :
"",
6002(
"LSOCK#%u[%u]@%s: [LSOCK::Create] " 6004x_id, (
unsigned int) fd, cp));
6011 # if !defined(NCBI_OS_BSD) && !defined(NCBI_OS_DARWIN) && \ 6012 !defined(NCBI_OS_IRIX) && !defined(NCBI_OS_CYGWIN) 6013(void) fchmod(fd, S_IRWXU | S_IRWXG | S_IRWXO);
6015 # ifdef NCBI_OS_CYGWIN 6016(void) chmod(path, S_IRWXU | S_IRWXG | S_IRWXO);
6021 assert(u.sa.sa_family == AF_INET || u.sa.sa_family == AF_INET6);
6023 if(
error|| u.sa.sa_family != family
6024|| (family == AF_INET && !(port = ntohs(u.in.sin_port)))
6025|| (family == AF_INET6 && !(port = ntohs(u.in6.sin6_port)))) {
6029 error, strerr ? strerr :
"",
6030(
"LSOCK#%u[%u]@%s: [LSOCK::Create] " 6031 " Cannot obtain free listening port",
6032x_id, (
unsigned int) fd, cp));
6038 assert((path && !port) ||
6041 #if defined(NCBI_OS_MSWIN) 6042 if(!(event = WSACreateEvent())) {
6043 DWORDerr = GetLastError();
6048err, strerr ? strerr :
"",
6049(
"LSOCK#%u[%u]@%s: [LSOCK::Create] " 6050 " Failed to create IO event",
6051x_id, (
unsigned int) fd, cp));
6057 if(WSAEventSelect(fd, event, FD_CLOSE
| FD_ACCEPT
) != 0) {
6062 error, strerr ? strerr :
"",
6063(
"LSOCK#%u[%u]@%s: [LSOCK::Create] " 6064 " Failed to bind IO event",
6065x_id, (
unsigned int) fd, cp));
6068WSACloseEvent(event);
6071 #elif !defined(SOCK_NONBLOCK) 6077 error, strerr ? strerr :
"",
6078(
"LSOCK#%u[%u]@%s: [LSOCK::Create] " 6079 " Cannot set socket to non-blocking mode",
6080x_id, (
unsigned int) fd, cp));
6088 if(listen(fd, backlog) != 0) {
6092 error, strerr ? strerr :
"",
6093(
"LSOCK#%u[%u]@%s: [LSOCK::Create] " 6094 " Failed listen(%hu)",
6095x_id, (
unsigned int) fd, cp, backlog));
6098 #ifdef NCBI_OS_MSWIN 6099WSACloseEvent(event);
6105 if(!(x_lsock =(
LSOCK)
calloc(1,
sizeof(*x_lsock) + (path?strlen(path):0)))){
6107 #ifdef NCBI_OS_MSWIN 6108WSACloseEvent(event);
6112x_lsock->
sock= fd;
6113x_lsock->
id= x_id;
6114x_lsock->
port= port;
6120 #if defined(NCBI_OS_UNIX) 6122strcpy(x_lsock->
path, path);
6123 #elif defined(NCBI_OS_MSWIN) 6124x_lsock->
event= event;
6128 #ifndef SOCK_CLOEXEC 6130 const char* strerr;
6131 # ifdef NCBI_OS_MSWIN 6132 DWORDerr = GetLastError();
6140 error, strerr ? strerr :
"",
6141(
"%s[LSOCK::Create] " 6142 " Cannot set socket close-on-exec mode",
6144 # ifdef NCBI_OS_MSWIN 6155(
"%sListening",
s_ID((
SOCK) x_lsock, _id)));
6170 structsockaddr_in
in;
6171 structsockaddr_in6 in6;
6173 structsockaddr_un un;
6180 unsigned shortport;
6181 #ifdef NCBI_OS_MSWIN 6193(
"%s[LSOCK::Accept] " 6226 if(lsock->
path[0]) {
6227addrlen =
sizeof(u.un);
6232addrlen =
sizeof(u);
6234 #ifdef NCBI_OS_MSWIN 6241fd = accept4(lsock->
sock, &u.sa, &addrlen,
error);
6243fd = accept (lsock->
sock, &u.sa, &addrlen);
6248 error, strerr ? strerr :
"",
6249(
"%s[LSOCK::Accept] " 6250 " Failed accept()",
6258 if(lsock->
path[0]) {
6259 assert(u.un.sun_family == AF_UNIX);
6260memset(&
addr, 0,
sizeof(
addr));
6261path = lsock->
path;
6266 switch(u.sa.sa_family) {
6269port = ntohs(u.in.sin_port);
6272memcpy(&
addr, &u.in6.sin6_addr,
sizeof(
addr));
6273port = ntohs(u.in6.sin6_port);
6293 #if defined(NCBI_OS_MSWIN) 6294 if(!(event = WSACreateEvent())) {
6295 DWORDerr = GetLastError();
6298err, strerr ? strerr :
"",
6299(
"SOCK#%u[%u]@%s: [LSOCK::Accept] " 6300 " Failed to create IO event",
6301x_id, (
unsigned int) fd,
6302 s_CP(&
addr, port, path, _id,
sizeof(_id))));
6308 if(WSAEventSelect(fd, event, SOCK_EVENTS) != 0) {
6312 error, strerr ? strerr :
"",
6313(
"SOCK#%u[%u]@%s: [LSOCK::Accept] " 6314 " Failed to bind IO event",
6315x_id, (
unsigned int) fd,
6316 s_CP(&
addr, port, path, _id,
sizeof(_id))));
6319WSACloseEvent(event);
6322 #elif !defined(HAVE_ACCEPT4) 6327 error, strerr ? strerr :
"",
6328(
"SOCK#%u[%u]@%s: [LSOCK::Accept] " 6329 " Cannot set socket to non-blocking mode",
6330x_id, (
unsigned int) fd,
6331 s_CP(&
addr, port, path, _id,
sizeof(_id))));
6340 if(!(x_sock = (
SOCK)
calloc(1,
sizeof(*x_sock) + addrlen))) {
6342 #ifdef NCBI_OS_MSWIN 6343WSACloseEvent(event);
6352strcpy(x_sock->
path, path);
6358x_sock->
port= port;
6369 #ifdef NCBI_OS_MSWIN 6370x_sock->
event= event;
6384 error, strerr ? strerr :
"",
6385(
"%s[LSOCK::Accept] " 6386 " Failed setsockopt(REUSEADDR)",
6387 s_ID(*sock, _id)));
6391 if(x_sock->
keepalive&& !s_SetKeepAlive(fd, 1)) {
6394 error, strerr ? strerr :
"",
6395(
"%s[LSOCK::Accept] " 6396 " Failed setsockopt(KEEPALIVE)",
6397 s_ID(*sock, _id)));
6402 if(!s_SetOobInline(fd, 1
)) {
6405 error, strerr ? strerr :
"",
6406(
"%s[LSOCK::Accept] " 6407 " Failed setsockopt(OOBINLINE)",
6408 s_ID(*sock, _id)));
6414 #ifndef HAVE_ACCEPT4 6416 const char* strerr;
6417 # ifdef NCBI_OS_MSWIN 6418 DWORDerr = GetLastError();
6426 error, strerr ? strerr :
"",
6427(
"%s[LSOCK::Accept] " 6428 " Cannot set socket close-on-exec mode",
6429 s_ID(*sock, _id)));
6430 # ifdef NCBI_OS_MSWIN 6455 #if defined(NCBI_OS_UNIX) 6456 if(!lsock->
keep&& lsock->
path[0]) {
6460 #elif defined(NCBI_OS_MSWIN) 6462WSAEventSelect(lsock->
sock, lsock->
event, 0
);
6468(
"%s%s (%u accept%s total)",
6470lsock->
keep?
"Leaving":
"Closing",
6471lsock->n_accept, lsock->n_accept == 1 ?
"":
"s"));
6475 if(!lsock->
keep) {
6485 #ifdef NCBI_OS_MSWIN 6486 if(
error== WSANOTINITIALISED) {
6494 error, strerr ? strerr :
"",
6495(
"%s[LSOCK::Close] " 6504 #ifdef NCBI_OS_MSWIN 6505WSASetEvent(lsock->
event);
6511 #ifdef NCBI_OS_MSWIN 6512WSACloseEvent(lsock->
event);
6525 unsigned short* sender_port)
6535x_msgsize = (msgsize && msgsize < ((1 << 16) - 1))
6536? msgsize : ((1 << 16) - 1);
6538 if(!(x_msg = (x_msgsize <=
bufsize 6539?
buf: (x_msgsize <=
sizeof(w)
6540? w :
malloc(x_msgsize))))) {
6551 structsockaddr_in
in;
6552 structsockaddr_in6 in6;
6555memset(&u, 0,
sizeof(u.sa));
6557u.sa.sa_len = addrlen;
6561 #ifdef NCBI_OS_MSWIN 6569 unsigned shortport;
6573*msglen = (size_t) x_read;
6574 switch(u.sa.sa_family) {
6577port = ntohs(u.in.sin_port);
6580memcpy(&
addr, &u.in6.sin6_addr,
sizeof(
addr));
6581port = ntohs(u.in6.sin6_port);
6584memset(&
addr, 0,
sizeof(
addr));
6590*sender_addr =
addr;
6592*sender_port = port;
6599 if((
size_t) x_read >
bufsize 6602(
size_t)x_read -
bufsize)) {
6604(
"%s[DSOCK::RecvMsg] " 6605 " Message truncated: %lu/%lu",
6607(
unsigned long)
bufsize, (
unsigned long) x_read));
6612memcpy(
buf, x_msg,
6654 error, strerr ? strerr :
"",
6655(
"%s[DSOCK::RecvMsg] " 6656 " Failed recvfrom()",
6665 if(x_msgsize >
bufsize&& x_msg != w)
6673 unsigned shortport,
6686 structsockaddr_in
in;
6687 structsockaddr_in6 in6;
6691status =
s_Write_(sock,
data, datalen, &x_msgsize, 1
);
6694 assert(x_msgsize == datalen);
6706(
"%s[DSOCK::SendMsg] " 6707 " Failed SOCK_gethostbyname(\"%.*s\")",
6712port = sock->
port;
6715 if(!x_msgsize || !port) {
6718(
"%s[DSOCK::SendMsg] " 6719 " Address \"%s\" incomplete, missing %s",
6720 s_ID(sock, w +
sizeof(w)/2), w,
6721port ?
"host": &
"host:port"[x_msgsize ? 5 : 0]));
6735 if(x_msgsize <=
sizeof(w))
6737 else if(!(x_msg =
malloc(x_msgsize)))
6744addrlen = ipv4 ?
sizeof(u.in) :
sizeof(u.in6);
6745memset(&u, 0, addrlen);
6746u.sa.sa_family = ipv4 ? AF_INET : AF_INET6;
6748u.sa.sa_len = addrlen;
6752u.in.sin_port = htons(port);
6754memcpy(&u.in6.sin6_addr, &
addr,
sizeof(u.in6.sin6_addr));
6755u.in6.sin6_port = htons(port);
6763&u.sa, addrlen)) >= 0) {
6771 if((
size_t) x_written != x_msgsize) {
6772sock->
w_status= status = eIO_Closed;
6778(
"%s[DSOCK::SendMsg] " 6779 " Partial datagram sent (%lu out of %lu)%s%s",
6780 s_ID(sock, w +
sizeof(w)/2),
6781(
unsigned long) x_written,
6782(
unsigned long) x_msgsize, *w ?
" to ":
"", w));
6790 #ifdef NCBI_OS_MSWIN 6828 error, strerr ? strerr :
"",
6829(
"%s[DSOCK::SendMsg] " 6830 " Failed sendto(%s)",
6831 s_ID(sock, w +
sizeof(w)/2), w));
6839 if(x_msg && x_msg != w)
6850 #ifndef NCBI_CXX_TOOLKIT 6855 #elif defined(NCBI_OS_UNIX) 6858 # define MAX_TRIGGER_BUF PIPE_SIZE 6860 # define MAX_TRIGGER_BUF 8192 6866 ssize_tx_read = read(trigger->
fd, x_buf,
sizeof(x_buf));
6873 if((
error= errno) == EAGAIN ||
error== EWOULDBLOCK)
6881 #elif defined(NCBI_OS_MSWIN) 6883 switch(WaitForSingleObject(trigger->
fd, 0)) {
6917 #ifndef NCBI_CXX_TOOLKIT 6921 #elif defined(NCBI_OS_UNIX) 6927err = pipe2(fd, O_NONBLOCK | O_CLOEXEC);
6933(
"TRIGGER#%u[?]: [TRIGGER::Create] " 6934 " Cannot create pipe", x_id));
6941 # ifdef F_DUPFD_CLOEXEC 6942fd[2] = fcntl(fd[1], F_DUPFD_CLOEXEC,
FD_SETSIZE);
6949 # if defined(RLIMIT_NOFILE) 6951 if(getrlimit(RLIMIT_NOFILE, &rl) == 0
6955 # elif defined(NCBI_OS_BSD) || defined(NCBI_OS_DARWIN) 6961(
"TRIGGER#%u[?]: [TRIGGER::Create] " 6962 " Failed to dup(%d) to higher fd(%d+)",
6970 # ifdef F_DUPFD_CLOEXEC 6971 assert((fd[2]=fcntl(fd[1],F_GETFD,0))!=-1 && (fd[2] & FD_CLOEXEC));
6975(
"TRIGGER#%u[?]: [TRIGGER::Create] " 6976 " Failed to set close-on-exec", x_id));
6987(
"TRIGGER#%u[?]: [TRIGGER::Create] " 6988 " Failed to set non-blocking mode", x_id));
7002 if(err && err != -1) {
7004(
"TRIGGER#%u[?]: [TRIGGER::Create] " 7005 " Failed to set close-on-exec", x_id));
7008 if(!(*trigger = (
TRIGGER)
calloc(1,
sizeof(**trigger)))) {
7013(*trigger)->fd = fd[0];
7014(*trigger)->id = x_id;
7015(*trigger)->out = fd[1];
7017(*trigger)->log =
log;
7023(
"TRIGGER#%u[%u, %u]: Ready", x_id, fd[0], fd[1]));
7028 #elif defined(NCBI_OS_MSWIN) 7030 HANDLE event= WSACreateEvent();
7032 DWORDerr = GetLastError();
7035err, strerr ? strerr :
"",
7036(
"TRIGGER#%u: [TRIGGER::Create] " 7037 " Cannot create event object", x_id));
7041 if(!(*trigger = (
TRIGGER)
calloc(1,
sizeof(**trigger)))) {
7042WSACloseEvent(event);
7045(*trigger)->fd = event;
7046(*trigger)->id = x_id;
7048(*trigger)->log =
log;
7054(
"TRIGGER#%u: Ready", x_id));
7060 # error "Unsupported platform" 7070 #ifndef NCBI_CXX_TOOLKIT 7079(
"TRIGGER#%u[%u]: Closing", trigger->
id, trigger->
fd));
7082 # if defined(NCBI_OS_UNIX) 7088 # elif defined(NCBI_OS_MSWIN) 7090WSACloseEvent(trigger->
fd);
7106 #ifndef NCBI_CXX_TOOLKIT 7110 #elif defined(NCBI_OS_UNIX) 7113 if(write(trigger->
out,
"", 1) < 0 && errno != EAGAIN)
7119 #elif defined(NCBI_OS_MSWIN) 7139trigger->
isset.
ptr= (
void*) 1
;
7146 returnstatus ==
eIO_Timeout? eIO_Closed : status;
7161 #if defined(NCBI_OS_UNIX) 7163trigger->
isset.
ptr= (
void*) 0
;
7165 #elif defined(NCBI_OS_MSWIN) 7167 if(!WSAResetEvent(trigger->
fd))
7183 unsigned shortbacklog,
7193 unsigned shortbacklog,
7204 unsigned shortbacklog,
7215 unsigned shortbacklog,
7227 unsigned shortbacklog,
7232 if(!path || !*path)
7279 if(!handle || handle_size !=
sizeof(lsock->
sock)) {
7281(
"LSOCK#%u[%u]: [LSOCK::GetOSHandle] " 7282 " Invalid handle%s %lu",
7283lsock->
id, (
unsigned int) lsock->
sock,
7284handle ?
" size":
"",
7285handle ? (
unsigned long) handle_size : 0UL));
7291memcpy(handle, &fd, handle_size);
7295memcpy(handle, &fd, handle_size);
7297status = eIO_Closed;
7320 unsigned shortport;
7327 unsigned int* host,
7328 unsigned short* port,
7337 unsigned short* port,
7366 unsigned shortport,
7383 unsigned shortport,
7392 unsigned shortport,
7400memset(&
init, 0,
sizeof(
init));
7416 if(!path || !*path)
7418 #ifndef NCBI_OS_UNIX 7423memset(&
init, 0,
sizeof(
init));
7465memset(&
init, 0,
sizeof(
init));
7475 unsigned shortport,
7482(
"%s[SOCK::Reconnect] " 7483 " Datagram socket",
7490 if(sock->
path[0] && (host || port)) {
7492(
"%s[SOCK::Reconnect] " 7493 " Unable to reconnect UNIX socket as INET at \"%s:%hu\"",
7494 s_ID(sock, _id), host ? host :
"", port));
7503(
"%s[SOCK::Reconnect] " 7504 " Attempt to reconnect server-side socket as" 7505 " client one to its peer address",
7527 return s_Connect(sock, host, port, timeout);
7539(
"%s[SOCK::Shutdown] " 7546(
"%s[SOCK::Shutdown] " 7547 " Datagram socket",
7554(
"%s[SOCK::Shutdown] " 7555 " Invalid direction #%u",
7556 s_ID(sock, _id), (
unsigned int) dir));
7564memset(&
info, 0,
sizeof(
info));
7577 info.status = status;
7591status = eIO_Closed;
7633 if(!handle || handle_size !=
sizeof(sock->
sock)) {
7636(
"%s[SOCK::GetOSHandle] " 7637 " Invalid handle%s %lu",
7639handle ?
" size":
"",
7640handle ? (
unsigned long) handle_size : 0UL));
7646memcpy(handle, &fd, handle_size);
7650memcpy(handle, &fd, handle_size);
7652status = eIO_Closed;
7678 if(!handle || handle_size !=
sizeof(fd))
7681memcpy(&fd, handle,
sizeof(fd));
7688setsockopt(fd, SOL_SOCKET, SO_LINGER, (
char*) &
lgr,
sizeof(
lgr));
7692setsockopt(fd, IPPROTO_TCP, TCP_LINGER2, (
char*) &no,
sizeof(no));
7707 #ifdef NCBI_OS_MSWIN 7708 if(
error== WSANOTINITIALISED) {
7717status = eIO_Closed;
7774 if(sock->
r_status== eIO_Closed) {
7776(
"%s[SOCK::Wait(R)] " 7777 " Socket already %s",
7778 s_ID(sock, _id), sock->
eof?
"closed":
"shut down"));
7788 if(sock->
w_status== eIO_Closed) {
7790(
"%s[SOCK::Wait(W)] " 7791 " Socket already shut down",
7800 if((sock->
r_status== eIO_Closed || sock->
eof) &&
7802 if(sock->
r_status== eIO_Closed) {
7804(
"%s[SOCK::Wait(RW)] " 7805 " Socket already shut down",
7810 if(sock->
r_status== eIO_Closed || sock->
eof) {
7811 if(sock->
r_status== eIO_Closed) {
7813(
"%s[SOCK::Wait(RW)] " 7814 " Socket already %s",
7816?
"closed":
"shut down for reading"));
7821 if(sock->
w_status== eIO_Closed) {
7823(
"%s[SOCK::Wait(RW)] " 7824 " Socket already shut down for writing",
7834 " Invalid event #%u",
7835 s_ID(sock, _id), (
unsigned int) event));
7841status =
s_Wait(sock, event, timeout);
7845memset(&
info, 0,
sizeof(
info));
7857 info.event = event;
7858 info.status = status;
7881g_MONKEY_Poll(&
n, &polls, &mnk_status);
7895 for(
i= 0;
i<
n; ++
i) {
7898 if(!(sock = polls[
i].sock) || !(event = polls[
i].event)) {
7925&& (sock->
r_status== eIO_Closed || sock->
eof)) ||
7927&& sock->
w_status== eIO_Closed)) {
7943 for(
i= 0;
i<
n; ++
i) {
7951 if(orig_polls != polls) {
7953 size_torig_iter, new_iter;
7954 for(orig_iter = 0; orig_iter < orig_n; ++orig_iter) {
7955 for(new_iter = 0; new_iter <
n; ++new_iter) {
7956 if(orig_polls[orig_iter].sock == polls[new_iter].sock) {
7957orig_polls[orig_iter] = polls[new_iter];
7966 if(mnk_status != -1)
7967status = mnk_status;
8002(
"%s[SOCK::SetTimeout] " 8003 " Invalid event #%u",
8004 s_ID(sock, _id), (
unsigned int) event));
8024 if(sock->
r_tv.tv_sec > sock->
w_tv.tv_sec)
8026 if(sock->
w_tv.tv_sec > sock->
r_tv.tv_sec)
8029 returnsock->
r_tv.tv_usec > sock->
w_tv.tv_usec
8043(
"%s[SOCK::GetTimeout] " 8044 " Invalid event #%u",
8045 s_ID(sock, _id), (
unsigned int) event));
8074x_buf = (
char*)
buf;
8078status =
s_Read(sock, x_buf,
8079 size, &xx_read, 0
);
8090 " Unsupported read method #%u",
8091 s_ID(sock, _id), (
unsigned int) how));
8112 #define s_Pushback(s, d, n) BUF_Pushback(&(s)->r_buf, d, n) 8120 unsigned intcr_seen,
done;
8127 if(!
size|| !line) {
8133(
"%s[SOCK::ReadLine] " 8140cr_seen =
done= 0
;
8144 char* x_buf =
size-
len<
sizeof(w) - cr_seen ? w : line +
len;
8146 x_size=
sizeof(w) - cr_seen;
8162line[
len++] =
'\r';
8186(
"%s[SOCK::ReadLine] " 8187 " Cannot pushback extra CR",
8203(
"%s[SOCK::ReadLine] " 8204 " Cannot pushback extra data (%lu byte%s)",
8217line[
len] =
'\0';
8236(
"%s[SOCK::Pushback] " 8249 switch(direction) {
8290 const char* x_data;
8295(
"%s[SOCK::Write] " 8296 " OOB not supported for datagrams",
8311x_data = (
const char*)
data;
8314status =
s_Write(sock, x_data,
8315 size, &xx_written, 0);
8316x_written += xx_written;
8317x_data += xx_written;
8324(
"%s[SOCK::Write] " 8325 " Unsupported write method #%u",
8326 s_ID(sock, _id), (
unsigned int) how));
8334(
"%s[SOCK::Write] " 8337status = eIO_Closed;
8342*n_written = x_written;
8353(
"%s[SOCK::Abort] " 8360(
"%s[SOCK::Abort] " 8361 " Datagram socket",
8375 unsigned shortport;
8381 if(sock->
path[0])
8385 if(trueport || !sock->
myport) {
8403 unsigned int* host,
8404 unsigned short* port,
8417? ntohl(x_host) : x_host;
8421? sock->
port: ntohs(sock->
port);
8428 unsigned short* port,
8433memset(
addr, 0,
sizeof(*
addr));
8443? sock->
port: ntohs(sock->
port);
8451 unsigned shortport;
8479memcpy(
buf, path,
len+ 1);
8493 if((
len= (
size_t) sprintf(port,
"%hu", sock->
port)) <
bufsize)
8494memcpy(
buf, port,
len+ 1);
8553(
"%s[SOCK::DisableOSSendDelay] " 8560(
"%s[SOCK::DisableOSSendDelay] " 8561 " Datagram socket",
8568 if(setsockopt(sock->
sock, IPPROTO_TCP, TCP_NODELAY,
8569(
char*) &on_off,
sizeof(on_off)) != 0) {
8573 error, strerr ? strerr :
"",
8574(
"%s[SOCK::DisableOSSendDelay] " 8575 " Failed setsockopt(%sTCP_NODELAY)",
8576 s_ID(sock, _id), on_off ?
"":
"!"));
8593(
"%s[SOCK::SetCork] " 8600(
"%s[SOCK::SetCork] " 8601 " Datagram socket",
8607 #if defined(TCP_CORK) && !defined(NCBI_OS_CYGWIN) 8608 if(setsockopt(sock->
sock, IPPROTO_TCP, TCP_CORK,
8609(
char*) &on_off,
sizeof(on_off)) != 0) {
8613 error, strerr ? strerr :
"",
8614(
"%s[SOCK::SetCork] " 8615 " Failed setsockopt(%sTCP_CORK)",
8616 s_ID(sock, _id), on_off ?
"":
"!"));
8622(void) send(sock->
sock, _id
, 0, 0);
8641 #ifdef NCBI_OS_MSWIN 8656 #ifdef SOCK_NONBLOCK 8657 type|= SOCK_NONBLOCK;
8661 type|= SOCK_CLOEXEC;
8669 error, strerr ? strerr :
"",
8670(
"DSOCK#%u[?]: [DSOCK::Create] " 8671 " Cannot create socket",
8677 #if defined(NCBI_OS_MSWIN) 8678 if(!(event = WSACreateEvent())) {
8679 DWORDerr = GetLastError();
8682err, strerr ? strerr :
"",
8683(
"DSOCK#%u[%u]: [DSOCK::Create] " 8684 " Failed to create IO event",
8685x_id, (
unsigned int) fd));
8691 if(WSAEventSelect(fd, event, SOCK_EVENTS) != 0) {
8694 error, strerr ? strerr :
"",
8695(
"DSOCK#%u[%u]: [DSOCK::Create] " 8696 " Failed to bind IO event",
8697x_id, (
unsigned int) fd));
8700WSACloseEvent(event);
8703 #elif !defined(SOCK_NONBLOCK) 8708 error, strerr ? strerr :
"",
8709(
"DSOCK#%u[%u]: [DSOCK::Create] " 8710 " Cannot set socket to non-blocking mode",
8711x_id, (
unsigned int) fd));
8718 if(!(x_sock = (
SOCK)
calloc(1,
sizeof(*x_sock)))) {
8720 #ifdef NCBI_OS_MSWIN 8721WSACloseEvent(event);
8735 #ifdef NCBI_OS_MSWIN 8736x_sock->
event= event;
8744 #ifndef SOCK_CLOEXEC 8746 const char* strerr;
8748 # ifdef NCBI_OS_MSWIN 8749 DWORDerr = GetLastError();
8757 error, strerr ? strerr :
"",
8758(
"%s[DSOCK::Create] Cannot set" 8759 " socket close-on-exec mode",
8760 s_ID(*sock, _id)));
8761 # ifdef NCBI_OS_MSWIN 8785 unsigned shortport,
8792 structsockaddr_in
in;
8793 structsockaddr_in6 in6;
8800(
"%s[DSOCK::Bind] " 8807(
"%s[DSOCK::Bind] " 8808 " Not a datagram socket",
8831 assert(family == AF_INET || family == AF_INET6);
8832addrlen = family == AF_INET6 ?
sizeof(u.in6) :
sizeof(u.in);
8834memset(&u, 0, addrlen);
8835u.sa.sa_family = family;
8837u.sa.sa_len = addrlen;
8839 if(family == AF_INET) {
8841u.in.sin_port = htons(port);
8843u.in6.sin6_port = htons(port);
8844 if(bind(sock->
sock, &u.sa, addrlen) != 0) {
8854 error, strerr ? strerr :
"",
8855(
"%s[DSOCK::Bind] " 8856 " Failed bind(:%hu)",
8857 s_ID(sock, _id), port));
8862 assert(u.sa.sa_family == family);
8863 error= getsockname(sock->
sock, &u.sa, &addrlen) != 0
8866 switch(u.sa.sa_family) {
8868port = htons(u.in.sin_port);
8871port = htons(u.in6.sin6_port);
8878 if(
error|| !port) {
8881 error, strerr ? strerr :
"",
8882(
"%s[DSOCK::Bind] " 8883 " Cannot obtain a free socket port",
8901 unsigned shortport)
8909 unsigned shortport)
8914 structsockaddr_in
in;
8915 structsockaddr_in6 in6;
8923(
"%s[DSOCK::Connect] " 8930(
"%s[DSOCK::Connect] " 8931 " Not a datagram socket",
8947 if(!host != !port) {
8950sprintf(addrstr,
":%hu", port);
8954(
"%s[DSOCK::Connect] " 8955 " Address \"%.*s%s\" incomplete, missing %s",
8957addrstr, port ?
"host":
"port"));
8961memset(&
addr, 0,
sizeof(
addr));
8964(
"%s[DSOCK::Connect] " 8965 " Failed SOCK_gethostbyname(\"%.*s\")",
8974addrlen = ipv4 ?
sizeof(u.in) :
sizeof(u.in6);
8975memset(&u, 0, addrlen);
8976u.sa.sa_family = ipv4 ? AF_INET : AF_INET6;
8979u.in.sin_port = htons(port);
8981memcpy(&u.in6.sin6_addr, &
addr,
sizeof(u.in6.sin6_addr));
8982u.in6.sin6_port = htons(port);
8985addrlen =
sizeof(u.sa);
8986memset(&u, 0, addrlen);
8987u.sa.sa_family = AF_UNSPEC;
8990u.sa.sa_len = addrlen;
8992 if(connect(sock->
sock, &u.sa, addrlen) != 0) {
8995 if(port | sock->
port) {
8998port ? port : sock->
port,
8999addrstr,
sizeof(addrstr));
9003 error, strerr ? strerr :
"",
9004(
"%s[DSOCK::Connect] " 9005 " Failed %sconnect%s%s",
9006 s_ID(sock, _id), port ?
"":
"to dis",
9007!*addrstr ?
"": port ?
" to ":
" from ",
9008!*addrstr ? addrstr :
" (not connected)"));
9033(
"%s[DSOCK::WaitMsg] " 9040(
"%s[DSOCK::WaitMsg] " 9041 " Not a datagram socket",
9054status = eIO_Closed;
9059memset(&
info, 0,
sizeof(
info));
9066 info.status = status;
9079 unsigned short* sender_port)
9087memset(sender_addr, 0,
sizeof(*sender_addr));
9093(
"%s[DSOCK::RecvMsg] " 9100(
"%s[DSOCK::RecvMsg] " 9101 " Not a datagram socket",
9108sender_addr, sender_port);
9112memset(&
info, 0,
sizeof(
info));
9119 info.status = status;
9131 unsigned int* sender_addr,
9132 unsigned short* sender_port)
9136&
addr, sender_port);
9145 unsigned shortport,
9154(
"%s[DSOCK::SendMsg] " 9161(
"%s[DSOCK::SendMsg] " 9162 " Not a datagram socket",
9174memset(&
info, 0,
sizeof(
info));
9182 info.port = port ? port : sock->
port;
9184 info.status = status;
9199(
"%s[DSOCK::WipeMsg] " 9206(
"%s[DSOCK::WipeMsg] " 9207 " Not a datagram socket",
9213 switch(direction) {
9226(
"%s[DSOCK::WipeMsg] " 9227 " Invalid direction #%u",
9228 s_ID(sock, _id), (
unsigned int) direction));
9245(
"%s[DSOCK::SetBroadcast] " 9252(
"%s[DSOCK::SetBroadcast] " 9253 " Not a datagram socket",
9259 #if defined(NCBI_OS_UNIX) || defined(NCBI_OS_MSWIN) 9262 # ifdef NCBI_OS_MSWIN 9263 BOOLbcast = !!on_off;
9265 intbcast = !!on_off;
9267 if(setsockopt(sock->
sock, SOL_SOCKET, SO_BROADCAST,
9268(
char*) &bcast,
sizeof(bcast)) != 0) {
9272 error, strerr ? strerr :
"",
9273(
"%s[DSOCK::SetBroadcast] " 9274 " Failed setsockopt(%sBROADCAST)",
9275 s_ID(sock, _id), bcast ?
"":
"NO"));
9291 switch(direction) {
9293 returnsock->
n_in;
9295 returnsock->
n_out;
9347 error, strerr ? strerr :
"",
9348(
"%s[SOCK::SetReuseAddress] " 9349 " Failed setsockopt(%sREUSEADDR)",
9350 s_ID(sock, _id), on_off ?
"":
"NO"));
9432 switch(direction) {
9454 switch(direction) {
9472 switch(direction) {
9562 const unsigned char*
b= (
const unsigned char*) &host;
9563 int len= sprintf(x_buf,
"%u.%u.%u.%u",
b[0],
b[1],
b[2],
b[3]);
9566memcpy(
buf, x_buf, (
size_t)
len+ 1);
9590 val= strtoul(
str, &end, 0);
9591 if(errno ||
str== end)
9593 if(fullquad && *
str==
'0'&& (
size_t)(end -
str) > 1)
9606(!fullquad || dots == 3) &&
val<= (0xFFFFFFFFUL >> (dots << 3));
9623 returnend && !*end;
9635 returnhtonl(
value);
9641 returnhtons(
value);
9647 returnhtonl(
value);
9653 returnhtons(
value);
9811memset(loop->
octet, 0,
sizeof(loop->
octet) - 1);
9812loop->
octet[
sizeof(loop->
octet) - 1] = 1;
9826 unsigned int addr= ntohl(
ip);
9827 #if defined(IN_CLASSA) && defined(IN_CLASSA_NET) && defined(IN_CLASSA_NSHIFT) 9828 returnIN_CLASSA(
addr)
9844 if(
addr->octet[
sizeof(
addr->octet) - 1] != 1)
9851 unsigned int* host,
9852 unsigned short* port,
9864 unsigned int* host,
9865 unsigned short* port)
9873 unsigned short* port)
9880 unsigned shortport,
9891 unsigned shortport,
9915mess =
"Cannot reset SSL while it is in use";
9917mess = (
const char*)(-1L)
;
9919mess =
"Conflicting SSL auto-setup";
9926mess == (
const char*)(-1L)
9928mess == (
const char*)(-1L)
9929?
"Conflicting SSL setup ignored" 9971 #ifdef NCBI_OS_MSWIN 9977 if(timespec_get(&ts, TIME_UTC) == TIME_UTC) {
9978tp->tv_sec = (long) ts.tv_sec;
9979tp->tv_usec = (
long)(ts.tv_nsec / 1000);
9982 static constULONGLONG EPOCH = 11644473600L;
9985ULARGE_INTEGER time;
9987 # if _WIN32_WINNT >= _WIN32_WINNT_WIN8 9988GetSystemTimePreciseAsFileTime(&systime);
9990GetSystemTimeAsFileTime(&systime);
9993time.LowPart = systime.dwLowDateTime;
9994time.HighPart = systime.dwHighDateTime;
9996tp->tv_sec = (long)(time.QuadPart / 10000000 - EPOCH);
9997tp->tv_usec = (long)(time.QuadPart % 10000000) / 10;
std::ofstream out("events_result.xml")
main entry point for tests
static void DLIST_NAME() init(DLIST_LIST_TYPE *list)
static void DLIST_NAME() remove(DLIST_LIST_TYPE *list, DLIST_TYPE *item)
static const char * str(char *buf, int n)
#define poll(fds, nfds, timeout)
#define getnameinfo(a, b, c, d, e, f, g)
#define getaddrinfo(n, s, h, r)
@ eTakeOwnership
An object can take ownership of another.
@ eNoOwnership
No ownership is assumed.
int BUF_Write(BUF *pBuf, const void *data, size_t size)
size_t BUF_SetChunkSize(BUF *pBuf, size_t chunk_size)
int BUF_AppendEx(BUF *pBuf, void *base, size_t alloc_size, void *data, size_t size)
size_t BUF_Read(BUF buf, void *data, size_t size)
int BUF_Splice(BUF *dst, BUF src)
size_t BUF_Peek(BUF buf, void *data, size_t size)
size_t BUF_PeekAtCB(BUF buf, size_t pos, size_t(*callback)(void *cbdata, const void *buf, size_t size), void *cbdata, size_t size)
void BUF_Destroy(BUF buf)
void LSOCK_GetListeningAddress6(LSOCK lsock, TNCBI_IPv6Addr *addr, unsigned short *port, ENH_ByteOrder byte_order)
EIO_Status LSOCK_CreateUNIX(const char *path, unsigned short backlog, LSOCK *lsock, TSOCK_Flags flags)
TRIGGER POLLABLE_ToTRIGGER(POLLABLE poll)
TNCBI_IPv6Addr * SOCK_gethostbyname6(TNCBI_IPv6Addr *addr, const char *host)
Same as SOCK_gethostbynameEx6(,,<current API data logging>)
LSOCK POLLABLE_ToLSOCK(POLLABLE poll)
const char * SOCK_StringToHostPort(const char *str, unsigned int *host, unsigned short *port)
Read (skipping leading blanks) "[host][:port]" from a string stopping at either EOL or a blank charac...
void SOCK_GetPeerAddress(SOCK sock, unsigned int *host, unsigned short *port, ENH_ByteOrder byte_order)
Get host and port of the socket's peer (remote end).
char * SOCK_GetPeerAddressStringEx(SOCK sock, char *buf, size_t bufsize, ESOCK_AddressFormat format)
Get textual representation of the socket's peer.
int SOCK_isipEx(const char *str, int fullquad)
Check whether a given string represents a valid bare IPv4 address.
ESwitch SOCK_SetReadOnWrite(SOCK sock, ESwitch on_off)
Control the reading-while-writing feature for socket "sock" individually.
EIO_Status TRIGGER_Set(TRIGGER trigger)
Set an event trigger.
size_t SOCK_HostPortToString6(const TNCBI_IPv6Addr *addr, unsigned short port, char *buf, size_t size)
IPv6-aware version of SOCK_HostPortToString, which can handle both IPv4 and IPv6.
int SOCK_IsSecure(SOCK sock)
Check whether a socket is using SSL (Secure Socket Layer).
EIO_Status SOCK_SetTimeout(SOCK sock, EIO_Event event, const STimeout *timeout)
Specify timeout for the connection I/O (see SOCK_[Read|Write|Close]()).
void SOCK_DisableOSSendDelay(SOCK sock, int on_off)
Control OS-defined send strategy by disabling/enabling the TCP Nagle algorithm (which is on by defaul...
unsigned int SOCK_HostToNetLong(unsigned int value)
See man for the BSDisms, htonl() and htons().
EIO_Status SOCK_Shutdown(SOCK sock, EIO_Event dir)
Shutdown the connection in only one direction (specified by "direction").
unsigned short SOCK_GetRemotePort(SOCK sock, ENH_ByteOrder byte_order)
Get remote port of the socket (the port it is connected to).
EIO_Event event
[in] SOCK to poll (NULL if not to poll)
EIO_Status SOCK_Close(SOCK sock)
Close the SOCK handle, and destroy all relevant internal data.
int SOCK_IsAddress(const char *str)
Check whether a given string represents a bare IP address.
size_t SOCK_HostPortToString(unsigned int host, unsigned short port, char *buf, size_t size)
Print numeric string "host:port" into a buffer provided, not to exceed 'bufsize' bytes (including the...
EIO_Status DSOCK_SetBroadcast(SOCK sock, int on_off)
Set a datagram socket for broadcast.
EIO_Status LSOCK_Accept(LSOCK lsock, const STimeout *timeout, SOCK *sock)
[SERVER-side] Accept connection from a client.
EIO_Status LSOCK_Create6(unsigned short port, unsigned short backlog, LSOCK *lsock, ESwitch ipv6)
[SERVER-side] Create and initialize the server-side(listening) socket Same as LSOCK_CreateEx6() calle...
EIO_Status DSOCK_RecvMsg(SOCK sock, void *buf, size_t bufsize, size_t msgsize, size_t *msglen, unsigned int *sender_addr, unsigned short *sender_port)
Same as DSOCK_RecvMsg6() but only suitable for IPv4 sender address.
void(* FSOCK_ErrHook)(const SSOCK_ErrInfo *info, void *data)
const char * SOCK_SSLName(void)
Return an SSL provider name (in a const static storage), with special considerations: return NULL if ...
EIO_Status DSOCK_Connect(SOCK sock, const char *host, unsigned short port)
Associate a datagram socket with a destination address.
ESwitch SOCK_SetReuseAddressAPI(ESwitch on_off)
Control address reuse for socket addresses taken by the API.
const char * SOCK_gethostbyaddr(unsigned int host, char *buf, size_t bufsize)
Same as SOCK_gethostbyaddrEx(,,<current API data logging>)
EIO_Status SOCK_Read(SOCK sock, void *buf, size_t size, size_t *n_read, EIO_ReadMethod how)
Read/peek up to "size" bytes from "sock" to a buffer pointed to by "buf".
ESwitch SOCK_SetInterruptOnSignal(SOCK sock, ESwitch on_off)
Control restartability of I/O interrupted by signals on a per-socket basis.
EIO_Status SOCK_Status(SOCK sock, EIO_Event direction)
Return low-level socket I/O status of *last* socket operation.
EIO_Status SOCK_CloseOSHandle(const void *handle, size_t handle_size)
Close socket OS handle (ungracefully aborting the connection if necessary).
TNCBI_IPv6Addr * SOCK_gethostbynameEx6(TNCBI_IPv6Addr *addr, const char *host, ESwitch log)
Find and return an Internet address of a named host.
unsigned int SOCK_gethostbynameEx(const char *host, ESwitch log)
Find and return IPv4 address of a named host.
EIO_Status POLLABLE_Poll(size_t n, SPOLLABLE_Poll polls[], const STimeout *timeout, size_t *n_ready)
Poll for I/O readiness.
EIO_Status TRIGGER_Reset(TRIGGER trigger)
Reset the trigger.
EIO_Status SOCK_InitializeAPI(void)
Initialize all internal/system data & resources to be used by the SOCK API.
unsigned int SOCK_htonl(unsigned int value)
int SOCK_gethostname(char *buf, size_t bufsize)
Same as SOCK_gethostnameEx(,,<current API data logging>)
void SOCK_SetupSSL(FSSLSetup setup)
Store SSL setup callback until actual initialization.
POLLABLE POLLABLE_FromSOCK(SOCK sock)
void SOCK_SetCork(SOCK sock, int on_off)
Control OS-defined send strategy by disabling/enabling the TCP layer to send incomplete network frame...
void SOCK_AllowSigPipeAPI(void)
By default (on UNIX platforms) the SOCK API functions automagically call "signal(SIGPIPE,...
ENH_ByteOrder
Network and host byte order enumeration type.
ESOCK_Type POLLABLE_What(POLLABLE poll)
Identifies a non-NULL POLLABLE.
EIO_Status SOCK_CloseEx(SOCK sock, int destroy)
Close the SOCK handle, and conditionally destroy relevant internal data.
void SOCK_SetApproveHookAPI(FSOCK_ApproveHook hook, void *data)
The hook is installed when non-NULL, and de-installed otherwise.
ESOCK_IOWaitSysAPI SOCK_SetIOWaitSysAPI(ESOCK_IOWaitSysAPI api)
This is a helper call that can improve I/O performance (ignored for MSVC).
unsigned int SOCK_GetLoopbackAddress(void)
Get IPv4 loopback address.
int SOCK_IsServerSide(SOCK sock)
Check whether a socket is server-side.
EIO_Status DSOCK_RecvMsg6(SOCK sock, void *buf, size_t bufsize, size_t msgsize, size_t *msglen, TNCBI_IPv6Addr *sender_addr, unsigned short *sender_port)
Receive a datagram from a datagram socket.
unsigned short SOCK_HostToNetShort(unsigned short value)
See man for the BSDisms, htonl() and htons().
ESOCK_Side
Sides of socket.
void SOCK_GetPeerAddress6(SOCK sock, TNCBI_IPv6Addr *addr, unsigned short *port, ENH_ByteOrder byte_order)
Get host and port of the socket's peer (remote end).
EIO_Status LSOCK_CreateEx6(unsigned short port, unsigned short backlog, LSOCK *lsock, TSOCK_Flags flags, ESwitch ipv6)
[SERVER-side] Create and initialize the server-side(listening) socket (socket() + bind() + listen())
int SOCK_IsLoopbackAddress(unsigned int ip)
Check whether an address is a loopback one.
TNCBI_BigCount SOCK_GetPosition(SOCK sock, EIO_Event direction)
Get current read or write position within a socket.
unsigned int SOCK_gethostbyname(const char *host)
Same as SOCK_gethostbynameEx(,<current API data logging>)
void SOCK_SetErrHookAPI(FSOCK_ErrHook hook, void *data)
EIO_Status SOCK_Pushback(SOCK sock, const void *data, size_t size)
Push the specified data back to the socket's input queue (in the socket's internal read buffer).
EIO_Status SOCK_Wait(SOCK sock, EIO_Event event, const STimeout *timeout)
Block on the socket until either the specified "event" is available or "timeout" expires (if "timeout...
EIO_Status SOCK_CreateEx(const char *host, unsigned short port, const STimeout *timeout, SOCK *sock, const void *data, size_t size, TSOCK_Flags flags)
[CLIENT-side] Connect client to another(server-side, listening) socket (socket() + connect() [+ selec...
ESwitch SOCK_SetDataLoggingAPI(ESwitch log)
By default data are not logged.
EIO_Status SOCK_Abort(SOCK sock)
If there is outstanding connection or output data pending, cancel it.
EIO_Status SOCK_GetOSHandleEx(SOCK sock, void *handle, size_t handle_size, EOwnership ownership)
Get an OS-dependent native socket handle to use by platform-specific API.
EIO_Status LSOCK_AcceptEx(LSOCK lsock, const STimeout *timeout, SOCK *sock, TSOCK_Flags flags)
[SERVER-side] Accept connection from a client.
TNCBI_IPv6Addr * SOCK_GetLoopbackAddress6(TNCBI_IPv6Addr *loop)
Get loopback address.
int SOCK_ntoa(unsigned int host, char *buf, size_t bufsize)
Convert IP address to a string in dotted notation.
EIO_Status TRIGGER_Create(TRIGGER *trigger, ESwitch log)
Create an event trigger.
ESwitch SOCK_SetReadOnWriteAPI(ESwitch on_off)
By default, sockets will not try to read data from inside SOCK_Write().
ESOCK_IOWaitSysAPI
Selector of I/O wait system API: auto, poll(), or select().
EIO_Status DSOCK_Create(SOCK *sock)
Same as DSOCK_CreateEx(, fSOCK_LogDefault)
unsigned int SOCK_GetLocalHostAddress(ESwitch reget)
Same as SOCK_GetLocalHostAddress6() only strictly for IPv4.
EIO_Status TRIGGER_Close(TRIGGER trigger)
Close an event trigger.
TNCBI_IPv6Addr * SOCK_GetLocalHostAddress6(TNCBI_IPv6Addr *addr, ESwitch reget)
Get (and cache for faster follow-up retrievals) IP address of local host.
EIO_Status SOCK_ReadLine(SOCK sock, char *line, size_t size, size_t *n_read)
Read a line from SOCK.
int SOCK_IsDatagram(SOCK sock)
Check whether a socket is a datagram one.
EIO_Status LSOCK_GetOSHandle(LSOCK lsock, void *handle, size_t handle_size)
Same as LSOCK_GetOSHandleEx(lsock, handle_buf, handle_size, eNoOwnership).
int SOCK_isip6(const char *str)
Check whether a given string represents a valid bare IPv6 address.
ESwitch SOCK_SetIPv6API(ESwitch ipv6)
Select IPv6 as the underlying IP protocol.
char * LSOCK_GetListeningAddressString(LSOCK lsock, char *buf, size_t bufsize)
Equivalent to LSOCK_GetListeningAddressStringEx(.,.,.,eSAF_Full)
EIO_Status SOCK_Write(SOCK sock, const void *data, size_t size, size_t *n_written, EIO_WriteMethod how)
Write "size" bytes of "data" to "sock".
EIO_Status DSOCK_WaitMsg(SOCK sock, const STimeout *timeout)
Wait for a datagram in a datagram socket.
TNCBI_BigCount SOCK_GetTotalCount(SOCK sock, EIO_Event direction)
Get the total volume of data transferred by a socket.
char * LSOCK_GetListeningAddressStringEx(LSOCK lsock, char *buf, size_t bufsize, ESOCK_AddressFormat format)
const char * SOCK_gethostbyaddrEx6(const TNCBI_IPv6Addr *addr, char *buf, size_t bufsize, ESwitch log)
Take an Internet address (IPv6 or IPv4) [or 0 (or empty) for current host], and fill in the provided ...
EIO_Status SOCK_Reconnect(SOCK sock, const char *host, unsigned short port, const STimeout *timeout)
[CLIENT-side] Close the socket referred to by "sock" and then connect it to another "host:port"; fail...
int SOCK_gethostnameEx(char *buf, size_t bufsize, ESwitch log)
Get the local host name.
int SOCK_IsClientSide(SOCK sock)
Check whether a socket is client-side.
EIO_Status DSOCK_SendMsg(SOCK sock, const char *host, unsigned short port, const void *data, size_t datalen)
Send a datagram to a datagram socket.
void LSOCK_GetListeningAddress(LSOCK lsock, unsigned int *host, unsigned short *port, ENH_ByteOrder byte_order)
char * SOCK_GetPeerAddressString(SOCK sock, char *buf, size_t bufsize)
Equivalent to SOCK_GetPeerAddressStringEx(.,.,.,eSAF_Full)
EIO_Status LSOCK_CreateEx(unsigned short port, unsigned short backlog, LSOCK *lsock, TSOCK_Flags flags)
Same as LSOCK_CreateEx6(,,,, eOff)
EIO_Status LSOCK_GetOSHandleEx(LSOCK lsock, void *handle, size_t handle_size, EOwnership ownership)
Get an OS-dependent native socket handle to use by platform-specific API.
struct TRIGGER_tag * TRIGGER
EIO_Status TRIGGER_IsSet(TRIGGER trigger)
Check whether the trigger has been set.
unsigned short SOCK_htons(unsigned short value)
int SOCK_IsUNIX(SOCK sock)
Check whether a socket is UNIX type.
EIO_Status SOCK_SetupSSLEx(FSSLSetup setup)
Take SSL setup callback, and then init the entire API (SOCK + SSL).
TNCBI_BigCount DSOCK_GetMessageCount(SOCK sock, EIO_Event direction)
Get message count.
EIO_Status SOCK_ShutdownAPI(void)
Cleanup; destroy all internal/system data & resources used by the SOCK API.
ESwitch SOCK_SetDataLogging(SOCK sock, ESwitch log)
Control the data logging for socket "sock" individually.
void SOCK_SetReuseAddress(SOCK sock, int on_off)
Control reuse of socket addresses on per-socket basis Note: only a boolean parameter value is can be ...
EIO_Status DSOCK_CreateEx(SOCK *sock, TSOCK_Flags flags)
Create a datagram socket.
EIO_Status LSOCK_Create(unsigned short port, unsigned short backlog, LSOCK *lsock)
Same as LSOCK_Create6(,,, eOff) or LSOCK_CreateEx(,,, eDefault)
const char * SOCK_StringToHostPort6(const char *str, TNCBI_IPv6Addr *addr, unsigned short *port)
unsigned short LSOCK_GetPort(LSOCK lsock, ENH_ByteOrder byte_order)
Get socket port number, which it listens on.
POLLABLE POLLABLE_FromLSOCK(LSOCK lsock)
const char * SOCK_gethostbyaddr6(const TNCBI_IPv6Addr *addr, char *buf, size_t bufsize)
Same as SOCK_gethostbyaddrEx6(,,<current API data logging>)
const char * SOCK_gethostbyaddrEx(unsigned int host, char *buf, size_t bufsize, ESwitch log)
Take an IPv4 address (in network byte order) [or 0 for current host], and fill in the provided buffer...
EIO_Status DSOCK_Bind(SOCK sock, unsigned short port)
Same as DSOCK_Bind6(,, eOff)
EIO_Status SOCK_Create(const char *host, unsigned short port, const STimeout *timeout, SOCK *sock)
[CLIENT-side] Connect client to another(server-side, listening) socket (socket() + connect() [+ selec...
POLLABLE POLLABLE_FromTRIGGER(TRIGGER trigger)
Conversion utilities from handles to POLLABLEs, and back.
int SOCK_IsLoopbackAddress6(const TNCBI_IPv6Addr *addr)
Check whether an address is a loopback one.
size_t SOCK_OSHandleSize(void)
Get size of OS-dependent native socket handle.
EIO_Status DSOCK_Bind6(SOCK sock, unsigned short port, ESwitch ipv6)
Assosiate a datagram socket with a local port.
EIO_Status LSOCK_Close(LSOCK lsock)
[SERVER-side] Close the listening socket, destroy relevant internal data.
struct SPOLLABLE_tag * POLLABLE
EIO_Status SOCK_CreateOnTop(const void *handle, size_t handle_size, SOCK *sock)
[SERVER-side] Create a socket on top of a "handle".
ESwitch SOCK_SetInterruptOnSignalAPI(ESwitch on_off)
Control restartability of I/O interrupted by signals.
EIO_Status SOCK_CreateOnTopEx(const void *handle, size_t handle_size, SOCK *sock, const void *data, size_t size, TSOCK_Flags flags)
[SERVER-side] Create a SOCKet on top of either an OS-dependent "handle" (file descriptor on Unix,...
EIO_Status SOCK_Poll(size_t n, SSOCK_Poll polls[], const STimeout *timeout, size_t *n_ready)
Block until at least one of the sockets enlisted in "polls" array (of size "n") becomes available for...
EIO_Status DSOCK_WipeMsg(SOCK sock, EIO_Event direction)
Clear message froma datagram socket.
TNCBI_BigCount SOCK_GetCount(SOCK sock, EIO_Event direction)
Get counts of read or written bytes.
const STimeout * SOCK_GetTimeout(SOCK sock, EIO_Event event)
Get the connection's i/o timeout (or NULL, if the timeout is infinite).
EIO_Event revent
[in] one of: eIO_Open/Read/Write/ReadWrite
int SOCK_isip(const char *str)
Equivalent of SOCK_isip(host, 0)
const STimeout * SOCK_SetSelectInternalRestartTimeout(const STimeout *t)
This is a helper call that can improve I/O behavior.
ESOCK_Type
Socket type (internal)
EIO_Status(* FSOCK_ApproveHook)(const SSOCK_ApproveInfo *info, void *data)
The approve hook is global per API and gets called with an arbitrary user "data", if so desired as a ...
EIO_Status SOCK_CreateUNIX(const char *path, const STimeout *timeout, SOCK *sock, const void *data, size_t size, TSOCK_Flags flags)
SOCKSSL(* FSSLSetup)(void)
SSL setup callback.
SOCK POLLABLE_ToSOCK(POLLABLE poll)
unsigned short SOCK_GetLocalPort(SOCK sock, ENH_ByteOrder byte_order)
Get local port of the socket.
unsigned short SOCK_GetLocalPortEx(SOCK sock, int trueport, ENH_ByteOrder byte_order)
Get local port of the socket (true or cached / stored).
unsigned int TSOCK_Flags
bitwise "OR" of ESOCK_Flags
EIO_Status SOCK_GetOSHandle(SOCK sock, void *handle, size_t handle_size)
Same as SOCK_GetOSHandleEx(sock, handle_buf, handle_size, eNoOwnership).
@ eSAF_IP
only numeric IP if INET socket, empty otherwise
@ eSAF_Full
address in full, native form
@ eSAF_Port
only numeric port if INET socket, empty otherwise
@ eSOCK_IOWaitSysAPISelect
always use select()
@ eSOCK_IOWaitSysAPIAuto
default; use some heuristics to choose API
@ eSOCK_IOWaitSysAPIPoll
always use poll()
@ eSOCK_ErrDns
DNS-related error (unresolvable hostname)
@ eSOCK_ErrIO
I/O-related error.
@ eSOCK_ErrInit
Socket layer initialization error.
@ fSOCK_KeepAlive
keep socket alive (if supported by OS)
@ fSOCK_BindLocal
bind to 127.0.0.1 only
@ fSOCK_Secure
subsumes CloseOnExec regardless of Keep
@ fSOCK_KeepOnClose
retain OS handle in SOCK_Close[Ex]()
@ fSOCK_KeepOnExec
can be applied to all sockets
@ fSOCK_InterruptOnSignal
ELOG_Level
Log severity level.
enum ENcbiSwitch ESwitch
Aux.
void UTIL_ReleaseBufferOnHeap(const void *ptr)
#define UTIL_TcharToUtf8OnHeap(x)
Conversion from Unicode to UTF8, and back.
LOG CORE_GetLOG(void)
Get the log handle that is to be used by the core internals (CORE LOG).
unsigned int usec
microseconds (modulo 1,000,000)
const char * IO_StatusStr(EIO_Status status)
Get the text form of an enum status value.
EIO_ReadMethod
I/O read method.
enum ENcbiOwnership EOwnership
Ownership relations between objects.
EIO_WriteMethod
I/O write method.
#define UTIL_ReleaseBuffer(x)
EIO_Event
I/O event (or direction).
#define NCBI_BIGCOUNT_FORMAT_SPEC
uint64_t TNCBI_BigCount
Big unsigned integer for file size and position.
@ eIO_Timeout
timeout expired before any I/O succeeded
@ eIO_Interrupt
signal arrival prevented any I/O to succeed
@ eIO_NotSupported
operation is not supported or is not available
@ eIO_Success
everything is fine, no error occurred
@ eIO_Unknown
unknown I/O error (likely fatal but can retry)
@ eIO_InvalidArg
bad argument / parameter value(s) supplied
@ eIO_ReadPlain
read readily available data only, wait if none
@ eIO_ReadPeek
do eIO_ReadPlain but leave data in input queue
@ eIO_ReadPersist
read exactly as much as requested, w/waits
@ eIO_WritePlain
write as much as possible, report back how much
@ eIO_WriteOutOfBand
write out-of-band chunk of urgent data (if supp)
@ eIO_WritePersist
write exactly as much as specified, w/waits
@ eIO_ReadWrite
eIO_Read | eIO_Write (also, eCONN_OnFlush)
@ eIO_Open
also serves as no-event indicator in SOCK_Poll
@ eIO_Close
also serves as an error indicator in SOCK_Poll
#define HANDLE
An abstraction for a file handle.
unsigned int
A callback function used to compare two keys in a database.
The blob sat and sat key Both must be positive integers</td > n< td > Non empty string The interpretation of the blob id depends on a processor Cassandra n processor expects the following format
if(yy_accept[yy_current_state])
static const CS_INT unused
constexpr bool empty(list< Ts... >) noexcept
const string version
version string
const struct ncbi::grid::netcache::search::fields::SIZE size
const GenericPointer< typename T::ValueType > T2 value
int NCBI_HasSpaces(const char *s, size_t n)
Return non-zero(true) if a block of memory based at "s" and of size "n" has any space characters (as ...
char * strncpy0(char *s1, const char *s2, size_t n)
Copy not more than "n" characters from string "s2" into "s1", and return the result,...
EIO_Status(* FSSLOpen)(void *session, int *error, char **desc)
void(* FSSLDelete)(void *session)
EIO_Status(* FSSLClose)(void *session, int how, int *error)
void *(* FSSLCreate)(ESOCK_Side side, SNcbiSSLctx *ctx, int *error)
EIO_Status(* FSSLRead)(void *session, void *buf, size_t size, size_t *done, int *error)
EIO_Status(* FSSLWrite)(void *session, const void *data, size_t size, size_t *done, int *error)
const char *(* FSSLError)(void *session, int error, char *buf, size_t size)
static size_t x_size(const char *dst, size_t len, const char *ptr)
int NcbiIsEmptyIPv6(const TNCBI_IPv6Addr *addr)
Return non-zero if the address is empty (either as NULL or IPv6 or IPv4); return zero otherwise.
const char * NcbiStringToIPv6(TNCBI_IPv6Addr *addr, const char *str, size_t len)
Convert into an IPv6 address, the first "len" (or "strlen(str)" if "len" is 0) bytes of "str" from a ...
unsigned int NcbiIPv6ToIPv4(const TNCBI_IPv6Addr *addr, size_t pfxlen)
Extract and return a network byte order IPv4 embedded address from an IPv6 address,...
char * NcbiAddrToString(char *buf, size_t bufsize, const TNCBI_IPv6Addr *addr)
Convert an IPv6 address into either a full-quad text IPv4 (for IPv4-mapped IPv6 addresses) or a hex c...
TNCBI_IPv6Addr * NcbiIPv4ToIPv6(TNCBI_IPv6Addr *addr, unsigned int ipv4, size_t pfxlen)
Embed a passed network byte order IPv4 address into an IPv6 address using the specified prefix length...
char * NcbiIPv6ToString(char *buf, size_t bufsize, const TNCBI_IPv6Addr *addr)
Convert an IPv6 address into a hex colon-separated text form and store the result in the "buf" of siz...
int NcbiIsIPv4(const TNCBI_IPv6Addr *addr)
Return non-zero(true) if the address is a true IPv4 address (a mapped IPv4 address),...
char * NcbiIPv4ToString(char *buf, size_t bufsize, unsigned int addr)
Convert a network byte order IPv4 into a full-quad text form and store the result in the "buf" of siz...
const char * NcbiStringToAddr(TNCBI_IPv6Addr *addr, const char *str, size_t len)
Convert into an IPv6 address, the first "len" (or "strlen(str)" if "len" is 0) bytes of "str",...
const char * NcbiIPToAddr(TNCBI_IPv6Addr *addr, const char *str, size_t len)
Convert into an IPv6 address, the first "len" (or "strlen(str)" if "len" is 0) bytes of "str" from ei...
#define CORE_Once(once)
Return non-zero (true) if "*once" had a value of NULL, and set the value to non-NULL regardless (best...
#define CORE_LOG_ERRNO_X(subcode, level, error, message)
#define CORE_DATAF_X(subcode, level, data, size, fmt_args)
#define CORE_LOGF_X(subcode, level, fmt_args)
#define CORE_LOG_ERRNO_EXX(subcode, level, error, descr, message)
#define CORE_LOGF_ERRNO_X(subcode, level, error, fmt_args)
#define CORE_TRACEF(fmt_args)
#define CORE_TRACE(message)
#define CORE_LOGF(level, fmt_args)
#define CORE_LOG_X(subcode, level, message)
#define CORE_LOGF_ERRNO_EXX(subcode, level, error, descr, fmt_args)
#define CORE_LOG(level, message)
static const char * s_CP(const TNCBI_IPv6Addr *addr, unsigned short port, const char *path, char *buf, size_t bufsize)
static FSSLSetup volatile s_SSLSetup
static volatile unsigned int s_ID_Counter
static EIO_Status s_ApproveCallback(const char *host, const TNCBI_IPv6Addr *addr, unsigned short port, ESOCK_Side side, ESOCK_Type type, SOCK sock)
static int x_IsSmallerTimeout(const struct timeval *t1, const struct timeval *t2)
const char * SOCK_StringToHostPortEx(const char *str, unsigned int *host, unsigned short *port, int flag)
static volatile int s_Initialized
static EIO_Status s_CreateListening(const char *path, unsigned short port, unsigned short backlog, LSOCK *lsock, TSOCK_Flags flags, ESwitch ipv6)
static EIO_Status s_Write_(SOCK sock, const void *data, size_t size, size_t *n_written, int oob)
static void *volatile s_ErrData
static ESwitch s_ReuseAddress
static EIO_Status s_Read(SOCK sock, void *buf, size_t size, size_t *n_read, int peek)
EIO_Status SOCK_CreateOnTopInternal(const void *handle, size_t handle_size, SOCK *sock, const SSOCK_Init *init, TSOCK_Flags flags)
static EIO_Status s_Select(size_t n, SSOCK_Poll polls[], const struct timeval *tv, int asis)
static EIO_Status s_Send(SOCK, const void *, size_t, size_t *, int)
static void x_AddTimeout(struct timeval *tv, int ms_addend)
static EIO_Status s_Connect_(SOCK sock, const char *host, unsigned short port, const STimeout *timeout)
static ESwitch s_ReadOnWrite
int gettimeofday(struct timeval *tp, void *unused)
static EIO_Status s_Close(SOCK sock, int reclose, TSOCK_Keep keep)
static EIO_Status s_Create(const char *hostpath, unsigned short port, const STimeout *timeout, SOCK *sock, const SSOCK_Init *init, TSOCK_Flags flags)
static TNCBI_IPv6Addr * s_gethostbyname_(TNCBI_IPv6Addr *addr, const char *host, int family, int not_ip, int self, ESwitch log)
static EIO_Status s_CloseListening(LSOCK lsock)
static FSOCK_ErrHook volatile s_ErrHook
static ESOCK_IOWaitSysAPI s_IOWaitSysAPI
static EIO_Status s_WaitConnected(SOCK sock, const struct timeval *tv)
static FSOCK_ApproveHook volatile s_ApproveHook
#define s_Pushback(s, d, n)
static EIO_Status s_Recv(SOCK, void *, size_t, size_t *, int)
static void x_tvcpy(struct timeval *dst, struct timeval *src)
static EIO_Status s_Init(void)
static void s_ErrorCallback(const SSOCK_ErrInfo *info)
static EIO_Status s_IsConnected_(SOCK sock, const struct timeval *tv, const char **what, int *error, int writeable)
static const char * s_WinStrerror(DWORD error)
static EIO_Status s_InitAPI(int secure)
static ESwitch s_InterruptOnSignal
static EIO_Status s_InitAPI_(int secure)
static EIO_Status s_Accept(LSOCK lsock, const STimeout *timeout, SOCK *sock, TSOCK_Flags flags)
static void x_ShowDataLayout(void)
const char g_kNcbiSockNameAbbr[]
static int x_IsAPIPA(unsigned int ip)
static TNCBI_IPv6Addr * s_gethostbyname(TNCBI_IPv6Addr *addr, const char *host, int family, int not_ip, ESwitch log)
static int s_SetNonblock(TSOCK_Handle sock, int nonblock)
static int s_AllowSigPipe
static EIO_Status s_RecvMsg(SOCK sock, void *buf, size_t bufsize, size_t msgsize, size_t *msglen, TNCBI_IPv6Addr *sender_addr, unsigned short *sender_port)
static EIO_Status s_Connect(SOCK sock, const char *host, unsigned short port, const STimeout *timeout)
static const char * s_StringToHostPort(const char *str, TNCBI_IPv6Addr *addr, int family, unsigned short *port, int flag)
static TNCBI_IPv6Addr * s_getlocalhostaddress(TNCBI_IPv6Addr *addr, int family, ESwitch reget, ESwitch log)
#define SOCK_HOSTPORTSTRLEN
static int s_VHostOk(const char *vhost)
static EIO_Status s_Write(SOCK sock, const void *data, size_t size, size_t *n_written, int oob)
static EIO_Status x_TriggerRead(const TRIGGER trigger, int isset)
static const char * s_CPListening(const TNCBI_IPv6Addr *addr, unsigned short port, char *buf, size_t bufsize)
static char * s_AddrToString(char *buf, size_t bufsize, const TNCBI_IPv6Addr *addr, int family, int empty)
static void x_ShutdownSSL(void)
static int x_IsInterruptibleSOCK(SOCK sock)
static EIO_Status s_Shutdown(SOCK sock, EIO_Event dir, const struct timeval *tv)
static const char * x_ChooseSelfIP(char **addrs)
static STimeout * s_tv2to(const struct timeval *tv, STimeout *to)
static EIO_Status s_SendMsg(SOCK sock, const char *host, unsigned short port, const void *data, size_t datalen)
static const struct timeval * s_SelectTimeout
static EIO_Status s_CreateOnTop(const void *handle, size_t handle_size, SOCK *sock, const SSOCK_Init *init, TSOCK_Flags flags)
static EIO_Status s_WritePending(SOCK, const struct timeval *, int, int)
static void *volatile s_ApproveData
static size_t x_WriteBuf(void *x_ctx, const void *data, size_t size)
static int s_SetCloexec(TSOCK_Handle x_sock, int cloexec)
static EIO_Status s_WriteData(SOCK sock, const void *data, size_t size, size_t *n_written, int oob)
EIO_Status SOCK_CreateInternal(const char *host, unsigned short port, const STimeout *timeout, SOCK *sock, const SSOCK_Init *init, TSOCK_Flags flags)
#define SOCK_GET_TIMEOUT(s, t)
static EIO_Status s_SelectStallsafe(size_t n, SSOCK_Poll polls[], const struct timeval *tv, size_t *n_ready)
static const char * s_gethostbyaddr(const TNCBI_IPv6Addr *addr, char *buf, size_t bufsize, ESwitch log)
#define SOCK_BUF_CHUNK_SIZE
static int s_gethostname(char *buf, size_t bufsize, ESwitch log)
static size_t s_HostPortToStringEx(const TNCBI_IPv6Addr *addr, int family, unsigned short port, char *buf, size_t bufsize)
#define SOCK_SHOWDATALAYOUT_PARAMS
static unsigned int x_ID_Counter(void)
static int s_SetReuseAddress(TSOCK_Handle x_sock, int on_off)
static struct timeval * s_to2tv(const STimeout *to, struct timeval *tv)
#define s_HostPortToString(a, b, c, d)
static void SOCK_ABORT(TSOCK_Handle x_sock)
EIO_Status SOCK_SetupSSLInternalEx(FSSLSetup setup, int init)
static void s_DoLog(ELOG_Level level, const SOCK sock, EIO_Event event, const void *data, size_t size, const void *ptr)
#define SOCK_SET_TIMEOUT(s, t, v)
static EIO_Status s_Read_(SOCK sock, void *buf, size_t size, size_t *n_read, int peek)
static unsigned short s_GetLocalPort(TSOCK_Handle fd)
static EIO_Status s_Wait(SOCK sock, EIO_Event event, const STimeout *timeout)
#define SOCK_STRERROR(error)
void SOCK_SetupSSLInternal(FSSLSetup setup, int init)
static const char * s_ID(const SOCK sock, char buf[128])
static EIO_Status s_Close_(SOCK sock, int abort, TSOCK_Keep keep)
static const char * s_StrError(SOCK sock, int error)
static char * s_gethostbyaddr_(const TNCBI_IPv6Addr *addr, int family, char *buf, size_t bufsize, ESwitch log)
#define SOCK_ECONNABORTED
#define SOCK_ECONNREFUSED
#define SOCK_SHUTDOWN_RDWR
#define TRUE
bool replacment for C indicating true.
#define FALSE
bool replacment for C indicating false.
std::istream & in(std::istream &in_, double &x_)
double r(size_t dimension_, const Int4 *score_, const double *prob_, double theta_)
static PCRE2_SIZE bufsize
static SLJIT_INLINE sljit_ins lgr(sljit_gpr dst, sljit_gpr src)
static SLJIT_INLINE sljit_ins ms(sljit_gpr r, sljit_s32 d, sljit_gpr x, sljit_gpr b)
User-level connection approval hook.
union TRIGGER_tag::@1003 isset
static CS_CONTEXT * context
voidp calloc(uInt items, uInt size)
RetroSearch is an open source project built by @garambo | Open a GitHub Issue
Search and Browse the WWW like it's 1997 | Search results from DuckDuckGo
HTML:
3.2
| Encoding:
UTF-8
| Version:
0.7.4