- foreach my $link (keys %linkchanged) {
- my $linkfile=$pagesources{$link};
- if (defined $linkfile) {
- debug("rendering $linkfile, to update its backlinks");
- render($linkfile);
- }
- }
- }
-} #}}}
-
-# Generates a C wrapper program for running ikiwiki in a specific way.
-# The wrapper may be safely made suid.
-sub gen_wrapper ($$) { #{{{
- my ($svn, $rebuild)=@_;
-
- eval q{use Cwd 'abs_path'};
- $srcdir=abs_path($srcdir);
- $destdir=abs_path($destdir);
- my $this=abs_path($0);
- if (! -x $this) {
- error("$this doesn't seem to be executable");
- }
-
- my @params=($srcdir, $templatedir, $destdir, "--wikiname=$wikiname");
- push @params, "--verbose" if $verbose;
- push @params, "--rebuild" if $rebuild;
- push @params, "--nosvn" if !$svn;
- push @params, "--cgi" if $cgi;
- push @params, "--url=$url" if $url;
- push @params, "--cgiurl=$cgiurl" if $cgiurl;
- push @params, "--historyurl=$historyurl" if $historyurl;
- push @params, "--anonok" if $anonok;
- my $params=join(" ", @params);
- my $call='';
- foreach my $p ($this, $this, @params) {
- $call.=qq{"$p", };
- }
- $call.="NULL";
-
- my @envsave;
- push @envsave, qw{REMOTE_ADDR QUERY_STRING REQUEST_METHOD REQUEST_URI
- CONTENT_TYPE CONTENT_LENGTH GATEWAY_INTERFACE
- HTTP_COOKIE} if $cgi;
- my $envsave="";
- foreach my $var (@envsave) {
- $envsave.=<<"EOF"
- if ((s=getenv("$var")))
- asprintf(&newenviron[i++], "%s=%s", "$var", s);
-EOF
- }
-
- open(OUT, ">ikiwiki-wrap.c") || error("failed to write ikiwiki-wrap.c: $!");;
- print OUT <<"EOF";
-/* A wrapper for ikiwiki, can be safely made suid. */
-#define _GNU_SOURCE
-#include <stdio.h>
-#include <unistd.h>
-#include <stdlib.h>
-#include <string.h>
-
-extern char **environ;
-
-int main (int argc, char **argv) {
- /* Sanitize environment. */
- char *s;
- char *newenviron[$#envsave+3];
- int i=0;
-$envsave
- newenviron[i++]="HOME=$ENV{HOME}";
- newenviron[i]=NULL;
- environ=newenviron;
-
- if (argc == 2 && strcmp(argv[1], "--params") == 0) {
- printf("$params\\n");
- exit(0);