Mercurial > masqmail
diff src/masqmail.c @ 10:26e34ae9a3e3
changed indention and line wrapping to a more consistent style
author | meillo@marmaro.de |
---|---|
date | Mon, 27 Oct 2008 16:23:10 +0100 |
parents | 08114f7dcc23 |
children | 9fb7ddbaf129 |
line wrap: on
line diff
--- a/src/masqmail.c Mon Oct 27 16:21:27 2008 +0100 +++ b/src/masqmail.c Mon Oct 27 16:23:10 2008 +0100 @@ -37,792 +37,783 @@ nor a 'queue daemon' mode. These, as well as the distinction beween the two (non exclusive) daemon (queue and listen) modes are handled by flags.*/ -typedef enum _mta_mode -{ - MODE_ACCEPT = 0, /* accept message on stdin */ - MODE_DAEMON, /* run as daemon */ - MODE_RUNQUEUE, /* single queue run, online or offline */ - MODE_GET_DAEMON, /* run as get (retrieve) daemon */ - MODE_SMTP, /* accept SMTP on stdin */ - MODE_LIST, /* list queue */ - MODE_MCMD, /* do queue manipulation */ - MODE_VERSION, /* show version */ - MODE_BI, /* fake ;-) */ - MODE_NONE /* to prevent default MODE_ACCEPT */ -}mta_mode; +typedef enum _mta_mode { + MODE_ACCEPT = 0, /* accept message on stdin */ + MODE_DAEMON, /* run as daemon */ + MODE_RUNQUEUE, /* single queue run, online or offline */ + MODE_GET_DAEMON, /* run as get (retrieve) daemon */ + MODE_SMTP, /* accept SMTP on stdin */ + MODE_LIST, /* list queue */ + MODE_MCMD, /* do queue manipulation */ + MODE_VERSION, /* show version */ + MODE_BI, /* fake ;-) */ + MODE_NONE /* to prevent default MODE_ACCEPT */ +} mta_mode; char *pidfile = NULL; volatile int sigterm_in_progress = 0; -static -void sigterm_handler(int sig) +static void +sigterm_handler(int sig) { - if(sigterm_in_progress) - raise(sig); - sigterm_in_progress = 1; + if (sigterm_in_progress) + raise(sig); + sigterm_in_progress = 1; - if(pidfile){ - uid_t uid; - uid = seteuid(0); - if(unlink(pidfile) != 0) - logwrite(LOG_WARNING, "could not delete pid file %s: %s\n", - pidfile, strerror(errno)); - seteuid(uid); /* we exit anyway after this, just to be sure */ - } + if (pidfile) { + uid_t uid; + uid = seteuid(0); + if (unlink(pidfile) != 0) + logwrite(LOG_WARNING, "could not delete pid file %s: %s\n", pidfile, strerror(errno)); + seteuid(uid); /* we exit anyway after this, just to be sure */ + } - signal(sig, SIG_DFL); - raise(sig); + signal(sig, SIG_DFL); + raise(sig); } -#ifdef ENABLE_IDENT /* so far used for that only */ -static -gboolean is_in_netlist(gchar *host, GList *netlist) +#ifdef ENABLE_IDENT /* so far used for that only */ +static gboolean +is_in_netlist(gchar * host, GList * netlist) { - guint hostip = inet_addr(host); - struct in_addr addr; + guint hostip = inet_addr(host); + struct in_addr addr; - addr.s_addr = hostip; - if(addr.s_addr != INADDR_NONE){ - GList *node; - foreach(netlist, node){ - struct in_addr *net = (struct in_addr *)(node->data); - if((addr.s_addr & net->s_addr) == net->s_addr) - return TRUE; - } - } - return FALSE; + addr.s_addr = hostip; + if (addr.s_addr != INADDR_NONE) { + GList *node; + foreach(netlist, node) { + struct in_addr *net = (struct in_addr *) (node->data); + if ((addr.s_addr & net->s_addr) == net->s_addr) + return TRUE; + } + } + return FALSE; } #endif -gchar *get_optarg(char *argv[], gint argc, gint *argp, gint *pos) +gchar* +get_optarg(char *argv[], gint argc, gint * argp, gint * pos) { - if(argv[*argp][*pos]) - return &(argv[*argp][*pos]); - else{ - if(*argp+1 < argc){ - if(argv[(*argp)+1][0] != '-'){ - (*argp)++; - *pos = 0; - return &(argv[*argp][*pos]); - } - } - } - return NULL; -} + if (argv[*argp][*pos]) + return &(argv[*argp][*pos]); + else { + if (*argp + 1 < argc) { + if (argv[(*argp) + 1][0] != '-') { + (*argp)++; + *pos = 0; + return &(argv[*argp][*pos]); + } + } + } + return NULL; +} -gchar *get_progname(gchar *arg0) +gchar* +get_progname(gchar * arg0) { - gchar *p = arg0 + strlen(arg0) - 1; - while(p > arg0){ - if(*p == '/') - return p+1; - p--; - } - return p; + gchar *p = arg0 + strlen(arg0) - 1; + while (p > arg0) { + if (*p == '/') + return p + 1; + p--; + } + return p; } -gboolean write_pidfile(gchar *name) +gboolean +write_pidfile(gchar * name) { - FILE *fptr; + FILE *fptr; - if((fptr = fopen(name, "wt"))){ - fprintf(fptr, "%d\n", getpid()); - fclose(fptr); - pidfile = strdup(name); - return TRUE; - } - logwrite(LOG_WARNING, "could not write pid file: %s\n", strerror(errno)); - return FALSE; + if ((fptr = fopen(name, "wt"))) { + fprintf(fptr, "%d\n", getpid()); + fclose(fptr); + pidfile = strdup(name); + return TRUE; + } + logwrite(LOG_WARNING, "could not write pid file: %s\n", strerror(errno)); + return FALSE; } -static -void mode_daemon(gboolean do_listen, gint queue_interval, char *argv[]) +static void +mode_daemon(gboolean do_listen, gint queue_interval, char *argv[]) { - guint pid; + guint pid; - /* daemon */ - if(!conf.run_as_user){ - if((conf.orig_uid != 0) && (conf.orig_uid != conf.mail_uid)){ - fprintf(stderr, "must be root or %s for daemon.\n", DEF_MAIL_USER); - exit(EXIT_FAILURE); - } - } + /* daemon */ + if (!conf.run_as_user) { + if ((conf.orig_uid != 0) && (conf.orig_uid != conf.mail_uid)) { + fprintf(stderr, "must be root or %s for daemon.\n", DEF_MAIL_USER); + exit(EXIT_FAILURE); + } + } - if((pid = fork()) > 0){ - exit(EXIT_SUCCESS); - }else if(pid < 0){ - logwrite(LOG_ALERT, "could not fork!"); - exit(EXIT_FAILURE); - } + if ((pid = fork()) > 0) { + exit(EXIT_SUCCESS); + } else if (pid < 0) { + logwrite(LOG_ALERT, "could not fork!"); + exit(EXIT_FAILURE); + } - signal(SIGTERM, sigterm_handler); - write_pidfile(PIDFILEDIR"/masqmail.pid"); + signal(SIGTERM, sigterm_handler); + write_pidfile(PIDFILEDIR "/masqmail.pid"); - conf.do_verbose = FALSE; + conf.do_verbose = FALSE; - fclose(stdin); - fclose(stdout); - fclose(stderr); + fclose(stdin); + fclose(stdout); + fclose(stderr); - listen_port(do_listen ? conf.listen_addresses : NULL, - queue_interval, argv); + listen_port(do_listen ? conf.listen_addresses : NULL, queue_interval, argv); } #ifdef ENABLE_POP3 -static -void mode_get_daemon(gint get_interval, char *argv[]) +static void +mode_get_daemon(gint get_interval, char *argv[]) { - guint pid; + guint pid; - /* daemon */ - if(!conf.run_as_user){ - if((conf.orig_uid != 0) && (conf.orig_uid != conf.mail_uid)){ - fprintf(stderr, "must be root or %s for daemon.\n", DEF_MAIL_USER); - exit(EXIT_FAILURE); - } - } + /* daemon */ + if (!conf.run_as_user) { + if ((conf.orig_uid != 0) && (conf.orig_uid != conf.mail_uid)) { + fprintf(stderr, "must be root or %s for daemon.\n", DEF_MAIL_USER); + exit(EXIT_FAILURE); + } + } - if((pid = fork()) > 0){ - exit(EXIT_SUCCESS); - }else if(pid < 0){ - logwrite(LOG_ALERT, "could not fork!"); - exit(EXIT_FAILURE); - } + if ((pid = fork()) > 0) { + exit(EXIT_SUCCESS); + } else if (pid < 0) { + logwrite(LOG_ALERT, "could not fork!"); + exit(EXIT_FAILURE); + } - signal(SIGTERM, sigterm_handler); - write_pidfile(PIDFILEDIR"/masqmail-get.pid"); + signal(SIGTERM, sigterm_handler); + write_pidfile(PIDFILEDIR "/masqmail-get.pid"); - conf.do_verbose = FALSE; + conf.do_verbose = FALSE; - fclose(stdin); - fclose(stdout); - fclose(stderr); + fclose(stdin); + fclose(stdout); + fclose(stderr); - get_daemon(get_interval, argv); + get_daemon(get_interval, argv); } #endif #ifdef ENABLE_SMTP_SERVER -static void mode_smtp() +static void +mode_smtp() { - /* accept smtp message on stdin */ - /* write responses to stderr. */ + /* accept smtp message on stdin */ + /* write responses to stderr. */ - struct sockaddr_in saddr; - gchar *peername = NULL; - int dummy = sizeof(saddr); + struct sockaddr_in saddr; + gchar *peername = NULL; + int dummy = sizeof(saddr); #ifdef ENABLE_IDENT - gchar *ident = NULL; + gchar *ident = NULL; #endif - conf.do_verbose = FALSE; + conf.do_verbose = FALSE; - if(!conf.run_as_user){ - seteuid(conf.orig_uid); - setegid(conf.orig_gid); - } + if (!conf.run_as_user) { + seteuid(conf.orig_uid); + setegid(conf.orig_gid); + } - DEBUG(5) debugf("accepting smtp message on stdin\n"); + DEBUG(5) debugf("accepting smtp message on stdin\n"); - if(getpeername(0, (struct sockaddr *)(&saddr), &dummy) == 0){ - peername = g_strdup(inet_ntoa(saddr.sin_addr)); + if (getpeername(0, (struct sockaddr *) (&saddr), &dummy) == 0) { + peername = g_strdup(inet_ntoa(saddr.sin_addr)); #ifdef ENABLE_IDENT - { - gchar *id = NULL; - if((id = (gchar *)ident_id(0, 60))){ - ident = g_strdup(id); - } - } + { + gchar *id = NULL; + if ((id = (gchar *) ident_id(0, 60))) { + ident = g_strdup(id); + } + } #endif - }else if(errno != ENOTSOCK) - exit(EXIT_FAILURE); + } else if (errno != ENOTSOCK) + exit(EXIT_FAILURE); - //smtp_in(stdin, stdout, peername); - smtp_in(stdin, stderr, peername, NULL); + //smtp_in(stdin, stdout, peername); + smtp_in(stdin, stderr, peername, NULL); #ifdef ENABLE_IDENT - if(ident) g_free(ident); + if (ident) + g_free(ident); #endif } #endif -static void mode_accept(address *return_path, gchar *full_sender_name, - guint accept_flags, char **addresses, int addr_cnt) +static void +mode_accept(address * return_path, gchar * full_sender_name, guint accept_flags, char **addresses, int addr_cnt) { - /* accept message on stdin */ - accept_error err; - message *msg = create_message(); - gint i; + /* accept message on stdin */ + accept_error err; + message *msg = create_message(); + gint i; - if(return_path != NULL){ - if((conf.orig_uid != 0) && - (conf.orig_uid != conf.mail_uid) && - (!is_ingroup(conf.orig_uid, conf.mail_gid))){ - fprintf(stderr, - "must be in root, %s or in group %s for setting return path.\n", - DEF_MAIL_USER, DEF_MAIL_GROUP); - exit(EXIT_FAILURE); - } - } + if (return_path != NULL) { + if ((conf.orig_uid != 0) + && (conf.orig_uid != conf.mail_uid) + && (!is_ingroup(conf.orig_uid, conf.mail_gid))) { + fprintf(stderr, "must be in root, %s or in group %s for setting return path.\n", DEF_MAIL_USER, DEF_MAIL_GROUP); + exit(EXIT_FAILURE); + } + } - if(!conf.run_as_user){ - seteuid(conf.orig_uid); - setegid(conf.orig_gid); - } + if (!conf.run_as_user) { + seteuid(conf.orig_uid); + setegid(conf.orig_gid); + } - DEBUG(5) debugf("accepting message on stdin\n"); + DEBUG(5) debugf("accepting message on stdin\n"); - msg->received_prot = PROT_LOCAL; - for(i = 0; i < addr_cnt; i++){ - if(addresses[i][0] != '|') - msg->rcpt_list = - g_list_append(msg->rcpt_list, - create_address_qualified(addresses[i], TRUE, conf.host_name)); - else{ - logwrite(LOG_ALERT, "no pipe allowed as recipient address: %s\n", addresses[i]); - exit(EXIT_FAILURE); - } - } + msg->received_prot = PROT_LOCAL; + for (i = 0; i < addr_cnt; i++) { + if (addresses[i][0] != '|') + msg->rcpt_list = g_list_append(msg->rcpt_list, create_address_qualified(addresses[i], TRUE, conf.host_name)); + else { + logwrite(LOG_ALERT, "no pipe allowed as recipient address: %s\n", addresses[i]); + exit(EXIT_FAILURE); + } + } - /* -f option */ - msg->return_path = return_path; + /* -f option */ + msg->return_path = return_path; - /* -F option */ - msg->full_sender_name = full_sender_name; - - if((err = accept_message(stdin, msg, accept_flags)) == AERR_OK){ - if(spool_write(msg, TRUE)){ - pid_t pid; - logwrite(LOG_NOTICE, "%s <= %s with %s\n", - msg->uid, addr_string(msg->return_path), - prot_names[PROT_LOCAL]); + /* -F option */ + msg->full_sender_name = full_sender_name; - if(!conf.do_queue){ - - if((pid = fork()) == 0){ - - conf.do_verbose = FALSE; - - fclose(stdin); - fclose(stdout); - fclose(stderr); + if ((err = accept_message(stdin, msg, accept_flags)) == AERR_OK) { + if (spool_write(msg, TRUE)) { + pid_t pid; + logwrite(LOG_NOTICE, "%s <= %s with %s\n", msg->uid, addr_string(msg->return_path), prot_names[PROT_LOCAL]); - if(deliver(msg)){ - exit(EXIT_SUCCESS); - }else - exit(EXIT_FAILURE); - }else if(pid < 0){ - logwrite(LOG_ALERT, "could not fork for delivery, id = %s", - msg->uid); + if (!conf.do_queue) { + if ((pid = fork()) == 0) { + conf.do_verbose = FALSE; + fclose(stdin); + fclose(stdout); + fclose(stderr); + if (deliver(msg)) { + exit(EXIT_SUCCESS); + } else + exit(EXIT_FAILURE); + } else if (pid < 0) { + logwrite(LOG_ALERT, "could not fork for delivery, id = %s", msg->uid); + } + } + } else { + fprintf(stderr, "Could not write spool file\n"); + exit(EXIT_FAILURE); + } + } else { + switch (err) { + case AERR_EOF: + fprintf(stderr, "unexpected EOF.\n"); + exit(EXIT_FAILURE); + case AERR_NORCPT: + fprintf(stderr, "no recipients.\n"); + exit(EXIT_FAILURE); + default: + /* should never happen: */ + fprintf(stderr, "Unknown error (%d)\r\n", err); + exit(EXIT_FAILURE); + } + exit(EXIT_FAILURE); } - } - }else{ - fprintf(stderr, "Could not write spool file\n"); - exit(EXIT_FAILURE); - } - }else{ - switch(err){ - case AERR_EOF: - fprintf(stderr, "unexpected EOF.\n"); - exit(EXIT_FAILURE); - case AERR_NORCPT: - fprintf(stderr, "no recipients.\n"); - exit(EXIT_FAILURE); - default: - /* should never happen: */ - fprintf(stderr, "Unknown error (%d)\r\n", err); - exit(EXIT_FAILURE); - } - exit(EXIT_FAILURE); - } } int main(int argc, char *argv[]) { - /* cmd line flags */ - gchar *conf_file = CONF_FILE; - gint arg = 1; - gboolean do_get = FALSE; - gboolean do_get_online = FALSE; + /* cmd line flags */ + gchar *conf_file = CONF_FILE; + gint arg = 1; + gboolean do_get = FALSE; + gboolean do_get_online = FALSE; - gboolean do_listen = FALSE; - gboolean do_runq = FALSE; - gboolean do_runq_online = FALSE; + gboolean do_listen = FALSE; + gboolean do_runq = FALSE; + gboolean do_runq_online = FALSE; - gboolean do_queue = FALSE; - - gboolean do_verbose = FALSE; - gint debug_level = -1; - - mta_mode mta_mode = MODE_ACCEPT; + gboolean do_queue = FALSE; - gint queue_interval = 0; - gint get_interval = 0; - gboolean opt_t = FALSE; - gboolean opt_i = FALSE; - gboolean opt_odb = FALSE; - gboolean opt_oem = FALSE; - gboolean exit_failure = FALSE; + gboolean do_verbose = FALSE; + gint debug_level = -1; - gchar *M_cmd = NULL; + mta_mode mta_mode = MODE_ACCEPT; - gint exit_code = EXIT_SUCCESS; - gchar *route_name = NULL; - gchar *get_name = NULL; - gchar *progname; - gchar *f_address = NULL; - gchar *full_sender_name = NULL; - address *return_path = NULL; /* may be changed by -f option */ - - progname = get_progname(argv[0]); - - if(strcmp(progname, "mailq") == 0) - { mta_mode = MODE_LIST; } - else if(strcmp(progname, "mailrm") == 0) - { mta_mode = MODE_MCMD; M_cmd = "rm"; } - else if(strcmp(progname, "runq") == 0) - { mta_mode = MODE_RUNQUEUE; do_runq = TRUE; } - else if(strcmp(progname, "rmail") == 0) - { mta_mode = MODE_ACCEPT; opt_i = TRUE; } - else if(strcmp(progname, "smtpd") == 0 || strcmp(progname, "in.smtpd") == 0) - { mta_mode = MODE_SMTP; } + gint queue_interval = 0; + gint get_interval = 0; + gboolean opt_t = FALSE; + gboolean opt_i = FALSE; + gboolean opt_odb = FALSE; + gboolean opt_oem = FALSE; + gboolean exit_failure = FALSE; - /* parse cmd line */ - while(arg < argc){ - gint pos = 0; - if((argv[arg][pos] == '-') && (argv[arg][pos+1] != '-')){ - pos++; - switch(argv[arg][pos++]){ - case 'b': - switch(argv[arg][pos++]){ - case 'd': - do_listen = TRUE; - mta_mode = MODE_DAEMON; - break; - case 'i': - /* ignored */ - mta_mode = MODE_BI; - break; - case 's': - mta_mode = MODE_SMTP; - break; - case 'p': - mta_mode = MODE_LIST; - break; - case 'V': - mta_mode = MODE_VERSION; - break; - default: - fprintf(stderr, "unrecognized option '%s'\n", argv[arg]); - exit(EXIT_FAILURE); - } - break; - case 'B': - /* we ignore this and throw the argument away */ - get_optarg(argv, argc, &arg, &pos); - break; - case 'C': - if(!(conf_file = get_optarg(argv, argc, &arg, &pos))){ - fprintf(stderr, "-C requires a filename as argument.\n"); - exit(EXIT_FAILURE); - } - break; - case 'F': - { - full_sender_name = get_optarg(argv, argc, &arg, &pos); - if(!full_sender_name){ - fprintf(stderr, "-F requires a name as an argument\n"); - exit(EXIT_FAILURE); - } - } - break; - case 'd': - if(getuid() == 0){ - char *lvl = get_optarg(argv, argc, &arg, &pos); - if(lvl) - debug_level = atoi(lvl); - else{ - fprintf(stderr, "-d requires a number as an argument.\n"); - exit(EXIT_FAILURE); - } - }else{ - fprintf(stderr, "only root may set the debug level.\n"); - exit(EXIT_FAILURE); + gchar *M_cmd = NULL; + + gint exit_code = EXIT_SUCCESS; + gchar *route_name = NULL; + gchar *get_name = NULL; + gchar *progname; + gchar *f_address = NULL; + gchar *full_sender_name = NULL; + address *return_path = NULL; /* may be changed by -f option */ + + progname = get_progname(argv[0]); + + if (strcmp(progname, "mailq") == 0) { + mta_mode = MODE_LIST; + } else if (strcmp(progname, "mailrm") == 0) { + mta_mode = MODE_MCMD; + M_cmd = "rm"; + } else if (strcmp(progname, "runq") == 0) { + mta_mode = MODE_RUNQUEUE; + do_runq = TRUE; + } else if (strcmp(progname, "rmail") == 0) { + mta_mode = MODE_ACCEPT; + opt_i = TRUE; + } else if (strcmp(progname, "smtpd") == 0 || strcmp(progname, "in.smtpd") == 0) { + mta_mode = MODE_SMTP; } - break; - case 'f': - /* set return path */ - { - gchar *address; - address = get_optarg(argv, argc, &arg, &pos); - if(address){ - f_address = g_strdup(address); - }else{ - fprintf(stderr, "-f requires an address as an argument\n"); - exit(EXIT_FAILURE); - } - } - break; - case 'g': - do_get = TRUE; - if(!mta_mode) mta_mode = MODE_NONE; /* to prevent default MODE_ACCEPT */ - if(argv[arg][pos] == 'o'){ - pos++; - do_get_online = TRUE; - /* can be NULL, then we use online detection method */ - route_name = get_optarg(argv, argc, &arg, &pos); + + /* parse cmd line */ + while (arg < argc) { + gint pos = 0; + if ((argv[arg][pos] == '-') && (argv[arg][pos + 1] != '-')) { + pos++; + switch (argv[arg][pos++]) { + case 'b': + switch (argv[arg][pos++]) { + case 'd': + do_listen = TRUE; + mta_mode = MODE_DAEMON; + break; + case 'i': + /* ignored */ + mta_mode = MODE_BI; + break; + case 's': + mta_mode = MODE_SMTP; + break; + case 'p': + mta_mode = MODE_LIST; + break; + case 'V': + mta_mode = MODE_VERSION; + break; + default: + fprintf(stderr, "unrecognized option '%s'\n", argv[arg]); + exit(EXIT_FAILURE); + } + break; + case 'B': + /* we ignore this and throw the argument away */ + get_optarg(argv, argc, &arg, &pos); + break; + case 'C': + if (!(conf_file = get_optarg(argv, argc, &arg, &pos))) { + fprintf(stderr, "-C requires a filename as argument.\n"); + exit(EXIT_FAILURE); + } + break; + case 'F': + { + full_sender_name = get_optarg(argv, argc, &arg, &pos); + if (!full_sender_name) { + fprintf(stderr, "-F requires a name as an argument\n"); + exit(EXIT_FAILURE); + } + } + break; + case 'd': + if (getuid() == 0) { + char *lvl = get_optarg(argv, argc, &arg, &pos); + if (lvl) + debug_level = atoi(lvl); + else { + fprintf(stderr, "-d requires a number as an argument.\n"); + exit(EXIT_FAILURE); + } + } else { + fprintf(stderr, "only root may set the debug level.\n"); + exit(EXIT_FAILURE); + } + break; + case 'f': + /* set return path */ + { + gchar *address; + address = get_optarg(argv, argc, &arg, &pos); + if (address) { + f_address = g_strdup(address); + } else { + fprintf(stderr, "-f requires an address as an argument\n"); + exit(EXIT_FAILURE); + } + } + break; + case 'g': + do_get = TRUE; + if (!mta_mode) + mta_mode = MODE_NONE; /* to prevent default MODE_ACCEPT */ + if (argv[arg][pos] == 'o') { + pos++; + do_get_online = TRUE; + /* can be NULL, then we use online detection method */ + route_name = get_optarg(argv, argc, &arg, &pos); - if(route_name != NULL){ - if(isdigit(route_name[0])){ - get_interval = time_interval(route_name, &pos); - route_name = get_optarg(argv, argc, &arg, &pos); - mta_mode = MODE_GET_DAEMON; - do_get = FALSE; - } - } - }else{ - if((optarg = get_optarg(argv, argc, &arg, &pos))){ - get_name = get_optarg(argv, argc, &arg, &pos); - } - } - break; - case 'i': - if(argv[arg][pos] == 0){ - opt_i = TRUE; - exit_failure = FALSE; /* may override -oem */ - }else{ - fprintf(stderr, "unrecognized option '%s'\n", argv[arg]); - exit(EXIT_FAILURE); - } - break; - case 'M': - { - mta_mode = MODE_MCMD; - M_cmd = g_strdup(&(argv[arg][pos])); + if (route_name != NULL) { + if (isdigit(route_name[0])) { + get_interval = time_interval(route_name, &pos); + route_name = get_optarg(argv, argc, &arg, &pos); + mta_mode = MODE_GET_DAEMON; + do_get = FALSE; + } + } + } else { + if ((optarg = get_optarg(argv, argc, &arg, &pos))) { + get_name = get_optarg(argv, argc, &arg, &pos); + } + } + break; + case 'i': + if (argv[arg][pos] == 0) { + opt_i = TRUE; + exit_failure = FALSE; /* may override -oem */ + } else { + fprintf(stderr, "unrecognized option '%s'\n", argv[arg]); + exit(EXIT_FAILURE); + } + break; + case 'M': + { + mta_mode = MODE_MCMD; + M_cmd = g_strdup(&(argv[arg][pos])); + } + break; + case 'o': + switch (argv[arg][pos++]) { + case 'e': + if (argv[arg][pos++] == 'm') /* -oem */ + if (!opt_i) + exit_failure = TRUE; + opt_oem = TRUE; + break; + case 'd': + if (argv[arg][pos] == 'b') /* -odb */ + opt_odb = TRUE; + else if (argv[arg][pos] == 'q') /* -odq */ + do_queue = TRUE; + break; + case 'i': + opt_i = TRUE; + exit_failure = FALSE; /* may override -oem */ + break; + } + break; + + case 'q': + { + gchar *optarg; + + do_runq = TRUE; + mta_mode = MODE_RUNQUEUE; + if (argv[arg][pos] == 'o') { + pos++; + do_runq = FALSE; + do_runq_online = TRUE; + /* can be NULL, then we use online detection method */ + route_name = get_optarg(argv, argc, &arg, &pos); + } else + if ((optarg = get_optarg(argv, argc, &arg, &pos))) { + mta_mode = MODE_DAEMON; + queue_interval = time_interval(optarg, &pos); + } + } + break; + case 't': + if (argv[arg][pos] == 0) { + opt_t = TRUE; + } else { + fprintf(stderr, "unrecognized option '%s'\n", argv[arg]); + exit(EXIT_FAILURE); + } + break; + case 'v': + do_verbose = TRUE; + break; + default: + fprintf(stderr, "unrecognized option '%s'\n", argv[arg]); + exit(EXIT_FAILURE); + } + } else { + if (argv[arg][pos + 1] == '-') { + if (argv[arg][pos + 2] != '\0') { + fprintf(stderr, "unrecognized option '%s'\n", argv[arg]); + exit(EXIT_FAILURE); + } + arg++; + } + break; + } + arg++; } - break; - case 'o': - switch(argv[arg][pos++]){ - case 'e': - if(argv[arg][pos++] == 'm') /* -oem */ - if(!opt_i) exit_failure = TRUE; - opt_oem = TRUE; - break; - case 'd': - if(argv[arg][pos] == 'b') /* -odb */ - opt_odb = TRUE; - else if(argv[arg][pos] == 'q') /* -odq */ - do_queue = TRUE; - break; - case 'i': - opt_i = TRUE; - exit_failure = FALSE; /* may override -oem */ - break; - } - break; - - case 'q': - { - gchar *optarg; - do_runq = TRUE; - mta_mode = MODE_RUNQUEUE; - if(argv[arg][pos] == 'o'){ - pos++; - do_runq = FALSE; - do_runq_online = TRUE; - /* can be NULL, then we use online detection method */ - route_name = get_optarg(argv, argc, &arg, &pos); - }else if((optarg = get_optarg(argv, argc, &arg, &pos))){ - mta_mode = MODE_DAEMON; - queue_interval = time_interval(optarg, &pos); - } - } - break; - case 't': - if(argv[arg][pos] == 0){ - opt_t = TRUE; - }else{ - fprintf(stderr, "unrecognized option '%s'\n", argv[arg]); - exit(EXIT_FAILURE); - } - break; - case 'v': - do_verbose = TRUE; - break; - default: - fprintf(stderr, "unrecognized option '%s'\n", argv[arg]); - exit(EXIT_FAILURE); - } - }else{ - if(argv[arg][pos+1] == '-'){ - if(argv[arg][pos+2] != '\0'){ - fprintf(stderr, "unrecognized option '%s'\n", argv[arg]); - exit(EXIT_FAILURE); - } - arg++; - } - break; - } - arg++; - } + if (mta_mode == MODE_VERSION) { + gchar *with_resolver = "", *with_smtp_server = "", *with_pop3 = "", + *with_auth = "", *with_maildir = "", *with_ident = "", *with_mserver = ""; - if(mta_mode == MODE_VERSION){ - gchar *with_resolver = "", *with_smtp_server = "", *with_pop3 = "", *with_auth = "", - *with_maildir = "", *with_ident = "", *with_mserver = ""; - #ifdef ENABLE_RESOLVER - with_resolver = " +resolver"; + with_resolver = " +resolver"; #endif #ifdef ENABLE_SMTP_SERVER - with_smtp_server = " +smtp-server"; + with_smtp_server = " +smtp-server"; #endif #ifdef ENABLE_POP3 - with_pop3 = " +pop3"; + with_pop3 = " +pop3"; #endif #ifdef ENABLE_AUTH - with_auth = " +auth"; + with_auth = " +auth"; #endif #ifdef ENABLE_MAILDIR - with_maildir = " +maildir"; + with_maildir = " +maildir"; #endif #ifdef ENABLE_IDENT - with_ident = " +ident"; + with_ident = " +ident"; #endif #ifdef ENABLE_MSERVER - with_mserver = " +mserver"; + with_mserver = " +mserver"; #endif - printf("%s %s%s%s%s%s%s%s%s\n", PACKAGE, VERSION, - with_resolver, with_smtp_server, with_pop3, with_auth, - with_maildir, with_ident, with_mserver); - - exit(EXIT_SUCCESS); - } + printf("%s %s%s%s%s%s%s%s%s\n", PACKAGE, VERSION, with_resolver, with_smtp_server, + with_pop3, with_auth, with_maildir, with_ident, with_mserver); + + exit(EXIT_SUCCESS); + } + + /* initialize random generator */ + srand(time(NULL)); + /* ignore SIGPIPE signal */ + signal(SIGPIPE, SIG_IGN); - /* initialize random generator */ - srand(time(NULL)); - /* ignore SIGPIPE signal */ - signal(SIGPIPE, SIG_IGN); + /* close all possibly open file descriptors */ + { + int i, max_fd = sysconf(_SC_OPEN_MAX); - /* close all possibly open file descriptors */ - { - int i, max_fd = sysconf(_SC_OPEN_MAX); + if (max_fd <= 0) + max_fd = 64; + for (i = 3; i < max_fd; i++) + close(i); + } - if(max_fd <= 0) max_fd = 64; - for(i = 3; i < max_fd; i++) - close(i); - } - - init_conf(); + init_conf(); - /* if we are not privileged, and the config file was changed we - implicetely set the the run_as_user flag and give up all - privileges. + /* if we are not privileged, and the config file was changed we + implicetely set the the run_as_user flag and give up all + privileges. - So it is possible for a user to run his own daemon without - breaking security. - */ - if(strcmp(conf_file, CONF_FILE) != 0){ - if(conf.orig_uid != 0){ - conf.run_as_user = TRUE; - seteuid(conf.orig_uid); - setegid(conf.orig_gid); - setuid(conf.orig_uid); - setgid(conf.orig_gid); - } - } + So it is possible for a user to run his own daemon without + breaking security. + */ + if (strcmp(conf_file, CONF_FILE) != 0) { + if (conf.orig_uid != 0) { + conf.run_as_user = TRUE; + seteuid(conf.orig_uid); + setegid(conf.orig_gid); + setuid(conf.orig_uid); + setgid(conf.orig_gid); + } + } - read_conf(conf_file); + read_conf(conf_file); - if(do_queue) conf.do_queue = TRUE; - if(do_verbose) conf.do_verbose = TRUE; - if(debug_level >= 0) /* if >= 0, it was given by argument */ - conf.debug_level = debug_level; + if (do_queue) + conf.do_queue = TRUE; + if (do_verbose) + conf.do_verbose = TRUE; + if (debug_level >= 0) /* if >= 0, it was given by argument */ + conf.debug_level = debug_level; - chdir("/"); + chdir("/"); - if(!conf.run_as_user){ - if(setgid(0) != 0){ - fprintf(stderr, - "could not set gid to 0. Is the setuid bit set? : %s\n", - strerror(errno)); - exit(EXIT_FAILURE); - } - if(setuid(0) != 0){ - fprintf(stderr, - "could not gain root privileges. Is the setuid bit set? : %s\n", - strerror(errno)); - exit(EXIT_FAILURE); - } - } + if (!conf.run_as_user) { + if (setgid(0) != 0) { + fprintf(stderr, "could not set gid to 0. Is the setuid bit set? : %s\n", strerror(errno)); + exit(EXIT_FAILURE); + } + if (setuid(0) != 0) { + fprintf(stderr, "could not gain root privileges. Is the setuid bit set? : %s\n", strerror(errno)); + exit(EXIT_FAILURE); + } + } - if(!logopen()){ - fprintf(stderr, "could not open log file\n"); - exit(EXIT_FAILURE); - } + if (!logopen()) { + fprintf(stderr, "could not open log file\n"); + exit(EXIT_FAILURE); + } - DEBUG(1) debugf("masqmail %s starting\n", VERSION); + DEBUG(1) debugf("masqmail %s starting\n", VERSION); - DEBUG(5){ - gchar **str = argv; - debugf("args: \n"); - while(*str){ - debugf("%s \n", *str); - str++; - } - } - DEBUG(5) debugf("queue_interval = %d\n", queue_interval); + DEBUG(5) { + gchar **str = argv; + debugf("args: \n"); + while (*str) { + debugf("%s \n", *str); + str++; + } + } + DEBUG(5) debugf("queue_interval = %d\n", queue_interval); - if(f_address){ - return_path = create_address_qualified(f_address, TRUE, conf.host_name); - g_free(f_address); - if(!return_path){ - fprintf(stderr, "invalid RFC821 address: %s\n", f_address); - exit(EXIT_FAILURE); - } - } - - if(do_get){ -#ifdef ENABLE_POP3 - if((mta_mode == MODE_NONE) || (mta_mode == MODE_RUNQUEUE)){ - - set_identity(conf.orig_uid, "getting mail"); + if (f_address) { + return_path = create_address_qualified(f_address, TRUE, conf.host_name); + g_free(f_address); + if (!return_path) { + fprintf(stderr, "invalid RFC821 address: %s\n", f_address); + exit(EXIT_FAILURE); + } + } - if(do_get_online){ - if(route_name != NULL){ - conf.online_detect = g_strdup("argument"); - set_online_name(route_name); + if (do_get) { +#ifdef ENABLE_POP3 + if ((mta_mode == MODE_NONE) || (mta_mode == MODE_RUNQUEUE)) { + set_identity(conf.orig_uid, "getting mail"); + if (do_get_online) { + if (route_name != NULL) { + conf.online_detect = g_strdup("argument"); + set_online_name(route_name); + } + get_online(); + } else { + if (get_name) + get_from_name(get_name); + else + get_all(); + } + } else { + logwrite(LOG_ALERT, "get (-g) only allowed alone or together with queue run (-q)\n"); + } +#else + fprintf(stderr, "get (pop) support not compiled in\n"); +#endif } - get_online(); - }else{ - if(get_name) - get_from_name(get_name); - else - get_all(); - } - }else{ - logwrite(LOG_ALERT, "get (-g) only allowed alone or together with queue run (-q)\n"); - } -#else - fprintf(stderr, "get (pop) support not compiled in\n"); -#endif - } - switch(mta_mode){ - case MODE_DAEMON: - mode_daemon(do_listen, queue_interval, argv); - break; - case MODE_RUNQUEUE: - { - /* queue runs */ - set_identity(conf.orig_uid, "queue run"); + switch (mta_mode) { + case MODE_DAEMON: + mode_daemon(do_listen, queue_interval, argv); + break; + case MODE_RUNQUEUE: + { + /* queue runs */ + set_identity(conf.orig_uid, "queue run"); + + if (do_runq) + exit_code = queue_run() ? EXIT_SUCCESS : EXIT_FAILURE; - if(do_runq) - exit_code = queue_run() ? EXIT_SUCCESS : EXIT_FAILURE; - - if(do_runq_online){ - if(route_name != NULL){ - conf.online_detect = g_strdup("argument"); - set_online_name(route_name); - } - exit_code = queue_run_online() ? EXIT_SUCCESS : EXIT_FAILURE; - } - } - break; - case MODE_GET_DAEMON: + if (do_runq_online) { + if (route_name != NULL) { + conf.online_detect = g_strdup("argument"); + set_online_name(route_name); + } + exit_code = + queue_run_online() ? EXIT_SUCCESS : EXIT_FAILURE; + } + } + break; + case MODE_GET_DAEMON: #ifdef ENABLE_POP3 - if(route_name != NULL){ - conf.online_detect = g_strdup("argument"); - set_online_name(route_name); - } - mode_get_daemon(get_interval, argv); + if (route_name != NULL) { + conf.online_detect = g_strdup("argument"); + set_online_name(route_name); + } + mode_get_daemon(get_interval, argv); #endif - break; + break; - case MODE_SMTP: + case MODE_SMTP: #ifdef ENABLE_SMTP_SERVER - mode_smtp(); + mode_smtp(); #else - fprintf(stderr, "smtp server support not compiled in\n"); + fprintf(stderr, "smtp server support not compiled in\n"); #endif - break; - case MODE_LIST: + break; - queue_list(); - break; + case MODE_LIST: + queue_list(); + break; - case MODE_BI: - - exit(EXIT_SUCCESS); - break; /* well... */ - - case MODE_MCMD: - if(strcmp(M_cmd, "rm") == 0){ - gboolean ok = FALSE; + case MODE_BI: + exit(EXIT_SUCCESS); + break; /* well... */ - set_euidgid(conf.mail_uid, conf.mail_gid, NULL, NULL); + case MODE_MCMD: + if (strcmp(M_cmd, "rm") == 0) { + gboolean ok = FALSE; + + set_euidgid(conf.mail_uid, conf.mail_gid, NULL, NULL); - if(is_privileged_user(conf.orig_uid)){ - for(; arg < argc; arg++){ - if(queue_delete(argv[arg])) - ok = TRUE; - } - }else{ - struct passwd *pw = getpwuid(conf.orig_uid); - if(pw){ - for(; arg < argc; arg++){ - message *msg = msg_spool_read(argv[arg], FALSE); + if (is_privileged_user(conf.orig_uid)) { + for (; arg < argc; arg++) { + if (queue_delete(argv[arg])) + ok = TRUE; + } + } else { + struct passwd *pw = getpwuid(conf.orig_uid); + if (pw) { + for (; arg < argc; arg++) { + message *msg = msg_spool_read(argv[arg], FALSE); #ifdef ENABLE_IDENT - if(((msg->received_host == NULL) && (msg->received_prot == PROT_LOCAL)) || - is_in_netlist(msg->received_host, conf.ident_trusted_nets)){ + if (((msg->received_host == NULL) && (msg->received_prot == PROT_LOCAL)) + || is_in_netlist(msg->received_host, conf.ident_trusted_nets)) { #else - if((msg->received_host == NULL) && (msg->received_prot == PROT_LOCAL)){ + if ((msg->received_host == NULL) && (msg->received_prot == PROT_LOCAL)) { #endif - if(msg->ident){ - if(strcmp(pw->pw_name, msg->ident) == 0){ - if(queue_delete(argv[arg])) - ok = TRUE; - }else{ - fprintf(stderr, "you do not own message id %s\n", argv[arg]); + if (msg->ident) { + if (strcmp(pw->pw_name, msg->ident) == 0) { + if (queue_delete(argv[arg])) + ok = TRUE; + } else { + fprintf(stderr, "you do not own message id %s\n", argv[arg]); + } + } else + fprintf(stderr, "message %s does not have an ident.\n", argv[arg]); + } else { + fprintf(stderr, "message %s was not received locally or from a trusted network.\n", argv[arg]); + } + } + } else { + fprintf(stderr, "could not find a passwd entry for uid %d: %s\n", conf.orig_uid, strerror(errno)); + } + } + exit(ok ? EXIT_SUCCESS : EXIT_FAILURE); + } else { + fprintf(stderr, "unknown command %s\n", M_cmd); + exit(EXIT_FAILURE); } - }else - fprintf(stderr, "message %s does not have an ident.\n", argv[arg]); - }else{ - fprintf(stderr, "message %s was not received locally or from a trusted network.\n", argv[arg]); - } - } - }else{ - fprintf(stderr, "could not find a passwd entry for uid %d: %s\n", conf.orig_uid, strerror(errno)); - } - } - exit(ok ? EXIT_SUCCESS : EXIT_FAILURE); - }else{ - fprintf(stderr, "unknown command %s\n", M_cmd); - exit(EXIT_FAILURE); - } - break; + break; - case MODE_ACCEPT: - { - guint accept_flags = - (opt_t ? ACC_DEL_RCPTS|ACC_DEL_BCC|ACC_RCPT_FROM_HEAD : ACC_HEAD_FROM_RCPT) | - (opt_i ? ACC_NODOT_TERM : ACC_NODOT_RELAX); - - mode_accept(return_path, full_sender_name, accept_flags, &(argv[arg]), argc - arg); + case MODE_ACCEPT: + { + guint accept_flags = (opt_t ? ACC_DEL_RCPTS | ACC_DEL_BCC | ACC_RCPT_FROM_HEAD : ACC_HEAD_FROM_RCPT) + | (opt_i ? ACC_NODOT_TERM : ACC_NODOT_RELAX); + mode_accept(return_path, full_sender_name, accept_flags, &(argv[arg]), argc - arg); + exit(exit_failure ? EXIT_FAILURE : EXIT_SUCCESS); + } + break; + case MODE_NONE: + break; + default: + fprintf(stderr, "unknown mode: %d\n", mta_mode); + break; + } - exit(exit_failure ? EXIT_FAILURE : EXIT_SUCCESS); - } - break; - case MODE_NONE: - break; - default: - fprintf(stderr, "unknown mode: %d\n", mta_mode); - break; - } - - logclose(); + logclose(); - exit(exit_code); + exit(exit_code); }