Blame src/uv-common.c

Packit Service 7c31a4
/* Copyright Joyent, Inc. and other Node contributors. All rights reserved.
Packit Service 7c31a4
 *
Packit Service 7c31a4
 * Permission is hereby granted, free of charge, to any person obtaining a copy
Packit Service 7c31a4
 * of this software and associated documentation files (the "Software"), to
Packit Service 7c31a4
 * deal in the Software without restriction, including without limitation the
Packit Service 7c31a4
 * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
Packit Service 7c31a4
 * sell copies of the Software, and to permit persons to whom the Software is
Packit Service 7c31a4
 * furnished to do so, subject to the following conditions:
Packit Service 7c31a4
 *
Packit Service 7c31a4
 * The above copyright notice and this permission notice shall be included in
Packit Service 7c31a4
 * all copies or substantial portions of the Software.
Packit Service 7c31a4
 *
Packit Service 7c31a4
 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
Packit Service 7c31a4
 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
Packit Service 7c31a4
 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
Packit Service 7c31a4
 * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
Packit Service 7c31a4
 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
Packit Service 7c31a4
 * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
Packit Service 7c31a4
 * IN THE SOFTWARE.
Packit Service 7c31a4
 */
Packit Service 7c31a4
Packit Service 7c31a4
#include "uv.h"
Packit Service 7c31a4
#include "uv-common.h"
Packit Service 7c31a4
Packit Service 7c31a4
#include <assert.h>
Packit Service 7c31a4
#include <errno.h>
Packit Service 7c31a4
#include <stdarg.h>
Packit Service 7c31a4
#include <stddef.h> /* NULL */
Packit Service 7c31a4
#include <stdio.h>
Packit Service 7c31a4
#include <stdlib.h> /* malloc */
Packit Service 7c31a4
#include <string.h> /* memset */
Packit Service 7c31a4
Packit Service 7c31a4
#if defined(_WIN32)
Packit Service 7c31a4
# include <malloc.h> /* malloc */
Packit Service 7c31a4
#else
Packit Service 7c31a4
# include <net/if.h> /* if_nametoindex */
Packit Service 7c31a4
# include <sys/un.h> /* AF_UNIX, sockaddr_un */
Packit Service 7c31a4
#endif
Packit Service 7c31a4
Packit Service 7c31a4
Packit Service 7c31a4
typedef struct {
Packit Service 7c31a4
  uv_malloc_func local_malloc;
Packit Service 7c31a4
  uv_realloc_func local_realloc;
Packit Service 7c31a4
  uv_calloc_func local_calloc;
Packit Service 7c31a4
  uv_free_func local_free;
Packit Service 7c31a4
} uv__allocator_t;
Packit Service 7c31a4
Packit Service 7c31a4
static uv__allocator_t uv__allocator = {
Packit Service 7c31a4
  malloc,
Packit Service 7c31a4
  realloc,
Packit Service 7c31a4
  calloc,
Packit Service 7c31a4
  free,
Packit Service 7c31a4
};
Packit Service 7c31a4
Packit Service 7c31a4
char* uv__strdup(const char* s) {
Packit Service 7c31a4
  size_t len = strlen(s) + 1;
Packit Service 7c31a4
  char* m = uv__malloc(len);
Packit Service 7c31a4
  if (m == NULL)
Packit Service 7c31a4
    return NULL;
Packit Service 7c31a4
  return memcpy(m, s, len);
Packit Service 7c31a4
}
Packit Service 7c31a4
Packit Service 7c31a4
char* uv__strndup(const char* s, size_t n) {
Packit Service 7c31a4
  char* m;
Packit Service 7c31a4
  size_t len = strlen(s);
Packit Service 7c31a4
  if (n < len)
Packit Service 7c31a4
    len = n;
Packit Service 7c31a4
  m = uv__malloc(len + 1);
Packit Service 7c31a4
  if (m == NULL)
Packit Service 7c31a4
    return NULL;
Packit Service 7c31a4
  m[len] = '\0';
Packit Service 7c31a4
  return memcpy(m, s, len);
Packit Service 7c31a4
}
Packit Service 7c31a4
Packit Service 7c31a4
void* uv__malloc(size_t size) {
Packit Service 7c31a4
  if (size > 0)
Packit Service 7c31a4
    return uv__allocator.local_malloc(size);
Packit Service 7c31a4
  return NULL;
Packit Service 7c31a4
}
Packit Service 7c31a4
Packit Service 7c31a4
void uv__free(void* ptr) {
Packit Service 7c31a4
  int saved_errno;
Packit Service 7c31a4
Packit Service 7c31a4
  /* Libuv expects that free() does not clobber errno.  The system allocator
Packit Service 7c31a4
   * honors that assumption but custom allocators may not be so careful.
Packit Service 7c31a4
   */
Packit Service 7c31a4
  saved_errno = errno;
Packit Service 7c31a4
  uv__allocator.local_free(ptr);
Packit Service 7c31a4
  errno = saved_errno;
Packit Service 7c31a4
}
Packit Service 7c31a4
Packit Service 7c31a4
void* uv__calloc(size_t count, size_t size) {
Packit Service 7c31a4
  return uv__allocator.local_calloc(count, size);
Packit Service 7c31a4
}
Packit Service 7c31a4
Packit Service 7c31a4
void* uv__realloc(void* ptr, size_t size) {
Packit Service 7c31a4
  if (size > 0)
Packit Service 7c31a4
    return uv__allocator.local_realloc(ptr, size);
Packit Service 7c31a4
  uv__free(ptr);
Packit Service 7c31a4
  return NULL;
Packit Service 7c31a4
}
Packit Service 7c31a4
Packit Service 7c31a4
void* uv__reallocf(void* ptr, size_t size) {
Packit Service 7c31a4
  void* newptr;
Packit Service 7c31a4
Packit Service 7c31a4
  newptr = uv__realloc(ptr, size);
Packit Service 7c31a4
  if (newptr == NULL)
Packit Service 7c31a4
    if (size > 0)
Packit Service 7c31a4
      uv__free(ptr);
Packit Service 7c31a4
Packit Service 7c31a4
  return newptr;
Packit Service 7c31a4
}
Packit Service 7c31a4
Packit Service 7c31a4
int uv_replace_allocator(uv_malloc_func malloc_func,
Packit Service 7c31a4
                         uv_realloc_func realloc_func,
Packit Service 7c31a4
                         uv_calloc_func calloc_func,
Packit Service 7c31a4
                         uv_free_func free_func) {
Packit Service 7c31a4
  if (malloc_func == NULL || realloc_func == NULL ||
Packit Service 7c31a4
      calloc_func == NULL || free_func == NULL) {
Packit Service 7c31a4
    return UV_EINVAL;
Packit Service 7c31a4
  }
Packit Service 7c31a4
Packit Service 7c31a4
  uv__allocator.local_malloc = malloc_func;
Packit Service 7c31a4
  uv__allocator.local_realloc = realloc_func;
Packit Service 7c31a4
  uv__allocator.local_calloc = calloc_func;
Packit Service 7c31a4
  uv__allocator.local_free = free_func;
Packit Service 7c31a4
Packit Service 7c31a4
  return 0;
Packit Service 7c31a4
}
Packit Service 7c31a4
Packit Service 7c31a4
#define XX(uc, lc) case UV_##uc: return sizeof(uv_##lc##_t);
Packit Service 7c31a4
Packit Service 7c31a4
size_t uv_handle_size(uv_handle_type type) {
Packit Service 7c31a4
  switch (type) {
Packit Service 7c31a4
    UV_HANDLE_TYPE_MAP(XX)
Packit Service 7c31a4
    default:
Packit Service 7c31a4
      return -1;
Packit Service 7c31a4
  }
Packit Service 7c31a4
}
Packit Service 7c31a4
Packit Service 7c31a4
size_t uv_req_size(uv_req_type type) {
Packit Service 7c31a4
  switch(type) {
Packit Service 7c31a4
    UV_REQ_TYPE_MAP(XX)
Packit Service 7c31a4
    default:
Packit Service 7c31a4
      return -1;
Packit Service 7c31a4
  }
Packit Service 7c31a4
}
Packit Service 7c31a4
Packit Service 7c31a4
#undef XX
Packit Service 7c31a4
Packit Service 7c31a4
Packit Service 7c31a4
size_t uv_loop_size(void) {
Packit Service 7c31a4
  return sizeof(uv_loop_t);
Packit Service 7c31a4
}
Packit Service 7c31a4
Packit Service 7c31a4
Packit Service 7c31a4
uv_buf_t uv_buf_init(char* base, unsigned int len) {
Packit Service 7c31a4
  uv_buf_t buf;
Packit Service 7c31a4
  buf.base = base;
Packit Service 7c31a4
  buf.len = len;
Packit Service 7c31a4
  return buf;
Packit Service 7c31a4
}
Packit Service 7c31a4
Packit Service 7c31a4
Packit Service 7c31a4
static const char* uv__unknown_err_code(int err) {
Packit Service 7c31a4
  char buf[32];
Packit Service 7c31a4
  char* copy;
Packit Service 7c31a4
Packit Service 7c31a4
  snprintf(buf, sizeof(buf), "Unknown system error %d", err);
Packit Service 7c31a4
  copy = uv__strdup(buf);
Packit Service 7c31a4
Packit Service 7c31a4
  return copy != NULL ? copy : "Unknown system error";
Packit Service 7c31a4
}
Packit Service 7c31a4
Packit Service 7c31a4
#define UV_ERR_NAME_GEN_R(name, _) \
Packit Service 7c31a4
case UV_## name: \
Packit Service 7c31a4
  uv__strscpy(buf, #name, buflen); break;
Packit Service 7c31a4
char* uv_err_name_r(int err, char* buf, size_t buflen) {
Packit Service 7c31a4
  switch (err) {
Packit Service 7c31a4
    UV_ERRNO_MAP(UV_ERR_NAME_GEN_R)
Packit Service 7c31a4
    default: snprintf(buf, buflen, "Unknown system error %d", err);
Packit Service 7c31a4
  }
Packit Service 7c31a4
  return buf;
Packit Service 7c31a4
}
Packit Service 7c31a4
#undef UV_ERR_NAME_GEN_R
Packit Service 7c31a4
Packit Service 7c31a4
Packit Service 7c31a4
#define UV_ERR_NAME_GEN(name, _) case UV_ ## name: return #name;
Packit Service 7c31a4
const char* uv_err_name(int err) {
Packit Service 7c31a4
  switch (err) {
Packit Service 7c31a4
    UV_ERRNO_MAP(UV_ERR_NAME_GEN)
Packit Service 7c31a4
  }
Packit Service 7c31a4
  return uv__unknown_err_code(err);
Packit Service 7c31a4
}
Packit Service 7c31a4
#undef UV_ERR_NAME_GEN
Packit Service 7c31a4
Packit Service 7c31a4
Packit Service 7c31a4
#define UV_STRERROR_GEN_R(name, msg) \
Packit Service 7c31a4
case UV_ ## name: \
Packit Service 7c31a4
  snprintf(buf, buflen, "%s", msg); break;
Packit Service 7c31a4
char* uv_strerror_r(int err, char* buf, size_t buflen) {
Packit Service 7c31a4
  switch (err) {
Packit Service 7c31a4
    UV_ERRNO_MAP(UV_STRERROR_GEN_R)
Packit Service 7c31a4
    default: snprintf(buf, buflen, "Unknown system error %d", err);
Packit Service 7c31a4
  }
Packit Service 7c31a4
  return buf;
Packit Service 7c31a4
}
Packit Service 7c31a4
#undef UV_STRERROR_GEN_R
Packit Service 7c31a4
Packit Service 7c31a4
Packit Service 7c31a4
#define UV_STRERROR_GEN(name, msg) case UV_ ## name: return msg;
Packit Service 7c31a4
const char* uv_strerror(int err) {
Packit Service 7c31a4
  switch (err) {
Packit Service 7c31a4
    UV_ERRNO_MAP(UV_STRERROR_GEN)
Packit Service 7c31a4
  }
Packit Service 7c31a4
  return uv__unknown_err_code(err);
Packit Service 7c31a4
}
Packit Service 7c31a4
#undef UV_STRERROR_GEN
Packit Service 7c31a4
Packit Service 7c31a4
Packit Service 7c31a4
int uv_ip4_addr(const char* ip, int port, struct sockaddr_in* addr) {
Packit Service 7c31a4
  memset(addr, 0, sizeof(*addr));
Packit Service 7c31a4
  addr->sin_family = AF_INET;
Packit Service 7c31a4
  addr->sin_port = htons(port);
Packit Service 7c31a4
#ifdef SIN6_LEN
Packit Service 7c31a4
  addr->sin_len = sizeof(*addr);
Packit Service 7c31a4
#endif
Packit Service 7c31a4
  return uv_inet_pton(AF_INET, ip, &(addr->sin_addr.s_addr));
Packit Service 7c31a4
}
Packit Service 7c31a4
Packit Service 7c31a4
Packit Service 7c31a4
int uv_ip6_addr(const char* ip, int port, struct sockaddr_in6* addr) {
Packit Service 7c31a4
  char address_part[40];
Packit Service 7c31a4
  size_t address_part_size;
Packit Service 7c31a4
  const char* zone_index;
Packit Service 7c31a4
Packit Service 7c31a4
  memset(addr, 0, sizeof(*addr));
Packit Service 7c31a4
  addr->sin6_family = AF_INET6;
Packit Service 7c31a4
  addr->sin6_port = htons(port);
Packit Service 7c31a4
#ifdef SIN6_LEN
Packit Service 7c31a4
  addr->sin6_len = sizeof(*addr);
Packit Service 7c31a4
#endif
Packit Service 7c31a4
Packit Service 7c31a4
  zone_index = strchr(ip, '%');
Packit Service 7c31a4
  if (zone_index != NULL) {
Packit Service 7c31a4
    address_part_size = zone_index - ip;
Packit Service 7c31a4
    if (address_part_size >= sizeof(address_part))
Packit Service 7c31a4
      address_part_size = sizeof(address_part) - 1;
Packit Service 7c31a4
Packit Service 7c31a4
    memcpy(address_part, ip, address_part_size);
Packit Service 7c31a4
    address_part[address_part_size] = '\0';
Packit Service 7c31a4
    ip = address_part;
Packit Service 7c31a4
Packit Service 7c31a4
    zone_index++; /* skip '%' */
Packit Service 7c31a4
    /* NOTE: unknown interface (id=0) is silently ignored */
Packit Service 7c31a4
#ifdef _WIN32
Packit Service 7c31a4
    addr->sin6_scope_id = atoi(zone_index);
Packit Service 7c31a4
#else
Packit Service 7c31a4
    addr->sin6_scope_id = if_nametoindex(zone_index);
Packit Service 7c31a4
#endif
Packit Service 7c31a4
  }
Packit Service 7c31a4
Packit Service 7c31a4
  return uv_inet_pton(AF_INET6, ip, &addr->sin6_addr);
Packit Service 7c31a4
}
Packit Service 7c31a4
Packit Service 7c31a4
Packit Service 7c31a4
int uv_ip4_name(const struct sockaddr_in* src, char* dst, size_t size) {
Packit Service 7c31a4
  return uv_inet_ntop(AF_INET, &src->sin_addr, dst, size);
Packit Service 7c31a4
}
Packit Service 7c31a4
Packit Service 7c31a4
Packit Service 7c31a4
int uv_ip6_name(const struct sockaddr_in6* src, char* dst, size_t size) {
Packit Service 7c31a4
  return uv_inet_ntop(AF_INET6, &src->sin6_addr, dst, size);
Packit Service 7c31a4
}
Packit Service 7c31a4
Packit Service 7c31a4
Packit Service 7c31a4
int uv_tcp_bind(uv_tcp_t* handle,
Packit Service 7c31a4
                const struct sockaddr* addr,
Packit Service 7c31a4
                unsigned int flags) {
Packit Service 7c31a4
  unsigned int addrlen;
Packit Service 7c31a4
Packit Service 7c31a4
  if (handle->type != UV_TCP)
Packit Service 7c31a4
    return UV_EINVAL;
Packit Service 7c31a4
Packit Service 7c31a4
  if (addr->sa_family == AF_INET)
Packit Service 7c31a4
    addrlen = sizeof(struct sockaddr_in);
Packit Service 7c31a4
  else if (addr->sa_family == AF_INET6)
Packit Service 7c31a4
    addrlen = sizeof(struct sockaddr_in6);
Packit Service 7c31a4
  else
Packit Service 7c31a4
    return UV_EINVAL;
Packit Service 7c31a4
Packit Service 7c31a4
  return uv__tcp_bind(handle, addr, addrlen, flags);
Packit Service 7c31a4
}
Packit Service 7c31a4
Packit Service 7c31a4
Packit Service 7c31a4
int uv_udp_init_ex(uv_loop_t* loop, uv_udp_t* handle, unsigned flags) {
Packit Service 7c31a4
  unsigned extra_flags;
Packit Service 7c31a4
  int domain;
Packit Service 7c31a4
  int rc;
Packit Service 7c31a4
Packit Service 7c31a4
  /* Use the lower 8 bits for the domain. */
Packit Service 7c31a4
  domain = flags & 0xFF;
Packit Service 7c31a4
  if (domain != AF_INET && domain != AF_INET6 && domain != AF_UNSPEC)
Packit Service 7c31a4
    return UV_EINVAL;
Packit Service 7c31a4
Packit Service 7c31a4
  /* Use the higher bits for extra flags. */
Packit Service 7c31a4
  extra_flags = flags & ~0xFF;
Packit Service 7c31a4
  if (extra_flags & ~UV_UDP_RECVMMSG)
Packit Service 7c31a4
    return UV_EINVAL;
Packit Service 7c31a4
Packit Service 7c31a4
  rc = uv__udp_init_ex(loop, handle, flags, domain);
Packit Service 7c31a4
Packit Service 7c31a4
  if (rc == 0)
Packit Service 7c31a4
    if (extra_flags & UV_UDP_RECVMMSG)
Packit Service 7c31a4
      handle->flags |= UV_HANDLE_UDP_RECVMMSG;
Packit Service 7c31a4
Packit Service 7c31a4
  return rc;
Packit Service 7c31a4
}
Packit Service 7c31a4
Packit Service 7c31a4
Packit Service 7c31a4
int uv_udp_init(uv_loop_t* loop, uv_udp_t* handle) {
Packit Service 7c31a4
  return uv_udp_init_ex(loop, handle, AF_UNSPEC);
Packit Service 7c31a4
}
Packit Service 7c31a4
Packit Service 7c31a4
Packit Service 7c31a4
int uv_udp_bind(uv_udp_t* handle,
Packit Service 7c31a4
                const struct sockaddr* addr,
Packit Service 7c31a4
                unsigned int flags) {
Packit Service 7c31a4
  unsigned int addrlen;
Packit Service 7c31a4
Packit Service 7c31a4
  if (handle->type != UV_UDP)
Packit Service 7c31a4
    return UV_EINVAL;
Packit Service 7c31a4
Packit Service 7c31a4
  if (addr->sa_family == AF_INET)
Packit Service 7c31a4
    addrlen = sizeof(struct sockaddr_in);
Packit Service 7c31a4
  else if (addr->sa_family == AF_INET6)
Packit Service 7c31a4
    addrlen = sizeof(struct sockaddr_in6);
Packit Service 7c31a4
  else
Packit Service 7c31a4
    return UV_EINVAL;
Packit Service 7c31a4
Packit Service 7c31a4
  return uv__udp_bind(handle, addr, addrlen, flags);
Packit Service 7c31a4
}
Packit Service 7c31a4
Packit Service 7c31a4
Packit Service 7c31a4
int uv_tcp_connect(uv_connect_t* req,
Packit Service 7c31a4
                   uv_tcp_t* handle,
Packit Service 7c31a4
                   const struct sockaddr* addr,
Packit Service 7c31a4
                   uv_connect_cb cb) {
Packit Service 7c31a4
  unsigned int addrlen;
Packit Service 7c31a4
Packit Service 7c31a4
  if (handle->type != UV_TCP)
Packit Service 7c31a4
    return UV_EINVAL;
Packit Service 7c31a4
Packit Service 7c31a4
  if (addr->sa_family == AF_INET)
Packit Service 7c31a4
    addrlen = sizeof(struct sockaddr_in);
Packit Service 7c31a4
  else if (addr->sa_family == AF_INET6)
Packit Service 7c31a4
    addrlen = sizeof(struct sockaddr_in6);
Packit Service 7c31a4
  else
Packit Service 7c31a4
    return UV_EINVAL;
Packit Service 7c31a4
Packit Service 7c31a4
  return uv__tcp_connect(req, handle, addr, addrlen, cb);
Packit Service 7c31a4
}
Packit Service 7c31a4
Packit Service 7c31a4
Packit Service 7c31a4
int uv_udp_connect(uv_udp_t* handle, const struct sockaddr* addr) {
Packit Service 7c31a4
  unsigned int addrlen;
Packit Service 7c31a4
Packit Service 7c31a4
  if (handle->type != UV_UDP)
Packit Service 7c31a4
    return UV_EINVAL;
Packit Service 7c31a4
Packit Service 7c31a4
  /* Disconnect the handle */
Packit Service 7c31a4
  if (addr == NULL) {
Packit Service 7c31a4
    if (!(handle->flags & UV_HANDLE_UDP_CONNECTED))
Packit Service 7c31a4
      return UV_ENOTCONN;
Packit Service 7c31a4
Packit Service 7c31a4
    return uv__udp_disconnect(handle);
Packit Service 7c31a4
  }
Packit Service 7c31a4
Packit Service 7c31a4
  if (addr->sa_family == AF_INET)
Packit Service 7c31a4
    addrlen = sizeof(struct sockaddr_in);
Packit Service 7c31a4
  else if (addr->sa_family == AF_INET6)
Packit Service 7c31a4
    addrlen = sizeof(struct sockaddr_in6);
Packit Service 7c31a4
  else
Packit Service 7c31a4
    return UV_EINVAL;
Packit Service 7c31a4
Packit Service 7c31a4
  if (handle->flags & UV_HANDLE_UDP_CONNECTED)
Packit Service 7c31a4
    return UV_EISCONN;
Packit Service 7c31a4
Packit Service 7c31a4
  return uv__udp_connect(handle, addr, addrlen);
Packit Service 7c31a4
}
Packit Service 7c31a4
Packit Service 7c31a4
Packit Service 7c31a4
int uv__udp_is_connected(uv_udp_t* handle) {
Packit Service 7c31a4
  struct sockaddr_storage addr;
Packit Service 7c31a4
  int addrlen;
Packit Service 7c31a4
  if (handle->type != UV_UDP)
Packit Service 7c31a4
    return 0;
Packit Service 7c31a4
Packit Service 7c31a4
  addrlen = sizeof(addr);
Packit Service 7c31a4
  if (uv_udp_getpeername(handle, (struct sockaddr*) &addr, &addrlen) != 0)
Packit Service 7c31a4
    return 0;
Packit Service 7c31a4
Packit Service 7c31a4
  return addrlen > 0;
Packit Service 7c31a4
}
Packit Service 7c31a4
Packit Service 7c31a4
Packit Service 7c31a4
int uv__udp_check_before_send(uv_udp_t* handle, const struct sockaddr* addr) {
Packit Service 7c31a4
  unsigned int addrlen;
Packit Service 7c31a4
Packit Service 7c31a4
  if (handle->type != UV_UDP)
Packit Service 7c31a4
    return UV_EINVAL;
Packit Service 7c31a4
Packit Service 7c31a4
  if (addr != NULL && (handle->flags & UV_HANDLE_UDP_CONNECTED))
Packit Service 7c31a4
    return UV_EISCONN;
Packit Service 7c31a4
Packit Service 7c31a4
  if (addr == NULL && !(handle->flags & UV_HANDLE_UDP_CONNECTED))
Packit Service 7c31a4
    return UV_EDESTADDRREQ;
Packit Service 7c31a4
Packit Service 7c31a4
  if (addr != NULL) {
Packit Service 7c31a4
    if (addr->sa_family == AF_INET)
Packit Service 7c31a4
      addrlen = sizeof(struct sockaddr_in);
Packit Service 7c31a4
    else if (addr->sa_family == AF_INET6)
Packit Service 7c31a4
      addrlen = sizeof(struct sockaddr_in6);
Packit Service 7c31a4
#if defined(AF_UNIX) && !defined(_WIN32)
Packit Service 7c31a4
    else if (addr->sa_family == AF_UNIX)
Packit Service 7c31a4
      addrlen = sizeof(struct sockaddr_un);
Packit Service 7c31a4
#endif
Packit Service 7c31a4
    else
Packit Service 7c31a4
      return UV_EINVAL;
Packit Service 7c31a4
  } else {
Packit Service 7c31a4
    addrlen = 0;
Packit Service 7c31a4
  }
Packit Service 7c31a4
Packit Service 7c31a4
  return addrlen;
Packit Service 7c31a4
}
Packit Service 7c31a4
Packit Service 7c31a4
Packit Service 7c31a4
int uv_udp_send(uv_udp_send_t* req,
Packit Service 7c31a4
                uv_udp_t* handle,
Packit Service 7c31a4
                const uv_buf_t bufs[],
Packit Service 7c31a4
                unsigned int nbufs,
Packit Service 7c31a4
                const struct sockaddr* addr,
Packit Service 7c31a4
                uv_udp_send_cb send_cb) {
Packit Service 7c31a4
  int addrlen;
Packit Service 7c31a4
Packit Service 7c31a4
  addrlen = uv__udp_check_before_send(handle, addr);
Packit Service 7c31a4
  if (addrlen < 0)
Packit Service 7c31a4
    return addrlen;
Packit Service 7c31a4
Packit Service 7c31a4
  return uv__udp_send(req, handle, bufs, nbufs, addr, addrlen, send_cb);
Packit Service 7c31a4
}
Packit Service 7c31a4
Packit Service 7c31a4
Packit Service 7c31a4
int uv_udp_try_send(uv_udp_t* handle,
Packit Service 7c31a4
                    const uv_buf_t bufs[],
Packit Service 7c31a4
                    unsigned int nbufs,
Packit Service 7c31a4
                    const struct sockaddr* addr) {
Packit Service 7c31a4
  int addrlen;
Packit Service 7c31a4
Packit Service 7c31a4
  addrlen = uv__udp_check_before_send(handle, addr);
Packit Service 7c31a4
  if (addrlen < 0)
Packit Service 7c31a4
    return addrlen;
Packit Service 7c31a4
Packit Service 7c31a4
  return uv__udp_try_send(handle, bufs, nbufs, addr, addrlen);
Packit Service 7c31a4
}
Packit Service 7c31a4
Packit Service 7c31a4
Packit Service 7c31a4
int uv_udp_recv_start(uv_udp_t* handle,
Packit Service 7c31a4
                      uv_alloc_cb alloc_cb,
Packit Service 7c31a4
                      uv_udp_recv_cb recv_cb) {
Packit Service 7c31a4
  if (handle->type != UV_UDP || alloc_cb == NULL || recv_cb == NULL)
Packit Service 7c31a4
    return UV_EINVAL;
Packit Service 7c31a4
  else
Packit Service 7c31a4
    return uv__udp_recv_start(handle, alloc_cb, recv_cb);
Packit Service 7c31a4
}
Packit Service 7c31a4
Packit Service 7c31a4
Packit Service 7c31a4
int uv_udp_recv_stop(uv_udp_t* handle) {
Packit Service 7c31a4
  if (handle->type != UV_UDP)
Packit Service 7c31a4
    return UV_EINVAL;
Packit Service 7c31a4
  else
Packit Service 7c31a4
    return uv__udp_recv_stop(handle);
Packit Service 7c31a4
}
Packit Service 7c31a4
Packit Service 7c31a4
Packit Service 7c31a4
void uv_walk(uv_loop_t* loop, uv_walk_cb walk_cb, void* arg) {
Packit Service 7c31a4
  QUEUE queue;
Packit Service 7c31a4
  QUEUE* q;
Packit Service 7c31a4
  uv_handle_t* h;
Packit Service 7c31a4
Packit Service 7c31a4
  QUEUE_MOVE(&loop->handle_queue, &queue);
Packit Service 7c31a4
  while (!QUEUE_EMPTY(&queue)) {
Packit Service 7c31a4
    q = QUEUE_HEAD(&queue);
Packit Service 7c31a4
    h = QUEUE_DATA(q, uv_handle_t, handle_queue);
Packit Service 7c31a4
Packit Service 7c31a4
    QUEUE_REMOVE(q);
Packit Service 7c31a4
    QUEUE_INSERT_TAIL(&loop->handle_queue, q);
Packit Service 7c31a4
Packit Service 7c31a4
    if (h->flags & UV_HANDLE_INTERNAL) continue;
Packit Service 7c31a4
    walk_cb(h, arg);
Packit Service 7c31a4
  }
Packit Service 7c31a4
}
Packit Service 7c31a4
Packit Service 7c31a4
Packit Service 7c31a4
static void uv__print_handles(uv_loop_t* loop, int only_active, FILE* stream) {
Packit Service 7c31a4
  const char* type;
Packit Service 7c31a4
  QUEUE* q;
Packit Service 7c31a4
  uv_handle_t* h;
Packit Service 7c31a4
Packit Service 7c31a4
  if (loop == NULL)
Packit Service 7c31a4
    loop = uv_default_loop();
Packit Service 7c31a4
Packit Service 7c31a4
  QUEUE_FOREACH(q, &loop->handle_queue) {
Packit Service 7c31a4
    h = QUEUE_DATA(q, uv_handle_t, handle_queue);
Packit Service 7c31a4
Packit Service 7c31a4
    if (only_active && !uv__is_active(h))
Packit Service 7c31a4
      continue;
Packit Service 7c31a4
Packit Service 7c31a4
    switch (h->type) {
Packit Service 7c31a4
#define X(uc, lc) case UV_##uc: type = #lc; break;
Packit Service 7c31a4
      UV_HANDLE_TYPE_MAP(X)
Packit Service 7c31a4
#undef X
Packit Service 7c31a4
      default: type = "<unknown>";
Packit Service 7c31a4
    }
Packit Service 7c31a4
Packit Service 7c31a4
    fprintf(stream,
Packit Service 7c31a4
            "[%c%c%c] %-8s %p\n",
Packit Service 7c31a4
            "R-"[!(h->flags & UV_HANDLE_REF)],
Packit Service 7c31a4
            "A-"[!(h->flags & UV_HANDLE_ACTIVE)],
Packit Service 7c31a4
            "I-"[!(h->flags & UV_HANDLE_INTERNAL)],
Packit Service 7c31a4
            type,
Packit Service 7c31a4
            (void*)h);
Packit Service 7c31a4
  }
Packit Service 7c31a4
}
Packit Service 7c31a4
Packit Service 7c31a4
Packit Service 7c31a4
void uv_print_all_handles(uv_loop_t* loop, FILE* stream) {
Packit Service 7c31a4
  uv__print_handles(loop, 0, stream);
Packit Service 7c31a4
}
Packit Service 7c31a4
Packit Service 7c31a4
Packit Service 7c31a4
void uv_print_active_handles(uv_loop_t* loop, FILE* stream) {
Packit Service 7c31a4
  uv__print_handles(loop, 1, stream);
Packit Service 7c31a4
}
Packit Service 7c31a4
Packit Service 7c31a4
Packit Service 7c31a4
void uv_ref(uv_handle_t* handle) {
Packit Service 7c31a4
  uv__handle_ref(handle);
Packit Service 7c31a4
}
Packit Service 7c31a4
Packit Service 7c31a4
Packit Service 7c31a4
void uv_unref(uv_handle_t* handle) {
Packit Service 7c31a4
  uv__handle_unref(handle);
Packit Service 7c31a4
}
Packit Service 7c31a4
Packit Service 7c31a4
Packit Service 7c31a4
int uv_has_ref(const uv_handle_t* handle) {
Packit Service 7c31a4
  return uv__has_ref(handle);
Packit Service 7c31a4
}
Packit Service 7c31a4
Packit Service 7c31a4
Packit Service 7c31a4
void uv_stop(uv_loop_t* loop) {
Packit Service 7c31a4
  loop->stop_flag = 1;
Packit Service 7c31a4
}
Packit Service 7c31a4
Packit Service 7c31a4
Packit Service 7c31a4
uint64_t uv_now(const uv_loop_t* loop) {
Packit Service 7c31a4
  return loop->time;
Packit Service 7c31a4
}
Packit Service 7c31a4
Packit Service 7c31a4
Packit Service 7c31a4
Packit Service 7c31a4
size_t uv__count_bufs(const uv_buf_t bufs[], unsigned int nbufs) {
Packit Service 7c31a4
  unsigned int i;
Packit Service 7c31a4
  size_t bytes;
Packit Service 7c31a4
Packit Service 7c31a4
  bytes = 0;
Packit Service 7c31a4
  for (i = 0; i < nbufs; i++)
Packit Service 7c31a4
    bytes += (size_t) bufs[i].len;
Packit Service 7c31a4
Packit Service 7c31a4
  return bytes;
Packit Service 7c31a4
}
Packit Service 7c31a4
Packit Service 7c31a4
int uv_recv_buffer_size(uv_handle_t* handle, int* value) {
Packit Service 7c31a4
  return uv__socket_sockopt(handle, SO_RCVBUF, value);
Packit Service 7c31a4
}
Packit Service 7c31a4
Packit Service 7c31a4
int uv_send_buffer_size(uv_handle_t* handle, int *value) {
Packit Service 7c31a4
  return uv__socket_sockopt(handle, SO_SNDBUF, value);
Packit Service 7c31a4
}
Packit Service 7c31a4
Packit Service 7c31a4
int uv_fs_event_getpath(uv_fs_event_t* handle, char* buffer, size_t* size) {
Packit Service 7c31a4
  size_t required_len;
Packit Service 7c31a4
Packit Service 7c31a4
  if (!uv__is_active(handle)) {
Packit Service 7c31a4
    *size = 0;
Packit Service 7c31a4
    return UV_EINVAL;
Packit Service 7c31a4
  }
Packit Service 7c31a4
Packit Service 7c31a4
  required_len = strlen(handle->path);
Packit Service 7c31a4
  if (required_len >= *size) {
Packit Service 7c31a4
    *size = required_len + 1;
Packit Service 7c31a4
    return UV_ENOBUFS;
Packit Service 7c31a4
  }
Packit Service 7c31a4
Packit Service 7c31a4
  memcpy(buffer, handle->path, required_len);
Packit Service 7c31a4
  *size = required_len;
Packit Service 7c31a4
  buffer[required_len] = '\0';
Packit Service 7c31a4
Packit Service 7c31a4
  return 0;
Packit Service 7c31a4
}
Packit Service 7c31a4
Packit Service 7c31a4
/* The windows implementation does not have the same structure layout as
Packit Service 7c31a4
 * the unix implementation (nbufs is not directly inside req but is
Packit Service 7c31a4
 * contained in a nested union/struct) so this function locates it.
Packit Service 7c31a4
*/
Packit Service 7c31a4
static unsigned int* uv__get_nbufs(uv_fs_t* req) {
Packit Service 7c31a4
#ifdef _WIN32
Packit Service 7c31a4
  return &req->fs.info.nbufs;
Packit Service 7c31a4
#else
Packit Service 7c31a4
  return &req->nbufs;
Packit Service 7c31a4
#endif
Packit Service 7c31a4
}
Packit Service 7c31a4
Packit Service 7c31a4
/* uv_fs_scandir() uses the system allocator to allocate memory on non-Windows
Packit Service 7c31a4
 * systems. So, the memory should be released using free(). On Windows,
Packit Service 7c31a4
 * uv__malloc() is used, so use uv__free() to free memory.
Packit Service 7c31a4
*/
Packit Service 7c31a4
#ifdef _WIN32
Packit Service 7c31a4
# define uv__fs_scandir_free uv__free
Packit Service 7c31a4
#else
Packit Service 7c31a4
# define uv__fs_scandir_free free
Packit Service 7c31a4
#endif
Packit Service 7c31a4
Packit Service 7c31a4
void uv__fs_scandir_cleanup(uv_fs_t* req) {
Packit Service 7c31a4
  uv__dirent_t** dents;
Packit Service 7c31a4
Packit Service 7c31a4
  unsigned int* nbufs = uv__get_nbufs(req);
Packit Service 7c31a4
Packit Service 7c31a4
  dents = req->ptr;
Packit Service 7c31a4
  if (*nbufs > 0 && *nbufs != (unsigned int) req->result)
Packit Service 7c31a4
    (*nbufs)--;
Packit Service 7c31a4
  for (; *nbufs < (unsigned int) req->result; (*nbufs)++)
Packit Service 7c31a4
    uv__fs_scandir_free(dents[*nbufs]);
Packit Service 7c31a4
Packit Service 7c31a4
  uv__fs_scandir_free(req->ptr);
Packit Service 7c31a4
  req->ptr = NULL;
Packit Service 7c31a4
}
Packit Service 7c31a4
Packit Service 7c31a4
Packit Service 7c31a4
int uv_fs_scandir_next(uv_fs_t* req, uv_dirent_t* ent) {
Packit Service 7c31a4
  uv__dirent_t** dents;
Packit Service 7c31a4
  uv__dirent_t* dent;
Packit Service 7c31a4
  unsigned int* nbufs;
Packit Service 7c31a4
Packit Service 7c31a4
  /* Check to see if req passed */
Packit Service 7c31a4
  if (req->result < 0)
Packit Service 7c31a4
    return req->result;
Packit Service 7c31a4
Packit Service 7c31a4
  /* Ptr will be null if req was canceled or no files found */
Packit Service 7c31a4
  if (!req->ptr)
Packit Service 7c31a4
    return UV_EOF;
Packit Service 7c31a4
Packit Service 7c31a4
  nbufs = uv__get_nbufs(req);
Packit Service 7c31a4
  assert(nbufs);
Packit Service 7c31a4
Packit Service 7c31a4
  dents = req->ptr;
Packit Service 7c31a4
Packit Service 7c31a4
  /* Free previous entity */
Packit Service 7c31a4
  if (*nbufs > 0)
Packit Service 7c31a4
    uv__fs_scandir_free(dents[*nbufs - 1]);
Packit Service 7c31a4
Packit Service 7c31a4
  /* End was already reached */
Packit Service 7c31a4
  if (*nbufs == (unsigned int) req->result) {
Packit Service 7c31a4
    uv__fs_scandir_free(dents);
Packit Service 7c31a4
    req->ptr = NULL;
Packit Service 7c31a4
    return UV_EOF;
Packit Service 7c31a4
  }
Packit Service 7c31a4
Packit Service 7c31a4
  dent = dents[(*nbufs)++];
Packit Service 7c31a4
Packit Service 7c31a4
  ent->name = dent->d_name;
Packit Service 7c31a4
  ent->type = uv__fs_get_dirent_type(dent);
Packit Service 7c31a4
Packit Service 7c31a4
  return 0;
Packit Service 7c31a4
}
Packit Service 7c31a4
Packit Service 7c31a4
uv_dirent_type_t uv__fs_get_dirent_type(uv__dirent_t* dent) {
Packit Service 7c31a4
  uv_dirent_type_t type;
Packit Service 7c31a4
Packit Service 7c31a4
#ifdef HAVE_DIRENT_TYPES
Packit Service 7c31a4
  switch (dent->d_type) {
Packit Service 7c31a4
    case UV__DT_DIR:
Packit Service 7c31a4
      type = UV_DIRENT_DIR;
Packit Service 7c31a4
      break;
Packit Service 7c31a4
    case UV__DT_FILE:
Packit Service 7c31a4
      type = UV_DIRENT_FILE;
Packit Service 7c31a4
      break;
Packit Service 7c31a4
    case UV__DT_LINK:
Packit Service 7c31a4
      type = UV_DIRENT_LINK;
Packit Service 7c31a4
      break;
Packit Service 7c31a4
    case UV__DT_FIFO:
Packit Service 7c31a4
      type = UV_DIRENT_FIFO;
Packit Service 7c31a4
      break;
Packit Service 7c31a4
    case UV__DT_SOCKET:
Packit Service 7c31a4
      type = UV_DIRENT_SOCKET;
Packit Service 7c31a4
      break;
Packit Service 7c31a4
    case UV__DT_CHAR:
Packit Service 7c31a4
      type = UV_DIRENT_CHAR;
Packit Service 7c31a4
      break;
Packit Service 7c31a4
    case UV__DT_BLOCK:
Packit Service 7c31a4
      type = UV_DIRENT_BLOCK;
Packit Service 7c31a4
      break;
Packit Service 7c31a4
    default:
Packit Service 7c31a4
      type = UV_DIRENT_UNKNOWN;
Packit Service 7c31a4
  }
Packit Service 7c31a4
#else
Packit Service 7c31a4
  type = UV_DIRENT_UNKNOWN;
Packit Service 7c31a4
#endif
Packit Service 7c31a4
Packit Service 7c31a4
  return type;
Packit Service 7c31a4
}
Packit Service 7c31a4
Packit Service 7c31a4
void uv__fs_readdir_cleanup(uv_fs_t* req) {
Packit Service 7c31a4
  uv_dir_t* dir;
Packit Service 7c31a4
  uv_dirent_t* dirents;
Packit Service 7c31a4
  int i;
Packit Service 7c31a4
Packit Service 7c31a4
  if (req->ptr == NULL)
Packit Service 7c31a4
    return;
Packit Service 7c31a4
Packit Service 7c31a4
  dir = req->ptr;
Packit Service 7c31a4
  dirents = dir->dirents;
Packit Service 7c31a4
  req->ptr = NULL;
Packit Service 7c31a4
Packit Service 7c31a4
  if (dirents == NULL)
Packit Service 7c31a4
    return;
Packit Service 7c31a4
Packit Service 7c31a4
  for (i = 0; i < req->result; ++i) {
Packit Service 7c31a4
    uv__free((char*) dirents[i].name);
Packit Service 7c31a4
    dirents[i].name = NULL;
Packit Service 7c31a4
  }
Packit Service 7c31a4
}
Packit Service 7c31a4
Packit Service 7c31a4
Packit Service 7c31a4
int uv_loop_configure(uv_loop_t* loop, uv_loop_option option, ...) {
Packit Service 7c31a4
  va_list ap;
Packit Service 7c31a4
  int err;
Packit Service 7c31a4
Packit Service 7c31a4
  va_start(ap, option);
Packit Service 7c31a4
  /* Any platform-agnostic options should be handled here. */
Packit Service 7c31a4
  err = uv__loop_configure(loop, option, ap);
Packit Service 7c31a4
  va_end(ap);
Packit Service 7c31a4
Packit Service 7c31a4
  return err;
Packit Service 7c31a4
}
Packit Service 7c31a4
Packit Service 7c31a4
Packit Service 7c31a4
static uv_loop_t default_loop_struct;
Packit Service 7c31a4
static uv_loop_t* default_loop_ptr;
Packit Service 7c31a4
Packit Service 7c31a4
Packit Service 7c31a4
uv_loop_t* uv_default_loop(void) {
Packit Service 7c31a4
  if (default_loop_ptr != NULL)
Packit Service 7c31a4
    return default_loop_ptr;
Packit Service 7c31a4
Packit Service 7c31a4
  if (uv_loop_init(&default_loop_struct))
Packit Service 7c31a4
    return NULL;
Packit Service 7c31a4
Packit Service 7c31a4
  default_loop_ptr = &default_loop_struct;
Packit Service 7c31a4
  return default_loop_ptr;
Packit Service 7c31a4
}
Packit Service 7c31a4
Packit Service 7c31a4
Packit Service 7c31a4
uv_loop_t* uv_loop_new(void) {
Packit Service 7c31a4
  uv_loop_t* loop;
Packit Service 7c31a4
Packit Service 7c31a4
  loop = uv__malloc(sizeof(*loop));
Packit Service 7c31a4
  if (loop == NULL)
Packit Service 7c31a4
    return NULL;
Packit Service 7c31a4
Packit Service 7c31a4
  if (uv_loop_init(loop)) {
Packit Service 7c31a4
    uv__free(loop);
Packit Service 7c31a4
    return NULL;
Packit Service 7c31a4
  }
Packit Service 7c31a4
Packit Service 7c31a4
  return loop;
Packit Service 7c31a4
}
Packit Service 7c31a4
Packit Service 7c31a4
Packit Service 7c31a4
int uv_loop_close(uv_loop_t* loop) {
Packit Service 7c31a4
  QUEUE* q;
Packit Service 7c31a4
  uv_handle_t* h;
Packit Service 7c31a4
#ifndef NDEBUG
Packit Service 7c31a4
  void* saved_data;
Packit Service 7c31a4
#endif
Packit Service 7c31a4
Packit Service 7c31a4
  if (uv__has_active_reqs(loop))
Packit Service 7c31a4
    return UV_EBUSY;
Packit Service 7c31a4
Packit Service 7c31a4
  QUEUE_FOREACH(q, &loop->handle_queue) {
Packit Service 7c31a4
    h = QUEUE_DATA(q, uv_handle_t, handle_queue);
Packit Service 7c31a4
    if (!(h->flags & UV_HANDLE_INTERNAL))
Packit Service 7c31a4
      return UV_EBUSY;
Packit Service 7c31a4
  }
Packit Service 7c31a4
Packit Service 7c31a4
  uv__loop_close(loop);
Packit Service 7c31a4
Packit Service 7c31a4
#ifndef NDEBUG
Packit Service 7c31a4
  saved_data = loop->data;
Packit Service 7c31a4
  memset(loop, -1, sizeof(*loop));
Packit Service 7c31a4
  loop->data = saved_data;
Packit Service 7c31a4
#endif
Packit Service 7c31a4
  if (loop == default_loop_ptr)
Packit Service 7c31a4
    default_loop_ptr = NULL;
Packit Service 7c31a4
Packit Service 7c31a4
  return 0;
Packit Service 7c31a4
}
Packit Service 7c31a4
Packit Service 7c31a4
Packit Service 7c31a4
void uv_loop_delete(uv_loop_t* loop) {
Packit Service 7c31a4
  uv_loop_t* default_loop;
Packit Service 7c31a4
  int err;
Packit Service 7c31a4
Packit Service 7c31a4
  default_loop = default_loop_ptr;
Packit Service 7c31a4
Packit Service 7c31a4
  err = uv_loop_close(loop);
Packit Service 7c31a4
  (void) err;    /* Squelch compiler warnings. */
Packit Service 7c31a4
  assert(err == 0);
Packit Service 7c31a4
  if (loop != default_loop)
Packit Service 7c31a4
    uv__free(loop);
Packit Service 7c31a4
}
Packit Service 7c31a4
Packit Service 7c31a4
Packit Service 7c31a4
void uv_os_free_environ(uv_env_item_t* envitems, int count) {
Packit Service 7c31a4
  int i;
Packit Service 7c31a4
Packit Service 7c31a4
  for (i = 0; i < count; i++) {
Packit Service 7c31a4
    uv__free(envitems[i].name);
Packit Service 7c31a4
  }
Packit Service 7c31a4
Packit Service 7c31a4
  uv__free(envitems);
Packit Service 7c31a4
}
Packit Service 7c31a4
Packit Service 7c31a4
Packit Service 7c31a4
void uv_free_cpu_info(uv_cpu_info_t* cpu_infos, int count) {
Packit Service 7c31a4
  int i;
Packit Service 7c31a4
Packit Service 7c31a4
  for (i = 0; i < count; i++)
Packit Service 7c31a4
    uv__free(cpu_infos[i].model);
Packit Service 7c31a4
Packit Service 7c31a4
  uv__free(cpu_infos);
Packit Service 7c31a4
}
Packit Service 7c31a4
Packit Service 7c31a4
Packit Service 7c31a4
#ifdef __GNUC__  /* Also covers __clang__ and __INTEL_COMPILER. */
Packit Service 7c31a4
__attribute__((destructor))
Packit Service 7c31a4
#endif
Packit Service 7c31a4
void uv_library_shutdown(void) {
Packit Service 7c31a4
  static int was_shutdown;
Packit Service 7c31a4
Packit Service 7c31a4
  if (was_shutdown)
Packit Service 7c31a4
    return;
Packit Service 7c31a4
Packit Service 7c31a4
  uv__process_title_cleanup();
Packit Service 7c31a4
  uv__signal_cleanup();
Packit Service 7c31a4
  uv__threadpool_cleanup();
Packit Service 7c31a4
  was_shutdown = 1;
Packit Service 7c31a4
}