X-Git-Url: http://git.madism.org/?a=blobdiff_plain;f=job.c;h=12c450ab177567155e2af75458c540e5e4eed6c4;hb=85f5a14903a2ffcbea92b3dffded303b69d1d712;hp=fc0c1b84574b31a1aa9daf913edf0e6596de38b6;hpb=b1315f7af90c4d8047cf0c8f3c0a00b703676f84;p=apps%2Fpfixtools.git diff --git a/job.c b/job.c index fc0c1b8..12c450a 100644 --- a/job.c +++ b/job.c @@ -33,5 +33,97 @@ * Copyright © 2007 Pierre Habouzit */ +#include +#include +#include +#include +#include +#include + +#ifndef EPOLLRDHUP +# include +# ifdef POLLRDHUP +# define EPOLLRDHUP POLLRDHUP +# else +# define EPOLLRDHUP 0 +# endif +#endif + + #include "job.h" +static int epollfd; + +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) +{ + if (*job) { + if ((*job)->task && (*job)->task->stop) { + (*job)->task->stop(*job); + } + job_delete(job); + } +} + +static job_t *job_register_fd(job_t *job) +{ + struct epoll_event event = { .data.ptr = job, .events = EPOLLRDHUP }; + + if (job->state & JOB_READ || job->state & JOB_LISTEN) { + event.events |= EPOLLIN; + } + + if (job->state & JOB_WRITE || job->state & JOB_CONN) { + event.events |= EPOLLIN; + } + + if (epoll_ctl(epollfd, EPOLL_CTL_ADD, job->fd, &event) < 0) { + job->error = true; + job_release(&job); + } + + return job; +} + +void job_update_events(job_t *job) +{ + struct epoll_event event = { .data.ptr = job, .events = EPOLLRDHUP }; + + if (job->state & JOB_READ || job->state & JOB_LISTEN) { + event.events |= EPOLLIN; + } + + if (job->state & JOB_WRITE || job->state & JOB_CONN) { + event.events |= EPOLLIN; + } + + epoll_ctl(epollfd, EPOLL_CTL_MOD, job->fd, &event); +} + +job_t *job_accept(job_t *listener, int state) +{ + int sock; + job_t *res; + + if ((sock = accept(listener->fd, NULL, 0)) < 0) { + return NULL; + } + + if (fcntl(sock, F_SETFL, fcntl(sock, F_GETFL) | O_NONBLOCK)) { + return NULL; + } + + res = job_new(); + res->fd = sock; + res->state = state; + res->task = listener->task; + return job_register_fd(res); +}