X-Git-Url: https://git.saurik.com/apt.git/blobdiff_plain/0a8e3465cb644e380ab0fc6d66f6d1f17363b34e..e5eebd12b7d7faf31210511dbf15edbda508ffc4:/apt-pkg/contrib/fileutl.cc diff --git a/apt-pkg/contrib/fileutl.cc b/apt-pkg/contrib/fileutl.cc index 60b9f8b75..77e846117 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.8 1998/10/02 04:39:50 jgg Exp $ +// $Id: fileutl.cc,v 1.13 1998/10/26 07:11:49 jgg Exp $ /* ###################################################################### File Utilities @@ -29,7 +29,7 @@ // CopyFile - Buffered copy of a file /*{{{*/ // --------------------------------------------------------------------- /* The caller is expected to set things so that failure causes erasure */ -bool CopyFile(FileFd From,FileFd To) +bool CopyFile(FileFd &From,FileFd &To) { if (From.IsOpen() == false || To.IsOpen() == false) return false; @@ -119,6 +119,47 @@ string flNotDir(string File) return string(File,Res,Res - File.length()); } /*}}}*/ +// SetCloseExec - Set the close on exec flag /*{{{*/ +// --------------------------------------------------------------------- +/* */ +void SetCloseExec(int Fd,bool Close) +{ + if (fcntl(Fd,F_SETFD,(Close == false)?0:FD_CLOEXEC) != 0) + { + cerr << "FATAL -> Could not set close on exec " << strerror(errno) << endl; + exit(100); + } +} + /*}}}*/ +// SetNonBlock - Set the nonblocking flag /*{{{*/ +// --------------------------------------------------------------------- +/* */ +void SetNonBlock(int Fd,bool Block) +{ + int Flags = fcntl(Fd,F_GETFL) & (~O_NONBLOCK); + if (fcntl(Fd,F_SETFL,Flags | ((Block == false)?0:O_NONBLOCK)) != 0) + { + cerr << "FATAL -> Could not set non-blocking flag " << strerror(errno) << endl; + exit(100); + } +} + /*}}}*/ +// WaitFd - Wait for a FD to become readable /*{{{*/ +// --------------------------------------------------------------------- +/* This waits for a FD to become readable using select. It is usefull for + applications making use of non-blocking sockets. */ +bool WaitFd(int Fd) +{ + fd_set Set; + FD_ZERO(&Set); + FD_SET(Fd,&Set); + + if (select(Fd+1,&Set,0,0,0) <= 0) + return false; + + return true; +} + /*}}}*/ // FileFd::FileFd - Open a file /*{{{*/ // --------------------------------------------------------------------- @@ -154,7 +195,10 @@ FileFd::FileFd(string FileName,OpenMode Mode, unsigned long Perms) if (iFd < 0) _error->Errno("open","Could not open file %s",FileName.c_str()); else + { this->FileName = FileName; + SetCloseExec(iFd,true); + } } /*}}}*/ // FileFd::~File - Closes the file /*{{{*/