0.8.11claws98
[claws.git] / src / plugins / spamassassin / libspamc.h
1 /*
2  * This code is copyright 2001 by Craig Hughes
3  * Conversion to a thread-safe shared library copyright 2002 Liam Widdowson
4  * Portions copyright 2002 by Brad Jorsch
5  * It is licensed under the same license as Perl itself.  The text of this
6  * license is included in the SpamAssassin distribution in the file named
7  * "License".
8  */
9 #ifndef LIBSPAMC_H
10 #define LIBSPAMC_H 1
11
12 #include <sys/types.h>
13 #include <sys/socket.h>
14 #include <netdb.h>
15 #include <stdio.h>
16
17 #define EX_NOTSPAM                0
18 #define EX_ISSPAM                 1
19 #define EX_TOOBIG               866
20
21 /* Aug 14, 2002 bj: Bitflags instead of lots of bool parameters */
22 #define SPAMC_MODE_MASK      1
23 #define SPAMC_RAW_MODE       0
24 #define SPAMC_BSMTP_MODE     1
25
26 #define SPAMC_USE_SSL        (1<<27)
27 #define SPAMC_SAFE_FALLBACK  (1<<28)
28 #define SPAMC_CHECK_ONLY     (1<<29)
29
30 /* Jan 30, 2003 ym: added reporting options */
31 #define SPAMC_REPORT         (1<<26)
32 #define SPAMC_REPORT_IFSPAM  (1<<25)
33
34 /* Feb  1 2003 jm: might as well fix bug 191 as well */
35 #define SPAMC_SYMBOLS        (1<<24)
36
37
38 /* Aug 14, 2002 bj: A struct for storing a message-in-progress */
39 typedef enum {
40     MESSAGE_NONE,
41     MESSAGE_ERROR,
42     MESSAGE_RAW,
43     MESSAGE_BSMTP,
44     MAX_MESSAGE_TYPE
45 } message_type_t;
46
47 struct libspamc_private_message;
48
49 struct message {
50     /* Set before passing the struct on! */
51     int max_len;  /* messages larger than this will return EX_TOOBIG */
52     int timeout;  /* timeout for read() system calls */
53
54     /* Filled in by message_read */
55     message_type_t type;
56     char *raw; int raw_len;   /* Raw message buffer */
57     char *pre; int pre_len;   /* Pre-message data (e.g. SMTP commands) */
58     char *msg; int msg_len;   /* The message */
59     char *post; int post_len; /* Post-message data (e.g. SMTP commands) */
60     int content_length;
61
62     /* Filled in by filter_message */
63     int is_spam;              /* EX_ISSPAM if the message is spam, EX_NOTSPAM
64                                  if not */
65     float score, threshold;   /* score and threshold */
66     char *out; int out_len;   /* Output from spamd. Either the filtered
67                                  message, or the check-only response. Or else,
68                                  a pointer to msg above. */
69
70     /* these members added in SpamAssassin version 2.60: */
71     struct libspamc_private_message *priv;
72 };
73
74 /* Aug 14, 2002 bj: New interface functions */
75
76 /* Read in a message from the fd, with the mode specified in the flags.
77  * Returns EX_OK on success, EX_otherwise on failure. On failure, m may be
78  * either MESSAGE_NONE or MESSAGE_ERROR. */
79 int message_read(int in_fd, int flags, struct message *m);
80
81 /* Write out a message to the fd, as specified by m->type. Note that
82  * MESSAGE_NONE messages have nothing to write. Also note that if you ran the
83  * message through message_filter with SPAMC_CHECK_ONLY, it will only output
84  * the "score/threshold" line. */
85 long message_write(int out_fd, struct message *m);
86
87 /* Pass the message through spamd (at addr) as the specified user, with the
88  * given flags. Returns EX_OK on success, or various errors on error. If it was
89  * successful, message_write will print either the CHECK_ONLY output, or the
90  * filtered message in the appropriate output format. */
91 int message_filter(const struct sockaddr *addr, char *username, int flags, struct message *m);
92
93 /* Convert the host/port into a struct sockaddr. Returns EX_OK on success, or
94  * else an error EX. */
95 int lookup_host(const char *hostname, int port, struct sockaddr *a);
96
97 /* Pass the message through one of a set of spamd's. This variant will handle
98  * multiple spamd machines; if a connect failure occurs, it will fail-over to
99  * the next one in the struct hostent. Otherwise identical to message_filter().
100  */
101 int message_filter_with_failover (const struct hostent *hent, int port, char
102     *username, int flags, struct message *m);
103
104 /* Convert the host into a struct hostent, for use with
105  * message_filter_with_failover() above. Returns EX_OK on success, or else an
106  * error EX.  Note that the data filled into hent is from gethostbyname()'s
107  * static storage, so any call to gethostbyname() between
108  * lookup_host_for_failover() and message_filter_with_failover() will overwrite
109  * this.  Take a copy, and use that instead, if you think a call may occur in
110  * your code, or library code that you use (such as syslog()). */
111 int lookup_host_for_failover(const char *hostname, struct hostent *hent);
112
113 /* Dump the message. If there is any data in the message (typically, m->type
114  * will be MESSAGE_ERROR) it will be message_writed. Then, fd_in will be piped
115  * to fd_out intol EOF. This is particularly useful if you get back an
116  * EX_TOOBIG. */
117 void message_dump(int in_fd, int out_fd, struct message *m);
118
119 /* Do a message_read->message_filter->message_write sequence, handling errors
120  * appropriately with dump_message or appropriate CHECK_ONLY output. Returns
121  * EX_OK or EX_ISSPAM/EX_NOTSPAM on success, some error EX on error. */
122 int message_process(const char *hostname, int port, char *username, int max_size, int in_fd, int out_fd, const int flags);
123
124 /* Cleanup the resources we allocated for storing the message. Call after
125  * you're done processing. */
126 void message_cleanup(struct message *m);
127
128 /* Aug 14, 2002 bj: This is now legacy, don't use it. */
129 int process_message(const char *hostname, int port, char *username, 
130                     int max_size, int in_fd, int out_fd,
131                     const int check_only, const int safe_fallback);
132
133 #endif
134