tags 374713 + patch
thanks

Christian Hammers <[EMAIL PROTECTED]> writes:

> On 2006-06-21 Christian Hammers wrote:
>> In the old version dchroot-0.13 it jumped to the home directory as
>> specified in /etc/passwd *always*, regardless of the actual cwd of the
>> calling user. It did this by executing e.g. "/bin/su - ch -c foobar".
>> 
>> My suggestion would be to change the code to do something like:
>>   p = popen("/bin/sh -c 'pwd'", "r");
>>   target_dir = fgets(p);
>>   ... chroot() ...
>>   chdir(target_dir);
>
> Or maybe add an option that behaves like a "su" as I just found out that the
> new schroot does not read ~/.bashrc like both interactive and
> non-interactive new bash instances are supposed to. E.g. in my
> setup .bashrc tested for /etc/debian_chroot and changed $DISPLAY from
> ":0.0" (socket) to "localhost:0.0" (inet) and changed the PS1 prompt for
> interactive shells so that I did not mix up my xterms...

I have now made most of the changes needed to restore the original
dchroot behaviour.  I've attached a patch (against upstream SVN).
This needs a bit more work, but it's basically done.

A "login" shell is only run if you don't run a command.  If you run
with a command, you get a regular "non-login" shell.  Either way, it
/should/ source .bashrc in both cases--we just run bash, so it should
read it in.  This is with the patch applied, BTW.

I'll create a test package later on for you to try.


Regards,
Roger

-- 
Roger Leigh
                Printing on GNU/Linux?  http://gutenprint.sourceforge.net/
                Debian GNU/Linux        http://www.debian.org/
                GPG Public Key: 0x25BFB848.  Please sign and encrypt your mail.
Index: schroot/sbuild-session.cc
===================================================================
--- schroot/sbuild-session.cc	(revision 758)
+++ schroot/sbuild-session.cc	(working copy)
@@ -28,6 +28,8 @@
 #include <iostream>
 #include <memory>
 
+#include <sys/types.h>
+#include <sys/stat.h>
 #include <unistd.h>
 
 #include <syslog.h>
@@ -66,16 +68,26 @@
       emap(session::USER_SWITCH,    N_("User switching is not permitted"))
     };
 
-}
+  /**
+   * Get the current working directory.  If it can't be found, fall
+   * back to root.
+   *
+   * @returns the current working directory.
+   */
+  std::string
+  getcwd ()
+  {
+    std::string cwd;
 
-template<>
-std::map<session::error_code,const char *>
-custom_error<session::error_code>::error_strings
-(init_errors,
- init_errors + (sizeof(init_errors) / sizeof(init_errors[0])));
+    char *raw_cwd = ::getcwd (NULL, 0);
+    if (raw_cwd)
+      cwd = raw_cwd;
+    else
+      cwd = "/";
+    free(raw_cwd);
 
-namespace
-{
+    return cwd;
+  }
 
   /**
    * Check group membership.
@@ -157,6 +169,12 @@
 
 }
 
+template<>
+std::map<session::error_code,const char *>
+custom_error<session::error_code>::error_strings
+(init_errors,
+ init_errors + (sizeof(init_errors) / sizeof(init_errors[0])));
+
 session::session (std::string const&         service,
 		  config_ptr&                config,
 		  operation                  operation,
@@ -169,7 +187,8 @@
   session_operation(operation),
   session_id(),
   force(false),
-  saved_signals()
+  saved_signals(),
+  cwd(getcwd())
 {
 }
 
@@ -372,6 +391,7 @@
 	log_debug(DEBUG_NOTICE)
 	  << format("Running session in %1% chroot:") % *cur
 	  << endl;
+
 	const chroot::ptr ch = this->config->find_alias(*cur);
 	if (!ch) // Should never happen, but cater for it anyway.
 	  {
@@ -500,7 +520,169 @@
   }
 }
 
+string_list
+session::get_login_directories () const
+{
+  string_list ret;
+
+  // Set current working directory.
+  ret.push_back(this->cwd);
+
+  // Set $HOME.
+  environment env = get_pam_environment();
+  std::string home;
+  if (env.get("HOME", home) &&
+      std::find(ret.begin(), ret.end(), home) == ret.end())
+    ret.push_back(home);
+
+  // Set passwd home.
+  if (std::find(ret.begin(), ret.end(), get_home()) == ret.end())
+    ret.push_back(get_home());
+
+  // Final fallback to root.
+  if (std::find(ret.begin(), ret.end(), "/") == ret.end())
+  ret.push_back("/");
+
+  return ret;
+}
+
+string_list
+session::get_command_directories () const
+{
+  string_list ret;
+
+  // Set current working directory.
+  ret.push_back(this->cwd);
+
+  return ret;
+}
+
+std::string
+session::get_shell () const
+{
+  assert (!auth::get_shell().empty());
+  std::string shell = auth::get_shell();
+
+  struct stat statbuf;
+  if (stat(shell.c_str(), &statbuf) < 0)
+    {
+      if (shell != "/bin/sh")
+	{
+	  log_warning() << format(_("%1%: Shell not available: %2%"))
+	    % shell % strerror(errno) << endl;
+	  shell = "/bin/sh";
+	  log_warning() << format(_("Falling back to %1%"))
+	    % shell << endl;
+	}
+    }
+
+  return shell;
+}
+
 void
+session::get_command (sbuild::chroot::ptr& session_chroot,
+		      std::string&         file,
+		      string_list&         command) const
+{
+  /* Run login shell */
+  if (command.empty() ||
+      command[0].empty()) // No command
+    {
+      command.clear();
+
+      std::string shell = get_shell();
+      file = shell;
+
+      if (get_environment().empty() &&
+	  session_chroot->get_command_prefix().empty())
+	// Not keeping environment and can setup argv correctly; login shell
+	{
+	  std::string shellbase = basename(shell, '/');
+	  std::string loginshell = "-" + shellbase;
+	  command.push_back(loginshell);
+
+	  log_debug(DEBUG_NOTICE)
+	    << format("Running login shell: %1%") % shell << endl;
+	  syslog(LOG_USER|LOG_NOTICE,
+		 "[%s chroot] (%s->%s) Running login shell: \"%s\"",
+		 session_chroot->get_name().c_str(),
+		 get_ruser().c_str(), get_user().c_str(),
+		 shell.c_str());
+	}
+      else
+	{
+	  command.push_back(shell);
+	  log_debug(DEBUG_NOTICE)
+	    << format("Running shell: %1%") % shell << endl;
+	  syslog(LOG_USER|LOG_NOTICE,
+		 "[%s chroot] (%s->%s) Running shell: \"%s\"",
+		 session_chroot->get_name().c_str(),
+		 get_ruser().c_str(), get_user().c_str(),
+		 shell.c_str());
+	}
+
+      if (get_verbosity() != auth::VERBOSITY_QUIET)
+	{
+	  std::string format_string;
+	  if (get_ruid() == get_uid())
+	    {
+	      if (get_environment().empty() &&
+		  session_chroot->get_command_prefix().empty())
+		format_string = _("[%1% chroot] Running login shell: \"%4%\"");
+	      else
+		format_string = _("[%1% chroot] Running shell: \"%4%\"");
+	    }
+	  else
+	    {
+	      if (get_environment().empty() &&
+		  session_chroot->get_command_prefix().empty())
+		format_string = _("[%1% chroot] (%2%->%3%) Running login shell: \"%4%\"");
+	      else
+		format_string = _("[%1% chroot] (%2%->%3%) Running shell: \"%4%\"");
+	    }
+
+	  format fmt(format_string);
+	  fmt % session_chroot->get_name()
+	      % get_ruser() % get_user()
+	      % shell;
+	  log_info() << fmt << endl;
+	}
+    }
+  else
+    {
+      /* Search for program in path. */
+      environment env = get_pam_environment();
+      std::string path;
+      if (!env.get("PATH", path))
+	path.clear();
+
+      file = find_program_in_path(command[0], path, "");
+      if (file.empty())
+	file = command[0];
+      std::string commandstring = string_list_to_string(command, " ");
+      log_debug(DEBUG_NOTICE)
+	<< format("Running command: %1%") % commandstring << endl;
+      syslog(LOG_USER|LOG_NOTICE, "[%s chroot] (%s->%s) Running command: \"%s\"",
+	     session_chroot->get_name().c_str(), get_ruser().c_str(), get_user().c_str(), commandstring.c_str());
+
+      if (get_verbosity() != auth::VERBOSITY_QUIET)
+	{
+	  std::string format_string;
+	  if (get_ruid() == get_uid())
+	    format_string = _("[%1% chroot] Running command: \"%4%\"");
+	  else
+	    format_string = (_("[%1% chroot] (%2%->%3%) Running command: \"%4%\""));
+
+	  format fmt(format_string);
+	  fmt % session_chroot->get_name()
+	      % get_ruser() % get_user()
+	      % commandstring;
+	  log_info() << fmt << endl;
+	}
+    }
+}
+
+void
 session::setup_chroot (sbuild::chroot::ptr&       session_chroot,
 		       sbuild::chroot::setup_type setup_type)
 {
@@ -689,16 +871,10 @@
   assert(!get_shell().empty());
   assert(auth::pam != NULL); // PAM must be initialised
 
+  // Store before chroot call.
+  this->cwd = getcwd();
+
   std::string location(session_chroot->get_path());
-  std::string cwd;
-  {
-    char *raw_cwd = getcwd (NULL, 0);
-    if (raw_cwd)
-      cwd = raw_cwd;
-    else
-      cwd = "/";
-    free(raw_cwd);
-  }
 
   /* Child errors result in immediate exit().  Errors are not
      propagated back via an exception, because there is no longer any
@@ -769,130 +945,51 @@
     }
 
   std::string file;
+  string_list command(auth::get_command());
 
-  string_list command(get_command());
+  string_list dlist;
+  if (command.empty() ||
+      command[0].empty()) // No command
+    dlist = get_login_directories();
+  else
+    dlist = get_command_directories();
+  log_debug(DEBUG_NOTICE)
+    << format("Directory fallbacks: %1%") % string_list_to_string(dlist, ", ") << endl;
 
-  /* chdir to current directory */
-  if (chdir (cwd.c_str()))
+  /* Attempt to chdir to current directory. */
+  bool dir_changed = false;
+  for (string_list::const_iterator dpos = dlist.begin();
+       dpos != dlist.end();
+       ++dpos)
     {
-      /* Fall back to home directory, but only for a login shell,
-	 since for a command we require deterministic behaviour. */
-      if (command.empty() ||
-	  command[0].empty()) // No command
+      if (chdir ((*dpos).c_str()) < 0)
 	{
-	  log_warning() << format(_("Could not chdir to '%1%': %2%"))
-	    % cwd % strerror(errno)
-			<< endl;
-
-	  if (chdir (get_home().c_str()))
-	    log_warning() << format(_("Falling back to '%1%'"))
-	      % "/"
-			  << endl;
-	  else
-	    log_warning() << format(_("Falling back to home directory '%1%'"))
-	      % get_home()
-			  << endl;
+	  ((dpos + 1 == dlist.end()) ? log_error() : log_warning())
+	    << format(_("Could not chdir to '%1%': %2%"))
+	    % *dpos % strerror(errno)
+	    << endl;
 	}
       else
 	{
-	  log_error() << format(_("Could not chdir to '%1%': %2%"))
-	    % cwd % strerror(errno)
-		      << endl;
-	  exit (EXIT_FAILURE);
+	  if (dpos != dlist.begin())
+	    log_warning() << format(_("Falling back to '%1%'"))
+	      % *dpos
+			  << endl;
+	  dir_changed = true;
+	  break;
 	}
     }
 
+  if (dir_changed == false)
+    exit (EXIT_FAILURE); // Warning already logged.
+
+  /* Fix up the command for exec. */
+  get_command(session_chroot, file, command);
+
   /* Set up environment */
   environment env = get_pam_environment();
-    log_debug(DEBUG_INFO)
-      << "Set environment:\n" << env;
+  log_debug(DEBUG_INFO) << "Set environment:\n" << env;
 
-  /* Run login shell */
-  if (command.empty() ||
-      command[0].empty()) // No command
-    {
-      assert (!get_shell().empty());
-
-      file = get_shell();
-      if (get_environment().empty() &&
-	  session_chroot->get_command_prefix().empty())
-	// Not keeping environment and can setup argv correctly; login shell
-	{
-	  std::string shellbase = basename(get_shell(), '/');
-	  std::string loginshell = "-" + shellbase;
-	  command.push_back(loginshell);
-	  log_debug(DEBUG_INFO)
-	    << format("Login shell: %1%") % command[0] << endl;
-	}
-      else
-	{
-	  command.push_back(get_shell());
-	}
-
-      if (get_environment().empty() &&
-	  session_chroot->get_command_prefix().empty())
-	{
-	  log_debug(DEBUG_NOTICE)
-	    << format("Running login shell: %1%") % get_shell() << endl;
-	  syslog(LOG_USER|LOG_NOTICE, "[%s chroot] (%s->%s) Running login shell: \"%s\"",
-		 session_chroot->get_name().c_str(), get_ruser().c_str(), get_user().c_str(), get_shell().c_str());
-	}
-      else
-	{
-	  log_debug(DEBUG_NOTICE)
-	    << format("Running shell: %1%") % get_shell() << endl;
-	  syslog(LOG_USER|LOG_NOTICE, "[%s chroot] (%s->%s) Running shell: \"%s\"",
-		 session_chroot->get_name().c_str(), get_ruser().c_str(), get_user().c_str(), get_shell().c_str());
-	}
-
-      if (get_verbosity() != auth::VERBOSITY_QUIET)
-	{
-	  if (get_ruid() == get_uid())
-	    log_info()
-	      << format((get_environment().empty() &&
-			 session_chroot->get_command_prefix().empty() ?
-			 _("[%1% chroot] Running login shell: \"%2%\"") :
-			 _("[%1% chroot] Running shell: \"%2%\"")))
-	      % session_chroot->get_name() % get_shell()
-	      << endl;
-	  else
-	    log_info()
-	      << format((get_environment().empty() &&
-			 session_chroot->get_command_prefix().empty() ?
-			 _("[%1% chroot] (%2%->%3%) Running login shell: \"%4%\"") :
-			 _("[%1% chroot] (%2%->%3%) Running shell: \"%4%\"")))
-	      % session_chroot->get_name()
-	      % get_ruser() % get_user()
-	      % get_shell()
-	      << endl;
-	}
-    }
-  else
-    {
-      /* Search for program in path. */
-      file = find_program_in_path(command[0], getenv("PATH"), "");
-      if (file.empty())
-	file = command[0];
-      std::string commandstring = string_list_to_string(command, " ");
-      log_debug(DEBUG_NOTICE)
-	<< format("Running command: %1%") % commandstring << endl;
-      syslog(LOG_USER|LOG_NOTICE, "[%s chroot] (%s->%s) Running command: \"%s\"",
-	     session_chroot->get_name().c_str(), get_ruser().c_str(), get_user().c_str(), commandstring.c_str());
-      if (get_verbosity() != auth::VERBOSITY_QUIET)
-	{
-	  if (get_ruid() == get_uid())
-	    log_info() << format(_("[%1% chroot] Running command: \"%2%\""))
-	      % session_chroot->get_name() % commandstring
-		       << endl;
-	  else
-	    log_info() << format(_("[%1% chroot] (%2%->%3%) Running command: \"%4%\""))
-	      % session_chroot->get_name()
-	      % get_ruser() % get_user()
-	      % commandstring
-		       << endl;
-	}
-    }
-
   // The user's command does not use our syslog fd.
   closelog();
 
@@ -993,6 +1090,7 @@
   else if (pid == 0)
     {
 #ifdef SBUILD_DEBUG
+      sbuild::debug_level = sbuild::DEBUG_NOTICE;
       while (child_wait)
 	;
 #endif
Index: schroot/sbuild-session.h
===================================================================
--- schroot/sbuild-session.h	(revision 758)
+++ schroot/sbuild-session.h	(working copy)
@@ -202,7 +202,7 @@
     get_chroot_auth_status (auth::status status,
 			    chroot::ptr const& chroot) const;
 
-      public:
+  public:
     /**
      * Check if authentication is required, taking users, groups,
      * root-users and root-groups membership of all chroots specified
@@ -211,6 +211,7 @@
     virtual sbuild::auth::status
     get_auth_status () const;
 
+  protected:
     /**
      * Run a session.  If a command has been specified, this will be
      * run in each of the specified chroots.  If no command has been
@@ -221,6 +222,47 @@
     virtual void
     run_impl ();
 
+    /**
+     * Get a list of directories to change to when running a login
+     * shell.  Multiple directories are used as fallbacks.
+     *
+     * @returns a list of directories
+     */
+    virtual string_list
+    get_login_directories () const;
+
+    /**
+     * Get a list of directories to change to when running a command
+     * Multiple directories are used as fallbacks.
+     *
+     * @returns a list of directories
+     */
+    virtual string_list
+    get_command_directories () const;
+
+    /**
+     * Get the shell to run.  This finds a suitable shell to run in
+     * the chroot, falling back to /bin/sh if necessary.  Note that it
+     * assumes it is inside the chroot when called.
+     *
+     * @returns the shell.
+     */
+    virtual std::string
+    get_shell () const;
+
+    /**
+     * Get the command to run.
+     *
+     * @param session_chroot the chroot to setup.  This must be
+     * present in the chroot list and the chroot configuration object.
+     * @param file the filename to pass to execve(2).
+     * @param command the argv to pass to execve(2).
+     */
+    virtual void
+    get_command (chroot::ptr& session_chroot,
+		 std::string& file,
+		 string_list& command) const;
+
   private:
     /**
      * execve wrapper.  Run the command specified by file (an absolute
@@ -317,6 +359,10 @@
     bool             force;
     /// Signals saved while sighup handler is set.
     struct sigaction saved_signals;
+
+  protected:
+    /// Current working directory.
+    std::string      cwd;
   };
 
 }
Index: schroot/schroot-options.cc
===================================================================
--- schroot/schroot-options.cc	(revision 759)
+++ schroot/schroot-options.cc	(working copy)
@@ -141,6 +141,7 @@
   hidden.add_options()
     ("command", opt::value<sbuild::string_list>(&this->command),
      _("Command to run"));
+
   opt::positional_options_description pos;
   pos.add("command", -1);
 
@@ -243,6 +244,12 @@
 	}
     }
 
+  // dchroot and dchroot-dsa only allow one command.
+  if ((this->compat == COMPAT_DCHROOT ||
+       this->compat == COMPAT_DCHROOT_DSA) &&
+      this->command.size() > 1)
+    throw opt::validation_error(_("Only one command may be specified"));
+
   if (this->quiet && this->verbose)
     {
       sbuild::log_warning()
Index: schroot/dchroot-session.cc
===================================================================
--- schroot/dchroot-session.cc	(revision 758)
+++ schroot/dchroot-session.cc	(working copy)
@@ -41,12 +41,13 @@
 using std::cout;
 using std::endl;
 using boost::format;
+using sbuild::string_list;
 using namespace dchroot;
 
-session::session (std::string const&         service,
-		  config_ptr&                config,
-		  operation                  operation,
-		  sbuild::string_list const& chroots):
+session::session (std::string const& service,
+		  config_ptr&        config,
+		  operation          operation,
+		  string_list const& chroots):
   sbuild::session(service, config, operation, chroots)
 {
 }
@@ -67,8 +68,8 @@
      restrictions.  This only applies if not switching users (dchroot
      does not support user switching) */
 
-  sbuild::string_list const& users = chroot->get_users();
-  sbuild::string_list const& groups = chroot->get_groups();
+  string_list const& users = chroot->get_users();
+  string_list const& groups = chroot->get_groups();
 
   if (this->get_ruid() == this->get_uid() &&
       users.empty() && groups.empty())
@@ -95,7 +96,137 @@
   sbuild::session::run_impl();
 }
 
+string_list
+session::get_login_directories () const
+{
+  string_list ret;
 
+#ifndef SBUILD_DCHROOT_DSA_COMPAT
+  // Set current working directory only if preserving environment.
+  // Only change to home if not preserving the environment.
+  if (!get_environment().empty())
+    ret.push_back(this->sbuild::session::cwd);
+  else
+    ret.push_back(get_home());
+#else
+  ret.push_back(get_home());
+#endif
+
+  // Final fallback to root.
+  if (std::find(ret.begin(), ret.end(), "/") == ret.end())
+    ret.push_back("/");
+
+  return ret;
+}
+
+string_list
+session::get_command_directories () const
+{
+  // dchroot does not treat logins differently from commands with
+  // respect to the cwd inside the chroot.
+  return get_login_directories();
+}
+
+void
+session::get_command (sbuild::chroot::ptr& session_chroot,
+		      std::string&         file,
+		      string_list&         command) const
+{
+  /* Run login shell */
+  if (command.empty() ||
+      command[0].empty()) // No command
+    {
+      command.clear();
+
+      std::string shell = get_shell();
+      file = shell;
+
+      if (get_environment().empty() &&
+	  session_chroot->get_command_prefix().empty())
+	// Not keeping environment and can setup argv correctly; login shell
+	{
+	  std::string shellbase = sbuild::basename(shell, '/');
+	  std::string loginshell = "-" + shellbase;
+	  command.push_back(loginshell);
+
+	  sbuild::log_debug(sbuild::DEBUG_NOTICE)
+	    << format("Running login shell: %1%") % shell << endl;
+	  syslog(LOG_USER|LOG_NOTICE,
+		 "[%s chroot] (%s->%s) Running login shell: \"%s\"",
+		 session_chroot->get_name().c_str(),
+		 get_ruser().c_str(), get_user().c_str(),
+		 shell.c_str());
+	}
+      else
+	{
+	  command.push_back(shell);
+	  sbuild::log_debug(sbuild::DEBUG_NOTICE)
+	    << format("Running shell: %1%") % shell << endl;
+	  syslog(LOG_USER|LOG_NOTICE,
+		 "[%s chroot] (%s->%s) Running shell: \"%s\"",
+		 session_chroot->get_name().c_str(),
+		 get_ruser().c_str(), get_user().c_str(),
+		 shell.c_str());
+	}
+
+      if (get_verbosity() != auth::VERBOSITY_QUIET)
+	{
+	  std::string format_string;
+	  if (get_ruid() == get_uid())
+	    {
+	      if (get_environment().empty() &&
+		  session_chroot->get_command_prefix().empty())
+		format_string = _("[%1% chroot] Running login shell: \"%4%\"");
+	      else
+		format_string = _("[%1% chroot] Running shell: \"%4%\"");
+	    }
+	  else
+	    {
+	      if (get_environment().empty() &&
+		  session_chroot->get_command_prefix().empty())
+		format_string = _("[%1% chroot] (%2%->%3%) Running login shell: \"%4%\"");
+	      else
+		format_string = _("[%1% chroot] (%2%->%3%) Running shell: \"%4%\"");
+	    }
+
+	  format fmt(format_string);
+	  fmt % session_chroot->get_name()
+	      % get_ruser() % get_user()
+	      % shell;
+	  sbuild::log_info() << fmt << endl;
+	}
+    }
+  else
+    {
+      std::string programstring = command[0];
+#ifdef SBUILD_DCHROOT_DSA_COMPAT
+      file = programstring;
+#else
+      command.clear();
+      command.push_back(get_shell());
+      command.push_back("-c");
+      command.push_back(programstring);
+#endif
+
+      std::string commandstring = sbuild::string_list_to_string(command, " ");
+      sbuild::log_debug(sbuild::DEBUG_NOTICE)
+	<< format("Running command: %1%") % commandstring << endl;
+      syslog(LOG_USER|LOG_NOTICE, "[%s chroot] (%s->%s) Running command: \"%s\"",
+	     session_chroot->get_name().c_str(), get_ruser().c_str(), get_user().c_str(), commandstring.c_str());
+
+      if (get_verbosity() != auth::VERBOSITY_QUIET)
+	{
+	  std::string format_string;
+	  format_string = (_("[%1% chroot] Running command: \"%2%\""));
+
+	  format fmt(format_string);
+	  fmt % session_chroot->get_name()
+	      % programstring;
+	  sbuild::log_info() << fmt << endl;
+	}
+    }
+}
+
 /*
  * Local Variables:
  * mode:C++
Index: schroot/dchroot-session.h
===================================================================
--- schroot/dchroot-session.h	(revision 758)
+++ schroot/dchroot-session.h	(working copy)
@@ -66,6 +66,17 @@
 
     virtual void
     run_impl ();
+
+    virtual sbuild::string_list
+    get_login_directories () const;
+
+    virtual sbuild::string_list
+    get_command_directories () const;
+
+    virtual void
+    get_command (sbuild::chroot::ptr& session_chroot,
+		 std::string&         file,
+		 sbuild::string_list& command) const;
   };
 
 }
Index: ChangeLog
===================================================================
--- ChangeLog	(revision 760)
+++ ChangeLog	(working copy)
@@ -1,3 +1,44 @@
+2006-06-22  Roger Leigh  <[EMAIL PROTECTED]>
+
+	* schroot/schroot-options.cc: dchroot and dchroot-dsa only permit
+	a single command option.
+
+	* schroot/dchroot-session.cc
+	(get_login_directories): New virtual method.  For dchroot, use the
+	home directory and then / if not preserving the environment,
+	otherwise use the current working directory and /.  For
+	dchroot-dsa, always use the home directory and then /.
+	(get_command_directories): New virtual method.  This simply wraps
+	get_login_directories; dchroot and dchroot-dsa do not distinguish
+	between these two use cases.
+	(get_command): When running a login shell, this behaves similarly
+	to sbuild::session::get_command.  When running a command, dchroot
+	runs "sh -c command", and dchroot-dsa runs "command".
+
+	* schroot/sbuild-session.cc
+	(getcwd): New utility function, split out from run_child.
+	(get_login_directories): New protected virtual method.  Get a list
+	of directories to use (including fallbacks) when running a login
+	shell.  Use the current working directory, $HOME, passwd pw_dir
+	and / in that order.
+	(get_command_directories): New protected virtual method.  Get a
+	list of directories to use (including fallbacks) when running a
+	command.  This is currently only the current working directory;
+	there are no fallbacks.
+	(get_shell): New protected virtual method.  Get the program to run
+	as a shell, falling back to /bin/sh if unavailable.
+	(get_command): New protected virtual method.  Get the parameters
+	for calling exec with (file and argv).
+	(run_child): Use the new functions and methods getcwd,
+	get_login_directories, get_command_directories, get_shell and
+	get_command.  Handle directory fallbacks when changing directory
+	inside the chroot.
+	(run_chroot): If debugging is enabled, automatically set the debug
+	level to DEBUG_NOTICE.
+
+	* schroot/sbuild-session.h (sbuild): New protected member cwd, to
+	hold the current directory before entering the chroot.
+
 2006-06-21  Roger Leigh  <[EMAIL PROTECTED]>
 
 	* schroot/sbuild-chroot-file.h: Remove dangerous TODO item.

Attachment: pgpQNwZk4jZj7.pgp
Description: PGP signature

Reply via email to