X-Git-Url: http://www.chiark.greenend.org.uk/ucgi/~ian/git?a=blobdiff_plain;f=git-daemon%2Fgit-daemon.pl;h=8e15517e041d46180fc7a8efdabe28891bc12b9e;hb=6fe98f4a5ae10ba602534559e8685e7979f12be3;hp=5458c08fcd2c77036fcf34261d900640fbbb010e;hpb=11b88dbb4e21bf4a21e611eb185b1df02d0d7379;p=userv-utils.git diff --git a/git-daemon/git-daemon.pl b/git-daemon/git-daemon.pl index 5458c08..8e15517 100755 --- a/git-daemon/git-daemon.pl +++ b/git-daemon/git-daemon.pl @@ -17,27 +17,26 @@ use POSIX; use Socket; use Sys::Syslog; -use vars qw{ %vhost_default_user %vhost_user_from_tilde - $TILDE $REPO $HOSTNAME }; - use lib '/etc/userv'; -require 'git-daemon-vhosts.pl'; -my $peer = getpeername STDIN; -my ($port,$addr); -if (defined $peer) { - ($port,$addr) = sockaddr_in $peer; - $addr = inet_ntoa $addr; - $peer = "[$addr]:$port"; -} else { - $peer = "[?.?.?.?]:?"; - undef $!; +sub ntoa { + my $sockaddr = shift; + if (defined $sockaddr) { + my ($port,$addr) = sockaddr_in $sockaddr; + $addr = inet_ntoa $addr; + return ($addr,$port,"[$addr]:$port"); + } else { + return (undef,undef,"[?.?.?.?]:?"); + } } +my ($client_addr,$client_port,$client) = ntoa getpeername STDIN; +my ($server_addr,$server_port,$server) = ntoa getsockname STDIN; + openlog 'userv-git-daemon', 'pid', 'daemon'; sub fail { - syslog 'err', "$peer @_"; + syslog 'err', "$client @_"; exit; } @@ -58,24 +57,33 @@ sub xread { } my $len_hex = xread 4; -fail "non-hexadecimal packet length" unless $len_hex =~ m{^[0-9a-zA-Z]{4}$}; +fail "non-hex packet length" unless $len_hex =~ m{^[0-9a-fA-F]{4}$}; my $line = xread hex $len_hex; -unless ($line =~ m{^git-upload-pack (?:~($TILDE)/)?($REPO[.]git)\0host=($HOSTNAME)\0$}) { +unless ($line =~ m{^git-upload-pack ([!-~]+)\0host=([!-~]+)\0$}) { $line =~ s/[^ -~]+/ /g; fail "could not parse \"$line\"" } -my ($tilde,$repo,$host) = ($1,$2,$3); -my $url = $tilde ? "git://$host/~$tilde/$repo" : "git://$host/$repo"; +my ($path,$host) = ($1,$2); +$path =~ s|^/||; +$_ = my $uri = "git://$host/$path"; + +my ($user,$repo) = do "git-daemon-urlmap.pl"; +fail "no user configured for $uri" unless defined $user; +syslog 'info', "$client userv $user git-upload-pack $uri"; -my $user = $vhost_user_from_tilde{$host} ? $tilde : $vhost_default_user{$host}; -fail "no user configuration for $url" unless defined $user; -syslog 'info', "$peer $user $url"; +my %vars = ( + REQUEST_HOST => $host, + REQUEST_PATH => $path, + REQUEST_URI => $uri, + CLIENT_ADDR => $client_addr, + CLIENT_PORT => $client_port, + SERVER_ADDR => $server_addr, + SERVER_PORT => $server_port, +); +my @opts = map "-D$_=$vars{$_}", grep defined $vars{$_}, sort keys %vars; -my @opts = ("-DHOST=$host", "-DREPO=$repo"); -push @opts, "-DTILDE=$tilde" if defined $tilde; -push @opts, "-DCLIENT=$addr" if defined $addr; no warnings; # suppress errors to stderr exec 'userv', @opts, $user, 'git-upload-pack' - or fail "exec userv: $!"; + or fail "exec userv @opts $user git-upload-pack: $!"; # end