A RetroSearch Logo

Home - News ( United States | United Kingdom | Italy | Germany ) - Football scores

Search Query:

Showing content from http://www.ncbi.nlm.nih.gov/IEB/ToolBox/CPP_DOC/doxyhtml/ncbi__socket_8c_source.html below:

NCBI C++ ToolKit: src/connect/ncbi_socket.c Source File

86 # include <netinet/in.h> 87 # include <netinet/tcp.h> 93 # ifdef NCBI_OS_CYGWIN 101 # define POLLPRI POLLIN 104 # define POLLRDNORM POLLIN 107 # define POLLRDBAND POLLIN 110 # define POLLWRNORM POLLOUT 113 # define POLLWRBAND POLLOUT 116 # define POLLRDHUP POLLHUP 118 # define POLL_READ (POLLIN | POLLRDNORM | POLLRDBAND | POLLPRI) 119 # define POLL_WRITE (POLLOUT | POLLWRNORM | POLLWRBAND) 120 # define _POLL_READY (POLLERR | POLLHUP) 121 # define POLL_READ_READY (_POLL_READY | POLL_READ | POLLRDHUP) 122 # define POLL_WRITE_READY (_POLL_READY | POLL_WRITE) 123 # define POLL_ERROR POLLNVAL 127 # if !defined(NCBI_OS_BEOS) 128 # include <arpa/inet.h> 130 # include <sys/param.h> 131 # ifdef HAVE_SYS_RESOURCE_H 132 # include <sys/resource.h> 134 # include <sys/stat.h> 143 #define NCBI_USE_ERRCODE_X Connect_Socket 146 #ifndef INADDR_LOOPBACK 147 # define INADDR_LOOPBACK 0x7F000001 149 #ifndef IN_LOOPBACKNET 150 # define IN_LOOPBACKNET 127 153 # if IN_CLASSA_MAX <= IN_LOOPBACKNET 154 # error "IN_LOOPBACKNET is out of range" 160 # define SOCK_ADDRSTRLEN 46 162 # ifndef INET6_ADDRSTRLEN 164 # define INET6_ADDRSTRLEN 46 166 # define SOCK_ADDRSTRLEN INET6_ADDRSTRLEN 169 #define SOCK_HOSTPORTSTRLEN (1 + SOCK_ADDRSTRLEN + 2 + 5) 172 # define SOCK_ENOSPC ENOSPC 174 # define SOCK_ENOSPC ERANGE 181 # define send(a, b, c, d) \ 182  (g_MONKEY_Send ? g_MONKEY_Send((a),(b),(c),(d),&sock) : send((a),(b),(c),(d))) 183 # define recv(a, b, c, d) \ 184  (g_MONKEY_Recv ? g_MONKEY_Recv((a),(b),(c),(d),&sock) : recv((a),(b),(c),(d))) 185 # define connect(a, b, c) \ 186  (g_MONKEY_Connect ? g_MONKEY_Connect((a),(b),(c)) : connect((a),(b),(c))) 197 #define SOCK_BUF_CHUNK_SIZE 16384 201 #if defined(NCBI_OS_UNIX) 203 # define SOCK_INVALID (-1) 204 # define SOCK_ERRNO errno 205 # define SOCK_NFDS(s) ((s) + 1) 207 # define SOCK_CLOSE(s) closesocket(s) 209 # define SOCK_CLOSE(s) close(s) 212 # define WIN_INT_CAST 213 # define WIN_DWORD_CAST 215 # ifdef NCBI_OS_CYGWIN 217 # ifdef SOCK_NONBLOCK 218 # undef SOCK_NONBLOCK 229 # define INADDR_NONE ((unsigned int)(~0UL)) 232 # if defined(TCP_NOPUSH) && !defined(TCP_CORK) 233 # define TCP_CORK TCP_NOPUSH 237 #elif defined(NCBI_OS_MSWIN) 239 # define SOCK_INVALID INVALID_SOCKET 240 # define SOCK_ERRNO WSAGetLastError() 241 # define SOCK_NFDS(s) 0 242 # define SOCK_CLOSE(s) closesocket(s) 244 # define WIN_INT_CAST (int) 245 # define WIN_DWORD_CAST (DWORD) 247 # define SOCK_GHBX_MT_SAFE 1 248 # define SOCK_SEND_SLICE (4 << 10) 250 # define SOCK_EVENTS (FD_CLOSE|FD_CONNECT|FD_OOB|FD_WRITE|FD_READ) 251 # ifndef WSA_INVALID_EVENT 252 # define WSA_INVALID_EVENT ((WSAEVENT) 0) 263 # define abs(a) ((a) < 0 ? -(a) : (a)) 268 #define SOCK_STRERROR(error) s_StrError(0, (error)) 270 #define SOCK_LOOPBACK (assert(INADDR_LOOPBACK), htonl(INADDR_LOOPBACK)) 272 #define SOCK_GET_TIMEOUT(s, t) ((s)->t##_tv_set ? &(s)->t##_tv : 0) 274 #define SOCK_SET_TIMEOUT(s, t, v) (((s)->t##_tv_set = (v) ? 1 : 0) \ 275  ? (void)((s)->t##_tv = *(v)) : (void) 0) 278 #if defined(HAVE_SOCKLEN_T) || defined(_SOCKLEN_T) 350 #define NCBI_INCLUDE_STRERROR_C 360  if

(sock &&

error

< 0) {

365

errbuf,

sizeof

(errbuf));

366  if

(strerr && *strerr)

367  return

ERR_STRDUP(strerr);

370  return

s_StrErrorInternal(

error

);

384

rv = FormatMessage(FORMAT_MESSAGE_ALLOCATE_BUFFER |

385

FORMAT_MESSAGE_FROM_SYSTEM |

386

FORMAT_MESSAGE_MAX_WIDTH_MASK |

387

FORMAT_MESSAGE_IGNORE_INSERTS,

389

MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT),

392

LocalFree((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 char

kLayoutFormat[] = {

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

(((

struct

sockaddr_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) {

577

memset(&sa, 0,

sizeof

(sa));

578

sa.sa_handler = SIG_IGN;

579

sigaction(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

*

volatile

s_AtExitSet = 0

;

613  "Failed to register exit handler"

);

653  const char

* what = 0;

658

what = (

const char

*)(-1L);

670  const char

* provider;

672  if

(what != (

const char

*)(-1L)) {

673

provider = *what ? what :

"???"

;

674

what =

"initialize"

;

677

what =

"re-initialize"

;

684

(

"Failed to %s SSL provider%s%s: %s"

, what,

688  static void

*

volatile

s_Once = 0

;

691  " been properly initialized in the NCBI Toolkit. " 692  " Have you forgotten to call SOCK_SetupSSL[Ex]()?"

);

709

memset(&

info

, 0,

sizeof

(

info

));

711  info

.status = status;

737

memset(&

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

) {

877

memcpy(&

ip

, addrs[

n

],

sizeof

(

ip

));

900

memset(

addr

, 0,

sizeof

(*

addr

));

910

family == AF_INET ?

"(IPv4)"

:

911

family == AF_INET6 ?

"(IPv6)"

:

""

,

914  if

(family != AF_INET6) {

915 #ifdef NCBI_OS_DARWIN 916  if

(strspn(host,

".0123456789"

) ==

len

) {

919

memset(

addr

, 0,

sizeof

(*

addr

));

925  if

(!not_ip && (ipv4 = inet_addr(host)) != htonl(

INADDR_NONE

)) {

933

memset(

addr

, 0,

sizeof

(*

addr

));

944  if

(family == AF_INET6) {

950

}

else if

(family == AF_INET)

955

memset(

addr

, 0,

sizeof

(*

addr

));

961 #if defined(HAVE_GETADDRINFO) 963

memset(&hints, 0,

sizeof

(hints));

964

hints.ai_family = family;

967  const struct

sockaddr* sa;

968  const struct

sockaddr_in*

in

;

969  const struct

sockaddr_in6* in6;

972  if

(family != AF_INET6) {

978

u.sa =

tmp

->ai_addr;

979  if

(u.sa->sa_family == AF_INET) {

980

addrs[

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));

999

u.sa =

tmp

->ai_addr;

1000  if

(u.sa->sa_family == AF_INET6) {

1005  if

((temp->

octet

[0] & 0xE0) &&

1006

(temp->

octet

[0] ^ 0xE0)) {

1015

u.sa =

tmp

->ai_addr;

1016  if

(u.sa->sa_family == AF_INET6) {

1017

memcpy(

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 char

suffix[] =

"_r"

;

1049  struct

hostent x_he;

1053 # if NCBI_HAVE_GETHOSTBYNAME_R == 5 1054

he = 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 char

suffix[] =

""

;

1073 # ifndef SOCK_GHBX_MT_SAFE 1077

he = 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

)) {

1105

memcpy(

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"

,

1147

family == AF_INET ?

"(IPv4)"

:

1148

family == AF_INET6 ?

"(IPv6)"

:

""

,

1152  return

parsed ?

addr

: 0

;

1163  static volatile struct

{

1166

} s_LocalHostAddress[2] = { 0 };

1167  static void

*

volatile

s_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

) {

1178

isset = s_LocalHostAddress[

n

].isset;

1179

*

addr

= s_LocalHostAddress[

n

].addr;

1181  if

(!(

i

| isset)) {

1192  if

(reget !=

eOff

) {

1198

s_LocalHostAddress[

n

].addr = *

addr

;

1199

s_LocalHostAddress[

n

].isset = 1;

1207

(

"[SOCK::GetLocalHostAddress%s] " 1208  " Cannot obtain local host address%s"

,

1209

family == AF_INET ?

"(IPv4)"

:

1210

family == AF_INET6 ?

"(IPv6)"

:

""

,

1211

reget ==

eDefault

?

", using loopback instead"

:

""

));

1214  if

(family == AF_INET6)

1230  static void

*

volatile

s_Once = 0

;

1239

memset(&

info

, 0,

sizeof

(

info

));

1246

}

else if

(!s_Once && !host

1251

(

"[SOCK::gethostbyname] " 1252  " Got loopback address %s for local host name"

, addrstr));

1278

family == AF_INET ?

"(IPv4)"

:

1279

family == AF_INET6 ?

"(IPv6)"

:

""

,

1285 #if defined(HAVE_GETNAMEINFO) 1288  struct

sockaddr_in

in

;

1289  struct

sockaddr_in6 in6;

1295

memset(&u, 0, addrlen);

1296

u.sa.sa_family = ipv4 ? AF_INET : AF_INET6;

1297 # ifdef HAVE_SIN_LEN 1298

u.sa.sa_len = addrlen;

1303

memcpy(&u.in6.sin6_addr,

addr

,

sizeof

(u.in6.sin6_addr));

1304  if

((ipv4 && u.in.sin_addr.s_addr == htonl(

INADDR_NONE

))

1307

0, 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 char

suffix[] =

"_r"

;

1346  struct

hostent x_he;

1349 # if NCBI_HAVE_GETHOSTBYADDR_R == 7 1350

he = 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 char

suffix[] =

""

;

1371 # ifndef SOCK_GHBX_MT_SAFE 1375

he = 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

) {

1389

memcpy(

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"

,

1425

family == AF_INET ?

"(IPv4)"

:

1426

family == AF_INET6 ?

"(IPv6)"

:

""

,

1429

&

"\""

[!

buf

],

buf

?

buf

:

"(none)"

, &

"\""

[!

buf

]));

1441  static void

*

volatile

s_Once = 0

;

1452

(

"[SOCK::gethostbyaddr] " 1463  unsigned short

* port,

1467  const char

*s, *

t

, *q;

1472

memset(

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)

1505

memset(&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)))) {

1520

p = (

unsigned

short)

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))

1539

memcpy(x_buf, s,

len

);

1540

x_buf[

len

] =

'\0'

;

1550  assert

(family == AF_INET || family == AF_INET6);

1551  if

((ipv4 && family == AF_INET6) || (!ipv4 && family == AF_INET))

1565  unsigned short

port,

1576  int

bare = (ipv4 && family != AF_INET6) || !port;

1586  len

= (size_t)(end -

buf

);

1592  if

(port || !

len

) {

1594  size_t

x_len = (size_t) sprintf(x_buf,

":%hu"

, port);

1596

memcpy(

buf

+

len

, x_buf, x_len);

1605 #define s_HostPortToString(a,b,c,d) s_HostPortToStringEx((a),s_IPVersion,(b),(c),(d)) 1625  unsigned short

port,

1641  unsigned short

port,

1650

strcpy(

buf

+ 1,

"::"

);

1659

sprintf(

buf

+

len

,

":%hu"

, port);

1661

strcpy(

buf

+

len

,

":?"

);

1678  switch

(sock->

type

) {

1692  if

(sock->

path

[0])

1693

sname = sock->

sslctx

?

"SUSOCK"

:

"USOCK"

;

1711

cp = ((

LSOCK

) sock)->path;

1725

sprintf(fd,

"%u"

, (

unsigned int

) sock->

sock

);

1728  len

= cp && *cp ? strlen(cp) : 0;

1730

sprintf(

buf

,

"%s#%u[%s]%s%s%.*s: "

, sname, sock->

id

, fd,

1731

&

"@"

[!

n

], (

size_t

)

n

<

len

?

"..."

:

""

,

n

, cp +

len

-

n

);

1741  struct

sockaddr_in

in

;

1742  struct

sockaddr_in6 in6;

1745

memset(&u, 0,

sizeof

(u.sa));

1747

u.sa.sa_len = addrlen;

1749  if

(getsockname(fd, &u.sa, &addrlen) == 0) {

1750  switch

(u.sa.sa_family) {

1752  return

ntohs(u.in.sin_port);

1754  return

ntohs(u.in6.sin6_port);

1766  const void

*

data

,

size_t size

,

const void

* ptr)

1769  const struct

sockaddr* sa;

1770  const struct

sockaddr_in*

in

;

1771  const struct

sockaddr_in6* in6;

1773  const char

* what, *strerr;

1786  unsigned short

port;

1788

what = ptr ? (

const char

*) ptr :

"Connecting"

;

1789

strcpy(

head

, *what ? what :

"Re-using"

);

1792

strcpy(

head

,

"Accepted"

);

1795

strcpy(

head

,

"Created"

);

1800  if

(!sock->

path

[0])

1805

sprintf(tail,

" @:%hu"

, port);

1813

}

else if

(!(u.sa = (

const struct

sockaddr*) ptr)) {

1814

strcpy(

head

,

"Created"

);

1816

}

else if

(!

data

) {

1817  unsigned short

port;

1818  switch

(u.sa->sa_family) {

1820

port = ntohs(u.in->sin_port);

1823

port = ntohs(u.in6->sin6_port);

1830

strcpy(

head

,

"Bound @"

);

1831

sprintf(tail,

"(:%hu)"

, port);

1832

}

else if

(u.sa->sa_family) {

1834  unsigned short

port;

1835  switch

(u.sa->sa_family) {

1838

port = ntohs(u.in->sin_port);

1841

memcpy(&

addr

, &u.in6->sin6_addr,

sizeof

(

addr

));

1842

port = ntohs(u.in6->sin6_port);

1845

memset(&

addr

, 0,

sizeof

(

addr

));

1850

strcpy(

head

,

"Associated "

);

1853

strcpy(

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] ==

'.'

)

1879

u.sa = (

const struct

sockaddr*) ptr;

1881  unsigned short

port;

1882  assert

(u.sa && (u.sa->sa_family == AF_INET ||

1883

u.sa->sa_family == AF_INET6));

1884  switch

(u.sa->sa_family) {

1887

port = ntohs(u.in->sin_port);

1890

memcpy(&

addr

, &u.in6->sin6_addr,

sizeof

(

addr

));

1891

port = ntohs(u.in6->sin6_port);

1894

memset(&

addr

, 0,

sizeof

(

addr

));

1902

}

else if

(!ptr || !*((

char

*) ptr)) {

1905

strcpy(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),

1945

ptr ? (

const char

*) ptr :

1946

sock->

keep

?

"Leaving"

:

"Closing"

,

1952

(

"%s[SOCK::DoLog] " 1953  " Invalid event #%u"

,

1954  s_ID

(sock, _id), (

unsigned int

) event));

1975

to->

sec

= (

unsigned int

) tv->tv_sec;

1976

to->

usec

= (

unsigned int

) tv->tv_usec;

1988

tv->tv_sec = to->

usec

/ 1000000 + to->

sec

;

1989

tv->tv_usec = to->

usec

% 1000000;

2052  static struct

timeval 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"

);

2103

memset(&

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 long

arg = nonblock ? 1 : 0;

2157  return

ioctlsocket(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  return

fcntl(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  return

fcntl(x_sock, F_SETFD, cloexec

2188

?

flags

| FD_CLOEXEC

2189

:

flags

& (

int

) ~FD_CLOEXEC) == 0;

2190 #elif defined(NCBI_OS_MSWIN) 2191  return

SetHandleInformation((

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  int

reuse_addr = on_off ? 1 : 0;

2211  return

setsockopt(x_sock, SOL_SOCKET, SO_REUSEADDR,

2212

(

char

*) &reuse_addr,

sizeof

(reuse_addr)) == 0;

2228 # ifdef NCBI_OS_MSWIN 2231  int

keepalive = on_off ? 1

: 0

;

2233  return

setsockopt(x_sock, SOL_SOCKET, SO_KEEPALIVE,

2234

(

char

*) &keepalive,

sizeof

(keepalive)) == 0;

2246 # ifdef NCBI_OS_MSWIN 2249  int

oobinline = on_off ? 1

: 0

;

2251  return

setsockopt(x_sock, SOL_SOCKET, SO_OOBINLINE,

2252

(

char

*) &oobinline,

sizeof

(oobinline)) == 0;

2262  const struct

timeval* t2)

2268  if

(t1->tv_sec > t2->tv_sec)

2270  if

(t1->tv_sec < t2->tv_sec)

2272  return

t1->tv_usec < t2->tv_usec;

2290 #if !defined(NCBI_OS_MSWIN) && defined(FD_SETSIZE) 2291 static int

x_TryLowerSockFileno(

SOCK

sock)

2293 # ifdef STDERR_FILENO 2294 # define SOCK_DUPOVER STDERR_FILENO 2296 # define SOCK_DUPOVER 2 2298 # ifdef F_DUPFD_CLOEXEC 2299  int

fd = fcntl(sock->

sock

, F_DUPFD_CLOEXEC, SOCK_DUPOVER + 1);

2301  int

fd = fcntl(sock->

sock

, F_DUPFD, SOCK_DUPOVER + 1);

2306 # ifndef F_DUPFD_CLOEXEC 2307  int

cloexec = 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 int

x_IsInterruptiblePoll(

SOCK

sock0)

2344  const struct

timeval* tv,

2355  struct

timeval x_tv;

2358 # ifdef NCBI_OS_MSWIN 2361

tv ? tv->tv_sec * 1000 + (tv->tv_usec + 500) / 1000 : INFINITE;

2370

memset(&x_tv, 0,

sizeof

(x_tv));

2374 # ifdef NCBI_OS_MSWIN 2375  unsigned int count

= 0;

2377  struct

timeval 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

));

2505

memset(&xx_tv, 0,

sizeof

(xx_tv));

2513

write_only ? 0 : &rfds,

2514

read_only ? 0 : &wfds, &efds,

2529

x_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 2587

sock->readable = 1

;

2589

sock->writable = 1

;

2592  if

(!write_only && FD_ISSET(fd, &rfds)) {

2594 # ifdef NCBI_OS_MSWIN 2595

sock->readable = 1

;

2598  if

(!read_only && FD_ISSET(fd, &wfds)) {

2600 # ifdef NCBI_OS_MSWIN 2601

sock->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_t

x_AutoCountPolls(

size_t n

,

SSOCK_Poll

polls[])

2634  for

(

i

= 0;

i

<

n

; ++

i

) {

2635  if

(!polls[

i

].sock) {

2643  if

(!polls[

i

].event) {

2654

&& !x_TryLowerSockFileno(polls[

i

].sock)) {

2660  return

good && (

count

<= NPOLLS || bigfd) ?

count

: 0;

2666  const struct

timeval* tv,

2669  struct pollfd

xx_polls[NPOLLS];

2686  if

(!(m = x_AutoCountPolls(

n

, polls)))

2687  return

s_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));

2701

wait = 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);

2741

bitset |= POLL_WRITE;

2744

|| (sock->r_on_w ==

eOff 2753

|| (sock->r_status != eIO_Closed && !sock->eof))

2754

bitset |= POLL_READ;

2756

|| sock->w_status == eIO_Closed

2757

|| !(sock->pending | sock->w_len)) {

2760

bitset |= POLL_WRITE;

2785  if

(wait != -1 && wait < slice)

2789  if

(

count

|| !ready) {

2790

x_ready =

poll

(x_polls,

count

, slice);

2793 # ifdef NCBI_OS_DARWIN 2795  if

(x_ready > (

int

)

count

)

2799

ready = (nfds_t) x_ready;

2822  const char

* strerr =

2825

x_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) {

2870

nfds_t x_scanned = 0;

2873  for

(j = (nfds_t) m; j <

count

; ++j) {

2876  if

(x_polls[j].

fd

==

fd

) {

2879

scanned += 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 struct

timeval* tv,

2957 #if defined(NCBI_OS_MSWIN) && defined(NCBI_CXX_TOOLKIT) 2958  DWORD

wait = tv ? tv->tv_sec * 1000 + (tv->tv_usec + 500)/1000 : INFINITE;

2959  HANDLE

what[MAXIMUM_WAIT_OBJECTS];

2960  long

want[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) {

3013

bitset |= FD_CONNECT

;

3014

bitset |= FD_WRITE

;

3027

|| (sock->

r_status

!= eIO_Closed && !sock->

eof

)) {

3037

bitset |= FD_ACCEPT

;

3048

bitset |= FD_WRITE

;

3062  if

(

count

>=

sizeof

(what) /

sizeof

(what[0])) {

3066  " Too many objects exceeding %u"

,

3067

(

unsigned int

)

count

));

3072

want[

count

] = bitset;

3086  if

(wait != INFINITE && wait < slice)

3097  r

= WaitForMultipleObjects(c,

3101  if

(

r

== WAIT_FAILED) {

3102  DWORD

err = GetLastError();

3105

err, 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)));

3122

m +=

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]) {

3235

errno = 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  return

s_Poll_(

n

, polls, tv, asis);

3283  return

s_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

(

struct

timeval* dst,

struct

timeval* src)

3294

memcpy(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 struct

timeval* 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) {

3391

sprintf(mtu,

", MTU ?? (%.80s)"

, strerr ? strerr :

"??"

);

3394

sprintf(mtu,

", MTU = %d"

, m);

3398  static const char

* mtu =

""

;

3401

(

"%sConnection established%s"

,

s_ID

(sock, _id), mtu));

3411

x_error, strerr ? strerr :

""

,

3412

(

"%s[SOCK::IsConnected] " 3413  " Failed setsockopt(REUSEADDR)"

,

3428  const unsigned int

rtv_set = sock->

r_tv_set

;

3429  const unsigned int

wtv_set = sock->

w_tv_set

;

3440

want_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 struct

timeval* tv)

3479

memset(&

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))) {

3547

x_read < 0 ? (

void

*) &

error

:

3548

x_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 int

rtv_set;

3659  return

status == eIO_Closed ?

eIO_Unknown

: status;

3661  if

(!

size

&& peek >= 0) {

3663  if

(status == eIO_Closed)

3665  else if

(sock->

eof

)

3666

status = 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)

3705

memset(&sock->

r_tv

, 0,

sizeof

(sock->

r_tv

));

3709  assert

(!*n_read || peek > 0);

3713  size_t

x_todo, x_read, x_save;

3716

x_buf = (

char

*)

buf

+ *n_read;

3719

x_todo =

sizeof

(xx_buf);

3725  assert

(x_buf && x_todo);

3736

x_buf, x_todo, &x_read, &

error

);

3739  assert

(x_read <= x_todo);

3746

status != eIO_Closed || !sock->

eof

?

3747

(

void

*) &

error

: 0,

3749

x_read ?

" [decrypt]"

: 0);

3752  if

(status == eIO_Closed && !sock->

eof

)

3756

status =

s_Recv

(sock, x_buf, x_todo, &x_read, 0);

3758  assert

(x_read <= x_todo);

3764

status = eIO_Closed

;

3769  if

(x_read < x_todo)

3774

x_todo =

size

- *n_read;

3775  if

(x_todo > x_read)

3777  if

(

buf

&& (p_buf || x_buf == xx_buf))

3778

memcpy((

char

*)

buf

+ *n_read, x_buf, x_todo);

3779

x_save = peek ? x_read : x_read - x_todo;

3786

peek ? x_buf : x_buf + x_todo,

3794

peek ? 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]));

3806

x_read = peek >= 0 ? x_todo : 0;

3808

}

else if

(peek >= 0)

3817  if

((rtv_set = sock->

r_tv_set

) != 0)

3821

memset(&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)

3842

memset(&

info

, 0,

sizeof

(

info

));

3855  info

.status = status;

3876  const struct

timeval* 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 struct

timeval zero = { 0 };

3924

sock = polls[

i

].

sock

;

3931  if

(sock->

r_status

== eIO_Closed || sock->

eof

) {

3941

sock = 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 4006

tv->tv_usec += (ms_addend % 1000) * 1000;

4007

tv->tv_sec += ms_addend / 1000;

4008  if

(tv->tv_usec >= 10000000) {

4009

tv->tv_sec += tv->tv_usec / 10000000;

4010

tv->tv_usec %= 10000000;

4017 #ifdef SOCK_SEND_SLICE 4018 # define s_Send s_Send_ 4035 #ifdef NCBI_OS_MSWIN 4036  int

wait_buf_ms = 0;

4037  struct

timeval waited;

4038

memset(&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))) {

4073

x_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 struct

timeval* timeout;

4106 #ifdef NCBI_OS_MSWIN 4107  struct

timeval slice;

4108  unsigned int

writable = sock->

writable

;

4112  if

(

error

== WSAENOBUFS) {

4120  if

(wait_buf_ms == 0)

4122  else if

(wait_buf_ms < 500

)

4125

slice.tv_usec = wait_buf_ms * 1000;

4128

memset(&slice, 0,

sizeof

(slice));

4135

memset(&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 int

wtv_set = 2;

4227  size_t

n_todo =

size

> SOCK_SEND_SLICE ? SOCK_SEND_SLICE :

size

;

4229

status = 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)

4245

memset(&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_t

n_written = 0;

4321

n_written += x_written;

4323  data

= (

const char

*)

data

+ x_written;

4333  const struct

timeval* tv,

4338  unsigned int

wtv_set;

4353  error

, strerr ? strerr :

""

,

4354

(

"%s[SOCK::WritePending] " 4357

what ? 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)"

,

4421

oob ?

"[DSOCK::SendMsg]"

:

"[SOCK::Write]"

,

4422

oob ?

"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)

4464

memset(&

info

, 0,

sizeof

(

info

));

4477  info

.status = status;

4488  const struct

timeval* 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 int

rtv_set = sock->

r_tv_set

;

4553  const unsigned int

wtv_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  int

seconds = (

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 4767

WSAEventSelect(sock->

sock

, sock->

event

, 0

);

4776  error

, strerr ? strerr :

""

,

4777

(

"%s[SOCK::Close] " 4778  " Cannot set socket back to blocking mode"

,

4789

g_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 4831

WSASetEvent(sock->

event

);

4836 #ifdef NCBI_OS_MSWIN 4838

WSACloseEvent(sock->

event

);

4853  assert

(!reclose || !keep);

4854

status =

s_Close_

(sock, reclose << 1, keep);

4858

memset(&

info

, 0,

sizeof

(

info

));

4871  info

.status = status;

4887  unsigned short

port,

4892  struct

sockaddr_in

in

;

4893  struct

sockaddr_in6 in6;

4895  struct

sockaddr_un un;

4916  if

(sock->

path

[0]) {

4917  size_t

pathlen = 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)));

4926

addrlen =

sizeof

(u.un);

4927

memset(&u, 0, addrlen);

4928

u.un.sun_family = AF_UNIX;

4929 # ifdef HAVE_SIN_LEN 4930

u.un.sun_len = addrlen;

4932

memcpy(u.un.sun_path, sock->

path

, pathlen);

4947

(

"%s[SOCK::Connect] " 4948  " Failed SOCK_gethostbyname(\"%.*s\")"

,

4953

addrlen = ipv4 ?

sizeof

(u.in) :

sizeof

(u.in6);

4954

memset(&u, 0, addrlen);

4955

u.sa.sa_family = ipv4 ? AF_INET : AF_INET6;

4957

u.sa.sa_len = addrlen;

4961

u.in.sin_port = htons(sock->

port

);

4963

memcpy(&u.in6.sin6_addr, &sock->

addr

,

sizeof

(u.in6.sin6_addr));

4964

u.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)

5000

g_MONKEY_SockHasSocket(sock, fd);

5003 #if defined(NCBI_OS_MSWIN) 5005  if

(!(sock->

event

= WSACreateEvent())) {

5006  DWORD

err = GetLastError();

5009

err, 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  DWORD

err = GetLastError();

5081  error

, strerr ? strerr :

""

,

5082

(

"%s[SOCK::Connect] " 5083  " Cannot set socket close-on-exec mode"

,

5085 # ifdef NCBI_OS_MSWIN 5098

sslctx->

sock

= sock;

5102  if

(!sslctx->

sess

) {

5105  error

, strerr ? strerr :

""

,

5106

(

"%s[SOCK::Connect] " 5107  " %s to initialize secure session%s%s"

,

5109

sslcreate ?

"Failed"

:

"Unable"

,

5110

sslctx->

host

?

" with "

:

""

,

5111

sslctx->

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()"

,

5162

status = eIO_Closed;

5172  if

(!

error

|| !timeout || (timeout->

sec

| timeout->

usec

)) {

5175  const struct

timeval* x_tv =

s_to2tv

(timeout, &tv);

5180  const char

* reason;

5183

sprintf(

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),

5197

what ? what :

"pending connect()"

,

5214  unsigned short

port,

5221

memset(&

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 short

port,

5274  size_t size

= port ? 0 : strlen(hostpath);

5299

x_sock->

sslctx

= sslctx;

5313

memcpy(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]));

5332

status =

s_Connect

(x_sock, hostpath, port, timeout);

5345

memset(&temp, 0,

sizeof

(temp));

5348

temp.

sock

= x_sock;

5361  struct

sockaddr_in

in

;

5362  struct

sockaddr_in6 in6;

5364  struct

sockaddr_un un;

5372 #ifdef NCBI_OS_MSWIN 5376  unsigned short

myport = 0;

5378  SOCK

x_sock, x_orig = 0;

5385  if

(!handle || (handle_size && handle_size !=

sizeof

(fd))) {

5387

(

"SOCK#%u[?]: [SOCK::CreateOnTop] " 5388  " Invalid handle%s %lu"

,

5390

handle ?

" size"

:

""

,

5391

handle ? (

unsigned long

) handle_size : 0UL));

5398

x_orig = (

SOCK

) handle;

5403

fd = x_orig->

sock

;

5406  if

(!x_orig->

keep

) {

5414

oldctx = x_orig->

sslctx

;

5417

myport = x_orig->

myport

;

5419 #ifdef NCBI_OS_MSWIN 5420  event

= x_orig->

event

;

5427

memcpy(&fd, handle,

sizeof

(fd));

5436

memset(&u, 0,

sizeof

(u));

5438

addrlen =

sizeof

(u);

5440

u.sa.sa_len = addrlen;

5442  if

(getpeername(fd, &u.sa, &addrlen) != 0) {

5445  error

, strerr ? strerr :

""

,

5446

(

"SOCK#%u[%u]: [SOCK::CreateOnTop] " 5448

x_id, (

unsigned int

) fd,

5450

?

"Unconnected"

:

"Invalid"

,

5451

x_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])

5471

socklen = strlen(x_orig->

path

);

5472  else if

(!x_orig && (

5473

#

if

defined(NCBI_OS_BSD) || \

5475

defined(NCBI_OS_IRIX)

5476

u.sa.sa_family == AF_UNSPEC

||

5478

u.sa.sa_family == AF_UNIX)) {

5479  if

(addrlen ==

sizeof

(u.sa.sa_family) || !u.un.sun_path[0]) {

5480

memset(&u, 0,

sizeof

(u));

5481

addrlen =

sizeof

(u);

5482 # ifdef HAVE_SIN_LEN 5483

u.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"

,

5492

x_id, (

unsigned int

) fd,

5493

addrlen ==

sizeof

(u.sa.sa_family)

5494

?

"Unnamed"

:

"Abstract"

));

5498

socklen =

strnlen

(u.un.sun_path,

sizeof

(u.un.sun_path));

5507 #ifdef NCBI_OS_MSWIN 5510  if

(!(event = WSACreateEvent())) {

5511  DWORD

err = GetLastError();

5514

err, strerr ? strerr :

""

,

5515

(

"SOCK#%u[%u]: [SOCK::CreateOnTop] " 5516  " Failed to create IO event"

,

5517

x_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"

,

5528

x_id, (

unsigned int

) fd));

5539  error

, strerr ? strerr :

""

,

5540

(

"SOCK#%u[%u]: [SOCK::CreateOnTop] " 5541  " Cannot set socket to non-blocking mode"

,

5542

x_id, (

unsigned int

) fd));

5556

(

"SOCK#%u[%u]: [SOCK::CreateOnTop] " 5557  " Cannot store initial data (%lu byte%s)"

,

5558

x_id, (

unsigned int

) fd, (

unsigned long

)

size

,

5559

&

"s"

[

size

== 1]));

5568  if

(!(x_sock = (

SOCK

)

calloc

(1,

sizeof

(*x_sock) + socklen)))

5575

x_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) {

5586

x_sock->

port

= ntohs(u.in.sin_port);

5589

memcpy(&x_sock->

addr

, &u.in6.sin6_addr,

sizeof

(x_sock->

addr

));

5590

x_sock->

port

= ntohs(u.in6.sin6_port);

5598

x_sock->

myport

= myport;

5606  #ifdef NCBI_OS_MSWIN 5607

x_sock->

event

= event;

5614

x_sock->

w_buf

= w_buf;

5615  if

(oldctx && sslctx) {

5618  if

(!oldctx->sess &&

init

) {

5623

cred = oldctx->cred;

5624

host = oldctx->host;

5627

x_sock->

sslctx

= oldctx;

5629

x_orig->

sslctx

= sslctx;

5634

sslctx = x_sock->

sslctx

;

5635

}

else if

(sslctx) {

5638

x_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"

,

5661

sslcreate ?

"Failed"

:

"Unable"

,

5662

sslctx->

host

?

" with "

:

""

,

5663

sslctx->

host

? sslctx->

host

:

""

));

5666 #ifdef NCBI_OS_MSWIN 5667

WSAEventSelect(fd, event, 0

);

5668

WSACloseEvent(event);

5679

(

"%sSSL session re-acquired%s%s%s"

,

5681

sslctx->

host

?

" \""

:

""

,

5682

sslctx->

host

? sslctx->

host

:

""

,

5683

&

"\""

[!sslctx->

host

]));

5697  if

(x_sock->

w_buf

) {

5702

x_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  DWORD

err = 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 5759

memset(&

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);

5791

x_orig->

sock

= oldfd;

5792 #ifdef NCBI_OS_MSWIN 5793

x_orig->

event

= event;

5802  unsigned short

port,

5803  unsigned short

backlog,

5810  struct

sockaddr_in

in

;

5811  struct

sockaddr_in6 in6;

5813  struct

sockaddr_un un;

5823 #ifdef NCBI_OS_MSWIN 5839

pathlen = 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)"

,

5844

x_id, path, (

unsigned long

) pathlen,

5845

(

unsigned long

)

sizeof

(u.un.sun_path)));

5849

addrlen =

sizeof

(u.un);

5850

memset(&

addr

, 0,

sizeof

(

addr

));

5875

addrlen =

sizeof

(u.in);

5881

memset(&

addr

, 0,

sizeof

(

addr

));

5882

addrlen =

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

));

5964

memset(&u, 0, addrlen);

5965

u.sa.sa_family = family;

5967

u.sa.sa_len = addrlen;

5971  assert

(family == AF_UNIX);

5972

memcpy(u.un.sun_path, path, pathlen);

5978  assert

(family == AF_INET);

5980

u.in.sin_port = htons(port);

5982  assert

(family == AF_INET6);

5983

u.in6.sin6_port = htons(port);

5984

memcpy(&u.in6.sin6_addr, &

addr

,

sizeof

(u.in6.sin6_addr));

6001  error

, strerr ? strerr :

""

,

6002

(

"LSOCK#%u[%u]@%s: [LSOCK::Create] " 6004

x_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"

,

6032

x_id, (

unsigned int

) fd, cp));

6038  assert

((path && !port) ||

6041 #if defined(NCBI_OS_MSWIN) 6042  if

(!(event = WSACreateEvent())) {

6043  DWORD

err = GetLastError();

6048

err, strerr ? strerr :

""

,

6049

(

"LSOCK#%u[%u]@%s: [LSOCK::Create] " 6050  " Failed to create IO event"

,

6051

x_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"

,

6065

x_id, (

unsigned int

) fd, cp));

6068

WSACloseEvent(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"

,

6080

x_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)"

,

6095

x_id, (

unsigned int

) fd, cp, backlog));

6098 #ifdef NCBI_OS_MSWIN 6099

WSACloseEvent(event);

6105  if

(!(x_lsock =(

LSOCK

)

calloc

(1,

sizeof

(*x_lsock) + (path?strlen(path):0)))){

6107 #ifdef NCBI_OS_MSWIN 6108

WSACloseEvent(event);

6112

x_lsock->

sock

= fd;

6113

x_lsock->

id

= x_id;

6114

x_lsock->

port

= port;

6120 #if defined(NCBI_OS_UNIX) 6122

strcpy(x_lsock->

path

, path);

6123 #elif defined(NCBI_OS_MSWIN) 6124

x_lsock->

event

= event;

6128 #ifndef SOCK_CLOEXEC 6130  const char

* strerr;

6131 # ifdef NCBI_OS_MSWIN 6132  DWORD

err = 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  struct

sockaddr_in

in

;

6171  struct

sockaddr_in6 in6;

6173  struct

sockaddr_un un;

6180  unsigned short

port;

6181 #ifdef NCBI_OS_MSWIN 6193

(

"%s[LSOCK::Accept] " 6226  if

(lsock->

path

[0]) {

6227

addrlen =

sizeof

(u.un);

6232

addrlen =

sizeof

(u);

6234 #ifdef NCBI_OS_MSWIN 6241

fd = accept4(lsock->

sock

, &u.sa, &addrlen,

error

);

6243

fd = 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);

6260

memset(&

addr

, 0,

sizeof

(

addr

));

6261

path = lsock->

path

;

6266  switch

(u.sa.sa_family) {

6269

port = ntohs(u.in.sin_port);

6272

memcpy(&

addr

, &u.in6.sin6_addr,

sizeof

(

addr

));

6273

port = ntohs(u.in6.sin6_port);

6293 #if defined(NCBI_OS_MSWIN) 6294  if

(!(event = WSACreateEvent())) {

6295  DWORD

err = GetLastError();

6298

err, strerr ? strerr :

""

,

6299

(

"SOCK#%u[%u]@%s: [LSOCK::Accept] " 6300  " Failed to create IO event"

,

6301

x_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"

,

6315

x_id, (

unsigned int

) fd,

6316  s_CP

(&

addr

, port, path, _id,

sizeof

(_id))));

6319

WSACloseEvent(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"

,

6330

x_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 6343

WSACloseEvent(event);

6352

strcpy(x_sock->

path

, path);

6358

x_sock->

port

= port;

6369 #ifdef NCBI_OS_MSWIN 6370

x_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  DWORD

err = 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) 6462

WSAEventSelect(lsock->

sock

, lsock->

event

, 0

);

6468

(

"%s%s (%u accept%s total)"

,

6470

lsock->

keep

?

"Leaving"

:

"Closing"

,

6471

lsock->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 6505

WSASetEvent(lsock->

event

);

6511 #ifdef NCBI_OS_MSWIN 6512

WSACloseEvent(lsock->

event

);

6525  unsigned short

* sender_port)

6535

x_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  struct

sockaddr_in

in

;

6552  struct

sockaddr_in6 in6;

6555

memset(&u, 0,

sizeof

(u.sa));

6557

u.sa.sa_len = addrlen;

6561 #ifdef NCBI_OS_MSWIN 6569  unsigned short

port;

6573

*msglen = (size_t) x_read;

6574  switch

(u.sa.sa_family) {

6577

port = ntohs(u.in.sin_port);

6580

memcpy(&

addr

, &u.in6.sin6_addr,

sizeof

(

addr

));

6581

port = ntohs(u.in6.sin6_port);

6584

memset(&

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));

6612

memcpy(

buf

, x_msg,

6654  error

, strerr ? strerr :

""

,

6655

(

"%s[DSOCK::RecvMsg] " 6656  " Failed recvfrom()"

,

6665  if

(x_msgsize >

bufsize

&& x_msg != w)

6673  unsigned short

port,

6686  struct

sockaddr_in

in

;

6687  struct

sockaddr_in6 in6;

6691

status =

s_Write_

(sock,

data

, datalen, &x_msgsize, 1

);

6694  assert

(x_msgsize == datalen);

6706

(

"%s[DSOCK::SendMsg] " 6707  " Failed SOCK_gethostbyname(\"%.*s\")"

,

6712

port = 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,

6721

port ?

"host"

: &

"host:port"

[x_msgsize ? 5 : 0]));

6735  if

(x_msgsize <=

sizeof

(w))

6737  else if

(!(x_msg =

malloc

(x_msgsize)))

6744

addrlen = ipv4 ?

sizeof

(u.in) :

sizeof

(u.in6);

6745

memset(&u, 0, addrlen);

6746

u.sa.sa_family = ipv4 ? AF_INET : AF_INET6;

6748

u.sa.sa_len = addrlen;

6752

u.in.sin_port = htons(port);

6754

memcpy(&u.in6.sin6_addr, &

addr

,

sizeof

(u.in6.sin6_addr));

6755

u.in6.sin6_port = htons(port);

6763

&u.sa, addrlen)) >= 0) {

6771  if

((

size_t

) x_written != x_msgsize) {

6772

sock->

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_t

x_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) 6927

err = pipe2(fd, O_NONBLOCK | O_CLOEXEC);

6933

(

"TRIGGER#%u[?]: [TRIGGER::Create] " 6934  " Cannot create pipe"

, x_id));

6941 # ifdef F_DUPFD_CLOEXEC 6942

fd[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  DWORD

err = GetLastError();

7035

err, strerr ? strerr :

""

,

7036

(

"TRIGGER#%u: [TRIGGER::Create] " 7037  " Cannot create event object"

, x_id));

7041  if

(!(*trigger = (

TRIGGER

)

calloc

(1,

sizeof

(**trigger)))) {

7042

WSACloseEvent(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) 7090

WSACloseEvent(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) 7139

trigger->

isset

.

ptr

= (

void

*) 1

;

7146  return

status ==

eIO_Timeout

? eIO_Closed : status;

7161 #if defined(NCBI_OS_UNIX) 7163

trigger->

isset

.

ptr

= (

void

*) 0

;

7165 #elif defined(NCBI_OS_MSWIN) 7167  if

(!WSAResetEvent(trigger->

fd

))

7183  unsigned short

backlog,

7193  unsigned short

backlog,

7204  unsigned short

backlog,

7215  unsigned short

backlog,

7227  unsigned short

backlog,

7232  if

(!path || !*path)

7279  if

(!handle || handle_size !=

sizeof

(lsock->

sock

)) {

7281

(

"LSOCK#%u[%u]: [LSOCK::GetOSHandle] " 7282  " Invalid handle%s %lu"

,

7283

lsock->

id

, (

unsigned int

) lsock->

sock

,

7284

handle ?

" size"

:

""

,

7285

handle ? (

unsigned long

) handle_size : 0UL));

7291

memcpy(handle, &fd, handle_size);

7295

memcpy(handle, &fd, handle_size);

7297

status = eIO_Closed;

7320  unsigned short

port;

7327  unsigned int

* host,

7328  unsigned short

* port,

7337  unsigned short

* port,

7366  unsigned short

port,

7383  unsigned short

port,

7392  unsigned short

port,

7400

memset(&

init

, 0,

sizeof

(

init

));

7416  if

(!path || !*path)

7418 #ifndef NCBI_OS_UNIX 7423

memset(&

init

, 0,

sizeof

(

init

));

7465

memset(&

init

, 0,

sizeof

(

init

));

7475  unsigned short

port,

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));

7564

memset(&

info

, 0,

sizeof

(

info

));

7577  info

.status = status;

7591

status = eIO_Closed;

7633  if

(!handle || handle_size !=

sizeof

(sock->

sock

)) {

7636

(

"%s[SOCK::GetOSHandle] " 7637  " Invalid handle%s %lu"

,

7639

handle ?

" size"

:

""

,

7640

handle ? (

unsigned long

) handle_size : 0UL));

7646

memcpy(handle, &fd, handle_size);

7650

memcpy(handle, &fd, handle_size);

7652

status = eIO_Closed;

7678  if

(!handle || handle_size !=

sizeof

(fd))

7681

memcpy(&fd, handle,

sizeof

(fd));

7688

setsockopt(fd, SOL_SOCKET, SO_LINGER, (

char

*) &

lgr

,

sizeof

(

lgr

));

7692

setsockopt(fd, IPPROTO_TCP, TCP_LINGER2, (

char

*) &no,

sizeof

(no));

7707 #ifdef NCBI_OS_MSWIN 7708  if

(

error

== WSANOTINITIALISED) {

7717

status = 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));

7841

status =

s_Wait

(sock, event, timeout);

7845

memset(&

info

, 0,

sizeof

(

info

));

7857  info

.event = event;

7858  info

.status = status;

7881

g_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_t

orig_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) {

7957

orig_polls[orig_iter] = polls[new_iter];

7966  if

(mnk_status != -1)

7967

status = 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  return

sock->

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));

8074

x_buf = (

char

*)

buf

;

8078

status =

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 int

cr_seen,

done

;

8127  if

(!

size

|| !line) {

8133

(

"%s[SOCK::ReadLine] " 8140

cr_seen =

done

= 0

;

8144  char

* x_buf =

size

-

len

<

sizeof

(w) - cr_seen ? w : line +

len

;

8146  x_size

=

sizeof

(w) - cr_seen;

8162

line[

len

++] =

'\r'

;

8186

(

"%s[SOCK::ReadLine] " 8187  " Cannot pushback extra CR"

,

8203

(

"%s[SOCK::ReadLine] " 8204  " Cannot pushback extra data (%lu byte%s)"

,

8217

line[

len

] =

'\0'

;

8236

(

"%s[SOCK::Pushback] " 8249  switch

(direction) {

8290  const char

* x_data;

8295

(

"%s[SOCK::Write] " 8296  " OOB not supported for datagrams"

,

8311

x_data = (

const char

*)

data

;

8314

status =

s_Write

(sock, x_data,

8315  size

, &xx_written, 0);

8316

x_written += xx_written;

8317

x_data += xx_written;

8324

(

"%s[SOCK::Write] " 8325  " Unsupported write method #%u"

,

8326  s_ID

(sock, _id), (

unsigned int

) how));

8334

(

"%s[SOCK::Write] " 8337

status = eIO_Closed;

8342

*n_written = x_written;

8353

(

"%s[SOCK::Abort] " 8360

(

"%s[SOCK::Abort] " 8361  " Datagram socket"

,

8375  unsigned short

port;

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,

8433

memset(

addr

, 0,

sizeof

(*

addr

));

8443

? sock->

port

: ntohs(sock->

port

);

8451  unsigned short

port;

8479

memcpy(

buf

, path,

len

+ 1);

8493  if

((

len

= (

size_t

) sprintf(port,

"%hu"

, sock->

port

)) <

bufsize

)

8494

memcpy(

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  DWORD

err = GetLastError();

8682

err, strerr ? strerr :

""

,

8683

(

"DSOCK#%u[%u]: [DSOCK::Create] " 8684  " Failed to create IO event"

,

8685

x_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"

,

8697

x_id, (

unsigned int

) fd));

8700

WSACloseEvent(event);

8703 #elif !defined(SOCK_NONBLOCK) 8708  error

, strerr ? strerr :

""

,

8709

(

"DSOCK#%u[%u]: [DSOCK::Create] " 8710  " Cannot set socket to non-blocking mode"

,

8711

x_id, (

unsigned int

) fd));

8718  if

(!(x_sock = (

SOCK

)

calloc

(1,

sizeof

(*x_sock)))) {

8720 #ifdef NCBI_OS_MSWIN 8721

WSACloseEvent(event);

8735 #ifdef NCBI_OS_MSWIN 8736

x_sock->

event

= event;

8744 #ifndef SOCK_CLOEXEC 8746  const char

* strerr;

8748 # ifdef NCBI_OS_MSWIN 8749  DWORD

err = 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 short

port,

8792  struct

sockaddr_in

in

;

8793  struct

sockaddr_in6 in6;

8800

(

"%s[DSOCK::Bind] " 8807

(

"%s[DSOCK::Bind] " 8808  " Not a datagram socket"

,

8831  assert

(family == AF_INET || family == AF_INET6);

8832

addrlen = family == AF_INET6 ?

sizeof

(u.in6) :

sizeof

(u.in);

8834

memset(&u, 0, addrlen);

8835

u.sa.sa_family = family;

8837

u.sa.sa_len = addrlen;

8839  if

(family == AF_INET) {

8841

u.in.sin_port = htons(port);

8843

u.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) {

8868

port = htons(u.in.sin_port);

8871

port = 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 short

port)

8909  unsigned short

port)

8914  struct

sockaddr_in

in

;

8915  struct

sockaddr_in6 in6;

8923

(

"%s[DSOCK::Connect] " 8930

(

"%s[DSOCK::Connect] " 8931  " Not a datagram socket"

,

8947  if

(!host != !port) {

8950

sprintf(addrstr,

":%hu"

, port);

8954

(

"%s[DSOCK::Connect] " 8955  " Address \"%.*s%s\" incomplete, missing %s"

,

8957

addrstr, port ?

"host"

:

"port"

));

8961

memset(&

addr

, 0,

sizeof

(

addr

));

8964

(

"%s[DSOCK::Connect] " 8965  " Failed SOCK_gethostbyname(\"%.*s\")"

,

8974

addrlen = ipv4 ?

sizeof

(u.in) :

sizeof

(u.in6);

8975

memset(&u, 0, addrlen);

8976

u.sa.sa_family = ipv4 ? AF_INET : AF_INET6;

8979

u.in.sin_port = htons(port);

8981

memcpy(&u.in6.sin6_addr, &

addr

,

sizeof

(u.in6.sin6_addr));

8982

u.in6.sin6_port = htons(port);

8985

addrlen =

sizeof

(u.sa);

8986

memset(&u, 0, addrlen);

8987

u.sa.sa_family = AF_UNSPEC;

8990

u.sa.sa_len = addrlen;

8992  if

(connect(sock->

sock

, &u.sa, addrlen) != 0) {

8995  if

(port | sock->

port

) {

8998

port ? port : sock->

port

,

8999

addrstr,

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"

,

9054

status = eIO_Closed;

9059

memset(&

info

, 0,

sizeof

(

info

));

9066  info

.status = status;

9079  unsigned short

* sender_port)

9087

memset(sender_addr, 0,

sizeof

(*sender_addr));

9093

(

"%s[DSOCK::RecvMsg] " 9100

(

"%s[DSOCK::RecvMsg] " 9101  " Not a datagram socket"

,

9108

sender_addr, sender_port);

9112

memset(&

info

, 0,

sizeof

(

info

));

9119  info

.status = status;

9131  unsigned int

* sender_addr,

9132  unsigned short

* sender_port)

9136

&

addr

, sender_port);

9145  unsigned short

port,

9154

(

"%s[DSOCK::SendMsg] " 9161

(

"%s[DSOCK::SendMsg] " 9162  " Not a datagram socket"

,

9174

memset(&

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  BOOL

bcast = !!on_off;

9265  int

bcast = !!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  return

sock->

n_in

;

9295  return

sock->

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]);

9566

memcpy(

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  return

end && !*end;

9635  return

htonl(

value

);

9641  return

htons(

value

);

9647  return

htonl(

value

);

9653  return

htons(

value

);

9811

memset(loop->

octet

, 0,

sizeof

(loop->

octet

) - 1);

9812

loop->

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  return

IN_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 short

port,

9891  unsigned short

port,

9915

mess =

"Cannot reset SSL while it is in use"

;

9917

mess = (

const char

*)(-1L)

;

9919

mess =

"Conflicting SSL auto-setup"

;

9926

mess == (

const char

*)(-1L)

9928

mess == (

const char

*)(-1L)

9929

?

"Conflicting SSL setup ignored" 9971 #ifdef NCBI_OS_MSWIN 9977  if

(timespec_get(&ts, TIME_UTC) == TIME_UTC) {

9978

tp->tv_sec = (long) ts.tv_sec;

9979

tp->tv_usec = (

long

)(ts.tv_nsec / 1000);

9982  static const

ULONGLONG EPOCH = 11644473600L;

9985

ULARGE_INTEGER time;

9987 # if _WIN32_WINNT >= _WIN32_WINNT_WIN8 9988

GetSystemTimePreciseAsFileTime(&systime);

9990

GetSystemTimeAsFileTime(&systime);

9993

time.LowPart = systime.dwLowDateTime;

9994

time.HighPart = systime.dwHighDateTime;

9996

tp->tv_sec = (long)(time.QuadPart / 10000000 - EPOCH);

9997

tp->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