masqmail-0.2

diff src/masqmail.h @ 0:08114f7dcc23

this is masqmail-0.2.21 from oliver kurth
author meillo@marmaro.de
date Fri, 26 Sep 2008 17:05:23 +0200
parents
children 26e34ae9a3e3
line diff
     1.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
     1.2 +++ b/src/masqmail.h	Fri Sep 26 17:05:23 2008 +0200
     1.3 @@ -0,0 +1,656 @@
     1.4 +/*  MasqMail
     1.5 +    Copyright (C) 1999-2001 Oliver Kurth
     1.6 +
     1.7 +    This program is free software; you can redistribute it and/or modify
     1.8 +    it under the terms of the GNU General Public License as published by
     1.9 +    the Free Software Foundation; either version 2 of the License, or
    1.10 +    (at your option) any later version.
    1.11 +
    1.12 +    This program is distributed in the hope that it will be useful,
    1.13 +    but WITHOUT ANY WARRANTY; without even the implied warranty of
    1.14 +    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
    1.15 +    GNU General Public License for more details.
    1.16 +
    1.17 +    You should have received a copy of the GNU General Public License
    1.18 +    along with this program; if not, write to the Free Software
    1.19 +    Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
    1.20 +*/
    1.21 +#include <config.h>
    1.22 +
    1.23 +#include <stdio.h>
    1.24 +#include <stdarg.h>
    1.25 +#include <errno.h>
    1.26 +#include <stdlib.h>
    1.27 +#include <string.h>
    1.28 +#include <ctype.h>
    1.29 +#include <unistd.h>
    1.30 +#include <pwd.h>
    1.31 +#include <sys/types.h>
    1.32 +#include <sys/socket.h>
    1.33 +#include <netinet/in.h>
    1.34 +#include <time.h>
    1.35 +#include <sys/time.h>
    1.36 +#include <netinet/in.h>
    1.37 +#include <arpa/inet.h>
    1.38 +#include <netdb.h>
    1.39 +#include <syslog.h>
    1.40 +#include <signal.h>
    1.41 +#include <fcntl.h>
    1.42 +
    1.43 +#include <glib.h>
    1.44 +
    1.45 +#ifdef ENABLE_IDENT
    1.46 +#include "libident/ident.h"
    1.47 +#endif
    1.48 +
    1.49 +#include "lookup.h"
    1.50 +
    1.51 +typedef
    1.52 +struct _interface
    1.53 +{
    1.54 +  gchar *address;
    1.55 +  gint port;
    1.56 +} interface;
    1.57 +
    1.58 +#define ADDR_FLAG_DELIVERED 0x01
    1.59 +#define ADDR_FLAG_DEFERED 0x02
    1.60 +#define ADDR_FLAG_FAILED 0x04
    1.61 +#define ADDR_FLAG_LAST_ROUTE 0x40
    1.62 +#define ADDR_FLAG_NOEXPAND 0x80
    1.63 +
    1.64 +typedef struct _address
    1.65 +{
    1.66 +  gchar *address;
    1.67 +  gchar *local_part;
    1.68 +  gchar *domain;
    1.69 +  gint flags;
    1.70 +  GList *children;
    1.71 +  struct _address *parent;
    1.72 +} address;
    1.73 +
    1.74 +#define addr_mark_delivered(addr) { addr->flags |= ADDR_FLAG_DELIVERED; }
    1.75 +#define addr_unmark_delivered(addr) { addr->flags &= ~ADDR_FLAG_DELIVERED; }
    1.76 +#define addr_is_delivered(addr) ((addr->flags & ADDR_FLAG_DELIVERED) != 0 )
    1.77 +
    1.78 +#define addr_mark_defered(addr) { addr->flags |= ADDR_FLAG_DEFERED; }
    1.79 +#define addr_unmark_defered(addr) { addr->flags &= ~ADDR_FLAG_DEFERED; }
    1.80 +#define addr_is_defered(addr) ((addr->flags & ADDR_FLAG_DEFERED) != 0 )
    1.81 +
    1.82 +#define addr_mark_failed(addr) { addr->flags |= ADDR_FLAG_FAILED; }
    1.83 +#define addr_unmark_failed(addr) { addr->flags &= ~ADDR_FLAG_FAILED; }
    1.84 +#define addr_is_failed(addr) ((addr->flags & ADDR_FLAG_FAILED) != 0 )
    1.85 +
    1.86 +typedef
    1.87 +struct _connect_route
    1.88 +{
    1.89 +  gchar *name;
    1.90 +  gchar *filename;
    1.91 +
    1.92 +  gchar *protocol;
    1.93 +
    1.94 +  gboolean is_local_net;
    1.95 +  gboolean last_route;
    1.96 +
    1.97 +  GList *allowed_return_paths;
    1.98 +  GList *not_allowed_return_paths;
    1.99 +  GList *allowed_mail_locals;
   1.100 +  GList *not_allowed_mail_locals;
   1.101 +  GList *allowed_rcpt_domains;
   1.102 +  GList *not_allowed_rcpt_domains;
   1.103 +
   1.104 +  interface *mail_host;
   1.105 +  gchar *wrapper;
   1.106 +  gboolean connect_error_fail;
   1.107 +
   1.108 +  gchar *helo_name;
   1.109 +  gboolean do_correct_helo;
   1.110 +  gboolean do_pipelining;
   1.111 +
   1.112 +  gchar *set_h_from_domain;
   1.113 +  gchar *set_h_reply_to_domain;
   1.114 +  gchar *set_return_path_domain;
   1.115 +
   1.116 +  GList *map_h_from_addresses;
   1.117 +  GList *map_h_reply_to_addresses;
   1.118 +  GList *map_h_mail_followup_to_addresses;
   1.119 +  GList *map_return_path_addresses;
   1.120 +
   1.121 +  gboolean expand_h_sender_domain;
   1.122 +  gboolean expand_h_sender_address;
   1.123 +
   1.124 +  GList *resolve_list;
   1.125 +
   1.126 +  gchar *auth_name;
   1.127 +  gchar *auth_login;
   1.128 +  gchar *auth_secret;
   1.129 +
   1.130 +  gchar *pop3_login;
   1.131 +
   1.132 +  gchar *pipe;
   1.133 +  
   1.134 +  gboolean pipe_fromline;
   1.135 +  gboolean pipe_fromhack;
   1.136 +} connect_route;
   1.137 +
   1.138 +typedef struct _get_conf
   1.139 +{
   1.140 +  gchar *protocol;
   1.141 +  gchar *server_name;
   1.142 +  guint server_port;
   1.143 +  gchar *wrapper;
   1.144 +  gchar *login_user;
   1.145 +  gchar *login_pass;
   1.146 +  address *address;
   1.147 +  address *return_path;
   1.148 +  gboolean do_keep;
   1.149 +  gboolean do_uidl;
   1.150 +  gboolean do_uidl_dele;
   1.151 +  gint max_size;
   1.152 +  gboolean max_size_delete;
   1.153 +  gint max_count;
   1.154 +
   1.155 +  GList *resolve_list;
   1.156 +
   1.157 +} get_conf;
   1.158 +
   1.159 +typedef
   1.160 +struct _masqmail_conf
   1.161 +{
   1.162 +  gint mail_uid;
   1.163 +  gint mail_gid;
   1.164 +
   1.165 +  gint orig_uid;
   1.166 +  gint orig_gid;
   1.167 +
   1.168 +  gboolean run_as_user;
   1.169 +
   1.170 +  gchar *mail_dir;
   1.171 +  gchar *lock_dir;
   1.172 +  gchar *spool_dir;
   1.173 +  gchar *log_dir;
   1.174 +
   1.175 +  gint debug_level;
   1.176 +  gboolean use_syslog;
   1.177 +  guint log_max_pri;
   1.178 +
   1.179 +  gchar *host_name;
   1.180 +  GList *local_hosts;
   1.181 +  GList *local_addresses;
   1.182 +  GList *not_local_addresses;
   1.183 +  GList *local_nets;
   1.184 +  GList *listen_addresses;
   1.185 +
   1.186 +  guint remote_port;
   1.187 +
   1.188 +  gboolean do_save_envelope_to;
   1.189 +
   1.190 +  gboolean defer_all;
   1.191 +  gboolean do_relay;
   1.192 +
   1.193 +  GList *ident_trusted_nets;
   1.194 +
   1.195 +  gboolean do_queue;
   1.196 +
   1.197 +  gboolean do_verbose;
   1.198 +
   1.199 +  gchar *mbox_default;
   1.200 +  GList *mbox_users;
   1.201 +  GList *mda_users;
   1.202 +  GList *maildir_users;
   1.203 +
   1.204 +  gchar *mda;
   1.205 +  gboolean mda_fromline;
   1.206 +  gboolean mda_fromhack;
   1.207 +
   1.208 +  gboolean pipe_fromline;
   1.209 +  gboolean pipe_fromhack;
   1.210 +
   1.211 +  gchar *alias_file;
   1.212 +  int (*alias_local_cmp)(const char *, const char *);
   1.213 +
   1.214 +  GList *local_net_routes;
   1.215 +  GList *connect_routes; /* list of pairs which point to lists */
   1.216 +
   1.217 +  gchar *online_detect;
   1.218 +  gchar *online_file;
   1.219 +  gchar *online_pipe;
   1.220 +  interface *mserver_iface;
   1.221 +
   1.222 +  GList *get_names;
   1.223 +  GList *online_gets; /* list of pairs which point to lists */
   1.224 +
   1.225 +  gchar *errmsg_file;
   1.226 +  gchar *warnmsg_file;
   1.227 +  GList *warn_intervals;
   1.228 +  gint max_defer_time;
   1.229 +
   1.230 +  gchar *log_user;
   1.231 +} masqmail_conf;
   1.232 +
   1.233 +extern masqmail_conf conf;
   1.234 +
   1.235 +typedef
   1.236 +struct _table_pair
   1.237 +{
   1.238 +  gchar *key;
   1.239 +  gpointer *value;
   1.240 +} table_pair;
   1.241 +
   1.242 +
   1.243 +typedef
   1.244 +enum _prot_id
   1.245 +{
   1.246 +  PROT_LOCAL = 0,
   1.247 +  PROT_BSMTP,
   1.248 +  PROT_SMTP,
   1.249 +  PROT_ESMTP,
   1.250 +  PROT_POP3,
   1.251 +  PROT_APOP,
   1.252 +  PROT_NUM
   1.253 +}prot_id;
   1.254 +
   1.255 +extern gchar *prot_names[];
   1.256 +
   1.257 +typedef
   1.258 +enum _header_id
   1.259 +{
   1.260 +  HEAD_FROM = 0,
   1.261 +  HEAD_SENDER,
   1.262 +  HEAD_TO,
   1.263 +  HEAD_CC,
   1.264 +  HEAD_BCC,
   1.265 +  HEAD_DATE,
   1.266 +  HEAD_MESSAGE_ID,
   1.267 +  HEAD_REPLY_TO,
   1.268 +  HEAD_SUBJECT,
   1.269 +  HEAD_RETURN_PATH,
   1.270 +  HEAD_ENVELOPE_TO,
   1.271 +  HEAD_RECEIVED,
   1.272 +  HEAD_NUM_IDS,
   1.273 +  HEAD_STATUS,
   1.274 +  HEAD_UNKNOWN = HEAD_NUM_IDS,
   1.275 +  HEAD_NONE = -1,
   1.276 +}header_id;
   1.277 +
   1.278 +typedef
   1.279 +struct _header_name
   1.280 +{
   1.281 +  gchar *header;
   1.282 +  header_id id;
   1.283 +}header_name;
   1.284 +
   1.285 +typedef
   1.286 +struct _header
   1.287 +{
   1.288 +  header_id id;
   1.289 +  gchar *header;
   1.290 +  gchar *value;
   1.291 +}header;
   1.292 +
   1.293 +
   1.294 +typedef
   1.295 +struct _message
   1.296 +{
   1.297 +  gchar *uid;
   1.298 +
   1.299 +  gchar *received_host;
   1.300 +  prot_id received_prot;
   1.301 +  gchar *ident;
   1.302 +  gint transfer_id; /* for multiple messages per transfer */
   1.303 +
   1.304 +  address *return_path;
   1.305 +  GList *rcpt_list;
   1.306 +  GList *non_rcpt_list;
   1.307 +
   1.308 +  GList *hdr_list;
   1.309 +  GList *data_list;
   1.310 +
   1.311 +  gint data_size;
   1.312 +  time_t received_time;
   1.313 +  time_t warned_time;
   1.314 +
   1.315 +  gchar *full_sender_name;
   1.316 +}message;
   1.317 +
   1.318 +typedef
   1.319 +struct _msg_out
   1.320 +{
   1.321 +  message *msg;
   1.322 +  
   1.323 +  address *return_path;
   1.324 +  GList *rcpt_list;
   1.325 +
   1.326 +  GList *hdr_list;
   1.327 +  GList *xtra_hdr_list;
   1.328 +}msg_out;
   1.329 +
   1.330 +typedef
   1.331 +struct _msgout_perhost
   1.332 +{
   1.333 +  gchar *host;
   1.334 +  GList *msgout_list;
   1.335 +} msgout_perhost;
   1.336 +
   1.337 +/* flags for accept() */
   1.338 +/*#define ACC_LOCAL      0x01 (we better use received_host == NULL) */
   1.339 +#define ACC_HEAD_FROM_RCPT 0x01 /* create To: Header from rcpt_list (cmd line) */
   1.340 +#define ACC_DEL_RCPTS      0x02 /* -t option, delete rcpts */
   1.341 +#define ACC_DEL_BCC        0x04 /* -t option, delete Bcc header */
   1.342 +#define ACC_RCPT_FROM_HEAD 0x08 /* -t option, get rcpts from headers */
   1.343 +#define ACC_NODOT_TERM     0x10 /* a dot on a line itself does not end
   1.344 +				   the message (-oi option) */
   1.345 +#define ACC_NO_RECVD_HDR   0x20 /* do not create a Received: header */
   1.346 +#define ACC_MAIL_FROM_HEAD 0x40 /* get return path from header */
   1.347 +#define ACC_NODOT_RELAX    0x80 /* do not be picky if message ist not terminated by a dot on a line */
   1.348 +#define ACC_SAVE_ENVELOPE_TO 0x0100 /* save an existent Envelope-to header as X-Orig-Envelope-to */
   1.349 +
   1.350 +#define DLVR_LOCAL 0x01
   1.351 +#define DLVR_LAN 0x02
   1.352 +#define DLVR_ONLINE 0x04
   1.353 +#define DLVR_ALL (DLVR_LOCAL|DLVR_LAN|DLVR_ONLINE)
   1.354 +
   1.355 +/* transport flags */
   1.356 +#define MSGSTR_FROMLINE 0x01
   1.357 +#define MSGSTR_FROMHACK 0x02
   1.358 +
   1.359 +typedef
   1.360 +enum _accept_error
   1.361 +{
   1.362 +  AERR_OK = 0,
   1.363 +  AERR_TIMEOUT,
   1.364 +  AERR_EOF,
   1.365 +  AERR_OVERFLOW,
   1.366 +  AERR_SYNTAX,
   1.367 +  AERR_NOSPOOL,
   1.368 +  AERR_NORCPT,
   1.369 +  AERR_UNKNOWN
   1.370 +}accept_error;
   1.371 +
   1.372 +#define BUF_LEN 1024
   1.373 +#define MAX_ADDRESS 256
   1.374 +#define MAX_DATALINE 4096
   1.375 +
   1.376 +typedef
   1.377 +enum _smtp_cmd_id
   1.378 +{
   1.379 +  SMTP_HELO = 0,
   1.380 +  SMTP_EHLO,
   1.381 +  SMTP_MAIL_FROM,
   1.382 +  SMTP_RCPT_TO,
   1.383 +  SMTP_DATA,
   1.384 +  SMTP_QUIT,
   1.385 +  SMTP_RSET,
   1.386 +  SMTP_NOOP,
   1.387 +  SMTP_HELP,
   1.388 +  SMTP_NUM_IDS,
   1.389 +  SMTP_EOF = -1,
   1.390 +  SMTP_ERROR = -2,
   1.391 +} smtp_cmd_id;
   1.392 +
   1.393 +typedef
   1.394 +struct _smtp_cmd
   1.395 +{
   1.396 +  smtp_cmd_id id;
   1.397 +  gchar *cmd;
   1.398 +} smtp_cmd;
   1.399 +
   1.400 +typedef
   1.401 +struct _smtp_connection
   1.402 +{
   1.403 +  gchar *remote_host;
   1.404 +
   1.405 +  prot_id prot;
   1.406 +  gint next_id;
   1.407 +  
   1.408 +  gboolean helo_seen;
   1.409 +  gboolean from_seen;
   1.410 +  gboolean rcpt_seen;
   1.411 +
   1.412 +  message *msg;
   1.413 +}smtp_connection;
   1.414 +
   1.415 +/* alias.c*/
   1.416 +gboolean addr_is_local(address *addr);
   1.417 +GList *alias_expand(GList *alias_table, GList *rcpt_list, GList *non_rcpt_list);
   1.418 +
   1.419 +/* child.c */
   1.420 +int child(const char *command);
   1.421 +
   1.422 +/* conf.c */
   1.423 +void init_conf();
   1.424 +gboolean read_conf(gchar *filename);
   1.425 +connect_route *read_route(gchar *filename, gboolean is_local_net);
   1.426 +GList *read_route_list(GList *rf_list, gboolean is_local_net);
   1.427 +void destroy_route(connect_route *r);
   1.428 +void destroy_route_list(GList *list);
   1.429 +get_conf *read_get_conf(gchar *filename);
   1.430 +void destroy_get_conf(get_conf *gc);
   1.431 +connect_route *create_local_route();
   1.432 +
   1.433 +/* expand.c */
   1.434 +GList *var_table_rcpt(GList *var_table, address *rcpt);
   1.435 +GList *var_table_msg(GList *var_table, message *msg);
   1.436 +GList *var_table_conf(GList *var_table);
   1.437 +gint expand(GList *var_list, gchar *format, gchar *result, gint result_len);
   1.438 +
   1.439 +/* message.c */
   1.440 +message *create_message(void);
   1.441 +void destroy_message(message *msg);
   1.442 +void destroy_msg_list(GList *msg_list);
   1.443 +void msg_free_data(message *msg);
   1.444 +gint msg_calc_size(message *msg, gboolean is_smtp);
   1.445 +
   1.446 +msg_out *create_msg_out(message *msg);
   1.447 +msg_out *clone_msg_out(msg_out *msgout_orig);
   1.448 +GList *create_msg_out_list(GList *msg_list);
   1.449 +void destroy_msg_out(msg_out *msgout);
   1.450 +void destroy_msg_out_list(GList *msgout_list);
   1.451 +
   1.452 +/* address.c */
   1.453 +address *create_address(gchar *path, gboolean is_rfc821);
   1.454 +address *create_address_qualified(gchar *path, gboolean is_rfc821,
   1.455 +				  gchar *domain);
   1.456 +address *create_address_pipe(gchar *path);
   1.457 +void destroy_address(address *addr);
   1.458 +address *copy_modify_address(const address *orig, gchar *l_part, gchar *dom);
   1.459 +#define copy_address(addr) copy_modify_address(addr, NULL, NULL)
   1.460 +gboolean addr_isequal(address *addr1, address *addr2);
   1.461 +gboolean addr_isequal_parent(address *addr1, address *addr2);
   1.462 +address *addr_find_ancestor(address *addr);
   1.463 +gboolean addr_is_delivered_children(address *addr);
   1.464 +gboolean addr_is_finished_children(address *addr);
   1.465 +gchar *addr_string(address *addr);
   1.466 +gint addr_match(address *addr1, address *addr2);
   1.467 +
   1.468 +/* accept.c */
   1.469 +accept_error accept_message(FILE *in, message *msg,
   1.470 +			    guint flags);
   1.471 +accept_error accept_message_prepare(message *msg, guint flags);
   1.472 +
   1.473 +/* header.c */
   1.474 +gchar *rec_timestamp();
   1.475 +GList *find_header(GList *hdr_list, header_id id, gchar *hdr_str);
   1.476 +void header_unfold(header *hdr);
   1.477 +void header_fold(header *hdr);
   1.478 +header *create_header(header_id id, gchar *fmt, ...);
   1.479 +void destroy_header(header *hdr);
   1.480 +header *copy_header(header *hdr);
   1.481 +header *get_header(gchar *line);
   1.482 +
   1.483 +/* smtp_in.c */
   1.484 +void smtp_in(FILE *in, FILE *out, gchar *remote_host, gchar *ident);
   1.485 +
   1.486 +/* listen.c */
   1.487 +void listen_port(GList *addr_list, gint qival, char *argv[]);
   1.488 +
   1.489 +/* parse.c */
   1.490 +gboolean split_address(const gchar *path, gchar **local_part, gchar **domain,
   1.491 +		       gboolean is_rfc821);
   1.492 +gboolean parse_address_rfc822(gchar *string,
   1.493 +		       gchar **local_begin, gchar **local_end,
   1.494 +		       gchar **domain_begin, gchar **domain_end,
   1.495 +			      gchar **address_end);
   1.496 +gboolean parse_address_rfc821(gchar *string,
   1.497 +			      gchar **local_begin, gchar **local_end,
   1.498 +			      gchar **domain_begin, gchar **domain_end,
   1.499 +			      gchar **address_end);
   1.500 +address *_create_address(gchar *string, gchar **end, gboolean is_rfc821);
   1.501 +address *create_address_rfc821(gchar *string, gchar **end);
   1.502 +address *create_address_rfc822(gchar *string, gchar **end);
   1.503 +GList *addr_list_append_rfc822(GList *addr_list, gchar *string, gchar *domain);
   1.504 +gboolean addr_isequal(address *addr1, address *addr2);
   1.505 +
   1.506 +/* connect.c */
   1.507 +mxip_addr *connect_hostlist(int *psockfd, gchar *host, guint port,
   1.508 +			  GList *addr_list);
   1.509 +mxip_addr *connect_resolvelist(int *psockfd, gchar *host, guint port,
   1.510 +			     GList *res_funcs);
   1.511 +
   1.512 +/* deliver.c */
   1.513 +void msg_rcptlist_local(GList *rcpt_list, GList **, GList **);
   1.514 +gboolean deliver_local(msg_out *msgout);
   1.515 +gboolean deliver_msglist_host(connect_route *route, GList *msg_list, gchar *host, GList *res_list);
   1.516 +gboolean deliver_route_msgout_list(connect_route *route, GList *msgout_list);
   1.517 +gboolean deliver_route_msg_list(connect_route *route, GList *msgout_list);
   1.518 +gboolean deliver_finish(msg_out *msgout);
   1.519 +gboolean deliver_finish_list(GList *msgout_list);
   1.520 +gboolean deliver_msg_list(GList *msg_list, guint flags);
   1.521 +gboolean deliver(message *msg);
   1.522 +
   1.523 +/* fail_msg.c */
   1.524 +gboolean fail_msg(message *msg, gchar *template,
   1.525 +		  GList *failed_rcpts, gchar *err_fmt, va_list args);
   1.526 +gboolean warn_msg(message *msg, gchar *template,
   1.527 +		  GList *failed_rcpts, gchar *err_fmt, va_list args);
   1.528 +
   1.529 +/* get.c */
   1.530 +gboolean get_from_file(gchar *fname);
   1.531 +gboolean get_from_name(gchar *name);
   1.532 +gboolean get_all(void);
   1.533 +void get_online(void);
   1.534 +void get_daemon(gint gival, char *argv[]);
   1.535 +gboolean pop_before_smtp(gchar *fname);
   1.536 +
   1.537 +/* interface.c */
   1.538 +gboolean init_sockaddr(struct sockaddr_in *name, interface *iface);
   1.539 +int make_server_socket(interface *iface);
   1.540 +
   1.541 +/* local.c */
   1.542 +gboolean append_file(message *msg, GList *hdr_list, gchar *user);
   1.543 +gboolean maildir_out(message *msg, GList *hdr_list, gchar *user, guint flags);
   1.544 +gboolean pipe_out(message *msg, GList *hdr_list, address *rcpt, gchar *cmd, guint flags);
   1.545 +
   1.546 +/* log.c */
   1.547 +gchar *ext_strerror(int err);
   1.548 +gboolean logopen(void);
   1.549 +void logclose(void);
   1.550 +void vlogwrite(int pri, const char *fmt, va_list args);
   1.551 +void logwrite(int pri, const char *fmt, ...);
   1.552 +void debugf(const char *fmt, ...);
   1.553 +void vdebugf(const char *fmt, va_list args);
   1.554 +void maillog(const char *fmt, ...);
   1.555 +
   1.556 +/* spool.c */
   1.557 +gboolean spool_read_data(message *msg);
   1.558 +gboolean spool_read_data(message *msg);
   1.559 +message *msg_spool_read(gchar *uid, gboolean do_readdata);
   1.560 +gboolean spool_write(message *msg, gboolean do_writedata);
   1.561 +gboolean spool_lock(gchar *uid);
   1.562 +gboolean spool_unlock(gchar *uid);
   1.563 +gboolean spool_delete_all(message *msg);
   1.564 +
   1.565 +/* queue.c */
   1.566 +GList *read_queue(gboolean do_readdata);
   1.567 +gboolean queue_run(void);
   1.568 +gboolean queue_run_online(void);
   1.569 +void queue_list(void);
   1.570 +gboolean queue_delete(gchar *uid);
   1.571 +
   1.572 +/* online.c */
   1.573 +gchar *detect_online();
   1.574 +void set_online_name(gchar *name);
   1.575 +
   1.576 +/* permissions.c */
   1.577 +gboolean is_ingroup(uid_t uid, gid_t gid);
   1.578 +void set_euidgid(gint uid, gint gid, uid_t *old_uid, gid_t *old_gid);
   1.579 +void set_identity(uid_t old_uid, gchar *task_name);
   1.580 +
   1.581 +/* rewrite.c */
   1.582 +gboolean set_address_header_domain(header *hdr, gchar *domain);
   1.583 +gboolean map_address_header(header *hdr, GList *table);
   1.584 +
   1.585 +/* route.c */
   1.586 +msgout_perhost *create_msgout_perhost(gchar *host);
   1.587 +void destroy_msgout_perhost(msgout_perhost *mo_ph);
   1.588 +void rewrite_headers(msg_out *msgout, connect_route *route);
   1.589 +void rcptlist_with_one_of_hostlist(GList *rcpt_list, GList *host_list,
   1.590 +				     GList **, GList **);
   1.591 +void rcptlist_with_addr_is_local(GList *rcpt_list,
   1.592 +				   GList **p_rcpt_list, GList **p_non_rcpt_list);
   1.593 +gboolean route_strip_msgout(connect_route *route, msg_out *msgout);
   1.594 +msg_out *route_prepare_msgout(connect_route *route, msg_out *msgout);
   1.595 +GList *route_msgout_list(connect_route *route, GList *msgout_list);
   1.596 +gboolean route_is_allowed_return_path(connect_route *route, address *ret_path);
   1.597 +gboolean route_is_allowed_mail_local(connect_route *route, address *ret_path);
   1.598 +void msg_rcptlist_route(connect_route *route, GList *rcpt_list,
   1.599 +			GList **p_rcpt_list, GList **p_non_rcpt_list);
   1.600 +
   1.601 +/* tables.c */
   1.602 +table_pair *create_pair(gchar *key, gpointer value);
   1.603 +table_pair *create_pair_string(gchar *key, gpointer value);
   1.604 +table_pair *parse_table_pair(gchar *line, char delim);
   1.605 +gpointer *table_find_func(GList *table_list, gchar *key, int (*cmp_func)(const char *, const char *));
   1.606 +gpointer *table_find(GList *table_list, gchar *key);
   1.607 +gpointer *table_find_case(GList *table_list, gchar *key);
   1.608 +gpointer *table_find_fnmatch(GList *table_list, gchar *key);
   1.609 +GList *table_read(gchar *fname, gchar delim);
   1.610 +void destroy_table(GList *table);
   1.611 +
   1.612 +/* timeival.c */
   1.613 +gint time_interval(gchar *str, gint *pos);
   1.614 +
   1.615 +/* permissions.c */
   1.616 +gboolean is_privileged_user(uid_t uid);
   1.617 +
   1.618 +/* other things */
   1.619 +
   1.620 +#define foreach(list, node)\
   1.621 +for((node) = g_list_first(list);\
   1.622 +    (node);\
   1.623 +    (node) = g_list_next(node))
   1.624 +
   1.625 +#ifdef ENABLE_DEBUG
   1.626 +#define DEBUG(level) if(level <= conf.debug_level)
   1.627 +#else
   1.628 +/* hopefully the compiler optmizes this away... */
   1.629 +#define DEBUG(level) if(0)
   1.630 +#endif
   1.631 +
   1.632 +#define LOG_VERBOSE 0x100
   1.633 +
   1.634 +#ifndef HAVE_GETLINE
   1.635 +#define getline(buf, size, file) getdelim(buf, size, '\n', file)
   1.636 +#endif
   1.637 +
   1.638 +#ifndef HAVE_FDATASYNC
   1.639 +#define fdatasync(fd) fsync(fd)
   1.640 +#endif
   1.641 +
   1.642 +#ifndef CONF_DIR
   1.643 +#define CONF_DIR "/etc/masqmail"
   1.644 +#endif
   1.645 +
   1.646 +#define CONF_FILE CONF_DIR"/masqmail.conf"
   1.647 +
   1.648 +#define PIDFILEDIR "/var/run/masqmail/"
   1.649 +
   1.650 +#ifndef va_copy
   1.651 +#ifdef __va_copy
   1.652 +#define va_copy(ap1, ap2) __va_copy(ap1, ap2)
   1.653 +#else
   1.654 +#define va_copy(ap1, ap2) G_VA_COPY(ap1, ap2)
   1.655 +#endif
   1.656 +#endif
   1.657 +
   1.658 +/* *BSD needs this: */
   1.659 +extern char **environ;