vproc-transaction-support-smbd   [plain text]


Index: samba/source/configure.in
===================================================================
--- samba/source/configure.in.orig
+++ samba/source/configure.in
@@ -901,6 +901,9 @@ main() {
 	# go away. -- jpeach
 	CPPFLAGS="$CPPFLAGS -F/System/Library/PrivateFrameworks"
 
+	# Check for libvproc support
+	AC_CHECK_HEADERS(vproc.h)
+
 # Add a system specific charset module.
 	default_shared_modules="$default_shared_modules charset_macosxfs"
 	default_shared_modules="$default_shared_modules vfs_darwin_streams"
Index: samba/source/smbd/server.c
===================================================================
--- samba/source/smbd/server.c.orig
+++ samba/source/smbd/server.c
@@ -23,6 +23,28 @@
 
 #include "includes.h"
 
+#ifdef HAVE_VPROC_H
+#include <vproc.h>
+
+static vproc_transaction_t smbd_vproc_trans;
+
+static void smbd_vproc_start(void)
+{
+    smbd_vproc_trans = vproc_transaction_begin(NULL);
+}
+
+static void smbd_vproc_end(void)
+{
+    vproc_transaction_end(NULL, smbd_vproc_trans);
+}
+
+#else
+
+#define smbd_vproc_start()
+#define smbd_vproc_end()
+
+#endif
+
 static_decl_rpc;
 
 static int am_parent = 1;
@@ -410,8 +432,15 @@ static BOOL open_sockets_smbd(enum smb_s
 		memcpy((char *)&lfds, (char *)&listen_set, 
 		       sizeof(listen_set));
 
+		/* At this point, we know that our state is quiescent. We can
+		 * be SIGKILL'd with relative safety.
+		 */
+		smbd_vproc_end();
+
 		num = sys_select(maxfd+1,&lfds,NULL,NULL,
 			idle_timeout.tv_sec ? &idle_timeout : NULL);
+
+		smbd_vproc_start();
 		
 		if (num == -1 && errno == EINTR) {
 			if (got_sig_term) {
@@ -800,6 +829,8 @@ extern void build_options(BOOL screen);
 	POPT_TABLEEND
 	};
 
+	smbd_vproc_start();
+
 	load_case_tables();
 
 	TimeInit();