masqmail

annotate src/masqmail.h @ 203:45acc5727493

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