X-Git-Url: http://git.vanrenterghem.biz/git.ikiwiki.info.git/blobdiff_plain/761dee41b1041330f3bae4ec2f2eae1857d29756..3699c310adfdfefdae2afa35d33794d324aa4122:/IkiWiki/Wrapper.pm

diff --git a/IkiWiki/Wrapper.pm b/IkiWiki/Wrapper.pm
index eb6228dc3..99237d3b5 100644
--- a/IkiWiki/Wrapper.pm
+++ b/IkiWiki/Wrapper.pm
@@ -31,12 +31,43 @@ sub gen_wrapper () { #{{{
 		       HTTP_COOKIE REMOTE_USER HTTPS} if $config{cgi};
 	my $envsave="";
 	foreach my $var (@envsave) {
-		$envsave.=<<"EOF"
+		$envsave.=<<"EOF";
 	if ((s=getenv("$var")))
 		addenv("$var", s);
 EOF
 	}
-	
+
+	my $test_receive="";
+	if ($config{test_receive}) {
+		require IkiWiki::Receive;
+		$test_receive=IkiWiki::Receive::gen_wrapper();
+	}
+
+	my $check_commit_hook="";
+	if ($config{post_commit}) {
+		# Optimise checking !commit_hook_enabled() , 
+		# so that ikiwiki does not have to be started if the
+		# hook is disabled.
+		#
+		# Note that perl's flock may be implemented using fcntl
+		# or lockf on some systems. If so, and if there is no
+		# interop between the locking systems, the true C flock will
+		# always succeed, and this optimisation won't work.
+		# The perl code will later correctly check the lock,
+		# so the right thing will still happen, though without
+		# the benefit of this optimisation.
+		$check_commit_hook=<<"EOF";
+	{
+		int fd=open("$config{wikistatedir}/commitlock", O_CREAT | O_RDWR);
+		if (fd != -1) {
+			if (flock(fd, LOCK_SH | LOCK_NB) != 0)
+				exit(0);
+			close(fd);
+		}
+	}
+EOF
+	}
+
 	$Data::Dumper::Indent=0; # no newlines
 	my $configstring=Data::Dumper->Dump([\%config], ['*config']);
 	$configstring=~s/\\/\\\\/g;
@@ -50,9 +81,12 @@ EOF
 /* A wrapper for ikiwiki, can be safely made suid. */
 #include <stdio.h>
 #include <sys/types.h>
+#include <sys/stat.h>
+#include <fcntl.h>
 #include <unistd.h>
 #include <stdlib.h>
 #include <string.h>
+#include <sys/file.h>
 
 extern char **environ;
 char *newenviron[$#envsave+6];
@@ -67,12 +101,13 @@ addenv(char *var, char *val) {
 }
 
 int main (int argc, char **argv) {
-	/* Sanitize environment. */
 	char *s;
+
+$check_commit_hook
+$test_receive
 $envsave
 	newenviron[i++]="HOME=$ENV{HOME}";
 	newenviron[i++]="WRAPPED_OPTIONS=$configstring";
-	asprintf(newenviron[i++], "CALLER_UID=%i", getuid());
 	newenviron[i]=NULL;
 	environ=newenviron;