int sock_connect (const char *url, GError **err) { struct sockaddr_storage sas; gsize sas_len = sizeof(sas); if (!grid_string_to_sockaddr (url, (struct sockaddr*) &sas, &sas_len)) { g_error_transmit(err, NEWERROR(EINVAL, "invalid URL")); return -1; } int fd = socket_nonblock(sas.ss_family, SOCK_STREAM, 0); if (0 > fd) { g_error_transmit(err, NEWERROR(EINVAL, "socket error: (%d) %s", errno, strerror(errno))); return -1; } sock_set_reuseaddr(fd, TRUE); if (0 != metautils_syscall_connect (fd, (struct sockaddr*)&sas, sas_len)) { if (errno != EINPROGRESS && errno != 0) { g_error_transmit(err, NEWERROR(EINVAL, "connect error: (%d) %s", errno, strerror(errno))); metautils_pclose (&fd); return -1; } } sock_set_linger_default(fd); sock_set_nodelay(fd, TRUE); sock_set_tcpquickack(fd, TRUE); *err = NULL; return fd; }
GSList * gcluster_get_service_types(addr_info_t *addr, long timeout, GError ** error) { EXTRA_ASSERT (addr != NULL); gchar target[STRLEN_ADDRINFO]; grid_addrinfo_to_string (addr, target, sizeof(target)); GSList *out = NULL; MESSAGE req = metautils_message_create_named (NAME_MSGNAME_CS_GET_SRVNAMES); GError *err = gridd_client_exec_and_decode (target, ((gdouble)timeout)/1000.0, message_marshall_gba_and_clean(req), &out, strings_unmarshall); if (err) { g_prefix_error (&err, "Remote: "); g_error_transmit(error, err); } return out; }
GSList * gcluster_get_services(const char *target, gdouble timeout, const gchar *type, gboolean full, GError ** error) { MESSAGE req = metautils_message_create_named(NAME_MSGNAME_CS_GET_SRV); metautils_message_add_field_str (req, NAME_MSGKEY_TYPENAME, type); if (full) metautils_message_add_field_str(req, NAME_MSGKEY_FULL, "1"); GSList *out = NULL; GError *err = gridd_client_exec_and_decode (target, ((gdouble)timeout)/1000.0, message_marshall_gba_and_clean(req), &out, service_info_unmarshall); if (err) { g_error_transmit(error, err); g_slist_free_full (out, (GDestroyNotify)service_info_clean); } return out; }
namespace_info_t * gcluster_get_namespace_info_full(addr_info_t * addr, long timeout, GError ** error) { EXTRA_ASSERT (addr != NULL); gchar str[STRLEN_ADDRINFO]; addr_info_to_string(addr, str, sizeof(str)); GByteArray *out = NULL; GError *err = gridd_client_exec_and_concat (str, ((gdouble)timeout)/1000.0, message_marshall_gba_and_clean(metautils_message_create_named( NAME_MSGNAME_CS_GET_NSINFO)), &out); if (err) { g_prefix_error(&err, "request: "); g_error_transmit(error, err); return NULL; } namespace_info_t *ns_info = namespace_info_unmarshall(out->data, out->len, error); if (!ns_info) GSETERROR(error, "Decoding error"); return ns_info; }