Ejemplo n.º 1
0
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;
}
Ejemplo n.º 2
0
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;
}
Ejemplo n.º 3
0
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;
}
Ejemplo n.º 4
0
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;
}