107 #include <sys/stat.h>
177 static char *postdrop_path;
181 static void postdrop_sig(
int sig)
197 if (signal(SIGINT, SIG_IGN) != SIG_IGN) {
198 (void) signal(SIGQUIT, SIG_IGN);
199 (void) signal(SIGTERM, SIG_IGN);
200 (void) signal(SIGHUP, SIG_IGN);
202 (void)
remove(postdrop_path);
213 static void postdrop_cleanup(
void)
222 int main(
int argc,
char **argv)
231 static char *segment_info[] = {
235 uid_t uid = getuid();
237 const char *error_text;
242 struct timeval start;
246 int validate_input = 1;
263 for (fd = 0; fd < 3; fd++)
264 if (
fstat(fd, &st) == -1
265 && (close(fd), open(
"/dev/null", O_RDWR, 0)) != fd)
271 argv[0] =
"postdrop";
287 while ((c =
GETOPT(argc, argv,
"c:rv")) > 0) {
300 msg_fatal(
"usage: %s [-c config_dir] [-v]", argv[0]);
325 msg_fatal(
"User %s(%ld) is not allowed to submit mail",
357 signal(SIGPIPE, SIG_IGN);
358 signal(SIGXFSZ, SIG_IGN);
360 signal(SIGINT, postdrop_sig);
361 signal(SIGQUIT, postdrop_sig);
362 if (signal(SIGTERM, SIG_IGN) == SIG_DFL)
363 signal(SIGTERM, postdrop_sig);
364 if (signal(SIGHUP, SIG_IGN) == SIG_DFL)
365 signal(SIGHUP, postdrop_sig);
373 GETTIMEOFDAY(&start);
404 expected = segment_info;
413 if (
remove(postdrop_path))
414 msg_warn(
"uid=%ld: remove %s: %m", (
long) uid, postdrop_path);
416 msg_info(
"remove %s", postdrop_path);
422 msg_fatal(
"uid=%ld: malformed input", (
long) uid);
423 if (strchr(*expected, rec_type) == 0)
424 msg_fatal(
"uid=%ld: unexpected record type: %d", (
long) uid, rec_type);
425 if (rec_type == **expected)
438 &attr_value)) != 0) {
439 msg_warn(
"uid=%ld: ignoring malformed record: %s: %.200s",
443 #define STREQ(x,y) (strcmp(x,y) == 0)
457 attr_name, attr_value);
459 msg_warn(
"uid=%ld: ignoring attribute record: %.200s=%.200s",
460 (
long) uid, attr_name, attr_value);
471 msg_fatal(
"uid=%ld: malformed input", (
long) uid);
498 if (validate_input && (from_count == 0 || rcpt_count == 0)) {
507 msg_warn(
"uid=%ld: %m", (
long) uid);
516 junk = postdrop_path;
int mail_stream_finish(MAIL_STREAM *info, VSTRING *why)
#define MAIL_ATTR_DSN_NOTIFY
#define MAIL_ATTR_TRACE_FLAGS
const char * mail_task(const char *argv0)
MAIL_STREAM * mail_stream_file(const char *queue, const char *class, const char *service, int mode)
char * mystrdup(const char *str)
#define MAIL_ATTR_ENCODING
char * var_import_environ
void mail_stream_cleanup(MAIL_STREAM *info)
void set_mail_conf_str(const char *, const char *)
ARGV * argv_free(ARGV *argvp)
#define VAR_IMPORT_ENVIRON
#define MAIL_ATTR_RWR_CONTEXT
#define MAIL_ATTR_RWR_LOCAL
void set_file_limit(off_t limit)
#define MAIL_ATTR_RWR_REMOTE
int main(int argc, char **argv)
const char * split_nameval(char *buf, char **name, char **value)
void mail_conf_read(void)
off_t get_file_limit(void)
void clean_env(char **preserve_list)
#define MAIL_CLASS_PUBLIC
#define REC_PUT_BUF(v, t, b)
int rec_get_raw(VSTREAM *stream, VSTRING *buf, ssize_t maxsize, int flags)
#define MAIL_ATTR_ENC_NONE
#define REC_TYPE_POST_ENVELOPE
ARGV * mail_parm_split(const char *name, const char *value)
#define REC_TYPE_TIME_FORMAT
void msg_warn(const char *fmt,...)
VSTRING * vstring_alloc(ssize_t len)
void mail_dict_init(void)
#define MAIL_VERSION_STAMP_ALLOCATE
#define MAIL_ATTR_DSN_ENVID
#define SEND_ATTR_INT(name, val)
int rec_attr_map(const char *attr_name)
#define MAIL_QUEUE_MAILDROP
void get_mail_conf_str_table(const CONFIG_STR_TABLE *)
NORETURN msg_fatal(const char *fmt,...)
char * var_pickup_service
#define MAIL_VERSION_CHECK
int vstream_fflush(VSTREAM *stream)
#define GETOPT(argc, argv, str)
void msg_syslog_init(const char *name, int logopt, int facility)
MAIL_VERSION_STAMP_DECLARE
#define REC_TYPE_POST_CONTENT
VSTRING * vstring_free(VSTRING *vp)
const char * check_user_acl_byuid(const char *pname, const char *acl, uid_t uid)
void msg_vstream_init(const char *name, VSTREAM *vp)
#define CA_VSTREAM_CTL_END
#define REC_TYPE_POST_EXTRACT
#define CA_VSTREAM_CTL_PATH(v)
#define MAIL_ATTR_QUEUEID
void vstream_control(VSTREAM *stream, int name,...)
#define MAIL_ATTR_ENC_8BIT
int rec_fprintf(VSTREAM *stream, int type, const char *format,...)
#define SEND_ATTR_STR(name, val)
MSG_CLEANUP_FN msg_cleanup(MSG_CLEANUP_FN cleanup_fn)
#define REC_TYPE_TIME_ARG(tv)
#define MAIL_ATTR_ENC_7BIT
void msg_info(const char *fmt,...)