Ejemplo n.º 1
0
int rpcc_default_check_ready (struct connection *c) {
  if ((c->flags & C_FAILED) || c->status == conn_error) {
    return c->ready = cr_failed;
  }

  const double CONNECT_TIMEOUT = 3.0;
  if (c->status == conn_connecting || RPCC_DATA(c)->in_packet_num < 0) {
    if (RPCC_DATA(c)->in_packet_num == -1 && c->status == conn_running) {
      return c->ready = cr_ok;
    }

    assert (c->last_query_sent_time != 0);
    if (c->last_query_sent_time < precise_now - CONNECT_TIMEOUT) {
      fail_connection (c, -6);
      return c->ready = cr_failed;
    }
    return c->ready = cr_notyet;
  }
    
  if (c->status == conn_wait_answer || c->status == conn_reading_answer || c->status == conn_expect_query) {
    return c->ready = cr_ok;
  }

  return c->ready = cr_failed;
}
Ejemplo n.º 2
0
static void read_conn(struct connection *conn)
{
	int n;

	time(&conn->access);
#ifdef WANT_SSL
	if (conn->ssl) {
		n = openssl_read(conn);
		/* openssl_read can return -EAGAIN if the SSL
		 * connection needs a read or write. */
		if (n == -EAGAIN)
			return;
	} else
#endif
		n = recv(conn->poll->fd, conn->curp, conn->rlen, 0);
	if (n >= 0) {
		if (verbose > 1)
			printf("+ Read %d\n", n);
		conn->endp = conn->curp + n;
		conn->rlen -= n;
		*conn->endp = '\0';

		if (conn->func && conn->func(conn))
			fail_connection(conn);
	} else if (n < 0)
		reset_connection(conn); /* Try again */
}
Ejemplo n.º 3
0
void write_request(struct connection *conn)
{
	int n; /* must be signed. windows does not support ssize_t */

#ifdef WANT_SSL
	if (conn->ssl) {
		n = openssl_write(conn);
		/* openssl_write can return -EAGAIN if the SSL
		 * connection needs a read or write. */
		if (n == -EAGAIN)
			return;
	} else
#endif
		n = send(conn->poll->fd, conn->curp, conn->length,
			 MSG_NOSIGNAL);

	if (n == conn->length) {
		if (verbose > 2)
			printf("+ Sent request\n");
		conn->length = 0;

		/* reset for read */
		set_readable(conn);
		reset_buf(conn);
		NEXT_STATE(conn, read_reply);
	} else if (n > 0) {
		conn->length -= n;
		conn->curp += n;
	} else {
		printf("Write request error\n");
		fail_connection(conn);
	}
}
Ejemplo n.º 4
0
static size_t write_callback(char *ptr, size_t size, size_t nmemb, void *userdata)
{
	struct connection *conn = userdata;
	int bytes = size * nmemb;

	if (conn->out == -1) {
		char *fname;

		if (conn->regexp && !conn->matched)
			fname = conn->regfname;
		else {
			if (want_extensions)
				/* We allocated space for the extension in add_outname */
				strcat(conn->outname, lazy_imgtype(ptr));
			fname = conn->outname;
		}

		if ((conn->out = creat(fname, 0644)) < 0) {
			my_perror(fname);
			fail_connection(conn);
			return bytes;
		}

		conn->connected = 1;
	}

	int n = write(conn->out, ptr, bytes);
	if (n != bytes)
		printf("Write error\n");

	return n;
}
Ejemplo n.º 5
0
static void *comic_thread(void *arg)
{
	struct connection *conn = arg;
	int http_status_code;

	start_one_comic(conn);

again:
	curl_easy_perform(conn->curl);

	curl_easy_getinfo(conn->curl, CURLINFO_RESPONSE_CODE, &http_status_code);

	if (http_status_code == 200) {
		if (conn->regexp && !conn->matched) {
			if (process_html(conn))
				fail_connection(conn);
			else
				goto again;
		} else
			close_connection(conn);
	} else {
	}

	return NULL;
}
Ejemplo n.º 6
0
static void msg_done(CURL *curl)
{
	struct connection *conn;
	int http_status_code;

	curl_easy_getinfo(curl, CURLINFO_RESPONSE_CODE, &http_status_code);
	curl_easy_getinfo(curl, CURLINFO_PRIVATE, &conn);

	if (http_status_code == 200) {
		if (conn->regexp && !conn->matched) {
			if (process_html(conn))
				fail_connection(conn);
		} else
			close_connection(conn);
	} else {
		fprintf(stderr, "GET %s returned %d\n", conn->url, http_status_code);
		fail_connection(conn);
	}
}
Ejemplo n.º 7
0
static int timeout_connections(void)
{
	struct connection *comic;
	time_t timeout = time(NULL) - read_timeout;

	for (comic = comics; comic; comic = comic->next)
		if (comic->poll && comic->access < timeout) {
			printf("TIMEOUT %s\n", comic->url);
			fail_connection(comic);
		}

	return 0;
}
Ejemplo n.º 8
0
static int timeout_connections(void)
{
	struct connection *comic;
	time_t now = time(NULL);
	time_t timeout = now - read_timeout;

	for (comic = comics; comic; comic = comic->next)
		if (comic->poll && comic->access < timeout) {
			printf("TIMEOUT %s (n:%ld t:%ld a:%ld)\n",
				   comic->url, now, timeout, comic->access);
			fail_connection(comic);
		}

	return 0;
}
Ejemplo n.º 9
0
int process_html(struct connection *conn)
{	/* Should never be called with HEAD method */
	printf("Internal Error: %s called\n", __func__);
	fail_connection(conn);
	return 1;
}