masqmail-0.2

annotate src/masqmail.h @ 179:ec3fe72a3e99

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