masqmail-0.2

annotate src/masqmail.h @ 171:349518b940db

added support for STARTTLS wrappers added the route config option `instant_helo' which causes masqmail, as SMTP client, not to wait for the server's 220 greeting. Instead if says EHLO right at once. You'll need this for STARTTLS wrappers that usually eat the greeting line.
author meillo@marmaro.de
date Thu, 22 Jul 2010 23:30:05 +0200
parents 5ec5e6637049
children 087e99c7702a
rev   line source
meillo@0 1 /* MasqMail
meillo@0 2 Copyright (C) 1999-2001 Oliver Kurth
meillo@0 3
meillo@0 4 This program is free software; you can redistribute it and/or modify
meillo@0 5 it under the terms of the GNU General Public License as published by
meillo@0 6 the Free Software Foundation; either version 2 of the License, or
meillo@0 7 (at your option) any later version.
meillo@0 8
meillo@0 9 This program is distributed in the hope that it will be useful,
meillo@0 10 but WITHOUT ANY WARRANTY; without even the implied warranty of
meillo@0 11 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
meillo@0 12 GNU General Public License for more details.
meillo@0 13
meillo@0 14 You should have received a copy of the GNU General Public License
meillo@0 15 along with this program; if not, write to the Free Software
meillo@0 16 Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
meillo@0 17 */
meillo@0 18 #include <config.h>
meillo@0 19
meillo@0 20 #include <stdio.h>
meillo@0 21 #include <stdarg.h>
meillo@0 22 #include <errno.h>
meillo@0 23 #include <stdlib.h>
meillo@0 24 #include <string.h>
meillo@0 25 #include <ctype.h>
meillo@0 26 #include <unistd.h>
meillo@0 27 #include <pwd.h>
meillo@0 28 #include <sys/types.h>
meillo@0 29 #include <sys/socket.h>
meillo@0 30 #include <netinet/in.h>
meillo@0 31 #include <time.h>
meillo@0 32 #include <sys/time.h>
meillo@0 33 #include <netinet/in.h>
meillo@0 34 #include <arpa/inet.h>
meillo@0 35 #include <netdb.h>
meillo@0 36 #include <syslog.h>
meillo@0 37 #include <signal.h>
meillo@0 38 #include <fcntl.h>
meillo@0 39
meillo@0 40 #include <glib.h>
meillo@0 41
meillo@0 42 #ifdef ENABLE_IDENT
meillo@0 43 #include "libident/ident.h"
meillo@0 44 #endif
meillo@0 45
meillo@0 46 #include "lookup.h"
meillo@0 47
meillo@10 48 typedef struct _interface {
meillo@10 49 gchar *address;
meillo@10 50 gint port;
meillo@0 51 } interface;
meillo@0 52
meillo@0 53 #define ADDR_FLAG_DELIVERED 0x01
meillo@0 54 #define ADDR_FLAG_DEFERED 0x02
meillo@0 55 #define ADDR_FLAG_FAILED 0x04
meillo@0 56 #define ADDR_FLAG_LAST_ROUTE 0x40
meillo@0 57 #define ADDR_FLAG_NOEXPAND 0x80
meillo@0 58
meillo@10 59 typedef struct _address {
meillo@10 60 gchar *address;
meillo@10 61 gchar *local_part;
meillo@10 62 gchar *domain;
meillo@10 63 gint flags;
meillo@10 64 GList *children;
meillo@10 65 struct _address *parent;
meillo@0 66 } address;
meillo@0 67
meillo@0 68 #define addr_mark_delivered(addr) { addr->flags |= ADDR_FLAG_DELIVERED; }
meillo@0 69 #define addr_unmark_delivered(addr) { addr->flags &= ~ADDR_FLAG_DELIVERED; }
meillo@0 70 #define addr_is_delivered(addr) ((addr->flags & ADDR_FLAG_DELIVERED) != 0 )
meillo@0 71
meillo@0 72 #define addr_mark_defered(addr) { addr->flags |= ADDR_FLAG_DEFERED; }
meillo@0 73 #define addr_unmark_defered(addr) { addr->flags &= ~ADDR_FLAG_DEFERED; }
meillo@0 74 #define addr_is_defered(addr) ((addr->flags & ADDR_FLAG_DEFERED) != 0 )
meillo@0 75
meillo@0 76 #define addr_mark_failed(addr) { addr->flags |= ADDR_FLAG_FAILED; }
meillo@0 77 #define addr_unmark_failed(addr) { addr->flags &= ~ADDR_FLAG_FAILED; }
meillo@0 78 #define addr_is_failed(addr) ((addr->flags & ADDR_FLAG_FAILED) != 0 )
meillo@0 79
meillo@10 80 typedef struct _connect_route {
meillo@10 81 gchar *name;
meillo@10 82 gchar *filename;
meillo@0 83
meillo@10 84 gchar *protocol;
meillo@0 85
meillo@10 86 gboolean is_local_net;
meillo@10 87 gboolean last_route;
meillo@0 88
meillo@10 89 GList *allowed_return_paths;
meillo@10 90 GList *not_allowed_return_paths;
meillo@10 91 GList *allowed_mail_locals;
meillo@10 92 GList *not_allowed_mail_locals;
meillo@10 93 GList *allowed_rcpt_domains;
meillo@10 94 GList *not_allowed_rcpt_domains;
meillo@0 95
meillo@10 96 interface *mail_host;
meillo@10 97 gchar *wrapper;
meillo@10 98 gboolean connect_error_fail;
meillo@0 99
meillo@10 100 gchar *helo_name;
meillo@10 101 gboolean do_correct_helo;
meillo@171 102 gboolean instant_helo;
meillo@10 103 gboolean do_pipelining;
meillo@0 104
meillo@10 105 gchar *set_h_from_domain;
meillo@10 106 gchar *set_h_reply_to_domain;
meillo@10 107 gchar *set_return_path_domain;
meillo@0 108
meillo@10 109 GList *map_h_from_addresses;
meillo@10 110 GList *map_h_reply_to_addresses;
meillo@10 111 GList *map_h_mail_followup_to_addresses;
meillo@10 112 GList *map_return_path_addresses;
meillo@0 113
meillo@10 114 gboolean expand_h_sender_domain;
meillo@10 115 gboolean expand_h_sender_address;
meillo@0 116
meillo@10 117 GList *resolve_list;
meillo@0 118
meillo@10 119 gchar *auth_name;
meillo@10 120 gchar *auth_login;
meillo@10 121 gchar *auth_secret;
meillo@0 122
meillo@10 123 gchar *pop3_login;
meillo@0 124
meillo@10 125 gchar *pipe;
meillo@10 126
meillo@10 127 gboolean pipe_fromline;
meillo@10 128 gboolean pipe_fromhack;
meillo@0 129 } connect_route;
meillo@0 130
meillo@10 131 typedef struct _get_conf {
meillo@10 132 gchar *protocol;
meillo@10 133 gchar *server_name;
meillo@10 134 guint server_port;
meillo@10 135 gchar *wrapper;
meillo@10 136 gchar *login_user;
meillo@10 137 gchar *login_pass;
meillo@10 138 address *address;
meillo@10 139 address *return_path;
meillo@10 140 gboolean do_keep;
meillo@10 141 gboolean do_uidl;
meillo@10 142 gboolean do_uidl_dele;
meillo@10 143 gint max_size;
meillo@10 144 gboolean max_size_delete;
meillo@10 145 gint max_count;
meillo@0 146
meillo@10 147 GList *resolve_list;
meillo@0 148
meillo@0 149 } get_conf;
meillo@0 150
meillo@10 151 typedef struct _masqmail_conf {
meillo@10 152 gint mail_uid;
meillo@10 153 gint mail_gid;
meillo@0 154
meillo@10 155 gint orig_uid;
meillo@10 156 gint orig_gid;
meillo@0 157
meillo@10 158 gboolean run_as_user;
meillo@0 159
meillo@10 160 gchar *mail_dir;
meillo@10 161 gchar *lock_dir;
meillo@10 162 gchar *spool_dir;
meillo@10 163 gchar *log_dir;
meillo@0 164
meillo@10 165 gint debug_level;
meillo@10 166 gboolean use_syslog;
meillo@10 167 guint log_max_pri;
meillo@0 168
meillo@10 169 gchar *host_name;
meillo@10 170 GList *local_hosts;
meillo@10 171 GList *local_addresses;
meillo@10 172 GList *not_local_addresses;
meillo@10 173 GList *local_nets;
meillo@10 174 GList *listen_addresses;
meillo@0 175
meillo@10 176 guint remote_port;
meillo@0 177
meillo@117 178 /* ANSI C defines unsigned long to be at least 32bit
meillo@117 179 i.e. ca. 4GB max; that should be enough. */
meillo@117 180 gulong max_msg_size;
meillo@117 181
meillo@10 182 gboolean do_save_envelope_to;
meillo@0 183
meillo@10 184 gboolean defer_all;
meillo@10 185 gboolean do_relay;
meillo@0 186
meillo@10 187 GList *ident_trusted_nets;
meillo@0 188
meillo@10 189 gboolean do_queue;
meillo@0 190
meillo@10 191 gboolean do_verbose;
meillo@0 192
meillo@10 193 gchar *mbox_default;
meillo@10 194 GList *mbox_users;
meillo@10 195 GList *mda_users;
meillo@10 196 GList *maildir_users;
meillo@0 197
meillo@10 198 gchar *mda;
meillo@10 199 gboolean mda_fromline;
meillo@10 200 gboolean mda_fromhack;
meillo@0 201
meillo@10 202 gboolean pipe_fromline;
meillo@10 203 gboolean pipe_fromhack;
meillo@0 204
meillo@10 205 gchar *alias_file;
meillo@10 206 int (*alias_local_cmp) (const char *, const char *);
meillo@0 207
meillo@10 208 GList *local_net_routes;
meillo@10 209 GList *connect_routes; /* list of pairs which point to lists */
meillo@0 210
meillo@10 211 gchar *online_detect;
meillo@10 212 gchar *online_file;
meillo@10 213 gchar *online_pipe;
meillo@10 214 interface *mserver_iface;
meillo@0 215
meillo@10 216 GList *get_names;
meillo@10 217 GList *online_gets; /* list of pairs which point to lists */
meillo@0 218
meillo@10 219 gchar *errmsg_file;
meillo@10 220 gchar *warnmsg_file;
meillo@10 221 GList *warn_intervals;
meillo@10 222 gint max_defer_time;
meillo@0 223
meillo@10 224 gchar *log_user;
meillo@0 225 } masqmail_conf;
meillo@0 226
meillo@0 227 extern masqmail_conf conf;
meillo@0 228
meillo@10 229 typedef struct _table_pair {
meillo@10 230 gchar *key;
meillo@10 231 gpointer *value;
meillo@0 232 } table_pair;
meillo@0 233
meillo@0 234
meillo@10 235 typedef enum _prot_id {
meillo@10 236 PROT_LOCAL = 0,
meillo@10 237 PROT_BSMTP,
meillo@10 238 PROT_SMTP,
meillo@10 239 PROT_ESMTP,
meillo@10 240 PROT_POP3,
meillo@10 241 PROT_APOP,
meillo@10 242 PROT_NUM
meillo@10 243 } prot_id;
meillo@0 244
meillo@0 245 extern gchar *prot_names[];
meillo@0 246
meillo@10 247 typedef enum _header_id {
meillo@10 248 HEAD_FROM = 0,
meillo@10 249 HEAD_SENDER,
meillo@10 250 HEAD_TO,
meillo@10 251 HEAD_CC,
meillo@10 252 HEAD_BCC,
meillo@10 253 HEAD_DATE,
meillo@10 254 HEAD_MESSAGE_ID,
meillo@10 255 HEAD_REPLY_TO,
meillo@10 256 HEAD_SUBJECT,
meillo@10 257 HEAD_RETURN_PATH,
meillo@10 258 HEAD_ENVELOPE_TO,
meillo@10 259 HEAD_RECEIVED,
meillo@10 260 HEAD_NUM_IDS,
meillo@10 261 HEAD_STATUS,
meillo@10 262 HEAD_UNKNOWN = HEAD_NUM_IDS,
meillo@10 263 HEAD_NONE = -1,
meillo@10 264 } header_id;
meillo@0 265
meillo@10 266 typedef struct _header_name {
meillo@10 267 gchar *header;
meillo@10 268 header_id id;
meillo@10 269 } header_name;
meillo@0 270
meillo@10 271 typedef struct _header {
meillo@10 272 header_id id;
meillo@10 273 gchar *header;
meillo@10 274 gchar *value;
meillo@10 275 } header;
meillo@0 276
meillo@0 277
meillo@10 278 typedef struct _message {
meillo@10 279 gchar *uid;
meillo@0 280
meillo@10 281 gchar *received_host;
meillo@10 282 prot_id received_prot;
meillo@10 283 gchar *ident;
meillo@10 284 gint transfer_id; /* for multiple messages per transfer */
meillo@0 285
meillo@10 286 address *return_path;
meillo@10 287 GList *rcpt_list;
meillo@10 288 GList *non_rcpt_list;
meillo@0 289
meillo@10 290 GList *hdr_list;
meillo@10 291 GList *data_list;
meillo@0 292
meillo@10 293 gint data_size;
meillo@10 294 time_t received_time;
meillo@10 295 time_t warned_time;
meillo@0 296
meillo@10 297 gchar *full_sender_name;
meillo@10 298 } message;
meillo@0 299
meillo@10 300 typedef struct _msg_out {
meillo@10 301 message *msg;
meillo@0 302
meillo@10 303 address *return_path;
meillo@10 304 GList *rcpt_list;
meillo@0 305
meillo@10 306 GList *hdr_list;
meillo@10 307 GList *xtra_hdr_list;
meillo@10 308 } msg_out;
meillo@10 309
meillo@10 310 typedef struct _msgout_perhost {
meillo@10 311 gchar *host;
meillo@10 312 GList *msgout_list;
meillo@0 313 } msgout_perhost;
meillo@0 314
meillo@0 315 /* flags for accept() */
meillo@109 316 #define ACC_DEL_RCPTS 0x02 /* -t option, delete rcpts that were given as cmd args */
meillo@10 317 #define ACC_RCPT_FROM_HEAD 0x08 /* -t option, get rcpts from headers */
meillo@110 318 #define ACC_DOT_IGNORE 0x10 /* a dot on a line itself does not end the message (-oi option) */
meillo@10 319 #define ACC_MAIL_FROM_HEAD 0x40 /* get return path from header */
meillo@10 320 #define ACC_NODOT_RELAX 0x80 /* do not be picky if message ist not terminated by a dot on a line */
meillo@10 321 #define ACC_SAVE_ENVELOPE_TO 0x0100 /* save an existent Envelope-to header as X-Orig-Envelope-to */
meillo@0 322
meillo@0 323 #define DLVR_LOCAL 0x01
meillo@0 324 #define DLVR_LAN 0x02
meillo@0 325 #define DLVR_ONLINE 0x04
meillo@0 326 #define DLVR_ALL (DLVR_LOCAL|DLVR_LAN|DLVR_ONLINE)
meillo@0 327
meillo@0 328 /* transport flags */
meillo@0 329 #define MSGSTR_FROMLINE 0x01
meillo@0 330 #define MSGSTR_FROMHACK 0x02
meillo@0 331
meillo@10 332 typedef enum _accept_error {
meillo@10 333 AERR_OK = 0,
meillo@10 334 AERR_TIMEOUT,
meillo@10 335 AERR_EOF,
meillo@10 336 AERR_OVERFLOW,
meillo@10 337 AERR_SYNTAX,
meillo@10 338 AERR_NOSPOOL,
meillo@10 339 AERR_NORCPT,
meillo@117 340 AERR_SIZE, /* max msg size exeeded (SMTP SIZE) */
meillo@10 341 AERR_UNKNOWN
meillo@10 342 } accept_error;
meillo@0 343
meillo@0 344 #define BUF_LEN 1024
meillo@0 345 #define MAX_ADDRESS 256
meillo@0 346 #define MAX_DATALINE 4096
meillo@0 347
meillo@10 348 typedef enum _smtp_cmd_id {
meillo@10 349 SMTP_HELO = 0,
meillo@10 350 SMTP_EHLO,
meillo@10 351 SMTP_MAIL_FROM,
meillo@10 352 SMTP_RCPT_TO,
meillo@10 353 SMTP_DATA,
meillo@10 354 SMTP_QUIT,
meillo@10 355 SMTP_RSET,
meillo@10 356 SMTP_NOOP,
meillo@10 357 SMTP_HELP,
meillo@10 358 SMTP_NUM_IDS,
meillo@10 359 SMTP_EOF = -1,
meillo@10 360 SMTP_ERROR = -2,
meillo@0 361 } smtp_cmd_id;
meillo@0 362
meillo@10 363 typedef struct _smtp_cmd {
meillo@10 364 smtp_cmd_id id;
meillo@10 365 gchar *cmd;
meillo@0 366 } smtp_cmd;
meillo@0 367
meillo@10 368 typedef struct _smtp_connection {
meillo@10 369 gchar *remote_host;
meillo@0 370
meillo@10 371 prot_id prot;
meillo@10 372 gint next_id;
meillo@0 373
meillo@10 374 gboolean helo_seen;
meillo@10 375 gboolean from_seen;
meillo@10 376 gboolean rcpt_seen;
meillo@10 377
meillo@10 378 message *msg;
meillo@10 379 } smtp_connection;
meillo@0 380
meillo@0 381 /* alias.c*/
meillo@10 382 gboolean addr_is_local(address * addr);
meillo@10 383 GList *alias_expand(GList * alias_table, GList * rcpt_list, GList * non_rcpt_list);
meillo@0 384
meillo@0 385 /* child.c */
meillo@0 386 int child(const char *command);
meillo@0 387
meillo@0 388 /* conf.c */
meillo@0 389 void init_conf();
meillo@10 390 gboolean read_conf(gchar * filename);
meillo@10 391 connect_route *read_route(gchar * filename, gboolean is_local_net);
meillo@10 392 GList *read_route_list(GList * rf_list, gboolean is_local_net);
meillo@10 393 void destroy_route(connect_route * r);
meillo@10 394 void destroy_route_list(GList * list);
meillo@10 395 get_conf *read_get_conf(gchar * filename);
meillo@10 396 void destroy_get_conf(get_conf * gc);
meillo@0 397 connect_route *create_local_route();
meillo@0 398
meillo@0 399 /* expand.c */
meillo@10 400 GList *var_table_rcpt(GList * var_table, address * rcpt);
meillo@10 401 GList *var_table_msg(GList * var_table, message * msg);
meillo@10 402 GList *var_table_conf(GList * var_table);
meillo@10 403 gint expand(GList * var_list, gchar * format, gchar * result, gint result_len);
meillo@0 404
meillo@0 405 /* message.c */
meillo@0 406 message *create_message(void);
meillo@10 407 void destroy_message(message * msg);
meillo@10 408 void destroy_msg_list(GList * msg_list);
meillo@10 409 void msg_free_data(message * msg);
meillo@10 410 gint msg_calc_size(message * msg, gboolean is_smtp);
meillo@0 411
meillo@10 412 msg_out *create_msg_out(message * msg);
meillo@10 413 msg_out *clone_msg_out(msg_out * msgout_orig);
meillo@10 414 GList *create_msg_out_list(GList * msg_list);
meillo@10 415 void destroy_msg_out(msg_out * msgout);
meillo@10 416 void destroy_msg_out_list(GList * msgout_list);
meillo@0 417
meillo@0 418 /* address.c */
meillo@10 419 address *create_address(gchar * path, gboolean is_rfc821);
meillo@10 420 address *create_address_qualified(gchar * path, gboolean is_rfc821, gchar * domain);
meillo@10 421 address *create_address_pipe(gchar * path);
meillo@10 422 void destroy_address(address * addr);
meillo@10 423 address *copy_modify_address(const address * orig, gchar * l_part, gchar * dom);
meillo@0 424 #define copy_address(addr) copy_modify_address(addr, NULL, NULL)
meillo@10 425 gboolean addr_isequal(address * addr1, address * addr2);
meillo@10 426 gboolean addr_isequal_parent(address * addr1, address * addr2);
meillo@10 427 address *addr_find_ancestor(address * addr);
meillo@10 428 gboolean addr_is_delivered_children(address * addr);
meillo@10 429 gboolean addr_is_finished_children(address * addr);
meillo@10 430 gchar *addr_string(address * addr);
meillo@10 431 gint addr_match(address * addr1, address * addr2);
meillo@0 432
meillo@0 433 /* accept.c */
meillo@10 434 accept_error accept_message(FILE * in, message * msg, guint flags);
meillo@10 435 accept_error accept_message_prepare(message * msg, guint flags);
meillo@0 436
meillo@0 437 /* header.c */
meillo@0 438 gchar *rec_timestamp();
meillo@10 439 GList *find_header(GList * hdr_list, header_id id, gchar * hdr_str);
meillo@10 440 void header_unfold(header * hdr);
meillo@10 441 void header_fold(header * hdr);
meillo@10 442 header *create_header(header_id id, gchar * fmt, ...);
meillo@10 443 void destroy_header(header * hdr);
meillo@10 444 header *copy_header(header * hdr);
meillo@10 445 header *get_header(gchar * line);
meillo@0 446
meillo@0 447 /* smtp_in.c */
meillo@10 448 void smtp_in(FILE * in, FILE * out, gchar * remote_host, gchar * ident);
meillo@0 449
meillo@0 450 /* listen.c */
meillo@10 451 void listen_port(GList * addr_list, gint qival, char *argv[]);
meillo@0 452
meillo@0 453 /* parse.c */
meillo@10 454 gboolean split_address(const gchar * path, gchar ** local_part, gchar ** domain, gboolean is_rfc821);
meillo@10 455 gboolean parse_address_rfc822(gchar * string, gchar ** local_begin, gchar ** local_end, gchar ** domain_begin, gchar ** domain_end, gchar ** address_end);
meillo@10 456 gboolean parse_address_rfc821(gchar * string, gchar ** local_begin, gchar ** local_end, gchar ** domain_begin, gchar ** domain_end, gchar ** address_end);
meillo@10 457 address *_create_address(gchar * string, gchar ** end, gboolean is_rfc821);
meillo@10 458 address *create_address_rfc821(gchar * string, gchar ** end);
meillo@10 459 address *create_address_rfc822(gchar * string, gchar ** end);
meillo@10 460 GList *addr_list_append_rfc822(GList * addr_list, gchar * string, gchar * domain);
meillo@10 461 gboolean addr_isequal(address * addr1, address * addr2);
meillo@0 462
meillo@0 463 /* connect.c */
meillo@10 464 mxip_addr *connect_hostlist(int *psockfd, gchar * host, guint port, GList * addr_list);
meillo@10 465 mxip_addr *connect_resolvelist(int *psockfd, gchar * host, guint port, GList * res_funcs);
meillo@0 466
meillo@0 467 /* deliver.c */
meillo@10 468 void msg_rcptlist_local(GList * rcpt_list, GList **, GList **);
meillo@10 469 gboolean deliver_local(msg_out * msgout);
meillo@10 470 gboolean deliver_msglist_host(connect_route * route, GList * msg_list, gchar * host, GList * res_list);
meillo@10 471 gboolean deliver_route_msgout_list(connect_route * route, GList * msgout_list);
meillo@10 472 gboolean deliver_route_msg_list(connect_route * route, GList * msgout_list);
meillo@10 473 gboolean deliver_finish(msg_out * msgout);
meillo@10 474 gboolean deliver_finish_list(GList * msgout_list);
meillo@10 475 gboolean deliver_msg_list(GList * msg_list, guint flags);
meillo@10 476 gboolean deliver(message * msg);
meillo@0 477
meillo@0 478 /* fail_msg.c */
meillo@10 479 gboolean fail_msg(message * msg, gchar * template, GList * failed_rcpts, gchar * err_fmt, va_list args);
meillo@10 480 gboolean warn_msg(message * msg, gchar * template, GList * failed_rcpts, gchar * err_fmt, va_list args);
meillo@0 481
meillo@0 482 /* get.c */
meillo@10 483 gboolean get_from_file(gchar * fname);
meillo@10 484 gboolean get_from_name(gchar * name);
meillo@0 485 gboolean get_all(void);
meillo@0 486 void get_online(void);
meillo@0 487 void get_daemon(gint gival, char *argv[]);
meillo@10 488 gboolean pop_before_smtp(gchar * fname);
meillo@0 489
meillo@0 490 /* interface.c */
meillo@10 491 gboolean init_sockaddr(struct sockaddr_in *name, interface * iface);
meillo@10 492 int make_server_socket(interface * iface);
meillo@0 493
meillo@0 494 /* local.c */
meillo@10 495 gboolean append_file(message * msg, GList * hdr_list, gchar * user);
meillo@10 496 gboolean maildir_out(message * msg, GList * hdr_list, gchar * user, guint flags);
meillo@10 497 gboolean pipe_out(message * msg, GList * hdr_list, address * rcpt, gchar * cmd, guint flags);
meillo@0 498
meillo@0 499 /* log.c */
meillo@0 500 gchar *ext_strerror(int err);
meillo@0 501 gboolean logopen(void);
meillo@0 502 void logclose(void);
meillo@0 503 void vlogwrite(int pri, const char *fmt, va_list args);
meillo@0 504 void logwrite(int pri, const char *fmt, ...);
meillo@0 505 void debugf(const char *fmt, ...);
meillo@0 506 void vdebugf(const char *fmt, va_list args);
meillo@0 507 void maillog(const char *fmt, ...);
meillo@0 508
meillo@0 509 /* spool.c */
meillo@10 510 gboolean spool_read_data(message * msg);
meillo@10 511 gboolean spool_read_data(message * msg);
meillo@10 512 message *msg_spool_read(gchar * uid, gboolean do_readdata);
meillo@10 513 gboolean spool_write(message * msg, gboolean do_writedata);
meillo@10 514 gboolean spool_lock(gchar * uid);
meillo@10 515 gboolean spool_unlock(gchar * uid);
meillo@10 516 gboolean spool_delete_all(message * msg);
meillo@0 517
meillo@0 518 /* queue.c */
meillo@0 519 GList *read_queue(gboolean do_readdata);
meillo@0 520 gboolean queue_run(void);
meillo@0 521 gboolean queue_run_online(void);
meillo@0 522 void queue_list(void);
meillo@10 523 gboolean queue_delete(gchar * uid);
meillo@0 524
meillo@0 525 /* online.c */
meillo@0 526 gchar *detect_online();
meillo@10 527 void set_online_name(gchar * name);
meillo@0 528
meillo@0 529 /* permissions.c */
meillo@0 530 gboolean is_ingroup(uid_t uid, gid_t gid);
meillo@10 531 void set_euidgid(gint uid, gint gid, uid_t * old_uid, gid_t * old_gid);
meillo@10 532 void set_identity(uid_t old_uid, gchar * task_name);
meillo@0 533
meillo@0 534 /* rewrite.c */
meillo@10 535 gboolean set_address_header_domain(header * hdr, gchar * domain);
meillo@10 536 gboolean map_address_header(header * hdr, GList * table);
meillo@0 537
meillo@0 538 /* route.c */
meillo@10 539 msgout_perhost *create_msgout_perhost(gchar * host);
meillo@10 540 void destroy_msgout_perhost(msgout_perhost * mo_ph);
meillo@10 541 void rewrite_headers(msg_out * msgout, connect_route * route);
meillo@10 542 void rcptlist_with_one_of_hostlist(GList * rcpt_list, GList * host_list, GList **, GList **);
meillo@10 543 void rcptlist_with_addr_is_local(GList * rcpt_list, GList ** p_rcpt_list, GList ** p_non_rcpt_list);
meillo@10 544 gboolean route_strip_msgout(connect_route * route, msg_out * msgout);
meillo@10 545 msg_out *route_prepare_msgout(connect_route * route, msg_out * msgout);
meillo@10 546 GList *route_msgout_list(connect_route * route, GList * msgout_list);
meillo@10 547 gboolean route_is_allowed_return_path(connect_route * route, address * ret_path);
meillo@10 548 gboolean route_is_allowed_mail_local(connect_route * route, address * ret_path);
meillo@10 549 void msg_rcptlist_route(connect_route * route, GList * rcpt_list, GList ** p_rcpt_list, GList ** p_non_rcpt_list);
meillo@0 550
meillo@0 551 /* tables.c */
meillo@10 552 table_pair *create_pair(gchar * key, gpointer value);
meillo@10 553 table_pair *create_pair_string(gchar * key, gpointer value);
meillo@10 554 table_pair *parse_table_pair(gchar * line, char delim);
meillo@10 555 gpointer *table_find_func(GList * table_list, gchar * key, int (*cmp_func) (const char *, const char *));
meillo@10 556 gpointer *table_find(GList * table_list, gchar * key);
meillo@10 557 gpointer *table_find_case(GList * table_list, gchar * key);
meillo@10 558 gpointer *table_find_fnmatch(GList * table_list, gchar * key);
meillo@10 559 GList *table_read(gchar * fname, gchar delim);
meillo@10 560 void destroy_table(GList * table);
meillo@0 561
meillo@0 562 /* timeival.c */
meillo@10 563 gint time_interval(gchar * str, gint * pos);
meillo@0 564
meillo@0 565 /* permissions.c */
meillo@0 566 gboolean is_privileged_user(uid_t uid);
meillo@0 567
meillo@0 568 /* other things */
meillo@0 569
meillo@0 570 #define foreach(list, node)\
meillo@0 571 for((node) = g_list_first(list);\
meillo@0 572 (node);\
meillo@0 573 (node) = g_list_next(node))
meillo@0 574
meillo@0 575 #ifdef ENABLE_DEBUG
meillo@0 576 #define DEBUG(level) if(level <= conf.debug_level)
meillo@0 577 #else
meillo@0 578 /* hopefully the compiler optmizes this away... */
meillo@0 579 #define DEBUG(level) if(0)
meillo@0 580 #endif
meillo@0 581
meillo@0 582 #define LOG_VERBOSE 0x100
meillo@0 583
meillo@0 584 #ifndef HAVE_GETLINE
meillo@0 585 #define getline(buf, size, file) getdelim(buf, size, '\n', file)
meillo@0 586 #endif
meillo@0 587
meillo@0 588 #ifndef HAVE_FDATASYNC
meillo@0 589 #define fdatasync(fd) fsync(fd)
meillo@0 590 #endif
meillo@0 591
meillo@0 592 #ifndef CONF_DIR
meillo@0 593 #define CONF_DIR "/etc/masqmail"
meillo@0 594 #endif
meillo@0 595
meillo@0 596 #define CONF_FILE CONF_DIR"/masqmail.conf"
meillo@0 597
meillo@0 598 #define PIDFILEDIR "/var/run/masqmail/"
meillo@0 599
meillo@0 600 #ifndef va_copy
meillo@0 601 #ifdef __va_copy
meillo@0 602 #define va_copy(ap1, ap2) __va_copy(ap1, ap2)
meillo@0 603 #else
meillo@0 604 #define va_copy(ap1, ap2) G_VA_COPY(ap1, ap2)
meillo@0 605 #endif
meillo@0 606 #endif
meillo@0 607
meillo@0 608 /* *BSD needs this: */
meillo@0 609 extern char **environ;