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; }
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; }