Пример #1
0
CassError cass_inet_from_string(const char* str, CassInet* output) {
#if UV_VERSION_MAJOR == 0
  if (uv_inet_pton(AF_INET, str, output->address).code == UV_OK) {
#else
  if (uv_inet_pton(AF_INET, str, output->address) == 0) {
#endif
    output->address_length = CASS_INET_V4_LENGTH;
    return CASS_OK;
#if UV_VERSION_MAJOR == 0
  } else if (uv_inet_pton(AF_INET6, str, output->address).code == UV_OK) {
#else
  } else if (uv_inet_pton(AF_INET6, str, output->address) == 0) {
#endif
    output->address_length = CASS_INET_V6_LENGTH;
    return CASS_OK;
  } else {
    return CASS_ERROR_LIB_BAD_PARAMS;
  }
}

CassError cass_inet_from_string_n(const char* str,
                                  size_t str_length,
                                  CassInet* output) {
  char buf[CASS_INET_STRING_LENGTH];
   // Need space for null terminator
  if (str_length > CASS_INET_STRING_LENGTH - 1) {
    return CASS_ERROR_LIB_BAD_PARAMS;
  }
  memcpy(buf, str, str_length);
  buf[str_length] = '\0';
  return cass_inet_from_string(buf, output);
}
Пример #2
0
bool Address::validateIP(const std::string& addr)
{
    char ia[sizeof(struct in6_addr)];
    if (uv_inet_pton(AF_INET, addr.c_str(), &ia) == 0)
        return true;
    else if (uv_inet_pton(AF_INET6, addr.c_str(), &ia) == 0)
        return true;
    return false;
}
Пример #3
0
/* parse a Python tuple containing host, port, flowinfo, scope_id into a sockaddr struct */
static int
pyuv_parse_addr_tuple(PyObject *addr, struct sockaddr_storage *ss)
{
    char *host;
    int port;
    unsigned int scope_id, flowinfo;
    struct in_addr addr4;
    struct in6_addr addr6;
    struct sockaddr_in *sa4;
    struct sockaddr_in6 *sa6;

    flowinfo = scope_id = 0;

    if (!PyTuple_Check(addr)) {
        PyErr_Format(PyExc_TypeError, "address must be tuple, not %.500s", Py_TYPE(addr)->tp_name);
        return -1;
    }

    if (!PyArg_ParseTuple(addr, "si|II", &host, &port, &flowinfo, &scope_id)) {
        return -1;
    }

    if (port < 0 || port > 0xffff) {
        PyErr_SetString(PyExc_OverflowError, "port must be 0-65535");
        return -1;
    }

    if (flowinfo > 0xfffff) {
        PyErr_SetString(PyExc_OverflowError, "flowinfo must be 0-1048575");
        return -1;
    }

    memset(ss, 0, sizeof(struct sockaddr_storage));

    if (uv_inet_pton(AF_INET, host, &addr4) == 0) {
        /* it's an IPv4 address */
        sa4 = (struct sockaddr_in *)ss;
        sa4->sin_family = AF_INET;
        sa4->sin_port = htons((short)port);
        sa4->sin_addr = addr4;
        return 0;
    } else if (uv_inet_pton(AF_INET6, host, &addr6) == 0) {
        /* it's an IPv4 address */
        sa6 = (struct sockaddr_in6 *)ss;
        sa6->sin6_family = AF_INET6;
        sa6->sin6_port = htons((short)port);
        sa6->sin6_addr = addr6;
        sa6->sin6_flowinfo = flowinfo;
        sa6->sin6_scope_id = scope_id;
        return 0;
    } else {
        PyErr_SetString(PyExc_ValueError, "invalid IP address");
        return -1;
    }
}
Пример #4
0
void Address::init(const std::string& host, UInt16 port)
{
    //TraceLS(this) << "Parse: " << host << ":" << port << endl;

    char ia[sizeof(struct in6_addr)];
    if (uv_inet_pton(AF_INET, host.c_str(), &ia) == 0)
        _base = new IPv4AddressBase(&ia, htons(port));
    else if (uv_inet_pton(AF_INET6, host.c_str(), &ia) == 0)
        _base = new IPv6AddressBase(&ia, htons(port));
    else
        throw std::runtime_error("Invalid IP address format: " + host);
}
Пример #5
0
static PyObject *
DNSResolver_func_getnameinfo(DNSResolver *self, PyObject *args, PyObject *kwargs)
{
    char *addr;
    int port, flags, length;
    struct in_addr addr4;
    struct in6_addr addr6;
    struct sockaddr *sa;
    struct sockaddr_in sa4;
    struct sockaddr_in6 sa6;
    ares_cb_data_t *cb_data;
    PyObject *callback;

    if (!PyArg_ParseTuple(args, "(si)iO:getnameinfo", &addr, &port, &flags, &callback)) {
        return NULL;
    }

    if (!PyCallable_Check(callback)) {
        PyErr_SetString(PyExc_TypeError, "a callable is required");
        return NULL;
    }

    if (port < 0 || port > 65536) {
        PyErr_SetString(PyExc_ValueError, "port must be between 0 and 65536");
        return NULL;
    }

    if (uv_inet_pton(AF_INET, addr, &addr4) == 1) {
        sa4 = uv_ip4_addr(addr, port);
        sa = (struct sockaddr *)&sa4;
        length = sizeof(struct sockaddr_in);
    } else if (uv_inet_pton(AF_INET6, addr, &addr6) == 1) {
        sa6 = uv_ip6_addr(addr, port);
        sa = (struct sockaddr *)&sa6;
        length = sizeof(struct sockaddr_in6);
    } else {
        PyErr_SetString(PyExc_ValueError, "invalid IP address");
        return NULL;
    }

    cb_data = (ares_cb_data_t*) PyMem_Malloc(sizeof *cb_data);
    if (!cb_data) {
        return PyErr_NoMemory();
    }

    Py_INCREF(callback);
    cb_data->resolver = self;
    cb_data->cb = callback;

    ares_getnameinfo(self->channel, sa, length, flags, &nameinfo_cb, (void *)cb_data);
    Py_RETURN_NONE;
}
Пример #6
0
int uv_ip6_addr(const char* ip, int port, struct sockaddr_in6* addr) {
  char address_part[40];
  size_t address_part_size;
  const char* zone_index;

  memset(addr, 0, sizeof(*addr));
  addr->sin6_family = AF_INET6;
  addr->sin6_port = htons(port);

  zone_index = strchr(ip, '%');
  if (zone_index != NULL) {
    address_part_size = zone_index - ip;
    if (address_part_size >= sizeof(address_part))
      address_part_size = sizeof(address_part) - 1;

    memcpy(address_part, ip, address_part_size);
    address_part[address_part_size] = '\0';
    ip = address_part;

    zone_index++; /* skip '%' */
    /* NOTE: unknown interface (id=0) is silently ignored */
#ifdef _WIN32
    addr->sin6_scope_id = atoi(zone_index);
#else
    addr->sin6_scope_id = if_nametoindex(zone_index);
#endif
  }

  return uv_inet_pton(AF_INET6, ip, &addr->sin6_addr);
}
Пример #7
0
static PyObject *
DNSResolver_func_gethostbyaddr(DNSResolver *self, PyObject *args, PyObject *kwargs)
{
    char *name;
    int family, length;
    void *address;
    struct in_addr addr4;
    struct in6_addr addr6;
    ares_cb_data_t *cb_data;
    PyObject *callback;

    if (!PyArg_ParseTuple(args, "sO:gethostbyaddr", &name, &callback)) {
        return NULL;
    }

    if (!PyCallable_Check(callback)) {
        PyErr_SetString(PyExc_TypeError, "a callable is required");
        return NULL;
    }

    if (uv_inet_pton(AF_INET, name, &addr4) == 1) {
        family = AF_INET;
        length = sizeof(struct in_addr);
        address = (void *)&addr4;
    } else if (uv_inet_pton(AF_INET6, name, &addr6) == 1) {
        family = AF_INET6;
        length = sizeof(struct in6_addr);
        address = (void *)&addr6;
    } else {
        PyErr_SetString(PyExc_ValueError, "invalid IP address");
        return NULL;
    }

    cb_data = (ares_cb_data_t*) PyMem_Malloc(sizeof *cb_data);
    if (!cb_data) {
        return PyErr_NoMemory();
    }

    Py_INCREF(callback);
    cb_data->resolver = self;
    cb_data->cb = callback;

    ares_gethostbyaddr(self->channel, address, length, family, &host_cb, (void *)cb_data);

    Py_RETURN_NONE;
}
Пример #8
0
extern "C" struct sockaddr*
rust_malloc_ip4_addr(char *name, int port) {
    struct sockaddr_in *addr = (struct sockaddr_in*) calloc(1, rust_sockaddr_size());
    assert(addr != NULL);
    addr->sin_port = htons(port);
    assert(uv_inet_pton(AF_INET, name, &addr->sin_addr) == 0);
    addr->sin_family = AF_INET;
    return (struct sockaddr*) addr;
}
Пример #9
0
/*
 * Class:     com_oracle_libuv_LibUV
 * Method:    _isIPv6
 * Signature: (Ljava/lang/String;)Z
 */
JNIEXPORT jboolean JNICALL Java_com_oracle_libuv_LibUV__1isIPv6
  (JNIEnv *env, jclass cls, jstring ip) {

  const char *address = env->GetStringUTFChars(ip, JNI_FALSE);
  char address_buffer[sizeof(struct in6_addr)];
  if (uv_inet_pton(AF_INET6, address, &address_buffer).code == UV_OK) {
    return JNI_TRUE;
  }
  return JNI_FALSE;
}
Пример #10
0
Файл: udp.c Проект: ajafff/node
static int uv__udp_set_membership4(uv_udp_t* handle,
                                   const struct sockaddr_in* multicast_addr,
                                   const char* interface_addr,
                                   uv_membership membership) {
  int err;
  int optname;
  struct ip_mreq mreq;

  if (handle->flags & UV_HANDLE_IPV6)
    return UV_EINVAL;

  /* If the socket is unbound, bind to inaddr_any. */
  err = uv_udp_maybe_bind(handle,
                          (const struct sockaddr*) &uv_addr_ip4_any_,
                          sizeof(uv_addr_ip4_any_),
                          UV_UDP_REUSEADDR);
  if (err)
    return uv_translate_sys_error(err);

  memset(&mreq, 0, sizeof mreq);

  if (interface_addr) {
    err = uv_inet_pton(AF_INET, interface_addr, &mreq.imr_interface.s_addr);
    if (err)
      return err;
  } else {
    mreq.imr_interface.s_addr = htonl(INADDR_ANY);
  }

  mreq.imr_multiaddr.s_addr = multicast_addr->sin_addr.s_addr;

  switch (membership) {
    case UV_JOIN_GROUP:
      optname = IP_ADD_MEMBERSHIP;
      break;
    case UV_LEAVE_GROUP:
      optname = IP_DROP_MEMBERSHIP;
      break;
    default:
      return UV_EINVAL;
  }

  if (setsockopt(handle->socket,
                 IPPROTO_IP,
                 optname,
                 (char*) &mreq,
                 sizeof mreq) == SOCKET_ERROR) {
    return uv_translate_sys_error(WSAGetLastError());
  }

  return 0;
}
Пример #11
0
int bud_config_str_to_addr(const char* host,
                           uint16_t port,
                           struct sockaddr_storage* addr) {
  int r;
  struct sockaddr_in* addr4;
  struct sockaddr_in6* addr6;

  addr4 = (struct sockaddr_in*) addr;
  addr6 = (struct sockaddr_in6*) addr;

  r = uv_inet_pton(AF_INET, host, &addr4->sin_addr);
  if (r == 0) {
    addr4->sin_family = AF_INET;
    addr4->sin_port = htons(port);
  } else {
    addr6->sin6_family = AF_INET6;
    r = uv_inet_pton(AF_INET6, host, &addr6->sin6_addr);
    if (r == 0)
      addr6->sin6_port = htons(port);
  }

  return r;
}
Пример #12
0
static int uv__udp_set_membership4(uv_udp_t* handle,
                                   const struct sockaddr_in* multicast_addr,
                                   const char* interface_addr,
                                   uv_membership membership) {
  struct ip_mreq mreq;
  int optname;
  int err;

  memset(&mreq, 0, sizeof mreq);

  if (interface_addr) {
    err = uv_inet_pton(AF_INET, interface_addr, &mreq.imr_interface.s_addr);
    if (err)
      return err;
  } else {
    mreq.imr_interface.s_addr = htonl(INADDR_ANY);
  }

  mreq.imr_multiaddr.s_addr = multicast_addr->sin_addr.s_addr;

  switch (membership) {
  case UV_JOIN_GROUP:
    optname = IP_ADD_MEMBERSHIP;
    break;
  case UV_LEAVE_GROUP:
    optname = IP_DROP_MEMBERSHIP;
    break;
  default:
    return -EINVAL;
  }

  if (setsockopt(handle->io_watcher.fd,
                 IPPROTO_IP,
                 optname,
                 &mreq,
                 sizeof(mreq))) {
    return -errno;
  }

  return 0;
}
Пример #13
0
struct sockaddr_in6 uv_ip6_addr(const char* ip, int port) {
  struct sockaddr_in6 addr;
#if defined(UV_PLATFORM_HAS_IP6_LINK_LOCAL_ADDRESS)
  char address_part[40];
  size_t address_part_size;
  const char* zone_index;
#endif

  memset(&addr, 0, sizeof(struct sockaddr_in6));

  addr.sin6_family = AF_INET6;
  addr.sin6_port = htons(port);

#if defined(UV_PLATFORM_HAS_IP6_LINK_LOCAL_ADDRESS)
  zone_index = strchr(ip, '%');
  if (zone_index != NULL) {
    address_part_size = sizeof(address_part);
    assert((unsigned)(zone_index - ip) < address_part_size);
    strncpy(address_part, ip, zone_index - ip);
    address_part[address_part_size - 1] = '\0';

    ip = address_part;

    zone_index++; /* skip '%' */
    /* NOTE: unknown interface (id=0) is silently ignored */
#ifdef _WIN32
    addr.sin6_scope_id = atoi(zone_index);
#else
    addr.sin6_scope_id = if_nametoindex(zone_index);
#endif
  }
#endif

  /* result code is ignored - we assume ip is a valid IPv6 address */
  uv_inet_pton(AF_INET6, ip, &addr.sin6_addr);

  return addr;
}
Пример #14
0
int uv_ip6_addr(const char* ip, int port, struct sockaddr_in6* addr) {
#if defined(UV_PLATFORM_HAS_IP6_LINK_LOCAL_ADDRESS)
  char address_part[40];
  size_t address_part_size;
  const char* zone_index;
#endif

  memset(addr, 0, sizeof(*addr));
  addr->sin6_family = AF_INET6;
  addr->sin6_port = htons(port);

#if defined(UV_PLATFORM_HAS_IP6_LINK_LOCAL_ADDRESS)
  zone_index = strchr(ip, '%');
  if (zone_index != NULL) {
    address_part_size = zone_index - ip;
    if (address_part_size >= sizeof(address_part))
      address_part_size = sizeof(address_part) - 1;

    memcpy(address_part, ip, address_part_size);
    address_part[address_part_size] = '\0';
    ip = address_part;

    zone_index++; /* skip '%' */
    /* NOTE: unknown interface (id=0) is silently ignored */
#ifdef _WIN32
    addr->sin6_scope_id = atoi(zone_index);
#else
    addr->sin6_scope_id = if_nametoindex(zone_index);
#endif
  }
#endif

  /* TODO(bnoordhuis) Return an error when the address is bad. */
  uv_inet_pton(AF_INET6, ip, &addr->sin6_addr);

  return 0;
}
Пример #15
0
int uv_ip4_addr(const char* ip, int port, struct sockaddr_in* addr) {
  memset(addr, 0, sizeof(*addr));
  addr->sin_family = AF_INET;
  addr->sin_port = htons(port);
  return uv_inet_pton(AF_INET, ip, &(addr->sin_addr.s_addr));
}
Пример #16
0
static int
set_dns_servers(DNSResolver *self, PyObject *value)
{
    char *server;
    int i, r, length, ret;
    struct ares_addr_node *servers;
    PyObject *server_list = value;
    PyObject *item;

    ret = 0;

    if (!PyList_Check(server_list)) {
        PyErr_SetString(PyExc_TypeError, "servers argument must be a list");
	return -1;
    }

    length = PyList_Size(server_list);
    servers = PyMem_Malloc(sizeof(struct ares_addr_node) * length);

    for (i = 0; i < length; i++) {
        item = PyList_GetItem(server_list, i);
        if (!item) {
            ret = -1;
            goto servers_set_end;
        }

        server = PyString_AsString(item);
        if (!server) {
            ret = -1;
            goto servers_set_end;
        }

        if (uv_inet_pton(AF_INET, server, &servers[i].addr.addr4) == 1) {
            servers[i].family = AF_INET;
        } else if (uv_inet_pton(AF_INET6, server, &servers[i].addr.addr6) == 1) {
            servers[i].family = AF_INET6;
        } else {
            PyErr_SetString(PyExc_ValueError, "invalid IP address");
            ret = -1;
            goto servers_set_end;
        }

        if (i > 0) {
            servers[i-1].next = &servers[i];
        }
    }

    if (length > 0) {
        servers[length-1].next = NULL;
    } else {
        servers = NULL;
    }

    r = ares_set_servers(self->channel, servers);
    if (r != 0) {
        PyErr_SetString(PyExc_DNSError, "error c-ares library options");
        ret = -1;
    }

servers_set_end:

    PyMem_Free(servers);
    return ret;
}
Пример #17
0
bool Address::from_string(const std::string& ip, int port, Address* output) {
  char buf[sizeof(struct in6_addr)];
#if UV_VERSION_MAJOR == 0
  if (uv_inet_pton(AF_INET, ip.c_str(), &buf).code == UV_OK) {
#else
  if (uv_inet_pton(AF_INET, ip.c_str(), &buf) == 0) {
#endif
    if (output != NULL) {
      struct sockaddr_in addr;
#if UV_VERSION_MAJOR == 0
      addr = uv_ip4_addr(ip.c_str(), port);
#else
      uv_ip4_addr(ip.c_str(), port, &addr);
#endif
      output->init(copy_cast<struct sockaddr_in*, struct sockaddr*>(&addr));
    }
    return true;
#if UV_VERSION_MAJOR == 0
  } else if (uv_inet_pton(AF_INET6, ip.c_str(), &buf).code == UV_OK) {
#else
  } else if (uv_inet_pton(AF_INET6, ip.c_str(), &buf) == 0) {
#endif
    if (output != NULL) {
      struct sockaddr_in6 addr;
#if UV_VERSION_MAJOR == 0
      addr = uv_ip6_addr(ip.c_str(), port);
#else
      uv_ip6_addr(ip.c_str(), port, &addr);
#endif
      output->init(copy_cast<struct sockaddr_in6*, struct sockaddr*>(&addr));
    }
    return true;
  } else {
    return false;
  }
}

void Address::from_inet(const char* data, size_t size, int port, Address* output) {

  assert(size == 4 || size == 16);
  if (size == 4) {
    char buf[INET_ADDRSTRLEN];
    uv_inet_ntop(AF_INET, data, buf, sizeof(buf));
    if (output != NULL) {
      struct sockaddr_in addr;
#if UV_VERSION_MAJOR == 0
      addr = uv_ip4_addr(buf, port);
#else
      uv_ip4_addr(buf, port, &addr);
#endif
      output->init(copy_cast<struct sockaddr_in*, struct sockaddr*>(&addr));
    }
  } else {
    char buf[INET6_ADDRSTRLEN];
    uv_inet_ntop(AF_INET6, data, buf, sizeof(buf));
    if (output != NULL) {
      struct sockaddr_in6 addr;
#if UV_VERSION_MAJOR == 0
      addr = uv_ip6_addr(buf, port);
#else
      uv_ip6_addr(buf, port, &addr);
#endif
      output->init(copy_cast<struct sockaddr_in6*, struct sockaddr*>(&addr));
    }
  }
}