static void _client_free(struct gridd_client_s *client) { EXTRA_ASSERT(client != NULL); EXTRA_ASSERT(client->abstract.vtable == &VTABLE_CLIENT); _client_reset_reply(client); _client_reset_request(client); _client_reset_cnx(client); _client_reset_target(client); _client_reset_error(client); if (client->reply) g_byte_array_free(client->reply, TRUE); client->fd = -1; SLICE_FREE (struct gridd_client_s, client); }
static GError* _client_set_fd(struct gridd_client_s *client, int fd) { EXTRA_ASSERT(client != NULL); EXTRA_ASSERT(client->abstract.vtable == &VTABLE_CLIENT); if (fd >= 0) { switch (client->step) { case NONE: /* ok */ break; case CONNECTING: if (client->request != NULL) return NEWERROR(500, "Request pending"); /* PASSTHROUGH */ case CONNECTED: /* ok */ break; case REQ_SENDING: case REP_READING_SIZE: case REP_READING_DATA: return NEWERROR(500, "Request pending"); case STATUS_OK: case STATUS_FAILED: /* ok */ break; } } /* reset any connection and request */ _client_reset_reply(client); _client_reset_request(client); _client_reset_target(client); /* XXX do not call _client_reset_cnx(), or close the connexion. * It is the responsibility of the caller to manage this, because it * explicitely breaks the pending socket management. */ client->fd = fd; /* CONNECTING instead of CONNECTED helps coping with not yet * completely connected sockets */ client->step = (client->fd >= 0) ? CONNECTING : NONE; return NULL; }
static void _client_free(struct gridd_client_s *client) { EXTRA_ASSERT(client != NULL); EXTRA_ASSERT(client->abstract.vtable == &VTABLE_CLIENT); _client_reset_reply(client); _client_reset_request(client); _client_reset_cnx(client); _client_reset_target(client); _client_reset_error(client); if (client->reply) g_byte_array_free(client->reply, TRUE); if (client->past_url) g_string_free(client->past_url, TRUE); memset(client, 0, sizeof(*client)); client->fd = -1; g_free(client); }
static GError* _client_connect_addr(struct gridd_client_s *client, const struct addr_info_s *ai) { EXTRA_ASSERT(client != NULL); EXTRA_ASSERT(client->abstract.vtable == &VTABLE_CLIENT); if (NULL == ai || !ai->port) return NEWERROR(CODE_INTERNAL_ERROR, "Invalid parameter"); g_assert(client != NULL); _client_reset_cnx(client); _client_reset_target(client); _client_reset_reply(client); grid_addrinfo_to_string(ai, client->orig_url, URL_MAXLEN); memcpy(client->url, client->orig_url, URL_MAXLEN); client->step = NONE; return NULL; }
static GError* _client_connect_url(struct gridd_client_s *client, const gchar *url) { EXTRA_ASSERT(client != NULL); EXTRA_ASSERT(client->abstract.vtable == &VTABLE_CLIENT); if (NULL == url || !url[0]) return NEWERROR(CODE_INTERNAL_ERROR, "Bad address"); if (!metautils_url_valid_for_connect(url)) return NEWERROR(400, "Bad address [%s]", url); g_assert(client != NULL); _client_reset_cnx(client); _client_reset_target(client); _client_reset_reply(client); g_strlcpy(client->orig_url, url, URL_MAXLEN); memcpy(client->url, client->orig_url, URL_MAXLEN); client->step = NONE; return NULL; }