Example #1
0
static void control_incoming(int fd, void *p, uintptr_t u) {
	int nfd;
	struct control_tcp *c = p;
	struct control_stream *s;
	struct poller_item i;
	struct sockaddr_in sin;
	socklen_t sinl;

next:
	sinl = sizeof(sin);
	nfd = accept(fd, (struct sockaddr *) &sin, &sinl);
	if (nfd == -1) {
		if (errno == EAGAIN || errno == EWOULDBLOCK)
			return;
		goto next;
	}
	nonblock(nfd);

	ilog(LOG_INFO, "New control connection from " DF, DP(sin));

	s = obj_alloc0("control_stream", sizeof(*s), control_stream_free);

	s->fd = nfd;
	s->control = c;
	s->poller = c->poller;
	s->inbuf = streambuf_new(c->poller, nfd);
	s->outbuf = streambuf_new(c->poller, nfd);
	memcpy(&s->inaddr, &sin, sizeof(s->inaddr));
	mutex_init(&s->lock);
	s->linked = 1;

	ZERO(i);
	i.fd = nfd;
	i.closed = control_stream_closed;
	i.readable = control_stream_readable;
	i.writeable = control_stream_writeable;
	i.timer = control_stream_timer;
	i.obj = &s->obj;

	if (poller_add_item(c->poller, &i))
		goto fail;

	mutex_lock(&c->lock);
	/* let the list steal our own ref */
	c->streams = g_list_prepend(c->streams, s);
	mutex_unlock(&c->lock);

	goto next;

fail:
	obj_put(s);
	goto next;
}
Example #2
0
struct socket_end_st *socket_end_new(int sd) {
	struct socket_end_st *se;
	struct epoll_event ev;
	struct sockaddr_in addr;

	now=systimestamp_ms();

   	socklen_t addrlen = sizeof(struct sockaddr);

	mylog(L_DEBUG, "Socket end new for %d", sd);

	se = malloc(sizeof(*se));
	if (unlikely(se == NULL)) {
		return NULL;
	}

	se->send_buffer = streambuf_new(SE_BUF_HARD);
	if (unlikely(se->send_buffer == NULL)) {
		free(se);
		return NULL;
	}

	se->socket = sd;

	getpeername(sd, (struct sockaddr *)&addr, &addrlen);
	inet_ntop(AF_INET, &addr.sin_addr, se->client_str, (socklen_t)CLIENT_HOST_STR);
	se->client_port = ntohs(addr.sin_port);
	mylog(L_DEBUG, "New client from %s:%u", se->client_str, se->client_port);
	se->recv_state = SOCKET_RECV_STATE_LEN;
	se->buf_len_pos = 0;
	se->timeout_abs_ms = ONE_DAY + now;	// 1 day
	se->min_timeout_abs_ms = se->timeout_abs_ms;
	se->shared_key_flag = 0;

	se->pipeline_end = calloc(1, PIPELINE_END_MAX * sizeof(struct pipeline_end_st*));
	if (unlikely(se->pipeline_end == NULL)) {
		streambuf_delete(se->send_buffer);
		free(se);
		return NULL;
	}
	se->pipeline_arr_size = PIPELINE_END_MAX;
	se->pipeline_nr = 0;
	se->pipeline_1 = -1;
	se->send_pending_count = 0;

	memcpy(se->shared_key, NO_SHAREDKEY, strlen(NO_SHAREDKEY));

	if (olist_add_entry(timeout_index, se)) {
		mylog(L_DEBUG, "Add entry se new %p failed!", se);
	} else {
		mylog(L_DEBUG, "Add entry se new %p", se);
	}

	ev.events = EPOLLIN|EPOLLRDHUP;
	ev.data.ptr = se;
	epoll_ctl(epollfd, EPOLL_CTL_ADD, se->socket, &ev);

	return se;
}