diff options
author | Sergey Poznyakoff <gray@gnu.org.ua> | 2012-03-17 13:45:03 +0200 |
---|---|---|
committer | Sergey Poznyakoff <gray@gnu.org.ua> | 2012-03-17 13:58:15 +0200 |
commit | e75e9123344ff44bacdbe28d071411e6799384ec (patch) | |
tree | 15679d8e709aa2ccec6403bb6daa24fb0a4c956d /pop3d | |
parent | da65d5004f890d58e054a1c878fb3af634f47262 (diff) | |
download | mailutils-e75e9123344ff44bacdbe28d071411e6799384ec.tar.gz mailutils-e75e9123344ff44bacdbe28d071411e6799384ec.tar.bz2 |
Implement session ID for TCP/UDP servers.
* imap4d/imap4d.c (set_strerr_flt,clr_strerr_flt): New functions.
(imap4d_connection): Setup session prefix in strerr if
mu_log_session_id is set.
* imap4d/io.c (io_setio): Bugfix: unref debug stream.
* pop3d/extra.c (pop3d_setio): Likewise.
* pop3d/pop3d.c (set_strerr_flt,clr_strerr_flt): New functions.
(pop3d_connection): Setup session prefix in strerr if
mu_log_session_id is set.
* include/mailutils/acl.h (mu_acl_setenv)
(mu_acl_getenv,mu_acl_set_session_id): New functions.
* include/mailutils/server.h (mu_session_id): New extern.
(mu_m_server_configured_count): Fix signature.
* include/mailutils/syslog.h (mu_log_session_id): New extern.
* libmailutils/diag/syslog.c (mu_log_session_id): New global.
* libmailutils/server/acl.c (_mu_acl) <envv,envc,envn>: New
members.
(run_closure) <env>: New member.
(mu_acl_destroy): Free environment.
(_acl_match): Handle "family" variable.
(expand_arg): Propagate ACL environment to wordsplit.
(mu_acl_check_sockaddr): Propagate ACL environment.
(mu_acl_setenv)
(mu_acl_getenv,mu_acl_set_session_id): New functions.
* libmailutils/server/ipsrv.c (mu_ip_tcp_accept): Store session ID
in the ACL.
(mu_ip_udp_accept): Likewise.
* libmailutils/server/msrv.c (mu_m_server_configured_count): Fix
signature.
(mu_m_server_check_acl): Store session ID in the ACL.
* libmailutils/server/server.c (mu_session_id): New global variable.
(connection_loop): Increment session ID
(mu_acl_set_session_id): New function.
* libmailutils/stream/fltstream.c (filter_ctl): Handle
MU_IOCTL_SUBSTREAM.
* libmailutils/stream/logstream.c (_log_ctl): Likewise.
* libmu_cfg/common.c (mu_logging_param) <session-id>: New statement.
Diffstat (limited to 'pop3d')
-rw-r--r-- | pop3d/extra.c | 1 | ||||
-rw-r--r-- | pop3d/pop3d.c | 73 |
2 files changed, 74 insertions, 0 deletions
diff --git a/pop3d/extra.c b/pop3d/extra.c index b06c2dc52..f225d4f18 100644 --- a/pop3d/extra.c +++ b/pop3d/extra.c @@ -185,6 +185,7 @@ pop3d_setio (int ifd, int ofd, int tls) else { rc = mu_xscript_stream_create (&xstr, iostream, dstr, NULL); + mu_stream_unref (dstr); if (rc) mu_error (_("cannot create transcript stream: %s"), mu_strerror (rc)); diff --git a/pop3d/pop3d.c b/pop3d/pop3d.c index 3fe6c4ed7..223db3560 100644 --- a/pop3d/pop3d.c +++ b/pop3d/pop3d.c @@ -366,17 +366,90 @@ pop3d_mainloop (int ifd, int ofd, int tls) return status; } +static int +set_strerr_flt () +{ + mu_stream_t flt, trans[2]; + int rc; + + rc = mu_stream_ioctl (mu_strerr, MU_IOCTL_SUBSTREAM, MU_IOCTL_OP_GET, trans); + if (rc == 0) + { + char sessidstr[10]; + char *argv[] = { "inline-comment", NULL, "-S", NULL }; + + snprintf (sessidstr, sizeof sessidstr, "%08lx:", mu_session_id); + argv[1] = sessidstr; + rc = mu_filter_create_args (&flt, trans[0], "inline-comment", 3, + (const char **)argv, + MU_FILTER_ENCODE, MU_STREAM_WRITE); + mu_stream_unref (trans[0]); + if (rc == 0) + { + mu_stream_set_buffer (flt, mu_buffer_line, 0); + trans[0] = flt; + trans[1] = NULL; + rc = mu_stream_ioctl (mu_strerr, MU_IOCTL_SUBSTREAM, + MU_IOCTL_OP_SET, trans); + mu_stream_unref (trans[0]); + if (rc) + mu_error (_("%s failed: %s"), "MU_IOCTL_SET_STREAM", + mu_stream_strerror (mu_strerr, rc)); + } + else + mu_error (_("cannot create log filter stream: %s"), mu_strerror (rc)); + } + else + { + mu_error (_("%s failed: %s"), "MU_IOCTL_GET_STREAM", + mu_stream_strerror (mu_strerr, rc)); + } + return rc; +} + +static void +clr_strerr_flt () +{ + mu_stream_t flt, trans[2]; + int rc; + + rc = mu_stream_ioctl (mu_strerr, MU_IOCTL_SUBSTREAM, MU_IOCTL_OP_GET, trans); + if (rc == 0) + { + flt = trans[0]; + + rc = mu_stream_ioctl (flt, MU_IOCTL_SUBSTREAM, MU_IOCTL_OP_GET, trans); + if (rc == 0) + { + mu_stream_unref (trans[0]); + rc = mu_stream_ioctl (mu_strerr, MU_IOCTL_SUBSTREAM, + MU_IOCTL_OP_SET, trans); + if (rc == 0) + mu_stream_unref (flt); + } + } +} + int pop3d_connection (int fd, struct sockaddr *sa, int salen, struct mu_srv_config *pconf, void *data) { struct pop3d_srv_config *cfg = (struct pop3d_srv_config *) pconf; + int rc; idle_timeout = pconf->timeout; pop3d_transcript = pconf->transcript; + if (mu_log_session_id) + rc = set_strerr_flt (); + else + rc = 1; + pop3d_mainloop (fd, fd, cfg->tls); + + if (rc == 0) + clr_strerr_flt (); return 0; } |