8000 libevent/evutil.c at master · jamescool/libevent · GitHub
[go: up one dir, main page]
More Web Proxy on the site http://driver.im/
Skip to content
{"payload":{"allShortcutsEnabled":false,"fileTree":{"":{"items":[{"name":"WIN32-Code","path":"WIN32-Code","contentType":"directory"},{"name":"cmake","path":"cmake","contentType":"directory"},{"name":"compat","path":"compat","contentType":"directory"},{"name":"include","path":"include","contentType":"directory"},{"name":"m4","path":"m4","contentType":"directory"},{"name":"sample","path":"sample","contentType":"directory"},{"name":"test","path":"test","contentType":"directory"},{"name":".clang-format","path":".clang-format","contentType":"file"},{"name":".gitignore","path":".gitignore","contentType":"file"},{"name":".travis.yml","path":".travis.yml","contentType":"file"},{"name":".uncrustify","path":".uncrustify","contentType":"file"},{"name":"CMakeLists.txt","path":"CMakeLists.txt","contentType":"file"},{"name":"CONTRIBUTING.md","path":"CONTRIBUTING.md","contentType":"file"},{"name":"ChangeLog","path":"ChangeLog","contentType":"file"},{"name":"ChangeLog-1.4","path":"ChangeLog-1.4","contentType":"file"},{"name":"ChangeLog-2.0","path":"ChangeLog-2.0","contentType":"file"},{"name":"Doxyfile","path":"Doxyfile","contentType":"file"},{"name":"LICENSE","path":"LICENSE","contentType":"file"},{"name":"Makefile.am","path":"Makefile.am","contentType":"file"},{"name":"Makefile.nmake","path":"Makefile.nmake","contentType":"file"},{"name":"README.md","path":"README.md","contentType":"file"},{"name":"Vagrantfile","path":"Vagrantfile","contentType":"file"},{"name":"appveyor.yml","path":"appveyor.yml","contentType":"file"},{"name":"arc4random.c","path":"arc4random.c","contentType":"file"},{"name":"autogen.sh","path":"autogen.sh","contentType":"file"},{"name":"buffer.c","path":"buffer.c","contentType":"file"},{"name":"buffer_iocp.c","path":"buffer_iocp.c","contentType":"file"},{"name":"bufferevent-internal.h","path":"bufferevent-internal.h","contentType":"file"},{"name":"bufferevent.c","path":"bufferevent.c","contentType":"file"},{"name":"bufferevent_async.c","path":"bufferevent_async.c","contentType":"file"},{"name":"bufferevent_filter.c","path":"bufferevent_filter.c","contentType":"file"},{"name":"bufferevent_openssl.c","path":"bufferevent_openssl.c","contentType":"file"},{"name":"bufferevent_pair.c","path":"bufferevent_pair.c","contentType":"file"},{"name":"bufferevent_ratelim.c","path":"bufferevent_ratelim.c","contentType":"file"},{"name":"bufferevent_sock.c","path":"bufferevent_sock.c","contentType":"file"},{"name":"changelist-internal.h","path":"changelist-internal.h","contentType":"file"},{"name":"checkpatch.sh","path":"checkpatch.sh","contentType":"file"},{"name":"configure.ac","path":"configure.ac","contentType":"file"},{"name":"defer-internal.h","path":"defer-internal.h","contentType":"file"},{"name":"devpoll.c","path":"devpoll.c","contentType":"file"},{"name":"epoll.c","path":"epoll.c","contentType":"file"},{"name":"epoll_sub.c","path":"epoll_sub.c","contentType":"file"},{"name":"epolltable-internal.h","path":"epolltable-internal.h","contentType":"file"},{"name":"evbuffer-internal.h","path":"evbuffer-internal.h","contentType":"file"},{"name":"evconfig-private.h.cmake","path":"evconfig-private.h.cmake","contentType":"file"},{"name":"evconfig-private.h.in","path":"evconfig-private.h.in","contentType":"file"},{"name":"evdns.3","path":"evdns.3","contentType":"file"},{"name":"evdns.c","path":"evdns.c","contentType":"file"},{"name":"event-config.h.cmake","path":"event-config.h.cmake","contentType":"file"},{"name":"event-internal.h","path":"event-internal.h","contentType":"file"},{"name":"event.3","path":"event.3","contentType":"file"},{"name":"event.c","path":"event.c","contentType":"file"},{"name":"event_iocp.c","path":"event_iocp.c","contentType":"file"},{"name":"event_rpcgen.py","path":"event_rpcgen.py","contentType":"file"},{"name":"event_tagging.c","path":"event_tagging.c","contentType":"file"},{"name":"evmap-internal.h","path":"evmap-internal.h","contentType":"file"},{"name":"evmap.c","path":"evmap.c","contentType":"file"},{"name":"evport.c","path":"evport.c","contentType":"file"},{"name":"evrpc-internal.h","path":"evrpc-internal.h","contentType":"file"},{"name":"evrpc.c","path":"evrpc.c","contentType":"file"},{"name":"evsignal-internal.h","path":"evsignal-internal.h","contentType":"file"},{"name":"evthread-internal.h","path":"evthread-internal.h","contentType":"file"},{"name":"evthread.c","path":"evthread.c","contentType":"file"},{"name":"evthread_pthread.c","path":"evthread_pthread.c","contentType":"file"},{"name":"evthread_win32.c","path":"evthread_win32.c","contentType":"file"},{"name":"evutil.c","path":"evutil.c","contentType":"file"},{"name":"evutil_rand.c","path":"evutil_rand.c","contentType":"file"},{"name":"evutil_time.c","path":"evutil_time.c","contentType":"file"},{"name":"ht-internal.h","path":"ht-internal.h","contentType":"file"},{"name":"http-internal.h","path":"http-internal.h","contentType":"file"},{"name":"http.c","path":"http.c","contentType":"file"},{"name":"iocp-internal.h","path":"iocp-internal.h","contentType":"file"},{"name":"ipv6-internal.h","path":"ipv6-internal.h","contentType":"file"},{"name":"kqueue-internal.h","path":"kqueue-internal.h","contentType":"file"},{"name":"kqueue.c","path":"kqueue.c","contentType":"file"},{"name":"libevent.pc.in","path":"libevent.pc.in","contentType":"file"},{"name":"libevent_core.pc.in","path":"libevent_core.pc.in","contentType":"file"},{"name":"libevent_extra.pc.in","path":"libevent_extra.pc.in","contentType":"file"},{"name":"libevent_openssl.pc.in","path":"libevent_openssl.pc.in","contentType":"file"},{"name":"libevent_pthreads.pc.in","path":"libevent_pthreads.pc.in","contentType":"file"},{"name":"listener.c","path":"listener.c","contentType":"file"},{"name":"log-internal.h","path":"log-internal.h","contentType":"file"},{"name":"log.c","path":"log.c","contentType":"file"},{"name":"make-event-config.sed","path":"make-event-config.sed","contentType":"file"},{"name":"make_epoll_table.py","path":"make_epoll_table.py","contentType":"file"},{"name":"minheap-internal.h","path":"minheap-internal.h","contentType":"file"},{"name":"mm-internal.h","path":"mm-internal.h","contentType":"file"},{"name":"openssl-compat.h","path":"openssl-compat.h","contentType":"file"},{"name":"poll.c","path":"poll.c","contentType":"file"},{"name":"ratelim-internal.h","path":"ratelim-internal.h","contentType":"file"},{"name":"select.c","path":"select.c","contentType":"file"},{"name":"signal.c","path":"signal.c","contentType":"file"},{"name":"strlcpy-internal.h","path":"strlcpy-internal.h","contentType":"file"},{"name":"strlcpy.c","path":"strlcpy.c","contentType":"file"},{"name":"time-internal.h","path":"time-internal.h","contentType":"file"},{"name":"util-internal.h","path":"util-internal.h","contentType":"file"},{"name":"whatsnew-2.0.txt","path":"whatsnew-2.0.txt","contentType":"file"},{"name":"whatsnew-2.1.txt","path":"whatsnew-2.1.txt","contentType":"file"},{"name":"win32select.c","path":"win32select.c","contentType":"file"}],"totalCount":99}},"fileTreeProcessingTime":17.194156,"foldersToFetch":[],"incompleteFileTree":false,"repo":{"id":77128545,"defaultBranch":"master","name":"libevent","ownerLogin":"jamescool","currentUserCanPush":false,"isFork":true,"isEmpty":false,"createdAt":"2016-12-22T08:48:33.000Z","ownerAvatar":"https://avatars.githubusercontent.com/u/11913155?v=4","public":true,"private":false,"isOrgOwned":false},"codeLineWrapEnabled":false,"symbolsExpanded":false,"treeExpanded":true,"refInfo":{"name":"master","listCacheKey":"v0:1615351560.8525581","canEdit":false,"refType":"branch","currentOid":"68def4352c270fe597d3253b3e20cbe974e2f7d5"},"path":"evutil.c","currentUser":null,"blob":{"rawLines":["/*"," * Copyright (c) 2007-2012 Niels Provos and Nick Mathewson"," *"," * Redistribution and use in source and binary forms, with or without"," * modification, are permitted provided that the following conditions"," * are met:"," * 1. Redistributions of source code must retain the above copyright"," * notice, this list of conditions and the following disclaimer."," * 2. Redistributions in binary form must reproduce the above copyright"," * notice, this list of conditions and the following disclaimer in the"," * documentation and/or other materials provided with the distribution."," * 3. The name of the author may not be used to endorse or promote products"," * derived from this software without specific prior written permission."," *"," * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR"," * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES"," * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED."," * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,"," * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT"," * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,"," * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY"," * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT"," * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF"," * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE."," */","","#include \"event2/event-config.h\"","#include \"evconfig-private.h\"","","#ifdef _WIN32","#include \u003cwinsock2.h\u003e","#include \u003cws2tcpip.h\u003e","#define WIN32_LEAN_AND_MEAN","#include \u003cwindows.h\u003e","#undef WIN32_LEAN_AND_MEAN","#include \u003cio.h\u003e","#include \u003ctchar.h\u003e","#include \u003cprocess.h\u003e","#undef _WIN32_WINNT","/* For structs needed by GetAdaptersAddresses */","#define _WIN32_WINNT 0x0501","#include \u003ciphlpapi.h\u003e","#endif","","#include \u003csys/types.h\u003e","#ifdef EVENT__HAVE_SYS_SOCKET_H","#include \u003csys/socket.h\u003e","#endif","#ifdef EVENT__HAVE_UNISTD_H","#include \u003cunistd.h\u003e","#endif","#ifdef EVENT__HAVE_FCNTL_H","#include \u003cfcntl.h\u003e","#endif","#ifdef EVENT__HAVE_STDLIB_H","#include \u003cstdlib.h\u003e","#endif","#include \u003cerrno.h\u003e","#include \u003climits.h\u003e","#include \u003cstdio.h\u003e","#include \u003cstring.h\u003e","#ifdef EVENT__HAVE_NETINET_IN_H","#include \u003cnetinet/in.h\u003e","#endif","#ifdef EVENT__HAVE_NETINET_IN6_H","#include \u003cnetinet/in6.h\u003e","#endif","#ifdef EVENT__HAVE_NETINET_TCP_H","#include \u003cnetinet/tcp.h\u003e","#endif","#ifdef EVENT__HAVE_ARPA_INET_H","#include \u003carpa/inet.h\u003e","#endif","#include \u003ctime.h\u003e","#include \u003csys/stat.h\u003e","#ifdef EVENT__HAVE_IFADDRS_H","#include \u003cifaddrs.h\u003e","#endif","","#include \"event2/util.h\"","#include \"util-internal.h\"","#include \"log-internal.h\"","#include \"mm-internal.h\"","#include \"evthread-internal.h\"","","#include \"strlcpy-internal.h\"","#include \"ipv6-internal.h\"","","#ifdef _WIN32","#define HT_NO_CACHE_HASH_VALUES","#include \"ht-internal.h\"","#define open _open","#define read _read","#define close _close","#ifndef fstat","#define fstat _fstati64","#endif","#ifndef stat","#define stat _stati64","#endif","#define mode_t int","#endif","","int","evutil_open_closeonexec_(const char *pathname, int flags, unsigned mode)","{","\tint fd;","","#ifdef O_CLOEXEC","\tfd = open(pathname, flags|O_CLOEXEC, (mode_t)mode);","\tif (fd \u003e= 0 || errno == EINVAL)","\t\treturn fd;","\t/* If we got an EINVAL, fall through and try without O_CLOEXEC */","#endif","\tfd = open(pathname, flags, (mode_t)mode);","\tif (fd \u003c 0)","\t\treturn -1;","","#if defined(FD_CLOEXEC)","\tif (fcntl(fd, F_SETFD, FD_CLOEXEC) \u003c 0) {","\t\tclose(fd);","\t\treturn -1;","\t}","#endif","","\treturn fd;","}","","/**"," Read the contents of 'filename' into a newly allocated NUL-terminated"," string. Set *content_out to hold this string, and *len_out to hold its"," length (not including the appended NUL). If 'is_binary', open the file in"," binary mode.",""," Returns 0 on success, -1 if the open fails, and -2 for all other failures.",""," Used internally only; may go away in a future version."," */","int","evutil_read_file_(const char *filename, char **content_out, size_t *len_out,"," int is_binary)","{","\tint fd, r;","\tstruct stat st;","\tchar *mem;","\tsize_t read_so_far=0;","\tint mode = O_RDONLY;","","\tEVUTIL_ASSERT(content_out);","\tEVUTIL_ASSERT(len_out);","\t*content_out = NULL;","\t*len_out = 0;","","#ifdef O_BINARY","\tif (is_binary)","\t\tmode |= O_BINARY;","#endif","","\tfd = evutil_open_closeonexec_(filename, mode, 0);","\tif (fd \u003c 0)","\t\treturn -1;","\tif (fstat(fd, \u0026st) || st.st_size \u003c 0 ||","\t st.st_size \u003e EV_SSIZE_MAX-1 ) {","\t\tclose(fd);","\t\treturn -2;","\t}","\tmem = mm_malloc((size_t)st.st_size + 1);","\tif (!mem) {","\t\tclose(fd);","\t\treturn -2;","\t}","\tread_so_far = 0;","#ifdef _WIN32","#define N_TO_READ(x) ((x) \u003e INT_MAX) ? INT_MAX : ((int)(x))","#else","#define N_TO_READ(x) (x)","#endif","\twhile ((r = read(fd, mem+read_so_far, N_TO_READ(st.st_size - read_so_far))) \u003e 0) {","\t\tread_so_far += r;","\t\tif (read_so_far \u003e= (size_t)st.st_size)","\t\t\tbreak;","\t\tEVUTIL_ASSERT(read_so_far \u003c (size_t)st.st_size);","\t}","\tclose(fd);","\tif (r \u003c 0) {","\t\tmm_free(mem);","\t\treturn -2;","\t}","\tmem[read_so_far] = 0;","","\t*len_out = read_so_far;","\t*content_out = mem;","\treturn 0;","}","","int","evutil_socketpair(int family, int type, int protocol, evutil_socket_t fd[2])","{","#ifndef _WIN32","\treturn socketpair(family, type, protocol, fd);","#else","\treturn evutil_ersatz_socketpair_(family, type, protocol, fd);","#endif","}","","int","evutil_ersatz_socketpair_(int family, int type, int protocol,"," evutil_socket_t fd[2])","{","\t/* This code is originally from Tor. Used with permission. */","","\t/* This socketpair does not work when localhost is down. So","\t * it's really not the same thing at all. But it's close enough","\t * for now, and really, when localhost is down sometimes, we","\t * have other problems too.","\t */","#ifdef _WIN32","#define ERR(e) WSA##e","#else","#define ERR(e) e","#endif","\tevutil_socket_t listener = -1;","\tevutil_socket_t connector = -1;","\tevutil_socket_t acceptor = -1;","\tstruct sockaddr_in listen_addr;","\tstruct sockaddr_in connect_addr;","\tev_socklen_t size;","\tint saved_errno = -1;","\tint family_test;","\t","\tfamily_test = family != AF_INET;","#ifdef AF_UNIX","\tfamily_test = family_test \u0026\u0026 (family != AF_UNIX);","#endif","\tif (protocol || family_test) {","\t\tEVUTIL_SET_SOCKET_ERROR(ERR(EAFNOSUPPORT));","\t\treturn -1;","\t}","\t","\tif (!fd) {","\t\tEVUTIL_SET_SOCKET_ERROR(ERR(EINVAL));","\t\treturn -1;","\t}","","\tlistener = socket(AF_INET, type, 0);","\tif (listener \u003c 0)","\t\treturn -1;","\tmemset(\u0026listen_addr, 0, sizeof(listen_addr));","\tlisten_addr.sin_family = AF_INET;","\tlisten_addr.sin_addr.s_addr = htonl(INADDR_LOOPBACK);","\tlisten_addr.sin_port = 0;\t/* kernel chooses port.\t */","\tif (bind(listener, (struct sockaddr *) \u0026listen_addr, sizeof (listen_addr))","\t\t== -1)","\t\tgoto tidy_up_and_fail;","\tif (listen(listener, 1) == -1)","\t\tgoto tidy_up_and_fail;","","\tconnector = socket(AF_INET, type, 0);","\tif (connector \u003c 0)","\t\tgoto tidy_up_and_fail;","","\tmemset(\u0026connect_addr, 0, sizeof(connect_addr));","","\t/* We want to find out the port number to connect to. */","\tsize = sizeof(connect_addr);","\tif (getsockname(listener, (struct sockaddr *) \u0026connect_addr, \u0026size) == -1)","\t\tgoto tidy_up_and_fail;","\tif (size != sizeof (connect_addr))","\t\tgoto abort_tidy_up_and_fail;","\tif (connect(connector, (struct sockaddr *) \u0026connect_addr,","\t\t\t\tsizeof(connect_addr)) == -1)","\t\tgoto tidy_up_and_fail;","","\tsize = sizeof(listen_addr);","\tacceptor = accept(listener, (struct sockaddr *) \u0026listen_addr, \u0026size);","\tif (acceptor \u003c 0)","\t\tgoto tidy_up_and_fail;","\tif (size != sizeof(listen_addr))","\t\tgoto abort_tidy_up_and_fail;","\t/* Now check we are talking to ourself by matching port and host on the","\t two sockets.\t */","\tif (getsockname(connector, (struct sockaddr *) \u0026connect_addr, \u0026size) == -1)","\t\tgoto tidy_up_and_fail;","\tif (size != sizeof (connect_addr)","\t\t|| listen_addr.sin_family != connect_addr.sin_family","\t\t|| listen_addr.sin_addr.s_addr != connect_addr.sin_addr.s_addr","\t\t|| listen_addr.sin_port != connect_addr.sin_port)","\t\tgoto abort_tidy_up_and_fail;","\tevutil_closesocket(listener);","\tfd[0] = connector;","\tfd[1] = acceptor;","","\treturn 0;",""," abort_tidy_up_and_fail:","\tsaved_errno = ERR(ECONNABORTED);"," tidy_up_and_fail:","\tif (saved_errno \u003c 0)","\t\tsaved_errno = EVUTIL_SOCKET_ERROR();","\tif (listener != -1)","\t\tevutil_closesocket(listener);","\tif (connector != -1)","\t\tevutil_closesocket(connector);","\tif (acceptor != -1)","\t\tevutil_closesocket(acceptor);","","\tEVUTIL_SET_SOCKET_ERROR(saved_errno);","\treturn -1;","#undef ERR","}","","int","evutil_make_socket_nonblocking(evutil_socket_t fd)","{","#ifdef _WIN32","\t{","\t\tunsigned long nonblocking = 1;","\t\tif (ioctlsocket(fd, FIONBIO, \u0026nonblocking) == SOCKET_ERROR) {","\t\t\tevent_sock_warn(fd, \"fcntl(%d, F_GETFL)\", (int)fd);","\t\t\treturn -1;","\t\t}","\t}","#else","\t{","\t\tint flags;","\t\tif ((flags = fcntl(fd, F_GETFL, NULL)) \u003c 0) {","\t\t\tevent_warn(\"fcntl(%d, F_GETFL)\", fd);","\t\t\treturn -1;","\t\t}","\t\tif (!(flags \u0026 O_NONBLOCK)) {","\t\t\tif (fcntl(fd, F_SETFL, flags | O_NONBLOCK) == -1) {","\t\t\t\tevent_warn(\"fcntl(%d, F_SETFL)\", fd);","\t\t\t\treturn -1;","\t\t\t}","\t\t}","\t}","#endif","\treturn 0;","}","","/* Faster version of evutil_make_socket_nonblocking for internal use."," *"," * Requires that no F_SETFL flags were previously set on the fd."," */","static int","evutil_fast_socket_nonblocking(evutil_socket_t fd)","{","#ifdef _WIN32","\treturn evutil_make_socket_nonblocking(fd);","#else","\tif (fcntl(fd, F_SETFL, O_NONBLOCK) == -1) {","\t\tevent_warn(\"fcntl(%d, F_SETFL)\", fd);","\t\treturn -1;","\t}","\treturn 0;","#endif","}","","int","evutil_make_listen_socket_reuseable(evutil_socket_t sock)","{","#if defined(SO_REUSEADDR) \u0026\u0026 !defined(_WIN32)","\tint ","\t/* REUSEADDR on Unix means, \"don't hang on to this address after the","\t * listener is closed.\" On Windows, though, it means \"don't keep other","\t * processes from binding to this address while we're using it. */","\treturn setsockopt(sock, SOL_SOCKET, SO_REUSEADDR, (void*) \u0026one,","\t (ev_socklen_t)sizeof(one));","#else","\treturn 0;","#endif","}","","int","evutil_make_listen_socket_reuseable_port(evutil_socket_t sock)","{","#if defined __linux__ \u0026\u0026 defined(SO_REUSEPORT)","\tint ","\t/* REUSEPORT on Linux 3.9+ means, \"Multiple servers (processes or","\t * threads) can bind to the same port if they each set the option. */","\treturn setsockopt(sock, SOL_SOCKET, SO_REUSEPORT, (void*) \u0026one,","\t (ev_socklen_t)sizeof(one));","#else","\treturn 0;","#endif","}","","int","evutil_make_tcp_listen_socket_deferred(evutil_socket_t sock)","{","#if defined(EVENT__HAVE_NETINET_TCP_H) \u0026\u0026 defined(TCP_DEFER_ACCEPT)","\tint ","","\t/* TCP_DEFER_ACCEPT tells the kernel to call defer accept() only after data","\t * has arrived and ready to read */ ","\treturn setsockopt(sock, IPPROTO_TCP, TCP_DEFER_ACCEPT, \u0026one,","\t\t(ev_socklen_t)sizeof(one)); ","#endif","\treturn 0;","}","","int","evutil_make_socket_closeonexec(evutil_socket_t fd)","{","#if !defined(_WIN32) \u0026\u0026 defined(EVENT__HAVE_SETFD)","\tint flags;","\tif ((flags = fcntl(fd, F_GETFD, NULL)) \u003c 0) {","\t\tevent_warn(\"fcntl(%d, F_GETFD)\", fd);","\t\treturn -1;","\t}","\tif (!(flags \u0026 FD_CLOEXEC)) {","\t\tif (fcntl(fd, F_SETFD, flags | FD_CLOEXEC) == -1) {","\t\t\tevent_warn(\"fcntl(%d, F_SETFD)\", fd);","\t\t\treturn -1;","\t\t}","\t}","#endif","\treturn 0;","}","","/* Faster version of evutil_make_socket_closeonexec for internal use."," *"," * Requires that no F_SETFD flags were previously set on the fd."," */","static int","evutil_fast_socket_closeonexec(evutil_socket_t fd)","{","#if !defined(_WIN32) \u0026\u0026 defined(EVENT__HAVE_SETFD)","\tif (fcntl(fd, F_SETFD, FD_CLOEXEC) == -1) {","\t\tevent_warn(\"fcntl(%d, F_SETFD)\", fd);","\t\treturn -1;","\t}","#endif","\treturn 0;","}","","int","evutil_closesocket(evutil_socket_t sock)","{","#ifndef _WIN32","\treturn close(sock);","#else","\treturn closesocket(sock);","#endif","}","","ev_int64_t","evutil_strtoll(const char *s, char **endptr, int base)","{","#ifdef EVENT__HAVE_STRTOLL","\treturn (ev_int64_t)strtoll(s, endptr, base);","#elif EVENT__SIZEOF_LONG == 8","\treturn (ev_int64_t)strtol(s, endptr, base);","#elif defined(_WIN32) \u0026\u0026 defined(_MSC_VER) \u0026\u0026 _MSC_VER \u003c 1300","\t/* XXXX on old versions of MS APIs, we only support base","\t * 10. */","\tev_int64_t r;","\tif (base != 10)","\t\treturn 0;","\tr = (ev_int64_t) _atoi64(s);","\twhile (isspace(*s))","\t\t++s;","\tif (*s == '-')","\t\t++s;","\twhile (isdigit(*s))","\t\t++s;","\tif (endptr)","\t\t*endptr = (char*) s;","\treturn r;","#elif defined(_WIN32)","\treturn (ev_int64_t) _strtoi64(s, endptr, base);","#elif defined(EVENT__SIZEOF_LONG_LONG) \u0026\u0026 EVENT__SIZEOF_LONG_LONG == 8","\tlong long r;","\tint n;","\tif (base != 10 \u0026\u0026 base != 16)","\t\treturn 0;","\tif (base == 10) {","\t\tn = sscanf(s, \"%lld\", \u0026r);","\t} else {","\t\tunsigned long long ru=0;","\t\tn = sscanf(s, \"%llx\", \u0026ru);","\t\tif (ru \u003e EV_INT64_MAX)","\t\t\treturn 0;","\t\tr = (long long) ru;","\t}","\tif (n != 1)","\t\treturn 0;","\twhile (EVUTIL_ISSPACE_(*s))","\t\t++s;","\tif (*s == '-')","\t\t++s;","\tif (base == 10) {","\t\twhile (EVUTIL_ISDIGIT_(*s))","\t\t\t++s;","\t} else {","\t\twhile (EVUTIL_ISXDIGIT_(*s))","\t\t\t++s;","\t}","\tif (endptr)","\t\t*endptr = (char*) s;","\treturn r;","#else","#error \"I don't know how to parse 64-bit integers.\"","#endif","}","","#ifdef _WIN32","int","evutil_socket_geterror(evutil_socket_t sock)","{","\tint optval, optvallen=sizeof(optval);","\tint err = WSAGetLastError();","\tif (err == WSAEWOULDBLOCK \u0026\u0026 sock \u003e= 0) {","\t\tif (getsockopt(sock, SOL_SOCKET, SO_ERROR, (void*)\u0026optval,","\t\t\t\t\t \u0026optvallen))","\t\t\treturn err;","\t\tif (optval)","\t\t\treturn optval;","\t}","\treturn err;","}","#endif","","/* XXX we should use an enum here. */","/* 2 for connection refused, 1 for connected, 0 for not yet, -1 for error. */","int","evutil_socket_connect_(evutil_socket_t *fd_ptr, const struct sockaddr *sa, int socklen)","{","\tint made_fd = 0;","","\tif (*fd_ptr \u003c 0) {","\t\tif ((*fd_ptr = socket(sa-\u003esa_family, SOCK_STREAM, 0)) \u003c 0)","\t\t\tgoto err;","\t\tmade_fd = 1;","\t\tif (evutil_make_socket_nonblocking(*fd_ptr) \u003c 0) {","\t\t\tgoto err;","\t\t}","\t}","","\tif (connect(*fd_ptr, sa, socklen) \u003c 0) {","\t\tint e = evutil_socket_geterror(*fd_ptr);","\t\tif (EVUTIL_ERR_CONNECT_RETRIABLE(e))","\t\t\treturn 0;","\t\tif (EVUTIL_ERR_CONNECT_REFUSED(e))","\t\t\treturn 2;","\t\tgoto err;","\t} else {","\t\treturn 1;","\t}","","err:","\tif (made_fd) {","\t\tevutil_closesocket(*fd_ptr);","\t\t*fd_ptr = -1;","\t}","\treturn -1;","}","","/* Check whether a socket on which we called connect() is done"," connecting. Return 1 for connected, 0 for not yet, -1 for error. In the"," error case, set the current socket errno to the error that happened during"," the connect operation. */","int","evutil_socket_finished_connecting_(evutil_socket_t fd)","{","\tint e;","\tev_socklen_t elen = sizeof(e);","","\tif (getsockopt(fd, SOL_SOCKET, SO_ERROR, (void*)\u0026e, \u0026elen) \u003c 0)","\t\treturn -1;","","\tif (e) {","\t\tif (EVUTIL_ERR_CONNECT_RETRIABLE(e))","\t\t\treturn 0;","\t\tEVUTIL_SET_SOCKET_ERROR(e);","\t\treturn -1;","\t}","","\treturn 1;","}","","#if (EVUTIL_AI_PASSIVE|EVUTIL_AI_CANONNAME|EVUTIL_AI_NUMERICHOST| \\"," EVUTIL_AI_NUMERICSERV|EVUTIL_AI_V4MAPPED|EVUTIL_AI_ALL| \\"," EVUTIL_AI_ADDRCONFIG) != \\"," (EVUTIL_AI_PASSIVE^EVUTIL_AI_CANONNAME^EVUTIL_AI_NUMERICHOST^ \\"," EVUTIL_AI_NUMERICSERV^EVUTIL_AI_V4MAPPED^EVUTIL_AI_ALL^ \\"," EVUTIL_AI_ADDRCONFIG)","#error \"Some of our EVUTIL_AI_* flags seem to overlap with system AI_* flags\"","#endif","","/* We sometimes need to know whether we have an ipv4 address and whether we"," have an ipv6 address. If 'have_checked_interfaces', then we've already done"," the test. If 'had_ipv4_address', then it turns out we had an ipv4 address."," If 'had_ipv6_address', then it turns out we had an ipv6 address. These are"," set by evutil_check_interfaces. */","static int have_checked_interfaces, had_ipv4_address, had_ipv6_address;","","/* Macro: True iff the IPv4 address 'addr', in host order, is in 127.0.0.0/8"," */","#define EVUTIL_V4ADDR_IS_LOCALHOST(addr) (((addr)\u003e\u003e24) == 127)","","/* Macro: True iff the IPv4 address 'addr', in host order, is a class D"," * (multiclass) address."," */","#define EVUTIL_V4ADDR_IS_CLASSD(addr) ((((addr)\u003e\u003e24) \u0026 0xf0) == 0xe0)","","static void","evutil_found_ifaddr(const struct sockaddr *sa)","{","\tconst char ZEROES[] = \"\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\"","\t \"\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\";","","\tif (sa-\u003esa_family == AF_INET) {","\t\tconst struct sockaddr_in *sin = (struct sockaddr_in *)sa;","\t\tev_uint32_t addr = ntohl(sin-\u003esin_addr.s_addr);","\t\tif (addr == 0 ||","\t\t EVUTIL_V4ADDR_IS_LOCALHOST(addr) ||","\t\t EVUTIL_V4ADDR_IS_CLASSD(addr)) {","\t\t\t/* Not actually a usable external address. */","\t\t} else {","\t\t\tevent_debug((\"Detected an IPv4 interface\"));","\t\t\thad_ipv4_address = 1;","\t\t}","\t} else if (sa-\u003esa_family == AF_INET6) {","\t\tconst struct sockaddr_in6 *sin6 = (struct sockaddr_in6 *)sa;","\t\tconst unsigned char *addr =","\t\t (unsigned char*)sin6-\u003esin6_addr.s6_addr;","\t\tif (!memcmp(addr, ZEROES, 8) ||","\t\t ((addr[0] \u0026 0xfe) == 0xfc) ||","\t\t (addr[0] == 0xfe \u0026\u0026 (addr[1] \u0026 0xc0) == 0x80) ||","\t\t (addr[0] == 0xfe \u0026\u0026 (addr[1] \u0026 0xc0) == 0xc0) ||","\t\t (addr[0] == 0xff)) {","\t\t\t/* This is a reserved, ipv4compat, ipv4map, loopback,","\t\t\t * link-local, multicast, or unspecified address. */","\t\t} else {","\t\t\tevent_debug((\"Detected an IPv6 interface\"));","\t\t\thad_ipv6_address = 1;","\t\t}","\t}","}","","#ifdef _WIN32","typedef ULONG (WINAPI *GetAdaptersAddresses_fn_t)("," ULONG, ULONG, PVOID, PIP_ADAPTER_ADDRESSES, PULONG);","#endif","","static int","evutil_check_ifaddrs(void)","{","#if defined(EVENT__HAVE_GETIFADDRS)","\t/* Most free Unixy systems provide getifaddrs, which gives us a linked list","\t * of struct ifaddrs. */","\tstruct ifaddrs *ifa = NULL;","\tconst struct ifaddrs *i;","\tif (getifaddrs(\u0026ifa) \u003c 0) {","\t\tevent_warn(\"Unable to call getifaddrs()\");","\t\treturn -1;","\t}","","\tfor (i = ifa; i; i = i-\u003eifa_next) {","\t\tif (!i-\u003eifa_addr)","\t\t\tcontinue;","\t\tevutil_found_ifaddr(i-\u003eifa_addr);","\t}","","\tfreeifaddrs(ifa);","\treturn 0;","#elif defined(_WIN32)","\t/* Windows XP began to provide GetAdaptersAddresses. Windows 2000 had a","\t \"GetAdaptersInfo\", but that's deprecated; let's just try","\t GetAdaptersAddresses and fall back to connect+getsockname.","\t*/","\tHMODULE lib = evutil_load_windows_system_library_(TEXT(\"ihplapi.dll\"));","\tGetAdaptersAddresses_fn_t fn;","\tULONG size, res;","\tIP_ADAPTER_ADDRESSES *addresses = NULL, *address;","\tint result = -1;","","#define FLAGS (GAA_FLAG_SKIP_ANYCAST | \\"," GAA_FLAG_SKIP_MULTICAST | \\"," GAA_FLAG_SKIP_DNS_SERVER)","","\tif (!lib)","\t\tgoto done;","","\tif (!(fn = (GetAdaptersAddresses_fn_t) GetProcAddress(lib, \"GetAdaptersAddresses\")))","\t\tgoto done;","","\t/* Guess how much space we need. */","\tsize = 15*1024;","\taddresses = mm_malloc(size);","\tif (!addresses)","\t\tgoto done;","\tres = fn(AF_UNSPEC, FLAGS, NULL, addresses, \u0026size);","\tif (res == ERROR_BUFFER_OVERFLOW) {","\t\t/* we didn't guess that we needed enough space; try again */","\t\tmm_free(addresses);","\t\taddresses = mm_malloc(size);","\t\tif (!addresses)","\t\t\tgoto done;","\t\tres = fn(AF_UNSPEC, FLAGS, NULL, addresses, \u0026size);","\t}","\tif (res != NO_ERROR)","\t\tgoto done;","","\tfor (address = addresses; address; address = address-\u003eNext) {","\t\tIP_ADAPTER_UNICAST_ADDRESS *a;","\t\tfor (a = address-\u003eFirstUnicastAddress; a; a = a-\u003eNext) {","\t\t\t/* Yes, it's a linked list inside a linked list */","\t\t\tstruct sockaddr *sa = a-\u003eAddress.lpSockaddr;","\t\t\tevutil_found_ifaddr(sa);","\t\t}","\t}","","\tresult = 0;","done:","\tif (lib)","\t\tFreeLibrary(lib);","\tif (addresses)","\t\tmm_free(addresses);","\treturn result;","#else","\treturn -1;","#endif","}","","/* Test whether we have an ipv4 interface and an ipv6 interface. Return 0 if"," * the test seemed successful. */","static int","evutil_check_interfaces(int force_recheck)","{","\tevutil_socket_t fd = -1;","\tstruct sockaddr_in sin, sin_out;","\tstruct sockaddr_in6 sin6, sin6_out;","\tev_socklen_t sin_out_len = sizeof(sin_out);","\tev_socklen_t sin6_out_len = sizeof(sin6_out);","\tint r;","\tif (have_checked_interfaces \u0026\u0026 !force_recheck)","\t\treturn 0;","","\tif (evutil_check_ifaddrs() == 0) {","\t\t/* Use a nice sane interface, if this system has one. */","\t\treturn 0;","\t}","","\t/* Ugh. There was no nice sane interface. So to check whether we have","\t * an interface open for a given protocol, will try to make a UDP","\t * 'connection' to a remote host on the internet. We don't actually","\t * use it, so the address doesn't matter, but we want to pick one that","\t * keep us from using a host- or link-local interface. */","\tmemset(\u0026sin, 0, sizeof(sin));","\tsin.sin_family = AF_INET;","\tsin.sin_port = htons(53);","\tr = evutil_inet_pton(AF_INET, \"18.244.0.188\", \u0026sin.sin_addr);","\tEVUTIL_ASSERT(r);","","\tmemset(\u0026sin6, 0, sizeof(sin6));","\tsin6.sin6_family = AF_INET6;","\tsin6.sin6_port = htons(53);","\tr = evutil_inet_pton(AF_INET6, \"2001:4860:b002::68\", \u0026sin6.sin6_addr);","\tEVUTIL_ASSERT(r);","","\tmemset(\u0026sin_out, 0, sizeof(sin_out));","\tmemset(\u0026sin6_out, 0, sizeof(sin6_out));","","\t/* XXX some errnos mean 'no address'; some mean 'not enough sockets'. */","\tif ((fd = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP)) \u003e= 0 \u0026\u0026","\t connect(fd, (struct sockaddr*)\u0026sin, sizeof(sin)) == 0 \u0026\u0026","\t getsockname(fd, (struct sockaddr*)\u0026sin_out, \u0026sin_out_len) == 0) {","\t\t/* We might have an IPv4 interface. */","\t\tevutil_found_ifaddr((struct sockaddr*) \u0026sin_out);","\t}","\tif (fd \u003e= 0)","\t\tevutil_closesocket(fd);","","\tif ((fd = socket(AF_INET6, SOCK_DGRAM, IPPROTO_UDP)) \u003e= 0 \u0026\u0026","\t connect(fd, (struct sockaddr*)\u0026sin6, sizeof(sin6)) == 0 \u0026\u0026","\t getsockname(fd, (struct sockaddr*)\u0026sin6_out, \u0026sin6_out_len) == 0) {","\t\t/* We might have an IPv6 interface. */","\t\tevutil_found_ifaddr((struct sockaddr*) \u0026sin6_out);","\t}","","\tif (fd \u003e= 0)","\t\tevutil_closesocket(fd);","","\treturn 0;","}","","/* Internal addrinfo flag. This one is set when we allocate the addrinfo from"," * inside libevent. Otherwise, the built-in getaddrinfo() function allocated"," * it, and we should trust what they said."," **/","#define EVUTIL_AI_LIBEVENT_ALLOCATED 0x80000000","","/* Helper: construct a new addrinfo containing the socket address in"," * 'sa', which must be a sockaddr_in or a sockaddr_in6. Take the"," * socktype and protocol info from hints. If they weren't set, then"," * allocate both a TCP and a UDP addrinfo."," */","struct evutil_addrinfo *","evutil_new_addrinfo_(struct sockaddr *sa, ev_socklen_t socklen,"," const struct evutil_addrinfo *hints)","{","\tstruct evutil_addrinfo *res;","\tEVUTIL_ASSERT(hints);","","\tif (hints-\u003eai_socktype == 0 \u0026\u0026 hints-\u003eai_protocol == 0) {","\t\t/* Indecisive user! Give them a UDP and a TCP. */","\t\tstruct evutil_addrinfo *r1, *r2;","\t\tstruct evutil_addrinfo tmp;","\t\tmemcpy(\u0026tmp, hints, sizeof(tmp));","\t\ttmp.ai_socktype = SOCK_STREAM; tmp.ai_protocol = IPPROTO_TCP;","\t\tr1 = evutil_new_addrinfo_(sa, socklen, \u0026tmp);","\t\tif (!r1)","\t\t\treturn NULL;","\t\ttmp.ai_socktype = SOCK_DGRAM; tmp.ai_protocol = IPPROTO_UDP;","\t\tr2 = evutil_new_addrinfo_(sa, socklen, \u0026tmp);","\t\tif (!r2) {","\t\t\tevutil_freeaddrinfo(r1);","\t\t\treturn NULL;", 8000 "\t\t}","\t\tr1-\u003eai_next = r2;","\t\treturn r1;","\t}","","\t/* We're going to allocate extra space to hold the sockaddr. */","\tres = mm_calloc(1,sizeof(struct evutil_addrinfo)+socklen);","\tif (!res)","\t\treturn NULL;","\tres-\u003eai_addr = (struct sockaddr*)","\t (((char*)res) + sizeof(struct evutil_addrinfo));","\tmemcpy(res-\u003eai_addr, sa, socklen);","\tres-\u003eai_addrlen = socklen;","\tres-\u003eai_family = sa-\u003esa_family; /* Same or not? XXX */","\tres-\u003eai_flags = EVUTIL_AI_LIBEVENT_ALLOCATED;","\tres-\u003eai_socktype = hints-\u003eai_socktype;","\tres-\u003eai_protocol = hints-\u003eai_protocol;","","\treturn res;","}","","/* Append the addrinfo 'append' to the end of 'first', and return the start of"," * the list. Either element can be NULL, in which case we return the element"," * that is not NULL. */","struct evutil_addrinfo *","evutil_addrinfo_append_(struct evutil_addrinfo *first,"," struct evutil_addrinfo *append)","{","\tstruct evutil_addrinfo *ai = first;","\tif (!ai)","\t\treturn append;","\twhile (ai-\u003eai_next)","\t\tai = ai-\u003eai_next;","\tai-\u003eai_next = append;","","\treturn first;","}","","static int","parse_numeric_servname(const char *servname)","{","\tint n;","\tchar *endptr=NULL;","\tn = (int) strtol(servname, \u0026endptr, 10);","\tif (n\u003e=0 \u0026\u0026 n \u003c= 65535 \u0026\u0026 servname[0] \u0026\u0026 endptr \u0026\u0026 !endptr[0])","\t\treturn n;","\telse","\t\treturn -1;","}","","/** Parse a service name in 'servname', which can be a decimal port."," * Return the port number, or -1 on error."," */","static int","evutil_parse_servname(const char *servname, const char *protocol,"," const struct evutil_addrinfo *hints)","{","\tint n = parse_numeric_servname(servname);","\tif (n\u003e=0)","\t\treturn n;","#if defined(EVENT__HAVE_GETSERVBYNAME) || defined(_WIN32)","\tif (!(hints-\u003eai_flags \u0026 EVUTIL_AI_NUMERICSERV)) {","\t\tstruct servent *ent = getservbyname(servname, protocol);","\t\tif (ent) {","\t\t\treturn ntohs(ent-\u003es_port);","\t\t}","\t}","#endif","\treturn -1;","}","","/* Return a string corresponding to a protocol number that we can pass to"," * getservyname. */","static const char *","evutil_unparse_protoname(int proto)","{","\tswitch (proto) {","\tcase 0:","\t\treturn NULL;","\tcase IPPROTO_TCP:","\t\treturn \"tcp\";","\tcase IPPROTO_UDP:","\t\treturn \"udp\";","#ifdef IPPROTO_SCTP","\tcase IPPROTO_SCTP:","\t\treturn \"sctp\";","#endif","\tdefault:","#ifdef EVENT__HAVE_GETPROTOBYNUMBER","\t\t{","\t\t\tstruct protoent *ent = getprotobynumber(proto);","\t\t\tif (ent)","\t\t\t\treturn ent-\u003ep_name;","\t\t}","#endif","\t\treturn NULL;","\t}","}","","static void","evutil_getaddrinfo_infer_protocols(struct evutil_addrinfo *hints)","{","\t/* If we can guess the protocol from the socktype, do so. */","\tif (!hints-\u003eai_protocol \u0026\u0026 hints-\u003eai_socktype) {","\t\tif (hints-\u003eai_socktype == SOCK_DGRAM)","\t\t\thints-\u003eai_protocol = IPPROTO_UDP;","\t\telse if (hints-\u003eai_socktype == SOCK_STREAM)","\t\t\thints-\u003eai_protocol = IPPROTO_TCP;","\t}","","\t/* Set the socktype if it isn't set. */","\tif (!hints-\u003eai_socktype \u0026\u0026 hints-\u003eai_protocol) {","\t\tif (hints-\u003eai_protocol == IPPROTO_UDP)","\t\t\thints-\u003eai_socktype = SOCK_DGRAM;","\t\telse if (hints-\u003eai_protocol == IPPROTO_TCP)","\t\t\thints-\u003eai_socktype = SOCK_STREAM;","#ifdef IPPROTO_SCTP","\t\telse if (hints-\u003eai_protocol == IPPROTO_SCTP)","\t\t\thints-\u003eai_socktype = SOCK_STREAM;","#endif","\t}","}","","#if AF_UNSPEC != PF_UNSPEC","#error \"I cannot build on a system where AF_UNSPEC != PF_UNSPEC\"","#endif","","/** Implements the part of looking up hosts by name that's common to both"," * the blocking and nonblocking resolver:"," * - Adjust 'hints' to have a reasonable socktype and protocol."," * - Look up the port based on 'servname', and store it in *portnum,"," * - Handle the nodename==NULL case"," * - Handle some invalid arguments cases."," * - Handle the cases where nodename is an IPv4 or IPv6 address."," *"," * If we need the resolver to look up the hostname, we return"," * EVUTIL_EAI_NEED_RESOLVE. Otherwise, we can completely implement"," * getaddrinfo: we return 0 or an appropriate EVUTIL_EAI_* error, and"," * set *res as getaddrinfo would."," */","int","evutil_getaddrinfo_common_(const char *nodename, const char *servname,"," struct evutil_addrinfo *hints, struct evutil_addrinfo **res, int *portnum)","{","\tint port = 0;","\tconst char *pname;","","\tif (nodename == NULL \u0026\u0026 servname == NULL)","\t\treturn EVUTIL_EAI_NONAME;","","\t/* We only understand 3 families */","\tif (hints-\u003eai_family != PF_UNSPEC \u0026\u0026 hints-\u003eai_family != PF_INET \u0026\u0026","\t hints-\u003eai_family != PF_INET6)","\t\treturn EVUTIL_EAI_FAMILY;","","\tevutil_getaddrinfo_infer_protocols(hints);","","\t/* Look up the port number and protocol, if possible. */","\tpname = evutil_unparse_protoname(hints-\u003eai_protocol);","\tif (servname) {","\t\t/* XXXX We could look at the protocol we got back from","\t\t * getservbyname, but it doesn't seem too useful. */","\t\tport = evutil_parse_servname(servname, pname, hints);","\t\tif (port \u003c 0) {","\t\t\treturn EVUTIL_EAI_NONAME;","\t\t}","\t}","","\t/* If we have no node name, then we're supposed to bind to 'any' and","\t * connect to localhost. */","\tif (nodename == NULL) {","\t\tstruct evutil_addrinfo *res4=NULL, *res6=NULL;","\t\tif (hints-\u003eai_family != PF_INET) { /* INET6 or UNSPEC. */","\t\t\tstruct sockaddr_in6 sin6;","\t\t\tmemset(\u0026sin6, 0, sizeof(sin6));","\t\t\tsin6.sin6_family = AF_INET6;","\t\t\tsin6.sin6_port = htons(port);","\t\t\tif (hints-\u003eai_flags \u0026 EVUTIL_AI_PASSIVE) {","\t\t\t\t/* Bind to :: */","\t\t\t} else {","\t\t\t\t/* connect to ::1 */","\t\t\t\tsin6.sin6_addr.s6_addr[15] = 1;","\t\t\t}","\t\t\tres6 = evutil_new_addrinfo_((struct sockaddr*)\u0026sin6,","\t\t\t sizeof(sin6), hints);","\t\t\tif (!res6)","\t\t\t\treturn EVUTIL_EAI_MEMORY;","\t\t}","","\t\tif (hints-\u003eai_family != PF_INET6) { /* INET or UNSPEC */","\t\t\tstruct sockaddr_in sin;","\t\t\tmemset(\u0026sin, 0, sizeof(sin));","\t\t\tsin.sin_family = AF_INET;","\t\t\tsin.sin_port = htons(port);","\t\t\tif (hints-\u003eai_flags \u0026 EVUTIL_AI_PASSIVE) {","\t\t\t\t/* Bind to 0.0.0.0 */","\t\t\t} else {","\t\t\t\t/* connect to 127.0.0.1 */","\t\t\t\tsin.sin_addr.s_addr = htonl(0x7f000001);","\t\t\t}","\t\t\tres4 = evutil_new_addrinfo_((struct sockaddr*)\u0026sin,","\t\t\t sizeof(sin), hints);","\t\t\tif (!res4) {","\t\t\t\tif (res6)","\t\t\t\t\tevutil_freeaddrinfo(res6);","\t\t\t\treturn EVUTIL_EAI_MEMORY;","\t\t\t}","\t\t}","\t\t*res = evutil_addrinfo_append_(res4, res6);","\t\treturn 0;","\t}","","\t/* If we can, we should try to parse the hostname without resolving","\t * it. */","\t/* Try ipv6. */","\tif (hints-\u003eai_family == PF_INET6 || hints-\u003eai_family == PF_UNSPEC) {","\t\tstruct sockaddr_in6 sin6;","\t\tmemset(\u0026sin6, 0, sizeof(sin6));","\t\tif (1==evutil_inet_pton(AF_INET6, nodename, \u0026sin6.sin6_addr)) {","\t\t\t/* Got an ipv6 address. */","\t\t\tsin6.sin6_family = AF_INET6;","\t\t\tsin6.sin6_port = htons(port);","\t\t\t*res = evutil_new_addrinfo_((struct sockaddr*)\u0026sin6,","\t\t\t sizeof(sin6), hints);","\t\t\tif (!*res)","\t\t\t\treturn EVUTIL_EAI_MEMORY;","\t\t\treturn 0;","\t\t}","\t}","","\t/* Try ipv4. */","\tif (hints-\u003eai_family == PF_INET || hints-\u003eai_family == PF_UNSPEC) {","\t\tstruct sockaddr_in sin;","\t\tmemset(\u0026sin, 0, sizeof(sin));","\t\tif (1==evutil_inet_pton(AF_INET, nodename, \u0026sin.sin_addr)) {","\t\t\t/* Got an ipv6 address. */","\t\t\tsin.sin_family = AF_INET;","\t\t\tsin.sin_port = htons(port);","\t\t\t*res = evutil_new_addrinfo_((struct sockaddr*)\u0026sin,","\t\t\t sizeof(sin), hints);","\t\t\tif (!*res)","\t\t\t\treturn EVUTIL_EAI_MEMORY;","\t\t\treturn 0;","\t\t}","\t}","","","\t/* If we have reached this point, we definitely need to do a DNS","\t * lookup. */","\tif ((hints-\u003eai_flags \u0026 EVUTIL_AI_NUMERICHOST)) {","\t\t/* If we're not allowed to do one, then say so. */","\t\treturn EVUTIL_EAI_NONAME;","\t}","\t*portnum = port;","\treturn EVUTIL_EAI_NEED_RESOLVE;","}","","#ifdef EVENT__HAVE_GETADDRINFO","#define USE_NATIVE_GETADDRINFO","#endif","","#ifdef USE_NATIVE_GETADDRINFO","/* A mask of all the flags that we declare, so we can clear them before calling"," * the native getaddrinfo */","static const unsigned int ALL_NONNATIVE_AI_FLAGS =","#ifndef AI_PASSIVE"," EVUTIL_AI_PASSIVE |","#endif","#ifndef AI_CANONNAME"," EVUTIL_AI_CANONNAME |","#endif","#ifndef AI_NUMERICHOST"," EVUTIL_AI_NUMERICHOST |","#endif","#ifndef AI_NUMERICSERV"," EVUTIL_AI_NUMERICSERV |","#endif","#ifndef AI_ADDRCONFIG"," EVUTIL_AI_ADDRCONFIG |","#endif","#ifndef AI_ALL"," EVUTIL_AI_ALL |","#endif","#ifndef AI_V4MAPPED"," EVUTIL_AI_V4MAPPED |","#endif"," EVUTIL_AI_LIBEVENT_ALLOCATED;","","static const unsigned int ALL_NATIVE_AI_FLAGS =","#ifdef AI_PASSIVE"," AI_PASSIVE |","#endif","#ifdef AI_CANONNAME"," AI_CANONNAME |","#endif","#ifdef AI_NUMERICHOST"," AI_NUMERICHOST |","#endif","#ifdef AI_NUMERICSERV"," AI_NUMERICSERV |","#endif","#ifdef AI_ADDRCONFIG"," AI_ADDRCONFIG |","#endif","#ifdef AI_ALL"," AI_ALL |","#endif","#ifdef AI_V4MAPPED"," AI_V4MAPPED |","#endif"," 0;","#endif","","#ifndef USE_NATIVE_GETADDRINFO","/* Helper for systems with no getaddrinfo(): make one or more addrinfos out of"," * a struct hostent."," */","static struct evutil_addrinfo *","addrinfo_from_hostent(const struct hostent *ent,"," int port, const struct evutil_addrinfo *hints)","{","\tint i;","\tstruct sockaddr_in sin;","\tstruct sockaddr_in6 sin6;","\tstruct sockaddr *sa;","\tint socklen;","\tstruct evutil_addrinfo *res=NULL, *ai;","\tvoid *addrp;","","\tif (ent-\u003eh_addrtype == PF_INET) {","\t\tmemset(\u0026sin, 0, sizeof(sin));","\t\tsin.sin_family = AF_INET;","\t\tsin.sin_port = htons(port);","\t\tsa = (struct sockaddr *)\u0026sin;","\t\tsocklen = sizeof(struct sockaddr_in);","\t\taddrp = \u0026sin.sin_addr;","\t\tif (ent-\u003eh_length != sizeof(sin.sin_addr)) {","\t\t\tevent_warnx(\"Weird h_length from gethostbyname\");","\t\t\treturn NULL;","\t\t}","\t} else if (ent-\u003eh_addrtype == PF_INET6) {","\t\tmemset(\u0026sin6, 0, sizeof(sin6));","\t\tsin6.sin6_family = AF_INET6;","\t\tsin6.sin6_port = htons(port);","\t\tsa = (struct sockaddr *)\u0026sin6;","\t\tsocklen = sizeof(struct sockaddr_in6);","\t\taddrp = \u0026sin6.sin6_addr;","\t\tif (ent-\u003eh_length != sizeof(sin6.sin6_addr)) {","\t\t\tevent_warnx(\"Weird h_length from gethostbyname\");","\t\t\treturn NULL;","\t\t}","\t} else","\t\treturn NULL;","","\tfor (i = 0; ent-\u003eh_addr_list[i]; ++i) {","\t\tmemcpy(addrp, ent-\u003eh_addr_list[i], ent-\u003eh_length);","\t\tai = evutil_new_addrinfo_(sa, socklen, hints);","\t\tif (!ai) {","\t\t\tevutil_freeaddrinfo(res);","\t\t\treturn NULL;","\t\t}","\t\tres = evutil_addrinfo_append_(res, ai);","\t}","","\tif (res \u0026\u0026 ((hints-\u003eai_flags \u0026 EVUTIL_AI_CANONNAME) \u0026\u0026 ent-\u003eh_name)) {","\t\tres-\u003eai_canonname = mm_strdup(ent-\u003eh_name);","\t\tif (res-\u003eai_canonname == NULL) {","\t\t\tevutil_freeaddrinfo(res);","\t\t\treturn NULL;","\t\t}","\t}","","\treturn res;","}","#endif","","/* If the EVUTIL_AI_ADDRCONFIG flag is set on hints-\u003eai_flags, and"," * hints-\u003eai_family is PF_UNSPEC, then revise the value of hints-\u003eai_family so"," * that we'll only get addresses we could maybe connect to."," */","void","evutil_adjust_hints_for_addrconfig_(struct evutil_addrinfo *hints)","{","\tif (!(hints-\u003eai_flags \u0026 EVUTIL_AI_ADDRCONFIG))","\t\treturn;","\tif (hints-\u003eai_family != PF_UNSPEC)","\t\treturn;","\tif (!have_checked_interfaces)","\t\tevutil_check_interfaces(0);","\tif (had_ipv4_address \u0026\u0026 !had_ipv6_address) {","\t\thints-\u003eai_family = PF_INET;","\t} else if (!had_ipv4_address \u0026\u0026 had_ipv6_address) {","\t\thints-\u003eai_family = PF_INET6;","\t}","}","","#ifdef USE_NATIVE_GETADDRINFO","static int need_numeric_port_hack_=0;","static int need_socktype_protocol_hack_=0;","static int tested_for_getaddrinfo_hacks=0;","","/* Some older BSDs (like OpenBSD up to 4.6) used to believe that"," giving a numeric port without giving an ai_socktype was verboten."," We test for this so we can apply an appropriate workaround. If it"," turns out that the bug is present, then:",""," - If nodename==NULL and servname is numeric, we build an answer"," ourselves using evutil_getaddrinfo_common_().",""," - If nodename!=NULL and servname is numeric, then we set"," servname=NULL when calling getaddrinfo, and post-process the"," result to set the ports on it.",""," We test for this bug at runtime, since otherwise we can't have the"," same binary run on multiple BSD versions.",""," - Some versions of Solaris believe that it's nice to leave to protocol"," field set to 0. We test for this so we can apply an appropriate"," workaround.","*/","static struct evutil_addrinfo *ai_find_protocol(struct evutil_addrinfo *ai)","{","\twhile (ai) {","\t\tif (ai-\u003eai_protocol)","\t\t\treturn ai;","\t\tai = ai-\u003eai_next;","\t}","\treturn NULL;","}","static void","test_for_getaddrinfo_hacks(void)","{","\tint r, r2;","\tstruct evutil_addrinfo *ai=NULL, *ai2=NULL, *ai3=NULL;","\tstruct evutil_addrinfo hints;","","\tmemset(\u0026hints,0,sizeof(hints));","\thints.ai_family = PF_UNSPEC;","\thints.ai_flags =","#ifdef AI_NUMERICHOST","\t AI_NUMERICHOST |","#endif","#ifdef AI_NUMERICSERV","\t AI_NUMERICSERV |","#endif","\t 0;","\tr = getaddrinfo(\"1.2.3.4\", \"80\", \u0026hints, \u0026ai);","\tgetaddrinfo(\"1.2.3.4\", NULL, \u0026hints, \u0026ai3);","\thints.ai_socktype = SOCK_STREAM;","\tr2 = getaddrinfo(\"1.2.3.4\", \"80\", \u0026hints, \u0026ai2);","\tif (r2 == 0 \u0026\u0026 r != 0) {","\t\tneed_numeric_port_hack_=1;","\t}","\tif (!ai_find_protocol(ai2) || !ai_find_protocol(ai3)) {","\t\tneed_socktype_protocol_hack_=1;","\t}","","\tif (ai)","\t\tfreeaddrinfo(ai);","\tif (ai2)","\t\tfreeaddrinfo(ai2);","\tif (ai3)","\t\tfreeaddrinfo(ai3);","\ttested_for_getaddrinfo_hacks=1;","}","","static inline int","need_numeric_port_hack(void)","{","\tif (!tested_for_getaddrinfo_hacks)","\t\ttest_for_getaddrinfo_hacks();","\treturn need_numeric_port_hack_;","}","","static inline int","need_socktype_protocol_hack(void)","{","\tif (!tested_for_getaddrinfo_hacks)","\t\ttest_for_getaddrinfo_hacks();","\treturn need_socktype_protocol_hack_;","}","","static void","apply_numeric_port_hack(int port, struct evutil_addrinfo **ai)","{","\t/* Now we run through the list and set the ports on all of the","\t * results where ports would make sense. */","\tfor ( ; *ai; ai = \u0026(*ai)-\u003eai_next) {","\t\tstruct sockaddr *sa = (*ai)-\u003eai_addr;","\t\tif (sa \u0026\u0026 sa-\u003esa_family == AF_INET) {","\t\t\tstruct sockaddr_in *sin = (struct sockaddr_in*)sa;","\t\t\tsin-\u003esin_port = htons(port);","\t\t} else if (sa \u0026\u0026 sa-\u003esa_family == AF_INET6) {","\t\t\tstruct sockaddr_in6 *sin6 = (struct sockaddr_in6*)sa;","\t\t\tsin6-\u003esin6_port = htons(port);","\t\t} else {","\t\t\t/* A numeric port makes no sense here; remove this one","\t\t\t * from the list. */","\t\t\tstruct evutil_addrinfo *victim = *ai;","\t\t\t*ai = victim-\u003eai_next;","\t\t\tvictim-\u003eai_next = NULL;","\t\t\tfreeaddrinfo(victim);","\t\t}","\t}","}","","static int","apply_socktype_protocol_hack(struct evutil_addrinfo *ai)","{","\tstruct evutil_addrinfo *ai_new;","\tfor (; ai; ai = ai-\u003eai_next) {","\t\tevutil_getaddrinfo_infer_protocols(ai);","\t\tif (ai-\u003eai_socktype || ai-\u003eai_protocol)","\t\t\tcontinue;","\t\tai_new = mm_malloc(sizeof(*ai_new));","\t\tif (!ai_new)","\t\t\treturn -1;","\t\tmemcpy(ai_new, ai, sizeof(*ai_new));","\t\tai-\u003eai_socktype = SOCK_STREAM;","\t\tai-\u003eai_protocol = IPPROTO_TCP;","\t\tai_new-\u003eai_socktype = SOCK_DGRAM;","\t\tai_new-\u003eai_protocol = IPPROTO_UDP;","","\t\tai_new-\u003eai_next = ai-\u003eai_next;","\t\tai-\u003eai_next = ai_new;","\t}","\treturn 0;","}","#endif","","int","evutil_getaddrinfo(const char *nodename, const char *servname,"," const struct evutil_addrinfo *hints_in, struct evutil_addrinfo **res)","{","#ifdef USE_NATIVE_GETADDRINFO","\tstruct evutil_addrinfo hints;","\tint portnum=-1, need_np_hack, err;","","\tif (hints_in) {","\t\tmemcpy(\u0026hints, hints_in, sizeof(hints));","\t} else {","\t\tmemset(\u0026hints, 0, sizeof(hints));","\t\thints.ai_family = PF_UNSPEC;","\t}","","#ifndef AI_ADDRCONFIG","\t/* Not every system has AI_ADDRCONFIG, so fake it. */","\tif (hints.ai_family == PF_UNSPEC \u0026\u0026","\t (hints.ai_flags \u0026 EVUTIL_AI_ADDRCONFIG)) {","\t\tevutil_adjust_hints_for_addrconfig_(\u0026hints);","\t}","#endif","","#ifndef AI_NUMERICSERV","\t/* Not every system has AI_NUMERICSERV, so fake it. */","\tif (hints.ai_flags \u0026 EVUTIL_AI_NUMERICSERV) {","\t\tif (servname \u0026\u0026 parse_numeric_servname(servname)\u003c0)","\t\t\treturn EVUTIL_EAI_NONAME;","\t}","#endif","","\t/* Enough operating systems handle enough common non-resolve","\t * cases here weirdly enough that we are better off just","\t * overriding them. For example:","\t *","\t * - Windows doesn't like to infer the protocol from the","\t * socket type, or fill in socket or protocol types much at","\t * all. It also seems to do its own broken implicit","\t * always-on version of AI_ADDRCONFIG that keeps it from","\t * ever resolving even a literal IPv6 address when","\t * ai_addrtype is PF_UNSPEC.","\t */","#ifdef _WIN32","\t{","\t\tint tmp_port;","\t\terr = evutil_getaddrinfo_common_(nodename,servname,\u0026hints,","\t\t res, \u0026tmp_port);","\t\tif (err == 0 ||","\t\t err == EVUTIL_EAI_MEMORY ||","\t\t err == EVUTIL_EAI_NONAME)","\t\t\treturn err;","\t\t/* If we make it here, the system getaddrinfo can","\t\t * have a crack at it. */","\t}","#endif","","\t/* See documentation for need_numeric_port_hack above.*/","\tneed_np_hack = need_numeric_port_hack() \u0026\u0026 servname \u0026\u0026 !hints.ai_socktype","\t \u0026\u0026 ((portnum=parse_numeric_servname(servname)) \u003e= 0);","\tif (need_np_hack) {","\t\tif (!nodename)","\t\t\treturn evutil_getaddrinfo_common_(","\t\t\t\tNULL,servname,\u0026hints, res, \u0026portnum);","\t\tservname = NULL;","\t}","","\tif (need_socktype_protocol_hack()) {","\t\tevutil_getaddrinfo_infer_protocols(\u0026hints);","\t}","","\t/* Make sure that we didn't actually steal any AI_FLAGS values that","\t * the system is using. (This is a constant expression, and should ge","\t * optimized out.)","\t *","\t * XXXX Turn this into a compile-time failure rather than a run-time","\t * failure.","\t */","\tEVUTIL_ASSERT((ALL_NONNATIVE_AI_FLAGS \u0026 ALL_NATIVE_AI_FLAGS) == 0);","","\t/* Clear any flags that only libevent understands. */","\thints.ai_flags \u0026= ~ALL_NONNATIVE_AI_FLAGS;","","\terr = getaddrinfo(nodename, servname, \u0026hints, res);","\tif (need_np_hack)","\t\tapply_numeric_port_hack(portnum, res);","","\tif (need_socktype_protocol_hack()) {","\t\tif (apply_socktype_protocol_hack(*res) \u003c 0) {","\t\t\tevutil_freeaddrinfo(*res);","\t\t\t*res = NULL;","\t\t\treturn EVUTIL_EAI_MEMORY;","\t\t}","\t}","\treturn err;","#else","\tint port=0, err;","\tstruct hostent *ent = NULL;","\tstruct evutil_addrinfo hints;","","\tif (hints_in) {","\t\tmemcpy(\u0026hints, hints_in, sizeof(hints));","\t} else {","\t\tmemset(\u0026hints, 0, sizeof(hints));","\t\thints.ai_family = PF_UNSPEC;","\t}","","\tevutil_adjust_hints_for_addrconfig_(\u0026hints);","","\terr = evutil_getaddrinfo_common_(nodename, servname, \u0026hints, res, \u0026port);","\tif (err != EVUTIL_EAI_NEED_RESOLVE) {","\t\t/* We either succeeded or failed. No need to continue */","\t\treturn err;","\t}","","\terr = 0;","\t/* Use any of the various gethostbyname_r variants as available. */","\t{","#ifdef EVENT__HAVE_GETHOSTBYNAME_R_6_ARG","\t\t/* This one is what glibc provides. */","\t\tchar buf[2048];","\t\tstruct hostent hostent;","\t\tint r;","\t\tr = gethostbyname_r(nodename, \u0026hostent, buf, sizeof(buf), \u0026ent,","\t\t \u0026err);","#elif defined(EVENT__HAVE_GETHOSTBYNAME_R_5_ARG)","\t\tchar buf[2048];","\t\tstruct hostent hostent;","\t\tent = gethostbyname_r(nodename, \u0026hostent, buf, sizeof(buf),","\t\t \u0026err);","#elif defined(EVENT__HAVE_GETHOSTBYNAME_R_3_ARG)","\t\tstruct hostent_data data;","\t\tstruct hostent hostent;","\t\tmemset(\u0026data, 0, sizeof(data));","\t\terr = gethostbyname_r(nodename, \u0026hostent, \u0026data);","\t\tent = err ? NULL : \u0026hostent;","#else","\t\t/* fall back to gethostbyname. */","\t\t/* XXXX This needs a lock everywhere but Windows. */","\t\tent = gethostbyname(nodename);","#ifdef _WIN32","\t\terr = WSAGetLastError();","#else","\t\terr = h_errno;","#endif","#endif","","\t\t/* Now we have either ent or err set. */","\t\tif (!ent) {","\t\t\t/* XXX is this right for windows ? */","\t\t\tswitch (err) {","\t\t\tcase TRY_AGAIN:","\t\t\t\treturn EVUTIL_EAI_AGAIN;","\t\t\tcase NO_RECOVERY:","\t\t\tdefault:","\t\t\t\treturn EVUTIL_EAI_FAIL;","\t\t\tcase HOST_NOT_FOUND:","\t\t\t\treturn EVUTIL_EAI_NONAME;","\t\t\tcase NO_ADDRESS:","#if NO_DATA != NO_ADDRESS","\t\t\tcase NO_DATA:","#endif","\t\t\t\treturn EVUTIL_EAI_NODATA;","\t\t\t}","\t\t}","","\t\tif (ent-\u003eh_addrtype != hints.ai_family \u0026\u0026","\t\t hints.ai_family != PF_UNSPEC) {","\t\t\t/* This wasn't the type we were hoping for. Too bad","\t\t\t * we never had a chance to ask gethostbyname for what","\t\t\t * we wanted. */","\t\t\treturn EVUTIL_EAI_NONAME;","\t\t}","","\t\t/* Make sure we got _some_ answers. */","\t\tif (ent-\u003eh_length == 0)","\t\t\treturn EVUTIL_EAI_NODATA;","","\t\t/* If we got an address type we don't know how to make a","\t\t sockaddr for, give up. */","\t\tif (ent-\u003eh_addrtype != PF_INET \u0026\u0026 ent-\u003eh_addrtype != PF_INET6)","\t\t\treturn EVUTIL_EAI_FAMILY;","","\t\t*res = addrinfo_from_hostent(ent, port, \u0026hints);","\t\tif (! *res)","\t\t\treturn EVUTIL_EAI_MEMORY;","\t}","","\treturn 0;","#endif","}","","void","evutil_freeaddrinfo(struct evutil_addrinfo *ai)","{","#ifdef EVENT__HAVE_GETADDRINFO","\tif (!(ai-\u003eai_flags \u0026 EVUTIL_AI_LIBEVENT_ALLOCATED)) {","\t\tfreeaddrinfo(ai);","\t\treturn;","\t}","#endif","\twhile (ai) {","\t\tstruct evutil_addrinfo *next = ai-\u003eai_next;","\t\tif (ai-\u003eai_canonname)","\t\t\tmm_free(ai-\u003eai_canonname);","\t\tmm_free(ai);","\t\tai = next;","\t}","}","","static evdns_getaddrinfo_fn evdns_getaddrinfo_impl = NULL;","static evdns_getaddrinfo_cancel_fn evdns_getaddrinfo_cancel_impl = NULL;","","void","evutil_set_evdns_getaddrinfo_fn_(evdns_getaddrinfo_fn fn)","{","\tif (!evdns_getaddrinfo_impl)","\t\tevdns_getaddrinfo_impl = fn;","}","void","evutil_set_evdns_getaddrinfo_cancel_fn_(evdns_getaddrinfo_cancel_fn fn)","{","\tif (!evdns_getaddrinfo_cancel_impl)","\t\tevdns_getaddrinfo_cancel_impl = fn;","}","","/* Internal helper function: act like evdns_getaddrinfo if dns_base is set;"," * otherwise do a blocking resolve and pass the result to the callback in the"," * way that evdns_getaddrinfo would."," */","struct evdns_getaddrinfo_request *evutil_getaddrinfo_async_("," struct evdns_base *dns_base,"," const char *nodename, const char *servname,"," const struct evutil_addrinfo *hints_in,"," void (*cb)(int, struct evutil_addrinfo *, void *), void *arg)","{","\tif (dns_base \u0026\u0026 evdns_getaddrinfo_impl) {","\t\treturn evdns_getaddrinfo_impl(","\t\t\tdns_base, nodename, servname, hints_in, cb, arg);","\t} else {","\t\tstruct evutil_addrinfo *ai=NULL;","\t\tint err;","\t\terr = evutil_getaddrinfo(nodename, servname, hints_in, \u0026ai);","\t\tcb(err, ai, arg);","\t\treturn NULL;","\t}","}","","void evutil_getaddrinfo_cancel_async_(struct evdns_getaddrinfo_request *data)","{","\tif (evdns_getaddrinfo_cancel_impl \u0026\u0026 data) {","\t\tevdns_getaddrinfo_cancel_impl(data);","\t}","}","","const char *","evutil_gai_strerror(int err)","{","\t/* As a sneaky side-benefit, this case statement will get most","\t * compilers to tell us if any of the error codes we defined","\t * conflict with the platform's native error codes. */","\tswitch (err) {","\tcase EVUTIL_EAI_CANCEL:","\t\treturn \"Request canceled\";","\tcase 0:","\t\treturn \"No error\";","","\tcase EVUTIL_EAI_ADDRFAMILY:","\t\treturn \"address family for nodename not supported\";","\tcase EVUTIL_EAI_AGAIN:","\t\treturn \"temporary failure in name resolution\";","\tcase EVUTIL_EAI_BADFLAGS:","\t\treturn \"invalid value for ai_flags\";","\tcase EVUTIL_EAI_FAIL:","\t\treturn \"non-recoverable failure in name resolution\";","\tcase EVUTIL_EAI_FAMILY:","\t\treturn \"ai_family not supported\";","\tcase EVUTIL_EAI_MEMORY:","\t\treturn \"memory allocation failure\";","\tcase EVUTIL_EAI_NODATA:","\t\treturn \"no address associated with nodename\";","\tcase EVUTIL_EAI_NONAME:","\t\treturn \"nodename nor servname provided, or not known\";","\tcase EVUTIL_EAI_SERVICE:","\t\treturn \"servname not supported for ai_socktype\";","\tcase EVUTIL_EAI_SOCKTYPE:","\t\treturn \"ai_socktype not supported\";","\tcase EVUTIL_EAI_SYSTEM:","\t\treturn \"system error\";","\tdefault:","#if defined(USE_NATIVE_GETADDRINFO) \u0026\u0026 defined(_WIN32)","\t\treturn gai_strerrorA(err);","#elif defined(USE_NATIVE_GETADDRINFO)","\t\treturn gai_strerror(err);","#else","\t\treturn \"Unknown error code\";","#endif","\t}","}","","#ifdef _WIN32","/* destructively remove a trailing line terminator from s */","static void","chomp (char *s)","{","\tsize_t len;","\tif (s \u0026\u0026 (len = strlen (s)) \u003e 0 \u0026\u0026 s[len - 1] == '\\n') {","\t\ts[--len] = 0;","\t\tif (len \u003e 0 \u0026\u0026 s[len - 1] == '\\r')","\t\t\ts[--len] = 0;","\t}","}","","/* FormatMessage returns allocated strings, but evutil_socket_error_to_string"," * is supposed to return a string which is good indefinitely without having"," * to be freed. To make this work without leaking memory, we cache the"," * string the first time FormatMessage is called on a particular error"," * code, and then return the cached string on subsequent calls with the"," * same code. The strings aren't freed until libevent_global_shutdown"," * (or never). We use a linked list to cache the errors, because we"," * only expect there to be a few dozen, and that should be fast enough."," */","","struct cached_sock_errs_entry {","\tHT_ENTRY(cached_sock_errs_entry) node;","\tDWORD code;","\tchar *msg; /* allocated with LocalAlloc; free with LocalFree */","};","","static inline unsigned","hash_cached_sock_errs(const struct cached_sock_errs_entry *e)","{","\t/* Use Murmur3's 32-bit finalizer as an integer hash function */","\tDWORD h = e-\u003ecode;","\th ^= h \u003e\u003e 16;","\th *= 0x85ebca6b;","\th ^= h \u003e\u003e 13;","\th *= 0xc2b2ae35;","\th ^= h \u003e\u003e 16;","\treturn h;","}","","static inline int","eq_cached_sock_errs(const struct cached_sock_errs_entry *a,","\t\t const struct cached_sock_errs_entry *b)","{","\treturn a-\u003ecode == b-\u003ecode;","}","","#ifndef EVENT__DISABLE_THREAD_SUPPORT","static void *windows_socket_errors_lock_ = NULL;","#endif","","static HT_HEAD(cached_sock_errs_map, cached_sock_errs_entry)"," windows_socket_errors = HT_INITIALIZER();","","HT_PROTOTYPE(cached_sock_errs_map,","\t cached_sock_errs_entry,","\t node,","\t hash_cached_sock_errs,","\t eq_cached_sock_errs);","","HT_GENERATE(cached_sock_errs_map,","\t cached_sock_errs_entry,","\t node,","\t hash_cached_sock_errs,","\t eq_cached_sock_errs,","\t 0.5,","\t mm_malloc,","\t mm_realloc,","\t mm_free);","","/** Equivalent to strerror, but for windows socket errors. */","const char *","evutil_socket_error_to_string(int errcode)","{","\tstruct cached_sock_errs_entry *errs, *newerr, find;","\tchar *msg = NULL;","","\tEVLOCK_LOCK(windows_socket_errors_lock_, 0);","","\tfind.code = errcode;","\terrs = HT_FIND(cached_sock_errs_map, \u0026windows_socket_errors, \u0026find);","\tif (errs) {","\t\tmsg = errs-\u003emsg;","\t\tgoto done;","\t}","","\tif (0 != FormatMessageA(FORMAT_MESSAGE_FROM_SYSTEM |","\t\t\t FORMAT_MESSAGE_IGNORE_INSERTS |","\t\t\t FORMAT_MESSAGE_ALLOCATE_BUFFER,","\t\t\t NULL, errcode, 0, (char *)\u0026msg, 0, NULL))","\t\tchomp (msg);\t/* because message has trailing newline */","\telse {","\t\tsize_t len = 50;","\t\t/* use LocalAlloc because FormatMessage does */","\t\tmsg = LocalAlloc(LMEM_FIXED, len);","\t\tif (!msg) {","\t\t\tmsg = (char *)\"LocalAlloc failed during Winsock error\";","\t\t\tgoto done;","\t\t}","\t\tevutil_snprintf(msg, len, \"winsock error 0x%08x\", errcode);","\t}","","\tnewerr = (struct cached_sock_errs_entry *)","\t\tmm_malloc(sizeof (struct cached_sock_errs_entry));","","\tif (!newerr) {","\t\tLocalFree(msg);","\t\tmsg = (char *)\"malloc failed during Winsock error\";","\t\tgoto done;","\t}","","\tnewerr-\u003ecode = errcode;","\tnewerr-\u003emsg = msg;","\tHT_INSERT(cached_sock_errs_map, \u0026windows_socket_errors, newerr);",""," done:","\tEVLOCK_UNLOCK(windows_socket_errors_lock_, 0);","","\treturn msg;","}","","#ifndef EVENT__DISABLE_THREAD_SUPPORT","int","evutil_global_setup_locks_(const int enable_locks)","{","\tEVTHREAD_SETUP_GLOBAL_LOCK(windows_socket_errors_lock_, 0);","\treturn 0;","}","#endif","","static void","evutil_free_sock_err_globals(void)","{","\tstruct cached_sock_errs_entry **errs, *tofree;","","\tfor (errs = HT_START(cached_sock_errs_map, \u0026windows_socket_errors)","\t\t ; errs; ) {","\t\ttofree = *errs;","\t\terrs = HT_NEXT_RMV(cached_sock_errs_map,","\t\t\t\t \u0026windows_socket_errors,","\t\t\t\t errs);","\t\tLocalFree(tofree-\u003emsg);","\t\tmm_free(tofree);","\t}","","\tHT_CLEAR(cached_sock_errs_map, \u0026windows_socket_errors);","","#ifndef EVENT__DISABLE_THREAD_SUPPORT","\tif (windows_socket_errors_lock_ != NULL) {","\t\tEVTHREAD_FREE_LOCK(windows_socket_errors_lock_, 0);","\t\twindows_socket_errors_lock_ = NULL;","\t}","#endif","}","","#else","","#ifndef EVENT__DISABLE_THREAD_SUPPORT","int","evutil_global_setup_locks_(const int enable_locks)","{","\treturn 0;","}","#endif","","static void","evutil_free_sock_err_globals(void)","{","}","","#endif","","int","evutil_snprintf(char *buf, size_t buflen, const char *format, ...)","{","\tint r;","\tva_list ap;","\tva_start(ap, format);","\tr = evutil_vsnprintf(buf, buflen, format, ap);","\tva_end(ap);","\treturn r;","}","","int","evutil_vsnprintf(char *buf, size_t buflen, const char *format, va_list ap)","{","\tint r;","\tif (!buflen)","\t\treturn 0;","#if defined(_MSC_VER) || defined(_WIN32)","\tr = _vsnprintf(buf, buflen, format, ap);","\tif (r \u003c 0)","\t\tr = _vscprintf(format, ap);","#elif defined(sgi)","\t/* Make sure we always use the correct vsnprintf on IRIX */","\textern int _xpg5_vsnprintf(char * __restrict,","\t\t__SGI_LIBC_NAMESPACE_QUALIFIER size_t,","\t\tconst char * __restrict, /* va_list */ char *);","","\tr = _xpg5_vsnprintf(buf, buflen, format, ap);","#else","\tr = vsnprintf(buf, buflen, format, ap);","#endif","\tbuf[buflen-1] = '\\0';","\treturn r;","}","","#define USE_INTERNAL_NTOP","#define USE_INTERNAL_PTON","","const char *","evutil_inet_ntop(int af, const void *src, char *dst, size_t len)","{","#if defined(EVENT__HAVE_INET_NTOP) \u0026\u0026 !defined(USE_INTERNAL_NTOP)","\treturn inet_ntop(af, src, dst, len);","#else","\tif (af == AF_INET) {","\t\tconst struct in_addr *in = src;","\t\tconst ev_uint32_t a = ntohl(in-\u003es_addr);","\t\tint r;","\t\tr = evutil_snprintf(dst, len, \"%d.%d.%d.%d\",","\t\t (int)(ev_uint8_t)((a\u003e\u003e24)\u00260xff),","\t\t (int)(ev_uint8_t)((a\u003e\u003e16)\u00260xff),","\t\t (int)(ev_uint8_t)((a\u003e\u003e8 )\u00260xff),","\t\t (int)(ev_uint8_t)((a )\u00260xff));","\t\tif (r\u003c0||(size_t)r\u003e=len)","\t\t\treturn NULL;","\t\telse","\t\t\treturn dst;","#ifdef AF_INET6","\t} else if (af == AF_INET6) {","\t\tconst struct in6_addr *addr = src;","\t\tchar buf[64], *cp;","\t\tint longestGapLen = 0, longestGapPos = -1, i,","\t\t\tcurGapPos = -1, curGapLen = 0;","\t\tev_uint16_t words[8];","\t\tfor (i = 0; i \u003c 8; ++i) {","\t\t\twords[i] =","\t\t\t (((ev_uint16_t)addr-\u003es6_addr[2*i])\u003c\u003c8) + addr-\u003es6_addr[2*i+1];","\t\t}","\t\tif (words[0] == 0 \u0026\u0026 words[1] == 0 \u0026\u0026 words[2] == 0 \u0026\u0026 words[3] == 0 \u0026\u0026","\t\t words[4] == 0 \u0026\u0026 ((words[5] == 0 \u0026\u0026 words[6] \u0026\u00 8000 26 words[7]) ||","\t\t\t(words[5] == 0xffff))) {","\t\t\t/* This is an IPv4 address. */","\t\t\tif (words[5] == 0) {","\t\t\t\tevutil_snprintf(buf, sizeof(buf), \"::%d.%d.%d.%d\",","\t\t\t\t addr-\u003es6_addr[12], addr-\u003es6_addr[13],","\t\t\t\t addr-\u003es6_addr[14], addr-\u003es6_addr[15]);","\t\t\t} else {","\t\t\t\tevutil_snprintf(buf, sizeof(buf), \"::%x:%d.%d.%d.%d\", words[5],","\t\t\t\t addr-\u003es6_addr[12], addr-\u003es6_addr[13],","\t\t\t\t addr-\u003es6_addr[14], addr-\u003es6_addr[15]);","\t\t\t}","\t\t\tif (strlen(buf) \u003e len)","\t\t\t\treturn NULL;","\t\t\tstrlcpy(dst, buf, len);","\t\t\treturn dst;","\t\t}","\t\ti = 0;","\t\twhile (i \u003c 8) {","\t\t\tif (words[i] == 0) {","\t\t\t\tcurGapPos = i++;","\t\t\t\tcurGapLen = 1;","\t\t\t\twhile (i\u003c8 \u0026\u0026 words[i] == 0) {","\t\t\t\t\t++i; ++curGapLen;","\t\t\t\t}","\t\t\t\tif (curGapLen \u003e longestGapLen) {","\t\t\t\t\tlongestGapPos = curGapPos;","\t\t\t\t\tlongestGapLen = curGapLen;","\t\t\t\t}","\t\t\t} else {","\t\t\t\t++i;","\t\t\t}","\t\t}","\t\tif (longestGapLen\u003c=1)","\t\t\tlongestGapPos = -1;","","\t\tcp = buf;","\t\tfor (i = 0; i \u003c 8; ++i) {","\t\t\tif (words[i] == 0 \u0026\u0026 longestGapPos == i) {","\t\t\t\tif (i == 0)","\t\t\t\t\t*cp++ = ':';","\t\t\t\t*cp++ = ':';","\t\t\t\twhile (i \u003c 8 \u0026\u0026 words[i] == 0)","\t\t\t\t\t++i;","\t\t\t\t--i; /* to compensate for loop increment. */","\t\t\t} else {","\t\t\t\tevutil_snprintf(cp,","\t\t\t\t\t\t\t\tsizeof(buf)-(cp-buf), \"%x\", (unsigned)words[i]);","\t\t\t\tcp += strlen(cp);","\t\t\t\tif (i != 7)","\t\t\t\t\t*cp++ = ':';","\t\t\t}","\t\t}","\t\t*cp = '\\0';","\t\tif (strlen(buf) \u003e len)","\t\t\treturn NULL;","\t\tstrlcpy(dst, buf, len);","\t\treturn dst;","#endif","\t} else {","\t\treturn NULL;","\t}","#endif","}","","int","evutil_inet_pton(int af, const char *src, void *dst)","{","#if defined(EVENT__HAVE_INET_PTON) \u0026\u0026 !defined(USE_INTERNAL_PTON)","\treturn inet_pton(af, src, dst);","#else","\tif (af == AF_INET) {","\t\tunsigned a,b,c,d;","\t\tchar more;","\t\tstruct in_addr *addr = dst;","\t\tif (sscanf(src, \"%u.%u.%u.%u%c\", \u0026a,\u0026b,\u0026c,\u0026d,\u0026more) != 4)","\t\t\treturn 0;","\t\tif (a \u003e 255) return 0;","\t\tif (b \u003e 255) return 0;","\t\tif (c \u003e 255) return 0;","\t\tif (d \u003e 255) return 0;","\t\taddr-\u003es_addr = htonl((a\u003c\u003c24) | (b\u003c\u003c16) | (c\u003c\u003c8) | d);","\t\treturn 1;","#ifdef AF_INET6","\t} else if (af == AF_INET6) {","\t\tstruct in6_addr *out = dst;","\t\tev_uint16_t words[8];","\t\tint gapPos = -1, i, setWords=0;","\t\tconst char *dot = strchr(src, '.');","\t\tconst char *eow; /* end of words. */","\t\tif (dot == src)","\t\t\treturn 0;","\t\telse if (!dot)","\t\t\teow = src+strlen(src);","\t\telse {","\t\t\tunsigned byte1,byte2,byte3,byte4;","\t\t\tchar more;","\t\t\tfor (eow = dot-1; eow \u003e= src \u0026\u0026 EVUTIL_ISDIGIT_(*eow); --eow)","\t\t\t\t;","\t\t\t++eow;","","\t\t\t/* We use \"scanf\" because some platform inet_aton()s are too lax","\t\t\t * about IPv4 addresses of the form \"1.2.3\" */","\t\t\tif (sscanf(eow, \"%u.%u.%u.%u%c\",","\t\t\t\t\t \u0026byte1,\u0026byte2,\u0026byte3,\u0026byte4,\u0026more) != 4)","\t\t\t\treturn 0;","","\t\t\tif (byte1 \u003e 255 ||","\t\t\t byte2 \u003e 255 ||","\t\t\t byte3 \u003e 255 ||","\t\t\t byte4 \u003e 255)","\t\t\t\treturn 0;","","\t\t\twords[6] = (byte1\u003c\u003c8) | byte2;","\t\t\twords[7] = (byte3\u003c\u003c8) | byte4;","\t\t\tsetWords += 2;","\t\t}","","\t\ti = 0;","\t\twhile (src \u003c eow) {","\t\t\tif (i \u003e 7)","\t\t\t\treturn 0;","\t\t\tif (EVUTIL_ISXDIGIT_(*src)) {","\t\t\t\tchar *next;","\t\t\t\tlong r = strtol(src, \u0026next, 16);","\t\t\t\tif (next \u003e 4+src)","\t\t\t\t\treturn 0;","\t\t\t\tif (next == src)","\t\t\t\t\treturn 0;","\t\t\t\tif (r\u003c0 || r\u003e65536)","\t\t\t\t\treturn 0;","","\t\t\t\twords[i++] = (ev_uint16_t)r;","\t\t\t\tsetWords++;","\t\t\t\tsrc = next;","\t\t\t\tif (*src != ':' \u0026\u0026 src != eow)","\t\t\t\t\treturn 0;","\t\t\t\t++src;","\t\t\t} else if (*src == ':' \u0026\u0026 i \u003e 0 \u0026\u0026 gapPos==-1) {","\t\t\t\tgapPos = i;","\t\t\t\t++src;","\t\t\t} else if (*src == ':' \u0026\u0026 i == 0 \u0026\u0026 src[1] == ':' \u0026\u0026 gapPos==-1) {","\t\t\t\tgapPos = i;","\t\t\t\tsrc += 2;","\t\t\t} else {","\t\t\t\treturn 0;","\t\t\t}","\t\t}","","\t\tif (setWords \u003e 8 ||","\t\t\t(setWords == 8 \u0026\u0026 gapPos != -1) ||","\t\t\t(setWords \u003c 8 \u0026\u0026 gapPos == -1))","\t\t\treturn 0;","","\t\tif (gapPos \u003e= 0) {","\t\t\tint nToMove = setWords - (dot ? 2 : 0) - gapPos;","\t\t\tint gapLen = 8 - setWords;","\t\t\t/* assert(nToMove \u003e= 0); */","\t\t\tif (nToMove \u003c 0)","\t\t\t\treturn -1; /* should be impossible */","\t\t\tmemmove(\u0026words[gapPos+gapLen], \u0026words[gapPos],","\t\t\t\t\tsizeof(ev_uint16_t)*nToMove);","\t\t\tmemset(\u0026words[gapPos], 0, sizeof(ev_uint16_t)*gapLen);","\t\t}","\t\tfor (i = 0; i \u003c 8; ++i) {","\t\t\tout-\u003es6_addr[2*i ] = words[i] \u003e\u003e 8;","\t\t\tout-\u003es6_addr[2*i+1] = words[i] \u0026 0xff;","\t\t}","","\t\treturn 1;","#endif","\t} else {","\t\treturn -1;","\t}","#endif","}","","int","evutil_parse_sockaddr_port(const char *ip_as_string, struct sockaddr *out, int *outlen)","{","\tint port;","\tchar buf[128];","\tconst char *cp, *addr_part, *port_part;","\tint is_ipv6;","\t/* recognized formats are:","\t * [ipv6]:port","\t * ipv6","\t * [ipv6]","\t * ipv4:port","\t * ipv4","\t */","","\tcp = strchr(ip_as_string, ':');","\tif (*ip_as_string == '[') {","\t\tsize_t len;","\t\tif (!(cp = strchr(ip_as_string, ']'))) {","\t\t\treturn -1;","\t\t}","\t\tlen = ( cp-(ip_as_string + 1) );","\t\tif (len \u003e sizeof(buf)-1) {","\t\t\treturn -1;","\t\t}","\t\tmemcpy(buf, ip_as_string+1, len);","\t\tbuf[len] = '\\0';","\t\taddr_part = buf;","\t\tif (cp[1] == ':')","\t\t\tport_part = cp+2;","\t\telse","\t\t\tport_part = NULL;","\t\tis_ipv6 = 1;","\t} else if (cp \u0026\u0026 strchr(cp+1, ':')) {","\t\tis_ipv6 = 1;","\t\taddr_part = ip_as_string;","\t\tport_part = NULL;","\t} else if (cp) {","\t\tis_ipv6 = 0;","\t\tif (cp - ip_as_string \u003e (int)sizeof(buf)-1) {","\t\t\treturn -1;","\t\t}","\t\tmemcpy(buf, ip_as_string, cp-ip_as_string);","\t\tbuf[cp-ip_as_string] = '\\0';","\t\taddr_part = buf;","\t\tport_part = cp+1;","\t} else {","\t\taddr_part = ip_as_string;","\t\tport_part = NULL;","\t\tis_ipv6 = 0;","\t}","","\tif (port_part == NULL) {","\t\tport = 0;","\t} else {","\t\tport = atoi(port_part);","\t\tif (port \u003c= 0 || port \u003e 65535) {","\t\t\treturn -1;","\t\t}","\t}","","\tif (!addr_part)","\t\treturn -1; /* Should be impossible. */","#ifdef AF_INET6","\tif (is_ipv6)","\t{","\t\tstruct sockaddr_in6 sin6;","\t\tmemset(\u0026sin6, 0, sizeof(sin6));","#ifdef EVENT__HAVE_STRUCT_SOCKADDR_IN6_SIN6_LEN","\t\tsin6.sin6_len = sizeof(sin6);","#endif","\t\tsin6.sin6_family = AF_INET6;","\t\tsin6.sin6_port = htons(port);","\t\tif (1 != evutil_inet_pton(AF_INET6, addr_part, \u0026sin6.sin6_addr))","\t\t\treturn -1;","\t\tif ((int)sizeof(sin6) \u003e *outlen)","\t\t\treturn -1;","\t\tmemset(out, 0, *outlen);","\t\tmemcpy(out, \u0026sin6, sizeof(sin6));","\t\t*outlen = sizeof(sin6);","\t\treturn 0;","\t}","\telse","#endif","\t{","\t\tstruct sockaddr_in sin;","\t\tmemset(\u0026sin, 0, sizeof(sin));","#ifdef EVENT__HAVE_STRUCT_SOCKADDR_IN_SIN_LEN","\t\tsin.sin_len = sizeof(sin);","#endif","\t\tsin.sin_family = AF_INET;","\t\tsin.sin_port = htons(port);","\t\tif (1 != evutil_inet_pton(AF_INET, addr_part, \u0026sin.sin_addr))","\t\t\treturn -1;","\t\tif ((int)sizeof(sin) \u003e *outlen)","\t\t\treturn -1;","\t\tmemset(out, 0, *outlen);","\t\tmemcpy(out, \u0026sin, sizeof(sin));","\t\t*outlen = sizeof(sin);","\t\treturn 0;","\t}","}","","const char *","evutil_format_sockaddr_port_(const struct sockaddr *sa, char *out, size_t outlen)","{","\tchar b[128];","\tconst char *res=NULL;","\tint port;","\tif (sa-\u003esa_family == AF_INET) {","\t\tconst struct sockaddr_in *sin = (const struct sockaddr_in*)sa;","\t\tres = evutil_inet_ntop(AF_INET, \u0026sin-\u003esin_addr,b,sizeof(b));","\t\tport = ntohs(sin-\u003esin_port);","\t\tif (res) {","\t\t\tevutil_snprintf(out, outlen, \"%s:%d\", b, port);","\t\t\treturn out;","\t\t}","\t} else if (sa-\u003esa_family == AF_INET6) {","\t\tconst struct sockaddr_in6 *sin6 = (const struct sockaddr_in6*)sa;","\t\tres = evutil_inet_ntop(AF_INET6, \u0026sin6-\u003esin6_addr,b,sizeof(b));","\t\tport = ntohs(sin6-\u003esin6_port);","\t\tif (res) {","\t\t\tevutil_snprintf(out, outlen, \"[%s]:%d\", b, port);","\t\t\treturn out;","\t\t}","\t}","","\tevutil_snprintf(out, outlen, \"\u003caddr with socktype %d\u003e\",","\t (int)sa-\u003esa_family);","\treturn out;","}","","int","evutil_sockaddr_cmp(const struct sockaddr *sa1, const struct sockaddr *sa2,"," int include_port)","{","\tint r;","\tif (0 != (r = (sa1-\u003esa_family - sa2-\u003esa_family)))","\t\treturn r;","","\tif (sa1-\u003esa_family == AF_INET) {","\t\tconst struct sockaddr_in *sin1, *sin2;","\t\tsin1 = (const struct sockaddr_in *)sa1;","\t\tsin2 = (const struct sockaddr_in *)sa2;","\t\tif (sin1-\u003esin_addr.s_addr \u003c sin2-\u003esin_addr.s_addr)","\t\t\treturn -1;","\t\telse if (sin1-\u003esin_addr.s_addr \u003e sin2-\u003esin_addr.s_addr)","\t\t\treturn 1;","\t\telse if (include_port \u0026\u0026","\t\t (r = ((int)sin1-\u003esin_port - (int)sin2-\u003esin_port)))","\t\t\treturn r;","\t\telse","\t\t\treturn 0;","\t}","#ifdef AF_INET6","\telse if (sa1-\u003esa_family == AF_INET6) {","\t\tconst struct sockaddr_in6 *sin1, *sin2;","\t\tsin1 = (const struct sockaddr_in6 *)sa1;","\t\tsin2 = (const struct sockaddr_in6 *)sa2;","\t\tif ((r = memcmp(sin1-\u003esin6_addr.s6_addr, sin2-\u003esin6_addr.s6_addr, 16)))","\t\t\treturn r;","\t\telse if (include_port \u0026\u0026","\t\t (r = ((int)sin1-\u003esin6_port - (int)sin2-\u003esin6_port)))","\t\t\treturn r;","\t\telse","\t\t\treturn 0;","\t}","#endif","\treturn 1;","}","","/* Tables to implement ctypes-replacement EVUTIL_IS*() functions. Each table"," * has 256 bits to look up whether a character is in some set or not. This"," * fails on non-ASCII platforms, but so does every other place where we"," * take a char and write it onto the network."," **/","static const ev_uint32_t EVUTIL_ISALPHA_TABLE[8] ="," { 0, 0, 0x7fffffe, 0x7fffffe, 0, 0, 0, 0 };","static const ev_uint32_t EVUTIL_ISALNUM_TABLE[8] ="," { 0, 0x3ff0000, 0x7fffffe, 0x7fffffe, 0, 0, 0, 0 };","static const ev_uint32_t EVUTIL_ISSPACE_TABLE[8] = { 0x3e00, 0x1, 0, 0, 0, 0, 0, 0 };","static const ev_uint32_t EVUTIL_ISXDIGIT_TABLE[8] ="," { 0, 0x3ff0000, 0x7e, 0x7e, 0, 0, 0, 0 };","static const ev_uint32_t EVUTIL_ISDIGIT_TABLE[8] = { 0, 0x3ff0000, 0, 0, 0, 0, 0, 0 };","static const ev_uint32_t EVUTIL_ISPRINT_TABLE[8] ="," { 0, 0xffffffff, 0xffffffff, 0x7fffffff, 0, 0, 0, 0x0 };","static const ev_uint32_t EVUTIL_ISUPPER_TABLE[8] = { 0, 0, 0x7fffffe, 0, 0, 0, 0, 0 };","static const ev_uint32_t EVUTIL_ISLOWER_TABLE[8] = { 0, 0, 0, 0x7fffffe, 0, 0, 0, 0 };","/* Upper-casing and lowercasing tables to map characters to upper/lowercase"," * equivalents. */","static const unsigned char EVUTIL_TOUPPER_TABLE[256] = {"," 0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,"," 16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,"," 32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,"," 48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,"," 64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,"," 80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,"," 96,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,"," 80,81,82,83,84,85,86,87,88,89,90,123,124,125,126,127,"," 128,129,130,131,132,133,134,135,136,137,138,139,140,141,142,143,"," 144,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159,"," 160,161,162,163,164,165,166,167,168,169,170,171,172,173,174,175,"," 176,177,178,179,180,181,182,183,184,185,186,187,188,189,190,191,"," 192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,207,"," 208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,"," 224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,"," 240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,","};","static const unsigned char EVUTIL_TOLOWER_TABLE[256] = {"," 0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,"," 16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,"," 32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,"," 48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,"," 64,97,98,99,100,101,102,103,104,105,106,107,108,109,110,111,"," 112,113,114,115,116,117,118,119,120,121,122,91,92,93,94,95,"," 96,97,98,99,100,101,102,103,104,105,106,107,108,109,110,111,"," 112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,"," 128,129,130,131,132,133,134,135,136,137,138,139,140,141,142,143,"," 144,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159,"," 160,161,162,163,164,165,166,167,168,169,170,171,172,173,174,175,"," 176,177,178,179,180,181,182,183,184,185,186,187,188,189,190,191,"," 192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,207,"," 208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,"," 224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,"," 240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,","};","","#define IMPL_CTYPE_FN(name)\t\t\t\t\t\t\\","\tint EVUTIL_##name##_(char c) {\t\t\t\t\t\\","\t\tev_uint8_t u = c;\t\t\t\t\t\\","\t\treturn !!(EVUTIL_##name##_TABLE[(u \u003e\u003e 5) \u0026 7] \u0026 (1 \u003c\u003c (u \u0026 31))); \\","\t}","IMPL_CTYPE_FN(ISALPHA)","IMPL_CTYPE_FN(ISALNUM)","IMPL_CTYPE_FN(ISSPACE)","IMPL_CTYPE_FN(ISDIGIT)","IMPL_CTYPE_FN(ISXDIGIT)","IMPL_CTYPE_FN(ISPRINT)","IMPL_CTYPE_FN(ISLOWER)","IMPL_CTYPE_FN(ISUPPER)","","char EVUTIL_TOLOWER_(char c)","{","\treturn ((char)EVUTIL_TOLOWER_TABLE[(ev_uint8_t)c]);","}","char EVUTIL_TOUPPER_(char c)","{","\treturn ((char)EVUTIL_TOUPPER_TABLE[(ev_uint8_t)c]);","}","int","evutil_ascii_strcasecmp(const char *s1, const char *s2)","{","\tchar c1, c2;","\twhile (1) {","\t\tc1 = EVUTIL_TOLOWER_(*s1++);","\t\tc2 = EVUTIL_TOLOWER_(*s2++);","\t\tif (c1 \u003c c2)","\t\t\treturn -1;","\t\telse if (c1 \u003e c2)","\t\t\treturn 1;","\t\telse if (c1 == 0)","\t\t\treturn 0;","\t}","}","int evutil_ascii_strncasecmp(const char *s1, const char *s2, size_t n)","{","\tchar c1, c2;","\twhile (n--) {","\t\tc1 = EVUTIL_TOLOWER_(*s1++);","\t\tc2 = EVUTIL_TOLOWER_(*s2++);","\t\tif (c1 \u003c c2)","\t\t\treturn -1;","\t\telse if (c1 \u003e c2)","\t\t\treturn 1;","\t\telse if (c1 == 0)","\t\t\treturn 0;","\t}","\treturn 0;","}","","void","evutil_rtrim_lws_(char *str)","{","\tchar *cp;","","\tif (str == NULL)","\t\treturn;","","\tif ((cp = strchr(str, '\\0')) == NULL || (cp == str))","\t\treturn;","","\t--cp;","","\twhile (*cp == ' ' || *cp == '\\t') {","\t\t*cp = '\\0';","\t\tif (cp == str)","\t\t\tbreak;","\t\t--cp;","\t}","}","","static int","evutil_issetugid(void)","{","#ifdef EVENT__HAVE_ISSETUGID","\treturn issetugid();","#else","","#ifdef EVENT__HAVE_GETEUID","\tif (getuid() != geteuid())","\t\treturn 1;","#endif","#ifdef EVENT__HAVE_GETEGID","\tif (getgid() != getegid())","\t\treturn 1;","#endif","\treturn 0;","#endif","}","","const char *","evutil_getenv_(const char *varname)","{","\tif (evutil_issetugid())","\t\treturn NULL;","","\treturn getenv(varname);","}","","ev_uint32_t","evutil_weakrand_seed_(struct evutil_weakrand_state *state, ev_uint32_t seed)","{","\tif (seed == 0) {","\t\tstruct timeval tv;","\t\tevutil_gettimeofday(\u0026tv, NULL);","\t\tseed = (ev_uint32_t)tv.tv_sec + (ev_uint32_t)tv.tv_usec;","#ifdef _WIN32","\t\tseed += (ev_uint32_t) _getpid();","#else","\t\tseed += (ev_uint32_t) getpid();","#endif","\t}","\tstate-\u003eseed = seed;","\treturn seed;","}","","ev_int32_t","evutil_weakrand_(struct evutil_weakrand_state *state)","{","\t/* This RNG implementation is a linear congruential generator, with","\t * modulus 2^31, multiplier 1103515245, and addend 12345. It's also","\t * used by OpenBSD, and by Glibc's TYPE_0 RNG.","\t *","\t * The linear congruential generator is not an industrial-strength","\t * RNG! It's fast, but it can have higher-order patterns. Notably,","\t * the low bits tend to have periodicity.","\t */","\tstate-\u003eseed = ((state-\u003eseed) * 1103515245 + 12345) \u0026 0x7fffffff;","\treturn (ev_int32_t)(state-\u003eseed);","}","","ev_int32_t","evutil_weakrand_range_(struct evutil_weakrand_state *state, ev_int32_t top)","{","\tev_int32_t divisor, result;","","\t/* We can't just do weakrand() % top, since the low bits of the LCG","\t * are less random than the high ones. (Specifically, since the LCG","\t * modulus is 2^N, every 2^m for m\u003cN will divide the modulus, and so","\t * therefore the low m bits of the LCG will have period 2^m.) */","\tdivisor = EVUTIL_WEAKRAND_MAX / top;","\tdo {","\t\tresult = evutil_weakrand_(state) / divisor;","\t} while (result \u003e= top);","\treturn result;","}","","/**"," * Volatile pointer to memset: we use this to keep the compiler from"," * eliminating our call to memset."," */","void * (*volatile evutil_memset_volatile_)(void *, int, size_t) = memset;","","void","evutil_memclear_(void *mem, size_t len)","{","\tevutil_memset_volatile_(mem, 0, len);","}","","int","evutil_sockaddr_is_loopback_(const struct sockaddr *addr)","{","\tstatic const char LOOPBACK_S6[16] =","\t \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\1\";","\tif (addr-\u003esa_family == AF_INET) {","\t\tstruct sockaddr_in *sin = (struct sockaddr_in *)addr;","\t\treturn (ntohl(sin-\u003esin_addr.s_addr) \u0026 0xff000000) == 0x7f000000;","\t} else if (addr-\u003esa_family == AF_INET6) {","\t\tstruct sockaddr_in6 *sin6 = (struct sockaddr_in6 *)addr;","\t\treturn !memcmp(sin6-\u003esin6_addr.s6_addr, LOOPBACK_S6, 16);","\t}","\treturn 0;","}","","int","evutil_hex_char_to_int_(char c)","{","\tswitch(c)","\t{","\t\tcase '0': return 0;","\t\tcase '1': return 1;","\t\tcase '2': return 2;","\t\tcase '3': return 3;","\t\tcase '4': return 4;","\t\tcase '5': return 5;","\t\tcase '6': return 6;","\t\tcase '7': return 7;","\t\tcase '8': return 8;","\t\tcase '9': return 9;","\t\tcase 'A': case 'a': return 10;","\t\tcase 'B': case 'b': return 11;","\t\tcase 'C': case 'c': return 12;","\t\tcase 'D': case 'd': return 13;","\t\tcase 'E': case 'e': return 14;","\t\tcase 'F': case 'f': return 15;","\t}","\treturn -1;","}","","#ifdef _WIN32","HMODULE","evutil_load_windows_system_library_(const TCHAR *library_name)","{"," TCHAR path[MAX_PATH];"," unsigned n;"," n = GetSystemDirectory(path, MAX_PATH);"," if (n == 0 || n + _tcslen(library_name) + 2 \u003e= MAX_PATH)"," return 0;"," _tcscat(path, TEXT(\"\\\\\"));"," _tcscat(path, library_name);"," return LoadLibrary(path);","}","#endif","","/* Internal wrapper around 'socket' to provide Linux-style support for"," * syscall-saving methods where available."," *"," * In addition to regular socket behavior, you can use a bitwise or to set the"," * flags EVUTIL_SOCK_NONBLOCK and EVUTIL_SOCK_CLOEXEC in the 'type' argument,"," * to make the socket nonblocking or close-on-exec with as few syscalls as"," * possible."," */","evutil_socket_t","evutil_socket_(int domain, int type, int protocol)","{","\tevutil_socket_t r;","#if defined(SOCK_NONBLOCK) \u0026\u0026 defined(SOCK_CLOEXEC)","\tr = socket(domain, type, protocol);","\tif (r \u003e= 0)","\t\treturn r;","\telse if ((type \u0026 (SOCK_NONBLOCK|SOCK_CLOEXEC)) == 0)","\t\treturn -1;","#endif","#define SOCKET_TYPE_MASK (~(EVUTIL_SOCK_NONBLOCK|EVUTIL_SOCK_CLOEXEC))","\tr = socket(domain, type \u0026 SOCKET_TYPE_MASK, protocol);","\tif (r \u003c 0)","\t\treturn -1;","\tif (type \u0026 EVUTIL_SOCK_NONBLOCK) {","\t\tif (evutil_fast_socket_nonblocking(r) \u003c 0) {","\t\t\tevutil_closesocket(r);","\t\t\treturn -1;","\t\t}","\t}","\tif (type \u0026 EVUTIL_SOCK_CLOEXEC) {","\t\tif (evutil_fast_socket_closeonexec(r) \u003c 0) {","\t\t\tevutil_closesocket(r);","\t\t\treturn -1;","\t\t}","\t}","\treturn r;","}","","/* Internal wrapper around 'accept' or 'accept4' to provide Linux-style"," * support for syscall-saving methods where available."," *"," * In addition to regular accept behavior, you can set one or more of flags"," * EVUTIL_SOCK_NONBLOCK and EVUTIL_SOCK_CLOEXEC in the 'flags' argument, to"," * make the socket nonblocking or close-on-exec with as few syscalls as"," * possible."," */","evutil_socket_t","evutil_accept4_(evutil_socket_t sockfd, struct sockaddr *addr,"," ev_socklen_t *addrlen, int flags)","{","\tevutil_socket_t result;","#if defined(EVENT__HAVE_ACCEPT4) \u0026\u0026 defined(SOCK_CLOEXEC) \u0026\u0026 defined(SOCK_NONBLOCK)","\tresult = accept4(sockfd, addr, addrlen, flags);","\tif (result \u003e= 0 || (errno != EINVAL \u0026\u0026 errno != ENOSYS)) {","\t\t/* A nonnegative result means that we succeeded, so return.","\t\t * Failing with EINVAL means that an option wasn't supported,","\t\t * and failing with ENOSYS means that the syscall wasn't","\t\t * there: in those cases we want to fall back. Otherwise, we","\t\t * got a real error, and we should return. */","\t\treturn result;","\t}","#endif","\tresult = accept(sockfd, addr, addrlen);","\tif (result \u003c 0)","\t\treturn result;","","\tif (flags \u0026 EVUTIL_SOCK_CLOEXEC) {","\t\tif (evutil_fast_socket_closeonexec(result) \u003c 0) {","\t\t\tevutil_closesocket(result);","\t\t\treturn -1;","\t\t}","\t}","\tif (flags \u0026 EVUTIL_SOCK_NONBLOCK) {","\t\tif (evutil_fast_socket_nonblocking(result) \u003c 0) {","\t\t\tevutil_closesocket(result);","\t\t\treturn -1;","\t\t}","\t}","\treturn result;","}","","/* Internal function: Set fd[0] and fd[1] to a pair of fds such that writes on"," * fd[0] get read from fd[1]. Make both fds nonblocking and close-on-exec."," * Return 0 on success, -1 on failure."," */","int","evutil_make_internal_pipe_(evutil_socket_t fd[2])","{","\t/*","\t Making the second socket nonblocking is a bit subtle, given that we","\t ignore any EAGAIN returns when writing to it, and you don't usally","\t do that for a nonblocking socket. But if the kernel gives us EAGAIN,","\t then there's no need to add any more data to the buffer, since","\t the main thread is already either about to wake up and drain it,","\t or woken up and in the process of draining it.","\t*/","","#if defined(EVENT__HAVE_PIPE2)","\tif (pipe2(fd, O_NONBLOCK|O_CLOEXEC) == 0)","\t\treturn 0;","#endif","#if defined(EVENT__HAVE_PIPE)","\tif (pipe(fd) == 0) {","\t\tif (evutil_fast_socket_nonblocking(fd[0]) \u003c 0 ||","\t\t evutil_fast_socket_nonblocking(fd[1]) \u003c 0 ||","\t\t evutil_fast_socket_closeonexec(fd[0]) \u003c 0 ||","\t\t evutil_fast_socket_closeonexec(fd[1]) \u003c 0) {","\t\t\tclose(fd[0]);","\t\t\tclose(fd[1]);","\t\t\tfd[0] = fd[1] = -1;","\t\t\treturn -1;","\t\t}","\t\treturn 0;","\t} else {","\t\tevent_warn(\"%s: pipe\", __func__);","\t}","#endif","","#ifdef _WIN32","#define LOCAL_SOCKETPAIR_AF AF_INET","#else","#define LOCAL_SOCKETPAIR_AF AF_UNIX","#endif","\tif (evutil_socketpair(LOCAL_SOCKETPAIR_AF, SOCK_STREAM, 0, fd) == 0) {","\t\tif (evutil_fast_socket_nonblocking(fd[0]) \u003c 0 ||","\t\t evutil_fast_socket_nonblocking(fd[1]) \u003c 0 ||","\t\t evutil_fast_socket_closeonexec(fd[0]) \u003c 0 ||","\t\t evutil_fast_socket_closeonexec(fd[1]) \u003c 0) {","\t\t\tevutil_closesocket(fd[0]);","\t\t\tevutil_closesocket(fd[1]);","\t\t\tfd[0] = fd[1] = -1;","\t\t\treturn -1;","\t\t}","\t\treturn 0;","\t}","\tfd[0] = fd[1] = -1;","\treturn -1;","}","","/* Wrapper around eventfd on systems that provide it. Unlike the system"," * eventfd, it always supports EVUTIL_EFD_CLOEXEC and EVUTIL_EFD_NONBLOCK as"," * flags. Returns -1 on error or if eventfd is not supported."," */","evutil_socket_t","evutil_eventfd_(unsigned initval, int flags)","{","#if defined(EVENT__HAVE_EVENTFD) \u0026\u0026 defined(EVENT__HAVE_SYS_EVENTFD_H)","\tint r;","#if defined(EFD_CLOEXEC) \u0026\u0026 defined(EFD_NONBLOCK)","\tr = eventfd(initval, flags);","\tif (r \u003e= 0 || flags == 0)","\t\treturn r;","#endif","\tr = eventfd(initval, 0);","\tif (r \u003c 0)","\t\treturn r;","\tif (flags \u0026 EVUTIL_EFD_CLOEXEC) {","\t\tif (evutil_fast_socket_closeonexec(r) \u003c 0) {","\t\t\tevutil_closesocket(r);","\t\t\treturn -1;","\t\t}","\t}","\tif (flags \u0026 EVUTIL_EFD_NONBLOCK) {","\t\tif (evutil_fast_socket_nonblocking(r) \u003c 0) {","\t\t\tevutil_closesocket(r);","\t\t\treturn -1;","\t\t}","\t}","\treturn r;","#else","\treturn -1;","#endif","}","","void","evutil_free_globals_(void)","{","\tevutil_free_secure_rng_globals_();","\tevutil_free_sock_err_globals();","}"],"stylingDirectives":null,"colorizedLines":null,"csv":null,"csvError":null,"dependabotInfo":{"showConfigurationBanner":false,"configFilePath":null,"networkDependabotPath":"/jamescool/libevent/network/updates","dismissConfigurationNoticePath":"/settings/dismiss-notice/dependabot_configuration_notice","configurationNoticeDismissed":null},"displayName":"evutil.c","displayUrl":"https://github.com/jamescool/libevent/blob/master/evutil.c?raw=true","headerInfo":{"blobSize":"69 KB","deleteTooltip":"You must be signed in to make or propose changes","editTooltip":"You must be signed in to make or propose changes","ghDesktopPath":"https://desktop.github.com","isGitLfs":false,"onBranch":true,"shortPath":"1e8ef7b","siteNavLoginPath":"/login?return_to=https%3A%2F%2Fgithub.com%2Fjamescool%2Flibevent%2Fblob%2Fmaster%2Fevutil.c","isCSV":false,"isRichtext":false,"toc":null,"lineInfo":{"truncatedLoc":"2693","truncatedSloc":"2466"},"mode":"file"},"image":false,"isCodeownersFile":null,"isPlain":false,"isValidLegacyIssueTemplate":false,"issueTemplate":null,"discussionTemplate":null,"language":"C","languageID":41,"large":false,"planSupportInfo":{"repoIsFork":null,"repoOwnedByCurrentUser":null,"requestFullPath":"/jamescool/libevent/blob/master/evutil.c","showFreeOrgGatedFeatureMessage":null,"showPlanSupportBanner":null,"upgradeDataAttributes":null,"upgradePath":null},"publishBannersInfo":{"dismissActionNoticePath":"/settings/dismiss-notice/publish_action_from_dockerfile","releasePath":"/jamescool/libevent/releases/new?marketplace=true","showPublishActionBanner":false},"rawBlobUrl":"https://github.com/jamescool/libevent/raw/refs/heads/master/evutil.c","renderImageOrRaw":false,"richText":null,"renderedFileInfo":null,"shortPath":null,"symbolsEnabled":true,"tabSize":8,"topBannersInfo":{"overridingGlobalFundingFile":false,"globalPreferredFundingPath":null,"showInvalidCitationWarning":false,"citationHelpUrl":"https://docs.github.com/github/creating-cloning-and-archiving-repositories/creating-a-repository-on-github/about-citation-files","actionsOnboardingTip":null},"truncated":false,"viewable":true,"workflowRedirectUrl":null,"symbols":{"timed_out":true,"not_analyzed":false,"symbols":[{"name":"WIN32_LEAN_AND_MEAN","kind":"macro","ident_start":1599,"ident_end":1618,"extent_start":1591,"extent_end":1619,"fully_qualified_name":"WIN32_LEAN_AND_MEAN","ident_utf16":{"start":{"line_number":32,"utf16_col":8},"end":{"line_number":32,"utf16_col":27}},"extent_utf16":{"start":{"line_number":32,"utf16_col":0},"end":{"line_number":33,"utf16_col":0}}},{"name":"_WIN32_WINNT","kind":"macro","ident_start":1800,"ident_end":1812,"extent_start":1792,"extent_end":1820,"fully_qualified_name":"_WIN32_WINNT","ident_utf16":{"start":{"line_number":40,"utf16_col":8},"end":{"line_number":40,"utf16_col":20}},"extent_utf16":{"start":{"line_number":40,"utf16_col":0},"end":{"line_number":41,"utf16_col":0}}},{"name":"HT_NO_CACHE_HASH_VALUES","kind":"macro","ident_start":2744,"ident_end":2767,"extent_start":2736,"extent_end":2768,"fully_qualified_name":"HT_NO_CACHE_HASH_VALUES","ident_utf16":{"start":{"line_number":89,"utf16_col":8},"end":{"line_number":89,"utf16_col":31}},"extent_utf16":{"start":{"line_number":89,"utf16_col":0},"end":{"line_number":90,"utf16_col":0}}},{"name":"open","kind":"macro","ident_start":2801,"ident_end":2805,"extent_start":2793,"extent_end":2812,"fully_qualified_name":"open","ident_utf16":{"start":{"line_number":91,"utf16_col":8},"end":{"line_number":91,"utf16_col":12}},"extent_utf16":{"start":{"line_number":91,"utf16_col":0},"end":{"line_number":92,"utf16_col":0}}},{"name":"read","kind":"macro","ident_start":2820,"ident_end":2824,"extent_start":2812,"extent_end":2831,"fully_qualified_name":"read","ident_utf16":{"start":{"line_number":92,"utf16_col":8},"end":{"line_number":92,"utf16_col":12}},"extent_utf16":{"start":{"line_number":92,"utf16_col":0},"end":{"line_number":93,"utf16_col":0}}},{"name":"close","kind":"macro","ident_start":2839,"ident_end":2844,"extent_start":2831,"extent_end":2852,"fully_qualified_name":"close","ident_utf16":{"start":{"line_number":93,"utf16_col":8},"end":{"line_number":93,"utf16_col":13}},"extent_utf16":{"start":{"line_number":93,"utf16_col":0},"end":{"line_number":94,"utf16_col":0}}},{"name":"fstat","kind":"macro","ident_start":2874,"ident_end":2879,"extent_start":2866,"extent_end":2890,"fully_qualified_name":"fstat","ident_utf16":{"start":{"line_number":95,"utf16_col":8},"end":{"line_number":95,"utf16_col":13}},"extent_utf16":{"start":{"line_number":95,"utf16_col":0},"end":{"line_number":96,"utf16_col":0}}},{"name":"stat","kind":"macro","ident_start":2918,"ident_end":2922,"extent_start":2910,"extent_end":2932,"fully_qualified_name":"stat","ident_utf16":{"start":{"line_number":98,"utf16_col":8},"end":{"line_number":98,"utf16_col":12}},"extent_utf16":{"start":{"line_number":98,"utf16_col":0},"end":{"line_number":99,"utf16_col":0}}},{"name":"mode_t","kind":"macro","ident_start":2947,"ident_end":2953,"extent_start":2939,"extent_end":2958,"fully_qualified_name":"mode_t","ident_utf16":{"start":{"line_number":100,"utf16_col":8},"end":{"line_number":100,"utf16_col":14}},"extent_utf16":{"start":{"line_number":100,"utf16_col":0},"end":{"line_number":101,"utf16_col":0}}},{"name":"evutil_open_closeonexec_","kind":"function","ident_start":2970,"ident_end":2994,"extent_start":2970,"extent_end":3042,"fully_qualified_name":"evutil_open_closeonexec_","ident_utf16":{"start":{"line_number":104,"utf16_col":0},"end":{"line_number":104,"utf16_col":24}},"extent_utf16":{"start":{"line_number":104,"utf16_col":0},"end":{"line_number":104,"utf16_col":72}}},{"name":"evutil_read_file_","kind":"function","ident_start":3826,"ident_end":3843,"extent_start":3826,"extent_end":3921,"fully_qualified_name":"evutil_read_file_","ident_utf16":{"start":{"line_number":139,"utf16_col":0},"end":{"line_number":139,"utf16_col":17}},"extent_utf16":{"start":{"line_number":139,"utf16_col":0},"end":{"line_number":140,"utf16_col":18}}},{"name":"evutil_socketpair","kind":"function","ident_start":4916,"ident_end":4933,"extent_start":4916,"extent_end":4992,"fully_qualified_name":"evutil_socketpair","ident_utf16":{"start":{"line_number":196,"utf16_col":0},"end":{"line_number":196,"utf16_col":17}},"extent_utf16":{"start":{"line_number":196,"utf16_col":0},"end":{"line_number":196,"utf16_col":76}}},{"name":"evutil_ersatz_socketpair_","kind":"function","ident_start":5141,"ident_end":5166,"extent_start":5141,"extent_end":5229,"fully_qualified_name":"evutil_ersatz_socketpair_","ident_utf16":{"start":{"line_number":206,"utf16_col":0},"end":{"line_number":206,"utf16_col":25}},"extent_utf16":{"start":{"line_number":206,"utf16_col":0},"end":{"line_number":207,"utf16_col":26}}},{"name":"evutil_make_socket_nonblocking","kind":"function","ident_start":8120,"ident_end":8150,"extent_start":8120,"extent_end":8170,"fully_qualified_name":"evutil_make_socket_nonblocking","ident_utf16":{"start":{"line_number":312,"utf16_col":0},"end":{"line_number":312,"utf16_col":30}},"extent_utf16":{"start":{"line_number":312,"utf16_col":0},"end":{"line_number":312,"utf16_col":50}}},{"name":"evutil_fast_socket_nonblocking","kind":"function","ident_start":8821,"ident_end":8851,"extent_start":8821,"extent_end":8871,"fully_qualified_name":"evutil_fast_socket_nonblocking","ident_utf16":{"start":{"line_number":345,"utf16_col":0},"end":{"line_number":345,"utf16_col":30}},"extent_utf16":{"start":{"line_number":345,"utf16_col":0},"end":{"line_number":345,"utf16_col":50}}},{"name":"evutil_make_listen_socket_reuseable","kind":"function","ident_start":9064,"ident_end":9099,"extent_start":9064,"extent_end":9121,"fully_qualified_name":"evutil_make_listen_socket_reuseable","ident_utf16":{"start":{"line_number":359,"utf16_col":0},"end":{"line_number":359,"utf16_col":35}},"extent_utf16":{"start":{"line_number":359,"utf16_col":0},"end":{"line_number":359,"utf16_col":57}}},{"name":"evutil_make_listen_socket_reuseable_port","kind":"function","ident_start":9524,"ident_end":9564,"extent_start":9524,"extent_end":9586,"fully_qualified_name":"evutil_make_listen_socket_reuseable_port" 8000 ,"ident_utf16":{"start":{"line_number":374,"utf16_col":0},"end":{"line_number":374,"utf16_col":40}},"extent_utf16":{"start":{"line_number":374,"utf16_col":0},"end":{"line_number":374,"utf16_col":62}}},{"name":"evutil_make_tcp_listen_socket_deferred","kind":"function","ident_start":9917,"ident_end":9955,"extent_start":9917,"extent_end":9977,"fully_qualified_name":"evutil_make_tcp_listen_socket_deferred","ident_utf16":{"start":{"line_number":388,"utf16_col":0},"end":{"line_number":388,"utf16_col":38}},"extent_utf16":{"start":{"line_number":388,"utf16_col":0},"end":{"line_number":388,"utf16_col":60}}},{"name":"evutil_make_socket_closeonexec","kind":"function","ident_start":10296,"ident_end":10326,"extent_start":10296,"extent_end":10346,"fully_qualified_name":"evutil_make_socket_closeonexec","ident_utf16":{"start":{"line_number":402,"utf16_col":0},"end":{"line_number":402,"utf16_col":30}},"extent_utf16":{"start":{"line_number":402,"utf16_col":0},"end":{"line_number":402,"utf16_col":50}}},{"name":"evutil_fast_socket_closeonexec","kind":"function","ident_start":10835,"ident_end":10865,"extent_start":10835,"extent_end":10885,"fully_qualified_name":"evutil_fast_socket_closeonexec","ident_utf16":{"start":{"line_number":425,"utf16_col":0},"end":{"line_number":425,"utf16_col":30}},"extent_utf16":{"start":{"line_number":425,"utf16_col":0},"end":{"line_number":425,"utf16_col":50}}},{"name":"evutil_closesocket","kind":"function","ident_start":11065,"ident_end":11083,"extent_start":11065,"extent_end":11105,"fully_qualified_name":"evutil_closesocket","ident_utf16":{"start":{"line_number":437,"utf16_col":0},"end":{"line_number":437,"utf16_col":18}},"extent_utf16":{"start":{"line_number":437,"utf16_col":0},"end":{"line_number":437,"utf16_col":40}}},{"name":"evutil_strtoll","kind":"function","ident_start":11198,"ident_end":11212,"extent_start":11198,"extent_end":11252,"fully_qualified_name":"evutil_strtoll","ident_utf16":{"start":{"line_number":447,"utf16_col":0},"end":{"line_number":447,"utf16_col":14}},"extent_utf16":{"start":{"line_number":447,"utf16_col":0},"end":{"line_number":447,"utf16_col":54}}},{"name":"evutil_socket_geterror","kind":"function","ident_start":12445,"ident_end":12467,"extent_start":12445,"extent_end":12489,"fully_qualified_name":"evutil_socket_geterror","ident_utf16":{"start":{"line_number":508,"utf16_col":0},"end":{"line_number":508,"utf16_col":22}},"extent_utf16":{"start":{"line_number":508,"utf16_col":0},"end":{"line_number":508,"utf16_col":44}}},{"name":"evutil_socket_connect_","kind":"function","ident_start":12879,"ident_end":12901,"extent_start":12879,"extent_end":12966,"fully_qualified_name":"evutil_socket_connect_","ident_utf16":{"start":{"line_number":526,"utf16_col":0},"end":{"line_number":526,"utf16_col":22}},"extent_utf16":{"start":{"line_number":526,"utf16_col":0},"end":{"line_number":526,"utf16_col":87}}},{"name":"evutil_socket_finished_connecting_","kind":"function","ident_start":13732,"ident_end":13766,"extent_start":13732,"extent_end":13786,"fully_qualified_name":"evutil_socket_finished_connecting_","ident_utf16":{"start":{"line_number":563,"utf16_col":0},"end":{"line_number":563,"utf16_col":34}},"extent_utf16":{"start":{"line_number":563,"utf16_col":0},"end":{"line_number":563,"utf16_col":54}}},{"name":"evutil_found_ifaddr","kind":"function","ident_start":15193,"ident_end":15212,"extent_start":15193,"extent_end":15239,"fully_qualified_name":"evutil_found_ifaddr","ident_utf16":{"start":{"line_number":607,"utf16_col":0},"end":{"line_number":607,"utf16_col":19}},"extent_utf16":{"start":{"line_number":607,"utf16_col":0},"end":{"line_number":607,"utf16_col":46}}},{"name":"ULONG","kind":"type","ident_start":16403,"ident_end":16408,"extent_start":16331,"extent_end":16448,"fully_qualified_name":"ULONG","ident_utf16":{"start":{"line_number":643,"utf16_col":21},"end":{"line_number":643,"utf16_col":26}},"extent_utf16":{"start":{"line_number":642,"utf16_col":0},"end":{"line_number":643,"utf16_col":66}}},{"name":"PVOID","kind":"type","ident_start":16410,"ident_end":16415,"extent_start":16331,"extent_end":16448,"fully_qualified_name":"ULONG::PVOID","ident_utf16":{"start":{"line_number":643,"utf16_col":28},"end":{"line_number":643,"utf16_col":33}},"extent_utf16":{"start":{"line_number":642,"utf16_col":0},"end":{"line_number":643,"utf16_col":66}}},{"name":"PIP_ADAPTER_ADDRESSES","kind":"type","ident_start":16417,"ident_end":16438,"extent_start":16331,"extent_end":16448,"fully_qualified_name":"ULONG::PVOID::PIP_ADAPTER_ADDRESSES","ident_utf16":{"start":{"line_number":643,"utf16_col":35},"end":{"line_number":643,"utf16_col":56}},"extent_utf16":{"start":{"line_number":642,"utf16_col":0},"end":{"line_number":643,"utf16_col":66}}},{"name":"PULONG","kind":"type","ident_start":16440,"ident_end":16446,"extent_start":16331,"extent_end":16448,"fully_qualified_name":"ULONG::PVOID::PIP_ADAPTER_ADDRESSES::PULONG","ident_utf16":{"start":{"line_number":643,"utf16_col":58},"end":{"line_number":643,"utf16_col":64}},"extent_utf16":{"start":{"line_number":642,"utf16_col":0},"end":{"line_number":643,"utf16_col":66}}},{"name":"evutil_check_ifaddrs","kind":"function","ident_start":16468,"ident_end":16488,"extent_start":16468,"extent_end":16494,"fully_qualified_name":"evutil_check_ifaddrs","ident_utf16":{"start":{"line_number":647,"utf16_col":0},"end":{"line_number":647,"utf16_col":20}},"extent_utf16":{"start":{"line_number":647,"utf16_col":0},"end":{"line_number":647,"utf16_col":26}}},{"name":"FLAGS","kind":"macro","ident_start":17345,"ident_end":17350,"extent_start":17337,"extent_end":17462,"fully_qualified_name":"FLAGS","ident_utf16":{"start":{"line_number":678,"utf16_col":8},"end":{"line_number":678,"utf16_col":13}},"extent_utf16":{"start":{"line_number":678,"utf16_col":0},"end":{"line_number":681,"utf16_col":0}}},{"name":"evutil_check_interfaces","kind":"function","ident_start":18580,"ident_end":18603,"extent_start":18580,"extent_end":18622,"fully_qualified_name":"evutil_check_interfaces","ident_utf16":{"start":{"line_number":729,"utf16_col":0},"end":{"line_number":729,"utf16_col":23}},"extent_utf16":{"start":{"line_number":729,"utf16_col":0},"end":{"line_number":729,"utf16_col":42}}},{"name":"EVUTIL_AI_LIBEVENT_ALLOCATED","kind":"macro","ident_start":20737,"ident_end":20765,"extent_start":20729,"extent_end":20777,"fully_qualified_name":"EVUTIL_AI_LIBEVENT_ALLOCATED","ident_utf16":{"start":{"line_number":792,"utf16_col":8},"end":{"line_number":792,"utf16_col":36}},"extent_utf16":{"start":{"line_number":792,"utf16_col":0},"end":{"line_number":793,"utf16_col":0}}},{"name":"evutil_new_addrinfo_","kind":"function","ident_start":21054,"ident_end":21074,"extent_start":21054,"extent_end":21158,"fully_qualified_name":"evutil_new_addrinfo_","ident_utf16":{"start":{"line_number":800,"utf16_col":0},"end":{"line_number":800,"utf16_col":20}},"extent_utf16":{"start":{"line_number":800,"utf16_col":0},"end":{"line_number":801,"utf16_col":40}}},{"name":"evutil_addrinfo_append_","kind":"function","ident_start":22485,"ident_end":22508,"extent_start":22485,"extent_end":22575,"fully_qualified_name":"evutil_addrinfo_append_","ident_utf16":{"start":{"line_number":845,"utf16_col":0},"end":{"line_number":845,"utf16_col":23}},"extent_utf16":{"start":{"line_number":845,"utf16_col":0},"end":{"line_number":846,"utf16_col":35}}},{"name":"parse_numeric_servname","kind":"function","ident_start":22736,"ident_end":22758,"extent_start":22736,"extent_end":22780,"fully_qualified_name":"parse_numeric_servname","ident_utf16":{"start":{"line_number":859,"utf16_col":0},"end":{"line_number":859,"utf16_col":22}},"extent_utf16":{"start":{"line_number":859,"utf16_col":0},"end":{"line_number":859,"utf16_col":44}}},{"name":"evutil_parse_servname","kind":"function","ident_start":23078,"ident_end":23099,"extent_start":23078,"extent_end":23184,"fully_qualified_name":"evutil_parse_servname","ident_utf16":{"start":{"line_number":874,"utf16_col":0},"end":{"line_number":874,"utf16_col":21}},"extent_utf16":{"start":{"line_number":874,"utf16_col":0},"end":{"line_number":875,"utf16_col":40}}},{"name":"evutil_unparse_protoname","kind":"function","ident_start":23608,"ident_end":23632,"extent_start":23608,"extent_end":23643,"fully_qualified_name":"evutil_unparse_protoname","ident_utf16":{"start":{"line_number":894,"utf16_col":0},"end":{"line_number":894,"utf16_col":24}},"extent_utf16":{"start":{"line_number":894,"utf16_col":0},"end":{"line_number":894,"utf16_col":35}}},{"name":"evutil_getaddrinfo_infer_protocols","kind":"function","ident_start":24003,"ident_end":24037,"extent_start":24003,"extent_end":24068,"fully_qualified_name":"evutil_getaddrinfo_infer_protocols","ident_utf16":{"start":{"line_number":920,"utf16_col":0},"end":{"line_number":920,"utf16_col":34}},"extent_utf16":{"start":{"line_number":920,"utf16_col":0},"end":{"line_number":920,"utf16_col":65}}},{"name":"if","kind":"function","ident_start":24625,"ident_end":24627,"extent_start":24625,"extent_end":24686,"fully_qualified_name":"if","ident_utf16":{"start":{"line_number":937,"utf16_col":7},"end":{"line_number":937,"utf16_col":9}},"extent_utf16":{"start":{"line_number":937,"utf16_col":7},"end":{"line_number":938,"utf16_col":21}}},{"name":"evutil_getaddrinfo_common_","kind":"function","ident_start":25462,"ident_end":25488,"extent_start":25462,"extent_end":25611,"fully_qualified_name":"evutil_getaddrinfo_common_","ident_utf16":{"start":{"line_number":961,"utf16_col":0},"end":{"line_number":961,"utf16_col":26}},"extent_utf16":{"start":{"line_number":961,"utf16_col":0},"end":{"line_number":962,"utf16_col":78}}},{"name":"USE_NATIVE_GETADDRINFO","kind":"macro","ident_start":28815,"ident_end":28837,"extent_start":28807,"extent_end":28838,"fully_qualified_name":"USE_NATIVE_GETADDRINFO","ident_utf16":{"start":{"line_number":1078,"utf16_col":8},"end":{"line_number":1078,"utf16_col":30}},"extent_utf16":{"start":{"line_number":1078,"utf16_col":0},"end":{"line_number":1079,"utf16_col":0}}},{"name":"addrinfo_from_hostent","kind":"function","ident_start":29985,"ident_end":30006,"extent_start":29985,"extent_end":30084,"fully_qualified_name":"addrinfo_from_hostent","ident_utf16":{"start":{"line_number":1138,"utf16_col":0},"end":{"line_number":1138,"utf16_col":21}},"extent_utf16":{"start":{"line_number":1138,"utf16_col":0},"end":{"line_number":1139,"utf16_col":50}}},{"name":"evutil_adjust_hints_for_addrconfig_","kind":"function","ident_start":31662,"ident_end":31697,"extent_start":31662,"extent_end":31728,"fully_qualified_name":"evutil_adjust_hints_for_addrconfig_","ident_utf16":{"start":{"line_number":1201,"utf16_col":0},"end":{"line_number":1201,"utf16_col":35}},"extent_utf16":{"start":{"line_number":1201,"utf16_col":0},"end":{"line_number":1201,"utf16_col":66}}},{"name":"ai_find_protocol","kind":"function","ident_start":33064,"ident_end":33080,"extent_start":33064,"extent_end":33108,"fully_qualified_name":"ai_find_protocol","ident_utf16":{"start":{"line_number":1240,"utf16_col":31},"end":{"line_number":1240,"utf16_col":47}},"extent_utf16":{"start":{"line_number":1240,"utf16_col":31},"end":{"line_number":1240,"utf16_col":75}}},{"name":"test_for_getaddrinfo_hacks","kind":"function","ident_start":33213,"ident_end":33239,"extent_start":33213,"extent_end":33245,"fully_qualified_name":"test_for_getaddrinfo_hacks","ident_utf16":{"start":{"line_number":1250,"utf16_col":0},"end":{"line_number":1250,"utf16_col":26}},"extent_utf16":{"start":{"line_number":1250,"utf16_col":0},"end":{"line_number":1250,"utf16_col":32}}},{"name":"need_numeric_port_hack","kind":"function","ident_start":34014,"ident_end":34036,"extent_start":34014,"extent_end":34042,"fully_qualified_name":"need_numeric_port_hack","ident_utf16":{"start":{"line_number":1287,"utf16_col":0},"end":{"line_number":1287,"utf16_col":22}},"extent_utf16":{"start":{"line_number":1287,"utf16_col":0},"end":{"line_number":1287,"utf16_col":28}}},{"name":"need_socktype_protocol_hack","kind":"function","ident_start":34167,"ident_end":34194,"extent_start":34167,"extent_end":34200,"fully_qualified_name":"need_socktype_protocol_hack","ident_utf16":{"start":{"line_number":1295,"utf16_col":0},"end":{"line_number":1295,"utf16_col":27}},"extent_utf16":{"start":{"line_number":1295,"utf16_col":0},"end":{"line_number":1295,"utf16_col":33}}},{"name":"apply_numeric_port_hack","kind":"function","ident_start":34324,"ident_end":34347,"extent_start":34324,"extent_end":34386,"fully_qualified_name":"apply_numeric_port_hack","ident_utf16":{"start":{"line_number":1303,"utf16_col":0},"end":{"line_number":1303,"utf16_col":23}},"extent_utf16":{"start":{"line_number":1303,"utf16_col":0},"end":{"line_number":1303,"utf16_col":62}}},{"name":"apply_socktype_protocol_hack","kind":"function","ident_start":35074,"ident_end":35102,"extent_start":35074,"extent_end":35130,"fully_qualified_name":"apply_socktype_protocol_hack","ident_utf16":{"start":{"line_number":1327,"utf16_col":0},"end":{"line_number":1327,"utf16_col":28}},"extent_utf16":{"start":{"line_number":1327,"utf16_col":0},"end":{"line_number":1327,"utf16_col":56}}},{"name":"evutil_getaddrinfo","kind":"function","ident_start":35627,"ident_end":35645,"extent_start":35627,"extent_end":35763,"fully_qualified_name":"evutil_getaddrinfo","ident_utf16":{"start":{"line_number":1351,"utf16_col":0},"end":{"line_number":1351,"utf16_col":18}},"extent_utf16":{"start":{"line_number":1351,"utf16_col":0},"end":{"line_number":1352,"utf16_col":73}}},{"name":"evutil_freeaddrinfo","kind":"function","ident_start":40781,"ident_end":40800,"extent_start":40781,"extent_end":40828,"fully_qualified_name":"evutil_freeaddrinfo","ident_utf16":{"start":{"line_number":1542,"utf16_col":0},"end":{"line_number":1542,"utf16_col":19}},"extent_utf16":{"start":{"line_number":1542,"utf16_col":0},"end":{"line_number":1542,"utf16_col":47}}},{"name":"evutil_set_evdns_getaddrinfo_fn_","kind":"function","ident_start":41243,"ident_end":41275,"extent_start":41243,"extent_end":41300,"fully_qualified_name":"evutil_set_evdns_getaddrinfo_fn_","ident_utf16":{"start":{"line_number":1563,"utf16_col":0},"end":{"line_number":1563,"utf16_col":32}},"extent_utf16":{"start":{"line_number":1563,"utf16_col":0},"end":{"line_number":1563,"utf16_col":57}}},{"name":"evutil_set_evdns_getaddrinfo_cancel_fn_","kind":"function","ident_start":41371,"ident_end":41410,"extent_start":41371,"extent_end":41442,"fully_qualified_name":"evutil_set_evdns_getaddrinfo_cancel_fn_","ident_utf16":{"start":{"line_number":1569,"utf16_col":0},"end":{"line_number":1569,"utf16_col":39}},"extent_utf16":{"start":{"line_number":1569,"utf16_col":0},"end":{"line_number":1569,"utf16_col":71}}},{"name":"evutil_getaddrinfo_async_","kind":"function","ident_start":41752,"ident_end":41777,"extent_start":41752,"extent_end":41969,"fully_qualified_name":"evutil_getaddrinfo_async_","ident_utf16":{"start":{"line_number":1579,"utf16_col":34},"end":{"line_number":1579,"utf16_col":59}},"extent_utf16":{"start":{"line_number":1579,"utf16_col":34},"end":{"line_number":1583,"utf16_col":65}}},{"name":"evutil_getaddrinfo_cancel_async_","kind":"function","ident_start":42266,"ident_end":42298,"extent_start":42266,"extent_end":42338,"fully_qualified_name":"evutil_getaddrinfo_cancel_async_","ident_utf16":{"start":{"line_number":1597,"utf16_col":5},"end":{"line_number":1597,"utf16_col":37}},"extent_utf16":{"start":{"line_number":1597,"utf16_col":5},"end":{"line_number":1597,"utf16_col":77}}},{"name":"evutil_gai_strerror","kind":"function","ident_start":42445,"ident_end":42464,"extent_start":42445,"extent_end":42473,"fully_qualified_name":"evutil_gai_strerror","ident_utf16":{"start":{"line_number":1605,"utf16_col":0},"end":{"line_number":1605,"utf16_col":19}},"extent_utf16":{"start":{"line_number":1605,"utf16_col":0},"end":{"line_number":1605,"utf16_col":28}}},{"name":"chomp","kind":"function","ident_start":43827,"ident_end":43832,"extent_start":43827,"extent_end":43842,"fully_qualified_name":"chomp","ident_utf16":{"start":{"line_number":1652,"utf16_col":0},"end":{"line_number":1652,"utf16_col":5}},"extent_utf16":{"start":{"line_number":1652,"utf16_col":0},"end":{"line_number":1652,"utf16_col":15}}},{"name":"cached_sock_errs_entry","kind":"class","ident_start":44585,"ident_end":44607,"extent_start":44578,"extent_end":44729,"fully_qualified_name":"cached_sock_errs_entry","ident_utf16":{"start":{"line_number":1672,"utf16_col":7},"end":{"line_number":1672,"utf16_col":29}},"extent_utf16":{"start":{"line_number":1672,"utf16_col":0},"end":{"line_number":1676,"utf16_col":1}}},{"name":"hash_cached_sock_errs","kind":"function","ident_start":44755,"ident_end":44776,"extent_start":44755,"extent_end":44816,"fully_qualified_name":"hash_cached_sock_errs","ident_utf16":{"start":{"line_number":1679,"utf16_col":0},"end":{"line_number":1679,"utf16_col":21}},"extent_utf16":{"start":{"line_number":1679,"utf16_col":0},"end":{"line_number":1679,"utf16_col":61}}},{"name":"eq_cached_sock_errs","kind":"function","ident_start":45018,"ident_end":45037,"extent_start":45018,"extent_end":45123,"fully_qualified_name":"eq_cached_sock_errs","ident_utf16":{"start":{"line_number":1692,"utf16_col":0},"end":{"line_number":1692,"utf16_col":19}},"extent_utf16":{"start":{"line_number":1692,"utf16_col":0},"end":{"line_number":1693,"utf16_col":45}}},{"name":"evutil_socket_error_to_string","kind":"function","ident_start":45758,"ident_end":45787,"extent_start":45758,"extent_end":45800,"fully_qualified_name":"evutil_socket_error_to_string","ident_utf16":{"start":{"line_number":1723,"utf16_col":0},"end":{"line_number":1723,"utf16_col":29}},"extent_utf16":{"start":{"line_number":1723,"utf16_col":0},"end":{"line_number":1723,"utf16_col":42}}},{"name":"evutil_global_setup_locks_","kind":"function","ident_start":47012,"ident_end":47038,"extent_start":47012,"extent_end":47062,"fully_qualified_name":"evutil_global_setup_locks_","ident_utf16":{"start":{"line_number":1774,"utf16_col":0},"end":{"line_number":1774,"utf16_col":26}},"extent_utf16":{"start":{"line_number":1774,"utf16_col":0},"end":{"line_number":1774,"utf16_col":50}}},{"name":"evutil_free_sock_err_globals","kind":"function","ident_start":47159,"ident_end":47187,"extent_start":47159,"extent_end":47193,"fully_qualified_name":"evutil_free_sock_err_globals","ident_utf16":{"start":{"line_number":1782,"utf16_col":0},"end":{"line_number":1782,"utf16_col":28}},"extent_utf16":{"start":{"line_number":1782,"utf16_col":0},"end":{"line_number":1782,"utf16_col":34}}},{"name":"evutil_global_setup_locks_","kind":"function","ident_start":47781,"ident_end":47807,"extent_start":47781,"extent_end":47831,"fully_qualified_name":"evutil_global_setup_locks_","ident_utf16":{"start":{"line_number":1810,"utf16_col":0},"end":{"line_number":1810,"utf16_col":26}},"extent_utf16":{"start":{"line_number":1810,"utf16_col":0},"end":{"line_number":1810,"utf16_col":50}}},{"name":"evutil_free_sock_err_globals","kind":"function","ident_start":47867,"ident_end":47895,"extent_start":47867,"extent_end":47901,"fully_qualified_name":"evutil_free_sock_err_globals","ident_utf16":{"start":{"line_number":1817,"utf16_col":0},"end":{"line_number":1817,"utf16_col":28}},"extent_utf16":{"start":{"line_number":1817,"utf16_col":0},"end":{"line_number":1817,"utf16_col":34}}},{"name":"evutil_snprintf","kind":"function","ident_start":47919,"ident_end":47934,"extent_start":47919,"extent_end":47985,"fully_qualified_name":"evutil_snprintf","ident_utf16":{"start":{"line_number":1824,"utf16_col":0},"end":{"line_number":1824,"utf16_col":15}},"extent_utf16":{"start":{"line_number":1824,"utf16_col":0},"end":{"line_number":1824,"utf16_col":66}}},{"name":"evutil_vsnprintf","kind":"function","ident_start":48111,"ident_end":48127,"extent_start":48111,"extent_end":48185,"fully_qualified_name":"evutil_vsnprintf","ident_utf16":{"start":{"line_number":1835,"utf16_col":0},"end":{"line_number":1835,"utf16_col":16}},"extent_utf16":{"start":{"line_number":1835,"utf16_col":0},"end":{"line_number":1835,"utf16_col":74}}},{"name":"_xpg5_vsnprintf","kind":"function","ident_start":48444,"ident_end":48459,"extent_start":48444,"extent_end":48568,"fully_qualified_name":"_xpg5_vsnprintf","ident_utf16":{"start":{"line_number":1846,"utf16_col":17},"end":{"line_number":1846,"utf16_col":32}},"extent_utf16":{"start":{"line_number":1846,"utf16_col":17},"end":{"line_number":1848,"utf16_col":48}}},{"name":"USE_INTERNAL_NTOP","kind":"macro","ident_start":48717,"ident_end":48734,"extent_start":48709,"extent_end":48735,"fully_qualified_name":"USE_INTERNAL_NTOP","ident_utf16":{"start":{"line_number":1858,"utf16_col":8},"end":{"line_number":1858,"utf16_col":25}},"extent_utf16":{"start":{"line_number":1858,"utf16_col":0},"end":{"line_number":1859,"utf16_col":0}}},{"name":"USE_INTERNAL_PTON","kind":"macro","ident_start":48743,"ident_end":48760,"extent_start":48735,"extent_end":48761,"fully_qualified_name":"USE_INTERNAL_PTON","ident_utf16":{"start":{"line_number":1859,"utf16_col":8},"end":{"line_number":1859,"utf16_col":25}},"extent_utf16":{"start":{"line_number":1859,"utf16_col":0},"end":{"line_number":1860,"utf16_col":0}}},{"name":"evutil_inet_ntop","kind":"function","ident_start":48775,"ident_end":48791,"extent_start":48775,"extent_end":48839,"fully_qualified_name":"evutil_inet_ntop","ident_utf16":{"start":{"line_number":1862,"utf16_col":0},"end":{"line_number":1862,"utf16_col":16}},"extent_utf16":{"start":{"line_number":1862,"utf16_col":0},"end":{"line_number":1862,"utf16_col":64}}},{"name":"evutil_inet_pton","kind":"function","ident_start":51170,"ident_end":51186,"extent_start":51170,"extent_end":51222,"fully_qualified_name":"evutil_inet_pton","ident_utf16":{"start":{"line_number":1958,"utf16_col":0},"end":{"line_number":1958,"utf16_col":16}},"extent_utf16":{"start":{"line_number":1958,"utf16_col":0},"end":{"line_number":1958,"utf16_col":52}}},{"name":"evutil_parse_sockaddr_port","kind":"function","ident_start":53718,"ident_end":53744,"extent_start":53718,"extent_end":53805,"fully_qualified_name":"evutil_parse_sockaddr_port","ident_utf16":{"start":{"line_number":2070,"utf16_col":0},"end":{"line_number":2070,"utf16_col":26}},"extent_utf16":{"start":{"line_number":2070,"utf16_col":0},"end":{"line_number":2070,"utf16_col":87}}},{"name":"evutil_format_sockaddr_port_","kind":"function","ident_start":55879,"ident_end":55907,"extent_start":55879,"extent_end":55960,"fully_qualified_name":"evutil_format_sockaddr_port_","ident_utf16":{"start":{"line_number":2173,"utf16_col":0},"end":{"line_number":2173,"utf16_col":28}},"extent_utf16":{"start":{"line_number":2173,"utf16_col":0},"end":{"line_number":2173,"utf16_col":81}}},{"name":"evutil_sockaddr_cmp","kind":"function","ident_start":56686,"ident_end":56705,"extent_start":56686,"extent_end":56783,"fully_qualified_name":"evutil_sockaddr_cmp","ident_utf16":{"start":{"line_number":2202,"utf16_col":0},"end":{"line_number":2202,"utf16_col":19}},"extent_utf16":{"start":{"line_number":2202,"utf16_col":0},"end":{"line_number":2203,"utf16_col":21}}},{"name":"if","kind":"function","ident_start":57297,"ident_end":57299,"extent_start":57297,"extent_end":57328,"fully_qualified_name":"if","ident_utf16":{"start":{"line_number":2224,"utf16_col":6},"end":{"line_number":2224,"utf16_col":8}},"extent_utf16":{"start":{"line_number":2224,"utf16_col":6},"end":{"line_number":2224,"utf16_col":37}}},{"name":"IMPL_CTYPE_FN","kind":"function","ident_start":61056,"ident_end":61069,"extent_start":61056,"extent_end":61247,"fully_qualified_name":"IMPL_CTYPE_FN","ident_utf16":{"start":{"line_number":2302,"utf16_col":0},"end":{"line_number":2302,"utf16_col":13}},"extent_utf16":{"start":{"line_number":2302,"utf16_col":0},"end":{"line_number":2310,"utf16_col":28}}},{"name":"EVUTIL_TOUPPER_","kind":"function","ident_start":61310,"ident_end":61325,"extent_start":61310,"extent_end":61333,"fully_qualified_name":"EVUTIL_TOUPPER_","ident_utf16":{"start":{"line_number":2314,"utf16_col":5},"end":{"line_number":2314,"utf16_col":20}},"extent_utf16":{"start":{"line_number":2314,"utf16_col":5},"end":{"line_number":2314,"utf16_col":28}}},{"name":"evutil_ascii_strcasecmp","kind":"function","ident_start":61395,"ident_end":61418,"extent_start":61395,"extent_end":61450,"fully_qualified_name":"evutil_ascii_strcasecmp","ident_utf16":{"start":{"line_number":2319,"utf16_col":0},"end":{"line_number":2319,"utf16_col":23}},"extent_utf16":{"start":{"line_number":2319,"utf16_col":0},"end":{"line_number":2319,"utf16_col":55}}},{"name":"evutil_ascii_strncasecmp","kind":"function","ident_start":61646,"ident_end":61670,"extent_start":61646,"extent_end":61712,"fully_qualified_name":"evutil_ascii_strncasecmp","ident_utf16":{"start":{"line_number":2333,"utf16_col":4},"end":{"line_number":2333,"utf16_col":28}},"extent_utf16":{"start":{"line_number":2333,"utf16_col":4},"end":{"line_number":2333,"utf16_col":70}}},{"name":"evutil_rtrim_lws_","kind":"function","ident_start":61923,"ident_end":61940,"extent_start":61923,"extent_end":61951,"fully_qualified_name":"evutil_rtrim_lws_","ident_utf16":{"start":{"line_number":2350,"utf16_col":0},"end":{"line_number":2350,"utf16_col":17}},"extent_utf16":{"start":{"line_number":2350,"utf16_col":0},"end":{"line_number":2350,"utf16_col":28}}},{"name":"evutil_issetugid","kind":"function","ident_start":62171,"ident_end":62187,"extent_start":62171,"extent_end":62193,"fully_qualified_name":"evutil_issetugid","ident_utf16":{"start":{"line_number":2371,"utf16_col":0},"end":{"line_number":2371,"utf16_col":16}},"extent_utf16":{"start":{"line_number":2371,"utf16_col":0},"end":{"line_number":2371,"utf16_col":22}}},{"name":"evutil_getenv_","kind":"function","ident_start":62435,"ident_end":62449,"extent_start":62435,"extent_end":62470,"fully_qualified_name":"evutil_getenv_","ident_utf16":{"start":{"line_number":2390,"utf16_col":0},"end":{"line_number":2390,"utf16_col":14}},"extent_utf16":{"start":{"line_number":2390,"utf16_col":0},"end":{"line_number":2390,"utf16_col":35}}},{"name":"evutil_weakrand_seed_","kind":"function","ident_start":62554,"ident_end":62575,"extent_start":62554,"extent_end":62630,"fully_qualified_name":"evutil_weakrand_seed_","ident_utf16":{"start":{"line_number":2399,"utf16_col":0},"end":{"line_number":2399,"utf16_col":21}},"extent_utf16":{"start":{"line_number":2399,"utf16_col":0},"end":{"line_number":2399,"utf16_col":76}}},{"name":"evutil_weakrand_","kind":"function","ident_start":62913,"ident_end":62929,"extent_start":62913,"extent_end":62966,"fully_qualified_name":"evutil_weakrand_","ident_utf16":{"start":{"line_number":2416,"utf16_col":0},"end":{"line_number":2416,"utf16_col":16}},"extent_utf16":{"start":{"line_number":2416,"utf16_col":0},"end":{"line_number":2416,"utf16_col":53}}},{"name":"evutil_weakrand_range_","kind":"function","ident_start":63461,"ident_end":63483,"extent_start":63461,"extent_end":63536,"fully_qualified_name":"evutil_weakrand_range_","ident_utf16":{"start":{"line_number":2431,"utf16_col":0},"end":{"line_number":2431,"utf16_col":22}},"extent_utf16":{"start":{"line_number":2431,"utf16_col":0},"end":{"line_number":2431,"utf16_col":75}}},{"name":"evutil_memclear_","kind":"function","ident_start":64171,"ident_end":64187,"extent_start":64171,"extent_end":64210,"fully_qualified_name":"evutil_memclear_","ident_utf16":{"start":{"line_number":2453,"utf16_col":0},"end":{"line_number":2453,"utf16_col":16}},"extent_utf16":{"start":{"line_number":2453,"utf16_col":0},"end":{"line_number":2453,"utf16_col":39}}},{"name":"evutil_sockaddr_is_loopback_","kind":"function","ident_start":64259,"ident_end":64287,"extent_start":64259,"extent_end":64316,"fully_qualified_name":"evutil_sockaddr_is_loopback_","ident_utf16":{"start":{"line_number":2459,"utf16_col":0},"end":{"line_number":2459,"utf16_col":28}},"extent_utf16":{"start":{"line_number":2459,"utf16_col":0},"end":{"line_number":2459,"utf16_col":57}}},{"name":"evutil_hex_char_to_int_","kind":"function","ident_start":64738,"ident_end":64761,"extent_start":64738,"extent_end":64769,"fully_qualified_name":"evutil_hex_char_to_int_","ident_utf16":{"start":{"line_number":2474,"utf16_col":0},"end":{"line_number":2474,"utf16_col":23}},"extent_utf16":{"start":{"line_number":2474,"utf16_col":0},"end":{"line_number":2474,"utf16_col":31}}},{"name":"evutil_load_windows_system_library_","kind":"function","ident_start":65244,"ident_end":65279,"extent_start":65244,"extent_end":65306,"fully_qualified_name":"evutil_load_windows_system_library_","ident_utf16":{"start":{"line_number":2500,"utf16_col":0},"end":{"line_number":2500,"utf16_col":35}},"extent_utf16":{"start":{"line_number":2500,"utf16_col":0},"end":{"line_number":2500,"utf16_col":62}}},{"name":"evutil_socket_","kind":"function","ident_start":65942,"ident_end":65956,"extent_start":65942,"extent_end":65992,"fully_qualified_name":"evutil_socket_","ident_utf16":{"start":{"line_number":2522,"utf16_col":0},"end":{"line_number":2522,"utf16_col":14}},"extent_utf16":{"start":{"line_number":2522,"utf16_col":0},"end":{"line_number":2522,"utf16_col":50}}},{"name":"SOCKET_TYPE_MASK","kind":"macro","ident_start":66211,"ident_end":66227,"extent_start":66203,"extent_end":66274,"fully_qualified_name":"SOCKET_TYPE_MASK","ident_utf16":{"start":{"line_number":2532,"utf16_col":8},"end":{"line_number":2532,"utf16_col":24}},"extent_utf16":{"start":{"line_number":2532,"utf16_col":0},"end":{"line_number":2533,"utf16_col":0}}},{"name":"evutil_accept4_","kind":"function","ident_start":67015,"ident_end":67030,"extent_start":67015,"extent_end":67115,"fully_qualified_name":"evutil_accept4_","ident_utf16":{"start":{"line_number":2560,"utf16_col":0},"end":{"line_number":2560,"utf16_col":15}},"extent_utf16":{"start":{"line_number":2560,"utf16_col":0},"end":{"line_number":2561,"utf16_col":37}}},{"name":"evutil_make_internal_pipe_","kind":"function","ident_start":68238,"ident_end":68264,"extent_start":68238,"extent_end":68287,"fully_qualified_name":"evutil_make_internal_pipe_","ident_utf16":{"start":{"line_number":2599,"utf16_col":0},"end":{"line_number":2599,"utf16_col":26}},"extent_utf16":{"start":{"line_number":2599,"utf16_col":0},"end":{"line_number":2599,"utf16_col":49}}},{"name":"LOCAL_SOCKETPAIR_AF","kind":"macro","ident_start":69211,"ident_end":69230,"extent_start":69203,"extent_end":69239,"fully_qualified_name":"LOCAL_SOCKETPAIR_AF","ident_utf16":{"start":{"line_number":2632,"utf16_col":8},"end":{"line_number":2632,"utf16_col":27}},"extent_utf16":{"start":{"line_number":2632,"utf16_col":0},"end":{"line_number":2633,"utf16_col":0}}},{"name":"LOCAL_SOCKETPAIR_AF","kind":"macro","ident_start":69253,"ident_end":69272,"extent_start":69245,"extent_end":69281,"fully_qualified_name":"LOCAL_SOCKETPAIR_AF","ident_utf16":{"start":{"line_number":2634,"utf16_col":8},"end":{"line_number":2634,"utf16_col":27}},"extent_utf16":{"start":{"line_number":2634,"utf16_col":0},"end":{"line_number":2635,"utf16_col":0}}},{"name":"evutil_eventfd_","kind":"function","ident_start":69949,"ident_end":69964,"extent_start":69949,"extent_end":69993,"fully_qualified_name":"evutil_eventfd_","ident_utf16":{"start":{"line_number":2657,"utf16_col":0},"end":{"line_number":2657,"utf16_col":15}},"extent_utf16":{"start":{"line_number":2657,"utf16_col":0},"end":{"line_number":2657,"utf16_col":44}}},{"name":"evutil_free_globals_","kind":"function","ident_start":70554,"ident_end":70574,"extent_start":70554,"extent_end":70580,"fully_qualified_name":"evutil_free_globals_","ident_utf16":{"start":{"line_number":2688,"utf16_col":0},"end":{"line_number":2688,"utf16_col":20}},"extent_utf16":{"start":{"line_number":2688,"utf16_col":0},"end":{"line_number":2688,"utf16_col":26}}}]}},"copilotInfo":null,"copilotAccessAllowed":false,"modelsAccessAllowed":false,"modelsRepoIntegrationEnabled":false,"csrf_tokens":{"/jamescool/libevent/branches":{"post":"hJD3W_0L6tcX-UnUobOGxH_FDRCTfdn-9jC15zuMyKoSkBHWuWr7S2aEmRGUz3kjmDMiz5TeCS9Vcy9v86eZPw"},"/repos/preferences":{"post":"QxgRKA31OATG3LoTAo8h4oTvsid9NHg-U75ZuCwAiNNhIGPQDYsFr6dou6RIqYuAWijLLtWHArlDHnH-z1YCvw"}}},"title":"libevent/evutil.c at master · jamescool/libevent","appPayload":{"helpUrl":"https://docs.github.com","findFileWorkerPath":"/assets-cdn/worker/find-file-worker-263cab1760dd.js","findInFileWorkerPath":"/assets-cdn/worker/find-in-file-worker-1b17b3e7786a.js","githubDevUrl":null,"enabled_features":{"code_nav_ui_events":false,"react_blob_overlay":false,"accessible_code_button":true}}}
0