Photos
Blog
Projects
vanrenterghem.biz
projects
/
git.ikiwiki.info.git
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
(no commit message)
[git.ikiwiki.info.git]
/
IkiWiki
/
Wrapper.pm
diff --git
a/IkiWiki/Wrapper.pm
b/IkiWiki/Wrapper.pm
index 31e30ad2ebb3cd2e8da33996a2e3b8cbcf890da9..73f0896e8cd161cce0166dd2d0ff247316d7be41 100644
(file)
--- a/
IkiWiki/Wrapper.pm
+++ b/
IkiWiki/Wrapper.pm
@@
-8,7
+8,7
@@
use File::Spec;
use Data::Dumper;
use IkiWiki;
use Data::Dumper;
use IkiWiki;
-sub gen_wrapper () {
#{{{
+sub gen_wrapper () {
$config{srcdir}=File::Spec->rel2abs($config{srcdir});
$config{destdir}=File::Spec->rel2abs($config{destdir});
my $this=File::Spec->rel2abs($0);
$config{srcdir}=File::Spec->rel2abs($config{srcdir});
$config{destdir}=File::Spec->rel2abs($config{destdir});
my $this=File::Spec->rel2abs($0);
@@
-28,7
+28,8
@@
sub gen_wrapper () { #{{{
my @envsave;
push @envsave, qw{REMOTE_ADDR QUERY_STRING REQUEST_METHOD REQUEST_URI
CONTENT_TYPE CONTENT_LENGTH GATEWAY_INTERFACE
my @envsave;
push @envsave, qw{REMOTE_ADDR QUERY_STRING REQUEST_METHOD REQUEST_URI
CONTENT_TYPE CONTENT_LENGTH GATEWAY_INTERFACE
- HTTP_COOKIE REMOTE_USER HTTPS} if $config{cgi};
+ HTTP_COOKIE REMOTE_USER HTTPS REDIRECT_STATUS
+ REDIRECT_URL} if $config{cgi};
my $envsave="";
foreach my $var (@envsave) {
$envsave.=<<"EOF";
my $envsave="";
foreach my $var (@envsave) {
$envsave.=<<"EOF";
@@
-36,12
+37,9
@@
sub gen_wrapper () { #{{{
addenv("$var", s);
EOF
}
addenv("$var", s);
EOF
}
-
- my $test_receive="";
- if ($config{test_receive}) {
- require IkiWiki::Receive;
- $test_receive=IkiWiki::Receive::gen_wrapper();
- }
+
+ my @wrapper_hooks;
+ run_hooks(genwrapper => sub { push @wrapper_hooks, shift->() });
my $check_commit_hook="";
my $pre_exec="";
my $check_commit_hook="";
my $pre_exec="";
@@
-78,8
+76,8
@@
EOF
{
int fd=open("$config{wikistatedir}/cgilock", O_CREAT | O_RDWR, 0666);
if (fd != -1 && flock(fd, LOCK_EX) == 0) {
{
int fd=open("$config{wikistatedir}/cgilock", O_CREAT | O_RDWR, 0666);
if (fd != -1 && flock(fd, LOCK_EX) == 0) {
- char *fd_s;
-
asprintf(&
fd_s, "%i", fd);
+ char *fd_s
=malloc(8)
;
+
sprintf(
fd_s, "%i", fd);
setenv("IKIWIKI_CGILOCK_FD", fd_s, 1);
}
}
setenv("IKIWIKI_CGILOCK_FD", fd_s, 1);
}
}
@@
-92,10
+90,7
@@
EOF
$configstring=~s/"/\\"/g;
$configstring=~s/\n/\\n/g;
$configstring=~s/"/\\"/g;
$configstring=~s/\n/\\n/g;
- #translators: The first parameter is a filename, and the second is
- #translators: a (probably not translated) error message.
- open(OUT, ">$wrapper.c") || error(sprintf(gettext("failed to write %s: %s"), "$wrapper.c", $!));;
- print OUT <<"EOF";
+ writefile(basename("$wrapper.c"), dirname($wrapper), <<"EOF");
/* A wrapper for ikiwiki, can be safely made suid. */
#include <stdio.h>
#include <sys/types.h>
/* A wrapper for ikiwiki, can be safely made suid. */
#include <stdio.h>
#include <sys/types.h>
@@
-110,7
+105,7
@@
extern char **environ;
char *newenviron[$#envsave+6];
int i=0;
char *newenviron[$#envsave+6];
int i=0;
-addenv(char *var, char *val) {
+
void
addenv(char *var, char *val) {
char *s=malloc(strlen(var)+1+strlen(val)+1);
if (!s)
perror("malloc");
char *s=malloc(strlen(var)+1+strlen(val)+1);
if (!s)
perror("malloc");
@@
-122,12
+117,23
@@
int main (int argc, char **argv) {
char *s;
$check_commit_hook
char *s;
$check_commit_hook
-$test_receive
+@wrapper_hooks
$envsave
newenviron[i++]="HOME=$ENV{HOME}";
newenviron[i++]="WRAPPED_OPTIONS=$configstring";
$envsave
newenviron[i++]="HOME=$ENV{HOME}";
newenviron[i++]="WRAPPED_OPTIONS=$configstring";
+
+#ifdef __TINYC__
+ /* old tcc versions do not support modifying environ directly */
+ if (clearenv() != 0) {
+ perror("clearenv");
+ exit(1);
+ }
+ for (; i>0; i--)
+ putenv(newenviron[i-1]);
+#else
newenviron[i]=NULL;
environ=newenviron;
newenviron[i]=NULL;
environ=newenviron;
+#endif
if (setregid(getegid(), -1) != 0 &&
setregid(getegid(), -1) != 0) {
if (setregid(getegid(), -1) != 0 &&
setregid(getegid(), -1) != 0) {
@@
-146,10
+152,10
@@
$pre_exec
exit(1);
}
EOF
exit(1);
}
EOF
- close OUT;
- my $cc=exists $ENV{CC} ? possibly_foolish_untaint($ENV{CC}) : 'cc';
- if (system($cc, "$wrapper.c", "-o", "$wrapper.new") != 0) {
+ my @cc=exists $ENV{CC} ? possibly_foolish_untaint($ENV{CC}) : 'cc';
+ push @cc, possibly_foolish_untaint($ENV{CFLAGS}) if exists $ENV{CFLAGS};
+ if (system(@cc, "$wrapper.c", "-o", "$wrapper.new") != 0) {
#translators: The parameter is a C filename.
error(sprintf(gettext("failed to compile %s"), "$wrapper.c"));
}
#translators: The parameter is a C filename.
error(sprintf(gettext("failed to compile %s"), "$wrapper.c"));
}
@@
-173,6
+179,6
@@
EOF
#translators: The parameter is a filename.
printf(gettext("successfully generated %s"), $wrapper);
print "\n";
#translators: The parameter is a filename.
printf(gettext("successfully generated %s"), $wrapper);
print "\n";
-}
#}}}
+}
1
1