masqmail

annotate src/masqmail.h @ 214:ecd8d737d78e

removed the old manual because it is really outdated now In masqmail's 0.3 branch, so much changed that the old manual causes more harm than it improves the distribution. Most content is covered by the man pages anyway. You'll still find the old manual on masqmail's homepage.
author meillo@marmaro.de
date Mon, 19 Jul 2010 14:06:08 +0200
parents 89f951be358f
children 8cddc65765bd
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@10 102 gboolean do_pipelining;
meillo@0 103
meillo@10 104 gchar *set_h_from_domain;
meillo@10 105 gchar *set_h_reply_to_domain;
meillo@10 106 gchar *set_return_path_domain;
meillo@0 107
meillo@10 108 GList *map_h_from_addresses;
meillo@10 109 GList *map_h_reply_to_addresses;
meillo@10 110 GList *map_h_mail_followup_to_addresses;
meillo@10 111 GList *map_return_path_addresses;
meillo@0 112
meillo@10 113 gboolean expand_h_sender_domain;
meillo@10 114 gboolean expand_h_sender_address;
meillo@0 115
meillo@10 116 GList *resolve_list;
meillo@0 117
meillo@10 118 gchar *auth_name;
meillo@10 119 gchar *auth_login;
meillo@10 120 gchar *auth_secret;
meillo@0 121
meillo@10 122 gchar *pipe;
meillo@10 123
meillo@10 124 gboolean pipe_fromline;
meillo@10 125 gboolean pipe_fromhack;
meillo@0 126 } connect_route;
meillo@0 127
meillo@10 128 typedef struct _masqmail_conf {
meillo@10 129 gint mail_uid;
meillo@10 130 gint mail_gid;
meillo@0 131
meillo@10 132 gint orig_uid;
meillo@10 133 gint orig_gid;
meillo@0 134
meillo@10 135 gboolean run_as_user;
meillo@0 136
meillo@10 137 gchar *mail_dir;
meillo@10 138 gchar *lock_dir;
meillo@10 139 gchar *spool_dir;
meillo@10 140 gchar *log_dir;
meillo@0 141
meillo@10 142 gint debug_level;
meillo@10 143 gboolean use_syslog;
meillo@10 144 guint log_max_pri;
meillo@0 145
meillo@10 146 gchar *host_name;
meillo@10 147 GList *local_hosts;
meillo@10 148 GList *local_addresses;
meillo@10 149 GList *not_local_addresses;
meillo@10 150 GList *local_nets;
meillo@10 151 GList *listen_addresses;
meillo@0 152
meillo@117 153 /* ANSI C defines unsigned long to be at least 32bit
meillo@117 154 i.e. ca. 4GB max; that should be enough. */
meillo@117 155 gulong max_msg_size;
meillo@117 156
meillo@10 157 gboolean do_save_envelope_to;
meillo@0 158
meillo@10 159 gboolean defer_all;
meillo@10 160 gboolean do_relay;
meillo@0 161
meillo@10 162 GList *ident_trusted_nets;
meillo@0 163
meillo@10 164 gboolean do_queue;
meillo@0 165
meillo@10 166 gboolean do_verbose;
meillo@0 167
meillo@10 168 gchar *mbox_default;
meillo@10 169 GList *mbox_users;
meillo@10 170 GList *mda_users;
meillo@0 171
meillo@10 172 gchar *mda;
meillo@10 173 gboolean mda_fromline;
meillo@10 174 gboolean mda_fromhack;
meillo@0 175
meillo@10 176 gboolean pipe_fromline;
meillo@10 177 gboolean pipe_fromhack;
meillo@0 178
meillo@10 179 gchar *alias_file;
meillo@10 180 int (*alias_local_cmp) (const char *, const char *);
meillo@0 181
meillo@10 182 GList *local_net_routes;
meillo@10 183 GList *connect_routes; /* list of pairs which point to lists */
meillo@0 184
meillo@10 185 gchar *online_detect;
meillo@10 186 gchar *online_file;
meillo@10 187 gchar *online_pipe;
meillo@0 188
meillo@10 189 gchar *errmsg_file;
meillo@10 190 gchar *warnmsg_file;
meillo@10 191 GList *warn_intervals;
meillo@10 192 gint max_defer_time;
meillo@0 193
meillo@10 194 gchar *log_user;
meillo@0 195 } masqmail_conf;
meillo@0 196
meillo@0 197 extern masqmail_conf conf;
meillo@0 198
meillo@10 199 typedef struct _table_pair {
meillo@10 200 gchar *key;
meillo@10 201 gpointer *value;
meillo@0 202 } table_pair;
meillo@0 203
meillo@0 204
meillo@10 205 typedef enum _prot_id {
meillo@10 206 PROT_LOCAL = 0,
meillo@10 207 PROT_BSMTP,
meillo@10 208 PROT_SMTP,
meillo@10 209 PROT_ESMTP,
meillo@10 210 PROT_NUM
meillo@10 211 } prot_id;
meillo@0 212
meillo@0 213 extern gchar *prot_names[];
meillo@0 214
meillo@10 215 typedef enum _header_id {
meillo@10 216 HEAD_FROM = 0,
meillo@10 217 HEAD_SENDER,
meillo@10 218 HEAD_TO,
meillo@10 219 HEAD_CC,
meillo@10 220 HEAD_BCC,
meillo@10 221 HEAD_DATE,
meillo@10 222 HEAD_MESSAGE_ID,
meillo@10 223 HEAD_REPLY_TO,
meillo@10 224 HEAD_SUBJECT,
meillo@10 225 HEAD_RETURN_PATH,
meillo@10 226 HEAD_ENVELOPE_TO,
meillo@10 227 HEAD_RECEIVED,
meillo@10 228 HEAD_NUM_IDS,
meillo@10 229 HEAD_STATUS,
meillo@10 230 HEAD_UNKNOWN = HEAD_NUM_IDS,
meillo@10 231 HEAD_NONE = -1,
meillo@10 232 } header_id;
meillo@0 233
meillo@10 234 typedef struct _header_name {
meillo@10 235 gchar *header;
meillo@10 236 header_id id;
meillo@10 237 } header_name;
meillo@0 238
meillo@10 239 typedef struct _header {
meillo@10 240 header_id id;
meillo@10 241 gchar *header;
meillo@10 242 gchar *value;
meillo@10 243 } header;
meillo@0 244
meillo@0 245
meillo@10 246 typedef struct _message {
meillo@10 247 gchar *uid;
meillo@0 248
meillo@10 249 gchar *received_host;
meillo@10 250 prot_id received_prot;
meillo@10 251 gchar *ident;
meillo@10 252 gint transfer_id; /* for multiple messages per transfer */
meillo@0 253
meillo@10 254 address *return_path;
meillo@10 255 GList *rcpt_list;
meillo@10 256 GList *non_rcpt_list;
meillo@0 257
meillo@10 258 GList *hdr_list;
meillo@10 259 GList *data_list;
meillo@0 260
meillo@10 261 gint data_size;
meillo@10 262 time_t received_time;
meillo@10 263 time_t warned_time;
meillo@0 264
meillo@10 265 gchar *full_sender_name;
meillo@10 266 } message;
meillo@0 267
meillo@10 268 typedef struct _msg_out {
meillo@10 269 message *msg;
meillo@0 270
meillo@10 271 address *return_path;
meillo@10 272 GList *rcpt_list;
meillo@0 273
meillo@10 274 GList *hdr_list;
meillo@10 275 GList *xtra_hdr_list;
meillo@10 276 } msg_out;
meillo@10 277
meillo@10 278 typedef struct _msgout_perhost {
meillo@10 279 gchar *host;
meillo@10 280 GList *msgout_list;
meillo@0 281 } msgout_perhost;
meillo@0 282
meillo@0 283 /* flags for accept() */
meillo@109 284 #define ACC_DEL_RCPTS 0x02 /* -t option, delete rcpts that were given as cmd args */
meillo@10 285 #define ACC_RCPT_FROM_HEAD 0x08 /* -t option, get rcpts from headers */
meillo@110 286 #define ACC_DOT_IGNORE 0x10 /* a dot on a line itself does not end the message (-oi option) */
meillo@10 287 #define ACC_MAIL_FROM_HEAD 0x40 /* get return path from header */
meillo@10 288 #define ACC_NODOT_RELAX 0x80 /* do not be picky if message ist not terminated by a dot on a line */
meillo@10 289 #define ACC_SAVE_ENVELOPE_TO 0x0100 /* save an existent Envelope-to header as X-Orig-Envelope-to */
meillo@0 290
meillo@0 291 #define DLVR_LOCAL 0x01
meillo@0 292 #define DLVR_LAN 0x02
meillo@0 293 #define DLVR_ONLINE 0x04
meillo@0 294 #define DLVR_ALL (DLVR_LOCAL|DLVR_LAN|DLVR_ONLINE)
meillo@0 295
meillo@0 296 /* transport flags */
meillo@0 297 #define MSGSTR_FROMLINE 0x01
meillo@0 298 #define MSGSTR_FROMHACK 0x02
meillo@0 299
meillo@10 300 typedef enum _accept_error {
meillo@10 301 AERR_OK = 0,
meillo@10 302 AERR_TIMEOUT,
meillo@10 303 AERR_EOF,
meillo@10 304 AERR_OVERFLOW,
meillo@10 305 AERR_SYNTAX,
meillo@10 306 AERR_NOSPOOL,
meillo@10 307 AERR_NORCPT,
meillo@117 308 AERR_SIZE, /* max msg size exeeded (SMTP SIZE) */
meillo@10 309 AERR_UNKNOWN
meillo@10 310 } accept_error;
meillo@0 311
meillo@0 312 #define BUF_LEN 1024
meillo@0 313 #define MAX_ADDRESS 256
meillo@0 314 #define MAX_DATALINE 4096
meillo@0 315
meillo@10 316 typedef enum _smtp_cmd_id {
meillo@10 317 SMTP_HELO = 0,
meillo@10 318 SMTP_EHLO,
meillo@10 319 SMTP_MAIL_FROM,
meillo@10 320 SMTP_RCPT_TO,
meillo@10 321 SMTP_DATA,
meillo@10 322 SMTP_QUIT,
meillo@10 323 SMTP_RSET,
meillo@10 324 SMTP_NOOP,
meillo@10 325 SMTP_HELP,
meillo@10 326 SMTP_NUM_IDS,
meillo@10 327 SMTP_EOF = -1,
meillo@10 328 SMTP_ERROR = -2,
meillo@0 329 } smtp_cmd_id;
meillo@0 330
meillo@10 331 typedef struct _smtp_cmd {
meillo@10 332 smtp_cmd_id id;
meillo@10 333 gchar *cmd;
meillo@0 334 } smtp_cmd;
meillo@0 335
meillo@10 336 typedef struct _smtp_connection {
meillo@10 337 gchar *remote_host;
meillo@0 338
meillo@10 339 prot_id prot;
meillo@10 340 gint next_id;
meillo@0 341
meillo@10 342 gboolean helo_seen;
meillo@10 343 gboolean from_seen;
meillo@10 344 gboolean rcpt_seen;
meillo@10 345
meillo@10 346 message *msg;
meillo@10 347 } smtp_connection;
meillo@0 348
meillo@0 349 /* alias.c*/
meillo@10 350 gboolean addr_is_local(address * addr);
meillo@10 351 GList *alias_expand(GList * alias_table, GList * rcpt_list, GList * non_rcpt_list);
meillo@0 352
meillo@0 353 /* child.c */
meillo@0 354 int child(const char *command);
meillo@0 355
meillo@0 356 /* conf.c */
meillo@0 357 void init_conf();
meillo@10 358 gboolean read_conf(gchar * filename);
meillo@10 359 connect_route *read_route(gchar * filename, gboolean is_local_net);
meillo@10 360 GList *read_route_list(GList * rf_list, gboolean is_local_net);
meillo@10 361 void destroy_route(connect_route * r);
meillo@10 362 void destroy_route_list(GList * list);
meillo@0 363 connect_route *create_local_route();
meillo@0 364
meillo@0 365 /* expand.c */
meillo@10 366 GList *var_table_rcpt(GList * var_table, address * rcpt);
meillo@10 367 GList *var_table_msg(GList * var_table, message * msg);
meillo@10 368 GList *var_table_conf(GList * var_table);
meillo@10 369 gint expand(GList * var_list, gchar * format, gchar * result, gint result_len);
meillo@0 370
meillo@0 371 /* message.c */
meillo@0 372 message *create_message(void);
meillo@10 373 void destroy_message(message * msg);
meillo@10 374 void destroy_msg_list(GList * msg_list);
meillo@10 375 void msg_free_data(message * msg);
meillo@10 376 gint msg_calc_size(message * msg, gboolean is_smtp);
meillo@0 377
meillo@10 378 msg_out *create_msg_out(message * msg);
meillo@10 379 msg_out *clone_msg_out(msg_out * msgout_orig);
meillo@10 380 GList *create_msg_out_list(GList * msg_list);
meillo@10 381 void destroy_msg_out(msg_out * msgout);
meillo@10 382 void destroy_msg_out_list(GList * msgout_list);
meillo@0 383
meillo@0 384 /* address.c */
meillo@10 385 address *create_address(gchar * path, gboolean is_rfc821);
meillo@10 386 address *create_address_qualified(gchar * path, gboolean is_rfc821, gchar * domain);
meillo@10 387 address *create_address_pipe(gchar * path);
meillo@10 388 void destroy_address(address * addr);
meillo@10 389 address *copy_modify_address(const address * orig, gchar * l_part, gchar * dom);
meillo@0 390 #define copy_address(addr) copy_modify_address(addr, NULL, NULL)
meillo@10 391 gboolean addr_isequal(address * addr1, address * addr2);
meillo@10 392 gboolean addr_isequal_parent(address * addr1, address * addr2);
meillo@10 393 address *addr_find_ancestor(address * addr);
meillo@10 394 gboolean addr_is_delivered_children(address * addr);
meillo@10 395 gboolean addr_is_finished_children(address * addr);
meillo@10 396 gchar *addr_string(address * addr);
meillo@10 397 gint addr_match(address * addr1, address * addr2);
meillo@0 398
meillo@0 399 /* accept.c */
meillo@10 400 accept_error accept_message(FILE * in, message * msg, guint flags);
meillo@10 401 accept_error accept_message_prepare(message * msg, guint flags);
meillo@0 402
meillo@0 403 /* header.c */
meillo@0 404 gchar *rec_timestamp();
meillo@10 405 GList *find_header(GList * hdr_list, header_id id, gchar * hdr_str);
meillo@10 406 void header_unfold(header * hdr);
meillo@10 407 void header_fold(header * hdr);
meillo@10 408 header *create_header(header_id id, gchar * fmt, ...);
meillo@10 409 void destroy_header(header * hdr);
meillo@10 410 header *copy_header(header * hdr);
meillo@10 411 header *get_header(gchar * line);
meillo@0 412
meillo@0 413 /* smtp_in.c */
meillo@10 414 void smtp_in(FILE * in, FILE * out, gchar * remote_host, gchar * ident);
meillo@0 415
meillo@0 416 /* listen.c */
meillo@10 417 void listen_port(GList * addr_list, gint qival, char *argv[]);
meillo@0 418
meillo@0 419 /* parse.c */
meillo@10 420 gboolean split_address(const gchar * path, gchar ** local_part, gchar ** domain, gboolean is_rfc821);
meillo@10 421 gboolean parse_address_rfc822(gchar * string, gchar ** local_begin, gchar ** local_end, gchar ** domain_begin, gchar ** domain_end, gchar ** address_end);
meillo@10 422 gboolean parse_address_rfc821(gchar * string, gchar ** local_begin, gchar ** local_end, gchar ** domain_begin, gchar ** domain_end, gchar ** address_end);
meillo@10 423 address *_create_address(gchar * string, gchar ** end, gboolean is_rfc821);
meillo@10 424 address *create_address_rfc821(gchar * string, gchar ** end);
meillo@10 425 address *create_address_rfc822(gchar * string, gchar ** end);
meillo@10 426 GList *addr_list_append_rfc822(GList * addr_list, gchar * string, gchar * domain);
meillo@10 427 gboolean addr_isequal(address * addr1, address * addr2);
meillo@0 428
meillo@0 429 /* connect.c */
meillo@10 430 mxip_addr *connect_hostlist(int *psockfd, gchar * host, guint port, GList * addr_list);
meillo@10 431 mxip_addr *connect_resolvelist(int *psockfd, gchar * host, guint port, GList * res_funcs);
meillo@0 432
meillo@0 433 /* deliver.c */
meillo@10 434 void msg_rcptlist_local(GList * rcpt_list, GList **, GList **);
meillo@10 435 gboolean deliver_local(msg_out * msgout);
meillo@10 436 gboolean deliver_msglist_host(connect_route * route, GList * msg_list, gchar * host, GList * res_list);
meillo@10 437 gboolean deliver_route_msgout_list(connect_route * route, GList * msgout_list);
meillo@10 438 gboolean deliver_route_msg_list(connect_route * route, GList * msgout_list);
meillo@10 439 gboolean deliver_finish(msg_out * msgout);
meillo@10 440 gboolean deliver_finish_list(GList * msgout_list);
meillo@10 441 gboolean deliver_msg_list(GList * msg_list, guint flags);
meillo@10 442 gboolean deliver(message * msg);
meillo@0 443
meillo@0 444 /* fail_msg.c */
meillo@10 445 gboolean fail_msg(message * msg, gchar * template, GList * failed_rcpts, gchar * err_fmt, va_list args);
meillo@10 446 gboolean warn_msg(message * msg, gchar * template, GList * failed_rcpts, gchar * err_fmt, va_list args);
meillo@0 447
meillo@0 448 /* interface.c */
meillo@10 449 gboolean init_sockaddr(struct sockaddr_in *name, interface * iface);
meillo@10 450 int make_server_socket(interface * iface);
meillo@0 451
meillo@0 452 /* local.c */
meillo@10 453 gboolean append_file(message * msg, GList * hdr_list, gchar * user);
meillo@10 454 gboolean pipe_out(message * msg, GList * hdr_list, address * rcpt, gchar * cmd, guint flags);
meillo@0 455
meillo@0 456 /* log.c */
meillo@0 457 gchar *ext_strerror(int err);
meillo@0 458 gboolean logopen(void);
meillo@0 459 void logclose(void);
meillo@0 460 void vlogwrite(int pri, const char *fmt, va_list args);
meillo@0 461 void logwrite(int pri, const char *fmt, ...);
meillo@0 462 void debugf(const char *fmt, ...);
meillo@0 463 void vdebugf(const char *fmt, va_list args);
meillo@0 464 void maillog(const char *fmt, ...);
meillo@0 465
meillo@0 466 /* spool.c */
meillo@10 467 gboolean spool_read_data(message * msg);
meillo@10 468 gboolean spool_read_data(message * msg);
meillo@10 469 message *msg_spool_read(gchar * uid, gboolean do_readdata);
meillo@10 470 gboolean spool_write(message * msg, gboolean do_writedata);
meillo@10 471 gboolean spool_lock(gchar * uid);
meillo@10 472 gboolean spool_unlock(gchar * uid);
meillo@10 473 gboolean spool_delete_all(message * msg);
meillo@0 474
meillo@0 475 /* queue.c */
meillo@0 476 GList *read_queue(gboolean do_readdata);
meillo@0 477 gboolean queue_run(void);
meillo@0 478 gboolean queue_run_online(void);
meillo@0 479 void queue_list(void);
meillo@10 480 gboolean queue_delete(gchar * uid);
meillo@0 481
meillo@0 482 /* online.c */
meillo@0 483 gchar *detect_online();
meillo@10 484 void set_online_name(gchar * name);
meillo@0 485
meillo@0 486 /* permissions.c */
meillo@0 487 gboolean is_ingroup(uid_t uid, gid_t gid);
meillo@10 488 void set_euidgid(gint uid, gint gid, uid_t * old_uid, gid_t * old_gid);
meillo@10 489 void set_identity(uid_t old_uid, gchar * task_name);
meillo@0 490
meillo@0 491 /* rewrite.c */
meillo@10 492 gboolean set_address_header_domain(header * hdr, gchar * domain);
meillo@10 493 gboolean map_address_header(header * hdr, GList * table);
meillo@0 494
meillo@0 495 /* route.c */
meillo@10 496 msgout_perhost *create_msgout_perhost(gchar * host);
meillo@10 497 void destroy_msgout_perhost(msgout_perhost * mo_ph);
meillo@10 498 void rewrite_headers(msg_out * msgout, connect_route * route);
meillo@10 499 void rcptlist_with_one_of_hostlist(GList * rcpt_list, GList * host_list, GList **, GList **);
meillo@10 500 void rcptlist_with_addr_is_local(GList * rcpt_list, GList ** p_rcpt_list, GList ** p_non_rcpt_list);
meillo@10 501 gboolean route_strip_msgout(connect_route * route, msg_out * msgout);
meillo@10 502 msg_out *route_prepare_msgout(connect_route * route, msg_out * msgout);
meillo@10 503 GList *route_msgout_list(connect_route * route, GList * msgout_list);
meillo@10 504 gboolean route_is_allowed_return_path(connect_route * route, address * ret_path);
meillo@10 505 gboolean route_is_allowed_mail_local(connect_route * route, address * ret_path);
meillo@10 506 void msg_rcptlist_route(connect_route * route, GList * rcpt_list, GList ** p_rcpt_list, GList ** p_non_rcpt_list);
meillo@0 507
meillo@0 508 /* tables.c */
meillo@10 509 table_pair *create_pair(gchar * key, gpointer value);
meillo@10 510 table_pair *create_pair_string(gchar * key, gpointer value);
meillo@10 511 table_pair *parse_table_pair(gchar * line, char delim);
meillo@10 512 gpointer *table_find_func(GList * table_list, gchar * key, int (*cmp_func) (const char *, const char *));
meillo@10 513 gpointer *table_find(GList * table_list, gchar * key);
meillo@10 514 gpointer *table_find_case(GList * table_list, gchar * key);
meillo@10 515 gpointer *table_find_fnmatch(GList * table_list, gchar * key);
meillo@10 516 GList *table_read(gchar * fname, gchar delim);
meillo@10 517 void destroy_table(GList * table);
meillo@0 518
meillo@0 519 /* timeival.c */
meillo@10 520 gint time_interval(gchar * str, gint * pos);
meillo@0 521
meillo@0 522 /* permissions.c */
meillo@0 523 gboolean is_privileged_user(uid_t uid);
meillo@0 524
meillo@0 525 /* other things */
meillo@0 526
meillo@0 527 #define foreach(list, node)\
meillo@0 528 for((node) = g_list_first(list);\
meillo@0 529 (node);\
meillo@0 530 (node) = g_list_next(node))
meillo@0 531
meillo@0 532 #ifdef ENABLE_DEBUG
meillo@0 533 #define DEBUG(level) if(level <= conf.debug_level)
meillo@0 534 #else
meillo@0 535 /* hopefully the compiler optmizes this away... */
meillo@0 536 #define DEBUG(level) if(0)
meillo@0 537 #endif
meillo@0 538
meillo@0 539 #define LOG_VERBOSE 0x100
meillo@0 540
meillo@0 541 #ifndef HAVE_GETLINE
meillo@0 542 #define getline(buf, size, file) getdelim(buf, size, '\n', file)
meillo@0 543 #endif
meillo@0 544
meillo@0 545 #ifndef HAVE_FDATASYNC
meillo@0 546 #define fdatasync(fd) fsync(fd)
meillo@0 547 #endif
meillo@0 548
meillo@0 549 #ifndef CONF_DIR
meillo@0 550 #define CONF_DIR "/etc/masqmail"
meillo@0 551 #endif
meillo@0 552
meillo@0 553 #define CONF_FILE CONF_DIR"/masqmail.conf"
meillo@0 554
meillo@0 555 #define PIDFILEDIR "/var/run/masqmail/"
meillo@0 556
meillo@0 557 #ifndef va_copy
meillo@0 558 #ifdef __va_copy
meillo@0 559 #define va_copy(ap1, ap2) __va_copy(ap1, ap2)
meillo@0 560 #else
meillo@0 561 #define va_copy(ap1, ap2) G_VA_COPY(ap1, ap2)
meillo@0 562 #endif
meillo@0 563 #endif
meillo@0 564
meillo@0 565 /* *BSD needs this: */
meillo@0 566 extern char **environ;