# endif
#endif
-
#include "job.h"
+#include "gai.h"
static int epollfd = -1;
static bool sigint = false;
-static void job_wipe(job_t *job)
-{
- if (job->fd >= 0) {
- close(job->fd);
- job->fd = -1;
- }
-}
-DO_DELETE(job_t, job);
-
-void job_release(job_t **job)
+void job_delete(job_t **job)
{
if (*job) {
if ((*job)->stop) {
(*job)->stop(*job);
}
- job_delete(job);
+ if ((*job)->fd >= 0) {
+ close((*job)->fd);
+ }
+ p_delete(job);
}
}
{
struct epoll_event event = { .data.ptr = job, .events = EPOLLRDHUP };
- if (job->state & JOB_READ || job->state & JOB_LISTEN) {
+ if (job->mode & (JOB_READ | JOB_LISTEN)) {
event.events |= EPOLLIN;
}
- if (job->state & JOB_WRITE || job->state & JOB_CONN) {
- event.events |= EPOLLIN;
+ if (job->mode & (JOB_WRITE | JOB_CONN)) {
+ event.events |= EPOLLOUT;
}
if (epoll_ctl(epollfd, EPOLL_CTL_ADD, job->fd, &event) < 0) {
syslog(LOG_ERR, "epoll_ctl error: %m");
job->error = true;
- job_release(&job);
+ job_delete(&job);
}
return job;
}
-void job_update_state(job_t *job, int state)
+void job_update_mode(job_t *job, int mode)
{
struct epoll_event event = { .data.ptr = job, .events = EPOLLRDHUP };
- if (job->state == state)
+ if (job->mode == mode)
return;
- job->state = state;
-
- if (job->state & JOB_READ || job->state & JOB_LISTEN) {
+ job->mode = mode;
+ if (job->mode & (JOB_READ | JOB_LISTEN)) {
event.events |= EPOLLIN;
}
- if (job->state & JOB_WRITE || job->state & JOB_CONN) {
- event.events |= EPOLLIN;
+ if (job->mode & (JOB_WRITE | JOB_CONN)) {
+ event.events |= EPOLLOUT;
}
- epoll_ctl(epollfd, EPOLL_CTL_MOD, job->fd, &event);
+ if (epoll_ctl(epollfd, EPOLL_CTL_MOD, job->fd, &event) < 0) {
+ syslog(LOG_ERR, "epoll_ctl error: %m");
+ job->error = true;
+ }
}
-job_t *job_accept(job_t *listener, int state)
+job_t *job_accept(job_t *listener, int mode)
{
int sock;
job_t *res;
res = job_new();
res->fd = sock;
- res->state = state;
+ res->mode = mode;
res->process = listener->process;
res->stop = listener->stop;
return job_register_fd(res);
}
-static void job_handler(int sig)
+static void job_sighandler(int sig)
{
static time_t lastintr = 0;
time_t now = time(NULL);
void job_initialize(void)
{
signal(SIGPIPE, SIG_IGN);
- signal(SIGINT, &job_handler);
- signal(SIGTERM, &job_handler);
+ signal(SIGINT, &job_sighandler);
+ signal(SIGTERM, &job_sighandler);
epollfd = epoll_create(128);
if (epollfd < 0) {
job->process(job);
if (job->error || job->done) {
- job_release(&job);
+ job_delete(&job);
}
}
+
+ gai_process();
}
}