static void http_post_select(fd_set *rfds, __a_unused fd_set *wfds)
{
- int ret, match;
+ int ret, fd, match;
struct sender_client *sc, *tmp;
struct private_http_sender_data *phsd;
PARA_ERROR_LOG("%s\n", para_strerror(-ret));
return;
}
- sc = para_calloc(sizeof(*sc));
- sc->fd = ret;
- sc->name = make_message("%s", remote_name(sc->fd));
- PARA_NOTICE_LOG("connection from %s (fd %d)\n", sc->name, sc->fd);
+ fd = ret;
ret = -E_MAX_CLIENTS;
if (conf.http_max_clients_arg > 0 && numclients >=
conf.http_max_clients_arg) {
goto err_out;
}
- match = acl_lookup(sc->fd, &http_acl);
+ ret = mark_fd_nonblocking(fd);
+ if (ret < 0)
+ goto err_out;
+ match = acl_lookup(fd, &http_acl);
PARA_DEBUG_LOG("acl lookup returned %d\n", match);
ret = -E_ACL_PERM;
if ((match && !conf.http_default_deny_given) ||
(!match && conf.http_default_deny_given))
goto err_out;
- ret = mark_fd_nonblocking(sc->fd);
- if (ret < 0)
- goto err_out;
+ numclients++;
+ sc = para_calloc(sizeof(*sc));
+ sc->fd = fd;
+ sc->name = make_message("%s", remote_name(fd));
+ PARA_NOTICE_LOG("connection from %s (fd %d)\n", sc->name, fd);
phsd = para_malloc(sizeof(*phsd));
sc->private_data = phsd;
phsd->status = HTTP_CONNECTED;
sc->cq = cq_new(MAX_BACKLOG);
- numclients++;
PARA_INFO_LOG("accepted client #%d: %s (fd %d)\n", numclients,
- sc->name, sc->fd);
+ sc->name, fd);
para_list_add(&sc->node, &clients);
- add_close_on_fork_list(sc->fd);
+ add_close_on_fork_list(fd);
return;
err_out:
PARA_WARNING_LOG("%s\n", para_strerror(-ret));
- close(sc->fd);
- free(sc);
+ close(fd);
}
static void http_pre_select(int *max_fileno, fd_set *rfds, __a_unused fd_set *wfds)