Tags: +patch

It seems that su -c -- doesn't work better:

APT::Src::RootCommand "su -c --";

yields:

[pid 13670] execve("/bin/su", ["su", "-c", "--", "apt-get", "-y",
"build-dep", "awesome"], [/* 55 vars */]) = 0

which yields:

su: invalid option -- y

trying su -- -c instead yields better results:

[pid 18092] execve("/bin/su", ["su", "--", "-c", "apt-get", "-y",
"build-dep", "awesome"], [/* 55 vars */]) = 0

apt 0.8.10.3 for amd64 compiled on Jan 25 2011 11:30:03
Usage: apt-get [options] command
       apt-get [options] install|remove pkg1 [pkg2 ...]
       apt-get [options] source pkg1 [pkg2 ...]

... because this is like running:

su -- -c apt-get -y build-dep awesome

what we need here is this:

su -- -c "apt-get -y build-dep awesome"

... so I naively tried:

APT::Src::RootCommand "su -- -c '%s'";

.. but this failed with this:

apt-get: line 0: fg: no job control

... probably that '%s' wasn't interpolated.

I have added a crude patch that allows the following RootCommand to
work:

"su -c %s"

while allowing the regular "sudo" default to work also.
--- apt-src	2011-03-19 13:15:42.000000000 -0400
+++ /usr/bin/apt-src	2011-03-19 13:15:27.000000000 -0400
@@ -220,7 +217,12 @@
 
 The command to use if a non-root user needs to become root. This is used for,
 example, to satisfy build-deps. sudo is a good choice and the default.
-If you want to use su, you'll need to set it to "su -c".
+The command to run is appended (e.g. for sudo), unless there's a %s
+argument in the string, in which case the command is passed a a single
+argument.
+
+In short, if you want to use su, you'll need to set it to "su -c %s". If
+you use sudo, set it to "sudo" (default).
 
 =item APT::Src::BuildDeps
 
--- AptSrc.pm	2004-05-22 09:28:10.000000000 -0400
+++ /usr/share/perl5/AptSrc.pm	2011-03-19 13:07:51.000000000 -0400
@@ -654,14 +654,32 @@
 # Runs a shell command, gaining root if necessary.
 sub do_root {
 	my $class=shift;
-	if ($> != 0) {
-		my @command=qw(sudo);
+	my $interpolated = 0;
+	my @command;
+	if ($> == 0) {
+		@command = @_;
+	} else {
 		if ($_config->exists('APT::Src::RootCommand')) {
 			@command=split(/\s+/, $_config->get('APT::Src::RootCommand'));
+		} else {
+			@command = qw(sudo);
+		}
+		# look for %s in the command to see if the user requests
+		# interpolation instead of just appending
+		foreach (@command) {
+			if (/%s/) {
+				$interpolated = 1;
+				$_ = sprintf($_, join(' ', @_));
+				last;
+			}
+		}
+		# probably sudo, which doesn't require the command to be passed
+		# as a single string, so append the array
+		if (!$interpolated) {
+			push @command, @_;
 		}
-		unshift @_, @command;
 	}
-	$class->do(@_);
+	$class->do(@command);
 }
 
 # Runs a shell command, only displaying its output in verbose mode or if it

Attachment: signature.asc
Description: Digital signature

Reply via email to