diff -Nur dovecot-1.1.7+patches9-10/COPYING dovecot-patch/COPYING --- dovecot-1.1.7+patches9-10/COPYING 2009-01-06 16:26:35.000000000 -0600 +++ dovecot-patch/COPYING 2009-01-06 16:28:35.000000000 -0600 @@ -81,6 +81,7 @@ src/auth/passdb-od.c src/auth/userdb-od.c src/mail-common/* +src/lib/dtrace-dovecot.d Copyright (c) 2008 Apple Inc. All rights reserved. diff -Nur dovecot-1.1.7+patches9-10/configure.in dovecot-patch/configure.in --- dovecot-1.1.7+patches9-10/configure.in 2009-01-06 16:26:35.000000000 -0600 +++ dovecot-patch/configure.in 2009-01-06 16:28:51.000000000 -0600 @@ -30,6 +30,7 @@ AC_DEFINE(MAC_OS_X,, APPLE) AC_DEFINE(APPLE_OS_X_SERVER,, APPLE) fi +AM_CONDITIONAL(APPLE_OS_X_SERVER, test "$enable_apple" = "yes") AC_ARG_ENABLE(ipv6, [ --enable-ipv6 Enable IPv6 support (auto)], diff -Nur dovecot-1.1.7+patches9-10/src/auth/db-od.c dovecot-patch/src/auth/db-od.c --- dovecot-1.1.7+patches9-10/src/auth/db-od.c 2009-01-06 16:26:31.000000000 -0600 +++ dovecot-patch/src/auth/db-od.c 2009-01-06 16:29:12.000000000 -0600 @@ -42,6 +42,10 @@ #include "str.h" #include "var-expand.h" +#ifdef APPLE_OS_X_SERVER +#include "dtrace-dovecot.h" +#endif + #include #include #include @@ -600,6 +604,11 @@ out_user_rec->refcount = 1; out_user_rec->create_time = time(NULL); +#ifdef APPLE_OS_X_SERVER + if (DOVECOT_OD_LOOKUP_START_ENABLED()) + DOVECOT_OD_LOOKUP_START(in_od_info, (char *) in_user_name); +#endif + cf_query_ref = ODQueryCreateWithNode( NULL, in_od_info->od_node_ref, CFSTR(kDSStdRecordTypeUsers), CFSTR(kDSNAttrRecordName), kODMatchInsensitiveEqualTo, cf_str_ref, cf_arry_ref, 100, &cf_err_ref ); if ( cf_query_ref ) @@ -644,6 +653,11 @@ /* print the error and bail */ print_cf_error( cf_err_ref, "Unable to lookup user record" ); +#ifdef APPLE_OS_X_SERVER + if (DOVECOT_OD_LOOKUP_FINISH_ENABLED()) + DOVECOT_OD_LOOKUP_FINISH(in_od_info, (char *) in_user_name, NULL); +#endif + p_free(in_od_info->mem_pool, out_user_rec); return( NULL ); @@ -708,6 +722,11 @@ CFRelease(od_rec_ref); +#ifdef APPLE_OS_X_SERVER + if (DOVECOT_OD_LOOKUP_FINISH_ENABLED()) + DOVECOT_OD_LOOKUP_FINISH(in_od_info, (char *) in_user_name, out_user_rec); +#endif + if (od_debug) i_info("od-debug: (%s:%s): user %s refcount=%d", __FILE__, __FUNCTION__, out_user_rec->record_name, out_user_rec->refcount); return( out_user_rec ); @@ -733,6 +752,11 @@ sacl_check_delta = time( NULL ) + 30; } +#ifdef APPLE_OS_X_SERVER + if (DOVECOT_OD_SACL_START_ENABLED()) + DOVECOT_OD_SACL_START(in_od_user, (char *) in_group); +#endif + /* we should already have this from previous user lookup */ if ( in_od_user->user_uuid != NULL ) { @@ -752,6 +776,11 @@ i_error( "od: no user record name or user uuid for SACL checks" ); +#ifdef APPLE_OS_X_SERVER + if (DOVECOT_OD_SACL_FINISH_ENABLED()) + DOVECOT_OD_SACL_FINISH(in_od_user, (char *) in_group, -1); +#endif + return; } @@ -766,6 +795,11 @@ i_error( "od: mbr_user_name_to_uuid failed for user: %s (%s)", in_od_user->record_name, strerror( err ) ); +#ifdef APPLE_OS_X_SERVER + if (DOVECOT_OD_SACL_FINISH_ENABLED()) + DOVECOT_OD_SACL_FINISH(in_od_user, (char *) in_group, -2); +#endif + return; } @@ -797,6 +831,11 @@ in_od_user->acct_state |= account_enabled; in_od_user->acct_state |= imap_enabled; in_od_user->acct_state |= pop_enabled; + +#ifdef APPLE_OS_X_SERVER + if (DOVECOT_OD_SACL_FINISH_ENABLED()) + DOVECOT_OD_SACL_FINISH(in_od_user, (char *) in_group, 1); +#endif } else { @@ -805,6 +844,11 @@ in_od_user->acct_state &= ~account_enabled; in_od_user->acct_state &= ~imap_enabled; in_od_user->acct_state &= ~pop_enabled; + +#ifdef APPLE_OS_X_SERVER + if (DOVECOT_OD_SACL_FINISH_ENABLED()) + DOVECOT_OD_SACL_FINISH(in_od_user, (char *) in_group, 0); +#endif } } else @@ -818,6 +862,11 @@ { i_info( "od-debug: (%s:%s): Mail SACL is not enabled (%d)", __FILE__, __FUNCTION__, err ); } + +#ifdef APPLE_OS_X_SERVER + if (DOVECOT_OD_SACL_FINISH_ENABLED()) + DOVECOT_OD_SACL_FINISH(in_od_user, (char *) in_group, -3); +#endif } } /* db_od_sacl_check */ @@ -851,6 +900,11 @@ i_info("od-debug: (%s:%s): user %s refcount %d -> %d", __FILE__, __FUNCTION__, out_user->record_name, out_user->refcount, out_user->refcount + 1); ++out_user->refcount; +#ifdef APPLE_OS_X_SERVER + if (DOVECOT_OD_LOOKUP_CACHED_ENABLED()) + DOVECOT_OD_LOOKUP_CACHED(in_od_info, (char *) in_user_name, out_user); +#endif + /* check for SACL changes */ db_od_sacl_check( out_user, "mail" ); diff -Nur dovecot-1.1.7+patches9-10/src/imap/client.c dovecot-patch/src/imap/client.c --- dovecot-1.1.7+patches9-10/src/imap/client.c 2009-01-06 16:26:35.000000000 -0600 +++ dovecot-patch/src/imap/client.c 2009-01-06 16:29:26.000000000 -0600 @@ -12,6 +12,9 @@ #include "mail-namespace.h" #include "master.h" /* APPLE */ #include "ioloop.h" /* APPLE */ +#ifdef APPLE_OS_X_SERVER +#include "dtrace-dovecot.h" +#endif #include #include @@ -532,6 +535,11 @@ *_cmd = NULL; +#ifdef APPLE_OS_X_SERVER + if (DOVECOT_IMAP_COMMAND_FINISH_ENABLED() && cmd->func) + DOVECOT_IMAP_COMMAND_FINISH(cmd); +#endif + /* reset input idle time because command output might have taken a long time and we don't want to disconnect client immediately then */ client->last_input = ioloop_time; @@ -722,6 +730,11 @@ } else { i_assert(!client->disconnected); +#ifdef APPLE_OS_X_SERVER + if (DOVECOT_IMAP_COMMAND_START_ENABLED()) + DOVECOT_IMAP_COMMAND_START(cmd); +#endif + return client_command_input(cmd); } } diff -Nur dovecot-1.1.7+patches9-10/src/lib/Makefile.am dovecot-patch/src/lib/Makefile.am --- dovecot-1.1.7+patches9-10/src/lib/Makefile.am 2009-01-06 16:26:07.000000000 -0600 +++ dovecot-patch/src/lib/Makefile.am 2009-01-06 16:29:44.000000000 -0600 @@ -8,6 +8,13 @@ test -f UnicodeData.txt || wget http://www.unicode.org/Public/UNIDATA/UnicodeData.txt perl $(srcdir)/unicodemap.pl < UnicodeData.txt > $@ +if APPLE_OS_X_SERVER +DTRACE_SOURCE = dtrace-dovecot.d +DTRACE_HEADER = dtrace-dovecot.h +$(DTRACE_HEADER): $(DTRACE_SOURCE) + dtrace -h -s $(DTRACE_SOURCE) +endif + liblib_a_SOURCES = \ array.c \ aqueue.c \ @@ -19,6 +26,7 @@ compat.c \ crc32.c \ data-stack.c \ + $(DTRACE_SOURCE) \ env-util.c \ failures.c \ fd-close-on-exec.c \ @@ -118,6 +126,7 @@ compat.h \ crc32.h \ data-stack.h \ + $(DTRACE_HEADER) \ env-util.h \ failures.h \ fd-close-on-exec.h \ diff -Nur dovecot-1.1.7+patches9-10/src/lib/dtrace-dovecot.d dovecot-patch/src/lib/dtrace-dovecot.d --- dovecot-1.1.7+patches9-10/src/lib/dtrace-dovecot.d 1969-12-31 18:00:00.000000000 -0600 +++ dovecot-patch/src/lib/dtrace-dovecot.d 2009-01-06 16:33:59.000000000 -0600 @@ -0,0 +1,61 @@ +/* Dtrace providers for IMAP and POP3 */ + +/* + * Copyright (c) 2008 Apple Inc. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above + * copyright notice, this list of conditions and the following + * disclaimer in the documentation and/or other materials provided + * with the distribution. + * 3. Neither the name of Apple Inc. ("Apple") nor the names of its + * contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY APPLE AND ITS CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, + * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A + * PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE OR ITS + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF + * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, + * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT + * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + */ + +/* + * Dtrace sort of but not really understands struct types. To avoid + * warnings the arguments use only simple C types. The actual types + * are: + * struct db_od *od_info + * struct od_user *user_rec + * struct client_command_context *cmd + * struct client *client + * Dtrace doesn't understand const either. Phooey. + */ + +provider dovecot { + probe od__lookup__cached(void *od_info, char *user_name, + void *user_rec); + probe od__lookup__start(void *od_info, char *user_name); + probe od__lookup__finish(void *od_info, char *user_name, + void *user_rec); + + probe od__sacl__start(void *user_rec, char *group); + probe od__sacl__finish(void *user_rec, char *group, int ret); + + probe imap__command__start(void *cmd); + probe imap__command__finish(void *cmd); + + probe pop3__command__start(void *client, char *line, char *args); + probe pop3__command__finish(void *client, char *line, char *args, + int ret); +}; diff -Nur dovecot-1.1.7+patches9-10/src/pop3/client.c dovecot-patch/src/pop3/client.c --- dovecot-1.1.7+patches9-10/src/pop3/client.c 2009-01-06 16:26:35.000000000 -0600 +++ dovecot-patch/src/pop3/client.c 2009-01-06 16:30:17.000000000 -0600 @@ -14,6 +14,9 @@ #include "mail-namespace.h" #include "master.h" /* APPLE */ #include "ioloop.h" /* APPLE */ +#ifdef APPLE_OS_X_SERVER +#include "dtrace-dovecot.h" +#endif #include #include @@ -487,10 +490,21 @@ if (args != NULL) *args++ = '\0'; +#ifdef APPLE_OS_X_SERVER + if (DOVECOT_POP3_COMMAND_START_ENABLED()) + DOVECOT_POP3_COMMAND_START(client, line, args); +#endif + T_BEGIN { ret = client_command_execute(client, line, args != NULL ? args : ""); } T_END; + +#ifdef APPLE_OS_X_SERVER + if (DOVECOT_POP3_COMMAND_FINISH_ENABLED()) + DOVECOT_POP3_COMMAND_FINISH(client, line, args, ret); +#endif + if (ret >= 0) { client->bad_counter = 0; if (client->cmd != NULL) {