split files.
authorPierre Habouzit <madcoder@debian.org>
Sun, 4 Feb 2007 23:55:47 +0000 (00:55 +0100)
committerPierre Habouzit <madcoder@debian.org>
Sun, 4 Feb 2007 23:55:47 +0000 (00:55 +0100)
simplify some things.

Signed-off-by: Pierre Habouzit <madcoder@debian.org>
Makefile
job.c
job.h
postfix.c
query.h [new file with mode: 0644]

index d61d0a7..bf0c2e5 100644 (file)
--- a/Makefile
+++ b/Makefile
@@ -34,8 +34,8 @@ include mk/cflags.mk
 PROGRAMS = postlicyd
 
 postlicyd_SOURCES = \
-               str.h buffer.h job.h postfix.h        \
-               str.c buffer.c job.c postfix.c        \
+               str.h buffer.h job.h postfix.h query.h \
+               str.c buffer.c job.c postfix.c         \
                postlicyd.c
 
 postlicyd_LIBADD = -ludns
diff --git a/job.c b/job.c
index acf8294..23cd3d5 100644 (file)
--- a/job.c
+++ b/job.c
@@ -93,10 +93,15 @@ static job_t *job_register_fd(job_t *job)
     return job;
 }
 
-void job_update_events(job_t *job)
+void job_update_state(job_t *job, int state)
 {
     struct epoll_event event = { .data.ptr = job, .events = EPOLLRDHUP };
 
+    if (job->state == state)
+        return;
+
+    job->state = state;
+
     if (job->state & JOB_READ || job->state & JOB_LISTEN) {
         event.events |= EPOLLIN;
     }
diff --git a/job.h b/job.h
index 45d3e89..95638c9 100644 (file)
--- a/job.h
+++ b/job.h
@@ -36,7 +36,7 @@
 #ifndef POSTLICYD_JOB_H
 #define POSTLICYD_JOB_H
 
-#include "buffer.h"
+#include "mem.h"
 
 enum job_state {
     JOB_IDLE   = 0x00,
@@ -60,7 +60,6 @@ enum smtp_state {
 
 typedef struct job_t   job_t;
 typedef struct jpriv_t jpriv_t;
-typedef struct query_t query_t;
 
 struct job_t {
     unsigned state : 6;
@@ -69,8 +68,8 @@ struct job_t {
 
     int fd;
 
-    void (*stop)(job_t *);
     void (*process)(job_t *);
+    void (*stop)(job_t *);
 
     jpriv_t *jdata;
 };
@@ -82,55 +81,7 @@ static inline job_t *job_init(job_t *job) {
 }
 DO_NEW(job_t, job);
 void job_release(job_t **job);
-void job_update_events(job_t *job);
-
-struct query_t {
-    unsigned state : 4;
-    unsigned esmtp : 1;
-
-    const char *helo_name;
-    const char *queue_id;
-    const char *sender;
-    const char *recipient;
-    const char *recipient_count;
-    const char *client_address;
-    const char *client_name;
-    const char *rclient_name;
-    const char *instance;
-
-    /* postfix 2.2+ */
-    const char *sasl_method;
-    const char *sasl_username;
-    const char *sasl_sender;
-    const char *size;
-    const char *ccert_subject;
-    const char *ccert_issuer;
-    const char *ccsert_fingerprint;
-
-    /* postfix 2.3+ */
-    const char *encryption_protocol;
-    const char *encryption_cipher;
-    const char *encryption_keysize;
-    const char *etrn_domain;
-
-    buffer_t data;
-
-    job_t *postfix;
-    job_t *current;
-};
-
-static inline query_t *query_init(query_t *rq) {
-    p_clear(rq, 1);
-    buffer_init(&rq->data);
-    return rq;
-}
-static inline void query_wipe(query_t *rq) {
-    buffer_wipe(&rq->data);
-}
-DO_NEW(query_t, query);
-DO_DELETE(query_t, query);
-
-
+void job_update_state(job_t *job, int state);
 job_t *job_accept(job_t *listener, int state);
 
 #endif
index 83d7c4d..533955e 100644 (file)
--- a/postfix.c
+++ b/postfix.c
 
 #include "job.h"
 #include "postfix.h"
+#include "buffer.h"
 
 struct jpriv_t {
     buffer_t ibuf;
     buffer_t obuf;
 };
 
-void postfix_start(job_t *job, query_t *query)
+jpriv_t *postfix_jpriv_init(jpriv_t *jp)
 {
+    buffer_init(&jp->ibuf);
+    buffer_init(&jp->obuf);
+    return jp;
+}
+void postfix_jpriv_wipe(jpriv_t *jp)
+{
+    buffer_wipe(&jp->ibuf);
+    buffer_wipe(&jp->obuf);
+}
+DO_NEW(jpriv_t, postfix_jpriv);
+DO_DELETE(jpriv_t, postfix_jpriv);
+
+
+void postfix_start(job_t *listener)
+{
+    job_t *job;
+
+    job = job_accept(listener, JOB_READ);
+    if (!job)
+        return;
+
+    job->jdata = postfix_jpriv_new();
 }
 
 void postfix_stop(job_t *job)
 {
+    postfix_jpriv_delete(&job->jdata);
 }
 
 void postfix_process(job_t *job)
 {
-    if (job->state & JOB_LISTEN) {
-        /* TODO check return code */
-        job_accept(job, JOB_READ);
-    }
+    int nb;
 
-    if (job->state & JOB_WRITE) {
-        int nbwritten;
+    switch (job->state) {
+      case JOB_LISTEN:
+        return postfix_start(job);
 
-        nbwritten = write(job->fd, job->jdata->obuf.data, job->jdata->obuf.len);
-        if (nbwritten < 0) {
+      case JOB_WRITE:
+        nb = write(job->fd, job->jdata->obuf.data, job->jdata->obuf.len);
+        if (nb < 0) {
             job->error = errno != EINTR && errno != EAGAIN;
             return;
         }
 
-        buffer_consume(&job->jdata->obuf, nbwritten);
-    }
+        buffer_consume(&job->jdata->obuf, nb);
+        if (job->jdata->obuf.len)
+            return;
 
-    if (job->state & JOB_READ) {
-        int nbread;
+        job_update_state(job, JOB_READ);
 
-        nbread = buffer_read(&job->jdata->ibuf, job->fd, -1);
-        if (nbread < 0) {
+        /* fall through */
+
+      case JOB_READ:
+        nb = buffer_read(&job->jdata->ibuf, job->fd, -1);
+        if (nb < 0) {
             job->error = errno != EINTR && errno != EAGAIN;
             return;
         }
-        if (nbread == 0) {
+        if (nb == 0) {
             job->error = true;
             return;
         }
@@ -88,8 +114,12 @@ void postfix_process(job_t *job)
         if (!strstr(job->jdata->ibuf.data, "\r\n\r\n"))
             return;
 
-        job->state &= ~JOB_READ;
-
         /* TODO: do the parse */
+        job_update_state(job, JOB_IDLE);
+        return;
+
+      default:
+        job->error = true;
+        return;
     }
 }
diff --git a/query.h b/query.h
new file mode 100644 (file)
index 0000000..57a3eb3
--- /dev/null
+++ b/query.h
@@ -0,0 +1,87 @@
+/******************************************************************************/
+/*          postlicyd: a postfix policy daemon with a lot of features         */
+/*          ~~~~~~~~~                                                         */
+/*  ________________________________________________________________________  */
+/*                                                                            */
+/*  Redistribution and use in source and binary forms, with or without        */
+/*  modification, are permitted provided that the following conditions        */
+/*  are met:                                                                  */
+/*                                                                            */
+/*  1. Redistributions of source code must retain the above copyright         */
+/*     notice, this list of conditions and the following disclaimer.          */
+/*  2. Redistributions in binary form must reproduce the above copyright      */
+/*     notice, this list of conditions and the following disclaimer in the    */
+/*     documentation and/or other materials provided with the distribution.   */
+/*  3. The names of its contributors may not be used to endorse or promote    */
+/*     products derived from this software without specific prior written     */
+/*     permission.                                                            */
+/*                                                                            */
+/*  THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND   */
+/*  ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE     */
+/*  IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR        */
+/*  PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS    */
+/*  BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR    */
+/*  CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF      */
+/*  SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS  */
+/*  INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN   */
+/*  CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)   */
+/*  ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF    */
+/*  THE POSSIBILITY OF SUCH DAMAGE.                                           */
+/******************************************************************************/
+
+/*
+ * Copyright © 2007 Pierre Habouzit
+ */
+
+#ifndef POSTLICYD_QUERY_H
+#define POSTLICYD_QUERY_H
+
+#include "buffer.h"
+
+typedef struct query_t {
+    unsigned state : 4;
+    unsigned esmtp : 1;
+
+    const char *helo_name;
+    const char *queue_id;
+    const char *sender;
+    const char *recipient;
+    const char *recipient_count;
+    const char *client_address;
+    const char *client_name;
+    const char *rclient_name;
+    const char *instance;
+
+    /* postfix 2.2+ */
+    const char *sasl_method;
+    const char *sasl_username;
+    const char *sasl_sender;
+    const char *size;
+    const char *ccert_subject;
+    const char *ccert_issuer;
+    const char *ccsert_fingerprint;
+
+    /* postfix 2.3+ */
+    const char *encryption_protocol;
+    const char *encryption_cipher;
+    const char *encryption_keysize;
+    const char *etrn_domain;
+
+    buffer_t data;
+} query_t;
+
+static inline query_t *query_init(query_t *rq) {
+    p_clear(rq, 1);
+    buffer_init(&rq->data);
+    return rq;
+}
+static inline void query_wipe(query_t *rq) {
+    buffer_wipe(&rq->data);
+}
+DO_NEW(query_t, query);
+DO_DELETE(query_t, query);
+
+
+job_t *job_accept(job_t *listener, int state);
+
+#endif