diff -urN imap-2001a.RELEASE-CANDIDATE.2.orig/Makefile imap-2001a.RELEASE-CANDIDATE.2/Makefile --- imap-2001a.RELEASE-CANDIDATE.2.orig/Makefile Fri Oct 19 18:53:15 2001 +++ imap-2001a.RELEASE-CANDIDATE.2/Makefile Mon Oct 29 17:46:41 2001 @@ -211,8 +211,12 @@ # years. The Orthodox and Gregorian calendars diverge by 1 day for # gradually-increasing intervals, starting at 2800-2900, and becoming # permanent at 48,300. +# +# -DVERBOSELOG +# Improved syslog which gives lots of performance stats on each imap +# connection (by Jauder Ho, http://www.carumba.com/talk/imap/) -EXTRACFLAGS= +EXTRACFLAGS=-DVERBOSELOG # Extra linker flags (additional/alternative libraries, etc.) diff -urN imap-2001a.RELEASE-CANDIDATE.2.orig/src/imapd/imapd.c imap-2001a.RELEASE-CANDIDATE.2/src/imapd/imapd.c --- imap-2001a.RELEASE-CANDIDATE.2.orig/src/imapd/imapd.c Fri Sep 28 17:52:18 2001 +++ imap-2001a.RELEASE-CANDIDATE.2/src/imapd/imapd.c Wed Oct 24 17:22:18 2001 @@ -49,6 +49,11 @@ #define MAXCLIENTLIT 10000 /* maximum non-APPEND client literal size */ #define TMPLEN 8192 /* size of temporary buffers */ +#ifdef VERBOSELOG +#include +#include +#include +#endif /* Server states */ @@ -209,6 +214,11 @@ char *lastsel = NIL; /* last selected mailbox name */ SIZEDTEXT lastst = {NIL,0}; /* last sizedtext */ +#ifdef VERBOSELOG +time_t *timer; /* timer */ +time_t starttime; /* record start time of process */ +double uutime,sstime; /* user and system time */ +#endif /* Response texts which appear in multiple places */ @@ -242,6 +252,9 @@ char *s,*t,*u,*v,tmp[MAILTMPLEN]; struct stat sbuf; time_t autologouttime = 0; +#ifdef VERBOSELOG + struct rusage sysinfo; +#endif #include "linkage.c" rfc822_date (tmp); /* get date/time at startup */ /* initialize server */ @@ -273,6 +286,9 @@ default: fatal ("Unknown state from myusername_full()"); } +#ifdef VERBOSELOG + starttime = time(timer); +#endif PSOUT ("] "); if (user) { /* preauthenticated as someone? */ PSOUT ("Pre-authenticated user "); @@ -1203,6 +1219,34 @@ } syslog (LOG_INFO,"Logout user=%.80s host=%.80s",user ? user : "???", tcp_clienthost ()); +#ifdef VERBOSELOG + /* This is for additional logging information so that we can do analysis */ + getrusage(RUSAGE_SELF,&sysinfo); + + uutime = (double) sysinfo.ru_utime.tv_sec + + sysinfo.ru_utime.tv_usec / 1000000.0; + sstime = (double) sysinfo.ru_stime.tv_sec + + sysinfo.ru_stime.tv_usec / 1000000.0; + + syslog (LOG_INFO,"u %s from %s start %d et %d ut %.3f st %.3f mss %ld iss %ld minf %ld majf %ld sw %ld bi %ld bo %ld mi %ld mo %ld nsig %ld vcs %ld ics %ld", user ? user : "???", + tcp_clienthost (), + starttime, + time(timer) - starttime, + uutime, + sstime, + sysinfo.ru_maxrss, + sysinfo.ru_idrss, + sysinfo.ru_minflt, + sysinfo.ru_majflt, + sysinfo.ru_nswap, + sysinfo.ru_inblock, + sysinfo.ru_oublock, + sysinfo.ru_msgrcv, + sysinfo.ru_msgsnd, + sysinfo.ru_nsignals, + sysinfo.ru_nvcsw, + sysinfo.ru_nivcsw); +#endif return 0; /* all done */ } @@ -1444,12 +1488,43 @@ void clkint (void) { +#ifdef VERBOSELOG + struct rusage sysinfo; +#endif alarm (0); /* disable all interrupts */ server_init (NIL,NIL,NIL,NIL,SIG_IGN,SIG_IGN,SIG_IGN,SIG_IGN); if (!quell_events) PSOUT ("* BYE Autologout; idle for too long\015\012"); syslog (LOG_INFO,"Autologout user=%.80s host=%.80s",user ? user : "???", tcp_clienthost ()); +#ifdef VERBOSELOG + /* This is for additional logging information so that we can do analysis */ + getrusage(RUSAGE_SELF,&sysinfo); + + uutime = (double) sysinfo.ru_utime.tv_sec + + sysinfo.ru_utime.tv_usec / 1000000.0; + sstime = (double) sysinfo.ru_stime.tv_sec + + sysinfo.ru_stime.tv_usec / 1000000.0; + + syslog (LOG_INFO,"u %s from %s start %d et %d ut %.3f st %.3f mss %ld iss %ld minf %ld majf %ld sw %ld bi %ld bo %ld mi %ld mo %ld nsig %ld vcs %ld ics %ld", user ? user : "???", + tcp_clienthost (), + starttime, + time(timer) - starttime, + uutime, + sstime, + sysinfo.ru_maxrss, + sysinfo.ru_idrss, + sysinfo.ru_minflt, + sysinfo.ru_majflt, + sysinfo.ru_nswap, + sysinfo.ru_inblock, + sysinfo.ru_oublock, + sysinfo.ru_msgrcv, + sysinfo.ru_msgsnd, + sysinfo.ru_nsignals, + sysinfo.ru_nvcsw, + sysinfo.ru_nivcsw); +#endif PFLUSH (); /* make sure output blatted */ if (critical) state = LOGOUT; /* must defer if in critical code */ else { /* try to close stream gracefully */