diff options
author | Arch Librarian <arch@canonical.com> | 2004-09-20 16:53:38 +0000 |
---|---|---|
committer | Arch Librarian <arch@canonical.com> | 2004-09-20 16:53:38 +0000 |
commit | 54676e1a82f400e37879bc931b6db0c13b8ebb3f (patch) | |
tree | cc1a3db8623e9236855361403c5bc805ae6a42f5 | |
parent | fb0ee66e0bc8a2ae176d3b10da49fcf31c66b838 (diff) |
Working apt-get source build stuff
Author: jgg
Date: 1999-04-20 05:02:09 GMT
Working apt-get source build stuff
-rw-r--r-- | apt-pkg/acquire-worker.cc | 20 | ||||
-rw-r--r-- | apt-pkg/contrib/cdromutl.cc | 14 | ||||
-rw-r--r-- | apt-pkg/contrib/fileutl.cc | 37 | ||||
-rw-r--r-- | apt-pkg/contrib/fileutl.h | 3 | ||||
-rw-r--r-- | apt-pkg/deb/dpkgpm.cc | 32 | ||||
-rw-r--r-- | cmdline/apt-get.cc | 95 |
6 files changed, 107 insertions, 94 deletions
diff --git a/apt-pkg/acquire-worker.cc b/apt-pkg/acquire-worker.cc index 4c204041a..2ec8f1bd8 100644 --- a/apt-pkg/acquire-worker.cc +++ b/apt-pkg/acquire-worker.cc @@ -1,6 +1,6 @@ // -*- mode: cpp; mode: fold -*- // Description /*{{{*/ -// $Id: acquire-worker.cc,v 1.20 1999/03/16 00:43:55 jgg Exp $ +// $Id: acquire-worker.cc,v 1.21 1999/04/20 05:02:09 jgg Exp $ /* ###################################################################### Acquire Worker @@ -115,12 +115,7 @@ bool pkgAcquire::Worker::Start() SetCloseExec(Pipes[0],true); // Fork off the process - Process = fork(); - if (Process < 0) - { - cerr << "FATAL -> Failed to fork." << endl; - exit(100); - } + Process = ExecFork(); // Spawn the subprocess if (Process == 0) @@ -132,17 +127,6 @@ bool pkgAcquire::Worker::Start() SetCloseExec(STDOUT_FILENO,false); SetCloseExec(STDIN_FILENO,false); SetCloseExec(STDERR_FILENO,false); - - signal(SIGPIPE,SIG_DFL); - signal(SIGQUIT,SIG_DFL); - signal(SIGINT,SIG_DFL); - signal(SIGWINCH,SIG_DFL); - signal(SIGCONT,SIG_DFL); - signal(SIGTSTP,SIG_DFL); - - // Close all of our FDs - just in case - for (int K = 3; K != 40; K++) - fcntl(K,F_SETFD,FD_CLOEXEC); const char *Args[2]; Args[0] = Method.c_str(); diff --git a/apt-pkg/contrib/cdromutl.cc b/apt-pkg/contrib/cdromutl.cc index c24970553..a12c9d790 100644 --- a/apt-pkg/contrib/cdromutl.cc +++ b/apt-pkg/contrib/cdromutl.cc @@ -1,6 +1,6 @@ // -*- mode: cpp; mode: fold -*- // Description /*{{{*/ -// $Id: cdromutl.cc,v 1.3 1999/04/03 01:05:24 jgg Exp $ +// $Id: cdromutl.cc,v 1.4 1999/04/20 05:02:09 jgg Exp $ /* ###################################################################### CDROM Utilities - Some functions to manipulate CDROM mounts. @@ -66,16 +66,12 @@ bool UnmountCdrom(string Path) if (IsMounted(Path) == false) return true; - int Child = fork(); - if (Child < -1) - return _error->Errno("fork","Failed to fork"); + int Child = ExecFork(); // The child if (Child == 0) { // Make all the fds /dev/null - for (int I = 0; I != 10; I++) - close(I); for (int I = 0; I != 3; I++) dup2(open("/dev/null",O_RDWR),I); @@ -119,16 +115,12 @@ bool MountCdrom(string Path) if (IsMounted(Path) == true) return true; - int Child = fork(); - if (Child < -1) - return _error->Errno("fork","Failed to fork"); + int Child = ExecFork(); // The child if (Child == 0) { // Make all the fds /dev/null - for (int I = 0; I != 10; I++) - close(I); for (int I = 0; I != 3; I++) dup2(open("/dev/null",O_RDWR),I); diff --git a/apt-pkg/contrib/fileutl.cc b/apt-pkg/contrib/fileutl.cc index bc1681820..43717da16 100644 --- a/apt-pkg/contrib/fileutl.cc +++ b/apt-pkg/contrib/fileutl.cc @@ -1,6 +1,6 @@ // -*- mode: cpp; mode: fold -*- // Description /*{{{*/ -// $Id: fileutl.cc,v 1.26 1999/03/21 07:24:14 jgg Exp $ +// $Id: fileutl.cc,v 1.27 1999/04/20 05:02:09 jgg Exp $ /* ###################################################################### File Utilities @@ -25,6 +25,7 @@ #include <sys/fcntl.h> #include <sys/types.h> #include <sys/time.h> +#include <signal.h> #include <errno.h> /*}}}*/ @@ -214,6 +215,40 @@ bool WaitFd(int Fd,bool write,unsigned long timeout) return true; } /*}}}*/ +// ExecFork - Magical fork that sanitizes the context before execing /*{{{*/ +// --------------------------------------------------------------------- +/* This is used if you want to cleanse the environment for the forked + child, it fixes up the important signals and nukes all of the fds, + otherwise acts like normal fork. */ +int ExecFork() +{ + // Fork off the process + pid_t Process = fork(); + if (Process < 0) + { + cerr << "FATAL -> Failed to fork." << endl; + exit(100); + } + + // Spawn the subprocess + if (Process == 0) + { + // Setup the signals + signal(SIGPIPE,SIG_DFL); + signal(SIGQUIT,SIG_DFL); + signal(SIGINT,SIG_DFL); + signal(SIGWINCH,SIG_DFL); + signal(SIGCONT,SIG_DFL); + signal(SIGTSTP,SIG_DFL); + + // Close all of our FDs - just in case + for (int K = 3; K != 40; K++) + fcntl(K,F_SETFD,FD_CLOEXEC); + } + + return Process; +} + /*}}}*/ // FileFd::FileFd - Open a file /*{{{*/ // --------------------------------------------------------------------- diff --git a/apt-pkg/contrib/fileutl.h b/apt-pkg/contrib/fileutl.h index 4a6f6516e..8a1083241 100644 --- a/apt-pkg/contrib/fileutl.h +++ b/apt-pkg/contrib/fileutl.h @@ -1,6 +1,6 @@ // -*- mode: cpp; mode: fold -*- // Description /*{{{*/ -// $Id: fileutl.h,v 1.17 1999/04/07 05:35:55 jgg Exp $ +// $Id: fileutl.h,v 1.18 1999/04/20 05:02:09 jgg Exp $ /* ###################################################################### File Utilities @@ -69,6 +69,7 @@ string SafeGetCWD(); void SetCloseExec(int Fd,bool Close); void SetNonBlock(int Fd,bool Block); bool WaitFd(int Fd,bool write = false,unsigned long timeout = 0); +int ExecFork(); // File string manipulators string flNotDir(string File); diff --git a/apt-pkg/deb/dpkgpm.cc b/apt-pkg/deb/dpkgpm.cc index f8c59d844..478b119cf 100644 --- a/apt-pkg/deb/dpkgpm.cc +++ b/apt-pkg/deb/dpkgpm.cc @@ -1,6 +1,6 @@ // -*- mode: cpp; mode: fold -*- // Description /*{{{*/ -// $Id: dpkgpm.cc,v 1.8 1999/03/05 19:36:49 jgg Exp $ +// $Id: dpkgpm.cc,v 1.9 1999/04/20 05:02:09 jgg Exp $ /* ###################################################################### DPKG Package Manager - Provide an interface to dpkg @@ -86,27 +86,14 @@ bool pkgDPkgPM::RunScripts(const char *Cnf) Opts = Opts->Child; // Fork for running the system calls - pid_t Child = fork(); - if (Child < 0) - return _error->Errno("fork","Could't fork"); + pid_t Child = ExecFork(); // This is the child if (Child == 0) { - signal(SIGPIPE,SIG_DFL); - signal(SIGQUIT,SIG_DFL); - signal(SIGINT,SIG_DFL); - signal(SIGWINCH,SIG_DFL); - signal(SIGCONT,SIG_DFL); - signal(SIGTSTP,SIG_DFL); - if (chdir("/tmp/") != 0) _exit(100); - // Close all of our FDs - just in case - for (int K = 3; K != 40; K++) - fcntl(K,F_SETFD,FD_CLOEXEC); - unsigned int Count = 1; for (; Opts != 0; Opts = Opts->Next, Count++) { @@ -250,27 +237,14 @@ bool pkgDPkgPM::Go() signal(SIGINT,SIG_IGN); // Fork dpkg - pid_t Child = fork(); - if (Child < 0) - return _error->Errno("fork","Could't fork"); + pid_t Child = ExecFork(); // This is the child if (Child == 0) { - signal(SIGPIPE,SIG_DFL); - signal(SIGQUIT,SIG_DFL); - signal(SIGINT,SIG_DFL); - signal(SIGWINCH,SIG_DFL); - signal(SIGCONT,SIG_DFL); - signal(SIGTSTP,SIG_DFL); - if (chdir(_config->FindDir("DPkg::Run-Directory","/").c_str()) != 0) _exit(100); - // Close all of our FDs - just in case - for (int K = 3; K != 40; K++) - fcntl(K,F_SETFD,FD_CLOEXEC); - int Flags,dummy; if ((Flags = fcntl(STDIN_FILENO,F_GETFL,dummy)) < 0) _exit(100); diff --git a/cmdline/apt-get.cc b/cmdline/apt-get.cc index 504cde33e..41d089d76 100644 --- a/cmdline/apt-get.cc +++ b/cmdline/apt-get.cc @@ -1,6 +1,6 @@ // -*- mode: cpp; mode: fold -*- // Description /*{{{*/ -// $Id: apt-get.cc,v 1.54 1999/04/19 06:03:09 jgg Exp $ +// $Id: apt-get.cc,v 1.55 1999/04/20 05:02:09 jgg Exp $ /* ###################################################################### apt-get - Cover for dpkg @@ -51,6 +51,7 @@ #include <signal.h> #include <unistd.h> #include <stdio.h> +#include <sys/wait.h> /*}}}*/ ostream c0out; @@ -1214,42 +1215,68 @@ bool DoSource(CommandLine &CmdL) return true; // Unpack the sources - for (unsigned I = 0; I != J; I++) + pid_t Process = ExecFork(); + + if (Process == 0) { - string Dir = Dsc[I].Package + '-' + pkgBaseVersion(Dsc[I].Version.c_str()); - - // See if the package is already unpacked - struct stat Stat; - if (stat(Dir.c_str(),&Stat) == 0 && - S_ISDIR(Stat.st_mode) != 0) - { - c0out << "Skipping unpack of already unpacked source in " << Dir << endl; - } - else + for (unsigned I = 0; I != J; I++) { - // Call dpkg-source - char S[500]; - snprintf(S,sizeof(S),"%s -x %s", - _config->Find("Dir::Bin::dpkg-source","dpkg-source").c_str(), - Dsc[I].Dsc.c_str()); - if (system(S) != 0) - return _error->Error("Unpack command '%s' failed.",S); - } - - // Try to compile it with dpkg-buildpackage - if (_config->FindB("APT::Get::Compile",false) == true) - { - // Call dpkg-buildpackage - char S[500]; - snprintf(S,sizeof(S),"cd %s && %s %s", - Dir.c_str(), - _config->Find("Dir::Bin::dpkg-buildpackage","dpkg-buildpackage").c_str(), - _config->Find("DPkg::Build-Options","-b -uc").c_str()); + string Dir = Dsc[I].Package + '-' + pkgBaseVersion(Dsc[I].Version.c_str()); - if (system(S) != 0) - return _error->Error("Build command '%s' failed.",S); - } - } + // See if the package is already unpacked + struct stat Stat; + if (stat(Dir.c_str(),&Stat) == 0 && + S_ISDIR(Stat.st_mode) != 0) + { + c0out << "Skipping unpack of already unpacked source in " << Dir << endl; + } + else + { + // Call dpkg-source + char S[500]; + snprintf(S,sizeof(S),"%s -x %s", + _config->Find("Dir::Bin::dpkg-source","dpkg-source").c_str(), + Dsc[I].Dsc.c_str()); + if (system(S) != 0) + { + cerr << "Unpack command '" << S << "' failed." << endl; + _exit(1); + } + } + + // Try to compile it with dpkg-buildpackage + if (_config->FindB("APT::Get::Compile",false) == true) + { + // Call dpkg-buildpackage + char S[500]; + snprintf(S,sizeof(S),"cd %s && %s %s", + Dir.c_str(), + _config->Find("Dir::Bin::dpkg-buildpackage","dpkg-buildpackage").c_str(), + _config->Find("DPkg::Build-Options","-b -uc").c_str()); + + if (system(S) != 0) + { + cerr << "Build command '" << S << "' failed." << endl; + _exit(1); + } + } + } + + _exit(0); + } + + // Wait for the subprocess + int Status = 0; + while (waitpid(Process,&Status,0) != Process) + { + if (errno == EINTR) + continue; + return _error->Errno("waitpid","Couldn't wait for subprocess"); + } + + if (WIFEXITED(Status) == 0 || WEXITSTATUS(Status) != 0) + return _error->Error("Child process failed"); + return true; } /*}}}*/ |