From ceabc520928a2eadce005b4f6bcf1f1e703d6b49 Mon Sep 17 00:00:00 2001 From: Michael Vogt Date: Sun, 15 Jul 2007 11:11:04 +0100 Subject: apt-pkg/deb/dpkgpm.{cc,h}: - move the terminal and stdin reading into its own functions --- apt-pkg/deb/dpkgpm.cc | 61 ++++++++++++++++++++++++++++++++------------------- apt-pkg/deb/dpkgpm.h | 5 +++++ 2 files changed, 43 insertions(+), 23 deletions(-) (limited to 'apt-pkg/deb') diff --git a/apt-pkg/deb/dpkgpm.cc b/apt-pkg/deb/dpkgpm.cc index d024f8a35..be61be43b 100644 --- a/apt-pkg/deb/dpkgpm.cc +++ b/apt-pkg/deb/dpkgpm.cc @@ -329,7 +329,40 @@ bool pkgDPkgPM::RunScriptsWithPkgs(const char *Cnf) return true; } + + /*}}}*/ +// DPkgPM::DoStdin - Read stdin and pass to slave pty /*{{{*/ +// --------------------------------------------------------------------- +/* +*/ +void pkgDPkgPM::DoStdin(int master) +{ + char input_buf[2] = {0,0}; + while(read(0, input_buf, 1) > 0) + write(master, input_buf, 1); +} /*}}}*/ +// DPkgPM::DoTerminalPty - Read the terminal pty and write log /*{{{*/ +// --------------------------------------------------------------------- +/* + * read the terminal pty and write log + */ +void pkgDPkgPM::DoTerminalPty(int master, FILE *term_out) +{ + char term_buf[2] = {0,0}; + + // read a single char, make sure that the read can't block + // (otherwise we may leave zombies) + do + { + fwrite(term_buf, 1, 1, term_out); + write(1, term_buf, 1); + } while(read(master, term_buf, 1) > 0); +} + /*}}}*/ + + + // DPkgPM::Go - Run the sequence /*{{{*/ // --------------------------------------------------------------------- /* This globs the operations and calls dpkg @@ -528,6 +561,7 @@ bool pkgDPkgPM::Go(int OutStatusFd) int master; int slave; + // FIXME: setup sensible signal handling (*ick*) tcgetattr(0, &tt); ioctl(0, TIOCGWINSZ, (char *)&win); if (openpty(&master, &slave, NULL, &tt, &win) < 0) @@ -602,8 +636,6 @@ bool pkgDPkgPM::Go(int OutStatusFd) char line[1024] = {0,}; char buf[2] = {0,0}; - char term_buf[2] = {0,0}; - char input_buf[2] = {0,0}; // the result of the waitpid call int res; @@ -644,28 +676,11 @@ bool pkgDPkgPM::Go(int OutStatusFd) else if (select_ret == 0) continue; - // read a single char, make sure that the read can't block - // (otherwise we may leave zombies) - int term_len = read(master, term_buf, 1); - int input_len = read(0, input_buf, 1); - int len = read(_dpkgin, buf, 1); + DoStdin(master); + DoTerminalPty(master, term_out); + //DoDpkgStatusFd(); - // see if we have any input that needs to go to the - // master pty - if(input_len > 0) - write(master, input_buf, 1); - - // see if we have any output that needs to be echoed - // and written to the log - if(term_len > 0) - { - do - { - fwrite(term_buf, 1, 1, term_out); - write(1, term_buf, 1); - } while(read(master, term_buf, 1) > 0); - term_buf[0] = 0; - } + int len = read(_dpkgin, buf, 1); // nothing to read from dpkg , wait a bit for more if(len <= 0) diff --git a/apt-pkg/deb/dpkgpm.h b/apt-pkg/deb/dpkgpm.h index 7da729904..a1466878d 100644 --- a/apt-pkg/deb/dpkgpm.h +++ b/apt-pkg/deb/dpkgpm.h @@ -44,6 +44,11 @@ class pkgDPkgPM : public pkgPackageManager bool RunScriptsWithPkgs(const char *Cnf); bool SendV2Pkgs(FILE *F); + // input processing + void DoStdin(int master); + void DoTerminalPty(int master, FILE *out); + // void DoDpkgStatusFd(); + // The Actuall installation implementation virtual bool Install(PkgIterator Pkg,string File); virtual bool Configure(PkgIterator Pkg); -- cgit v1.2.3