Modernize AutoCloseFD
This commit is contained in:
		
							parent
							
								
									8a41792d43
								
							
						
					
					
						commit
						cb5e7254b6
					
				
					 11 changed files with 139 additions and 153 deletions
				
			
		|  | @ -274,18 +274,18 @@ string readFile(int fd) | |||
| string readFile(const Path & path, bool drain) | ||||
| { | ||||
|     AutoCloseFD fd = open(path.c_str(), O_RDONLY | O_CLOEXEC); | ||||
|     if (fd == -1) | ||||
|     if (!fd) | ||||
|         throw SysError(format("opening file ‘%1%’") % path); | ||||
|     return drain ? drainFD(fd) : readFile(fd); | ||||
|     return drain ? drainFD(fd.get()) : readFile(fd.get()); | ||||
| } | ||||
| 
 | ||||
| 
 | ||||
| void writeFile(const Path & path, const string & s) | ||||
| { | ||||
|     AutoCloseFD fd = open(path.c_str(), O_WRONLY | O_TRUNC | O_CREAT | O_CLOEXEC, 0666); | ||||
|     if (fd == -1) | ||||
|     if (!fd) | ||||
|         throw SysError(format("opening file ‘%1%’") % path); | ||||
|     writeFull(fd, s); | ||||
|     writeFull(fd.get(), s); | ||||
| } | ||||
| 
 | ||||
| 
 | ||||
|  | @ -556,28 +556,24 @@ void AutoDelete::reset(const Path & p, bool recursive) { | |||
| //////////////////////////////////////////////////////////////////////
 | ||||
| 
 | ||||
| 
 | ||||
| AutoCloseFD::AutoCloseFD() | ||||
| AutoCloseFD::AutoCloseFD() : fd{-1} {} | ||||
| 
 | ||||
| 
 | ||||
| AutoCloseFD::AutoCloseFD(int fd) : fd{fd} {} | ||||
| 
 | ||||
| 
 | ||||
| AutoCloseFD::AutoCloseFD(AutoCloseFD&& that) : fd{that.fd} | ||||
| { | ||||
|     fd = -1; | ||||
|     that.fd = -1; | ||||
| } | ||||
| 
 | ||||
| 
 | ||||
| AutoCloseFD::AutoCloseFD(int fd) | ||||
| AutoCloseFD& AutoCloseFD::operator =(AutoCloseFD&& that) | ||||
| { | ||||
|     this->fd = fd; | ||||
| } | ||||
| 
 | ||||
| 
 | ||||
| AutoCloseFD::AutoCloseFD(const AutoCloseFD & fd) | ||||
| { | ||||
|     /* Copying an AutoCloseFD isn't allowed (who should get to close
 | ||||
|        it?).  But as an edge case, allow copying of closed | ||||
|        AutoCloseFDs.  This is necessary due to tiresome reasons | ||||
|        involving copy constructor use on default object values in STL | ||||
|        containers (like when you do `map[value]' where value isn't in | ||||
|        the map yet). */ | ||||
|     this->fd = fd.fd; | ||||
|     if (this->fd != -1) abort(); | ||||
|     close(); | ||||
|     fd = that.fd; | ||||
|     that.fd = -1; | ||||
|     return *this; | ||||
| } | ||||
| 
 | ||||
| 
 | ||||
|  | @ -591,14 +587,7 @@ AutoCloseFD::~AutoCloseFD() | |||
| } | ||||
| 
 | ||||
| 
 | ||||
| void AutoCloseFD::operator =(int fd) | ||||
| { | ||||
|     if (this->fd != fd) close(); | ||||
|     this->fd = fd; | ||||
| } | ||||
| 
 | ||||
| 
 | ||||
| AutoCloseFD::operator int() const | ||||
| int AutoCloseFD::get() const | ||||
| { | ||||
|     return fd; | ||||
| } | ||||
|  | @ -610,19 +599,17 @@ void AutoCloseFD::close() | |||
|         if (::close(fd) == -1) | ||||
|             /* This should never happen. */ | ||||
|             throw SysError(format("closing file descriptor %1%") % fd); | ||||
|         fd = -1; | ||||
|     } | ||||
| } | ||||
| 
 | ||||
| 
 | ||||
| bool AutoCloseFD::isOpen() | ||||
| AutoCloseFD::operator bool() const | ||||
| { | ||||
|     return fd != -1; | ||||
| } | ||||
| 
 | ||||
| 
 | ||||
| /* Pass responsibility for closing this fd to the caller. */ | ||||
| int AutoCloseFD::borrow() | ||||
| int AutoCloseFD::release() | ||||
| { | ||||
|     int oldFD = fd; | ||||
|     fd = -1; | ||||
|  | @ -899,10 +886,10 @@ string runProgram(Path program, bool searchPath, const Strings & args, | |||
| 
 | ||||
|     /* Fork. */ | ||||
|     Pid pid = startProcess([&]() { | ||||
|         if (dup2(out.writeSide, STDOUT_FILENO) == -1) | ||||
|         if (dup2(out.writeSide.get(), STDOUT_FILENO) == -1) | ||||
|             throw SysError("dupping stdout"); | ||||
|         if (!input.empty()) { | ||||
|             if (dup2(in.readSide, STDIN_FILENO) == -1) | ||||
|             if (dup2(in.readSide.get(), STDIN_FILENO) == -1) | ||||
|                 throw SysError("dupping stdin"); | ||||
|         } | ||||
| 
 | ||||
|  | @ -917,16 +904,16 @@ string runProgram(Path program, bool searchPath, const Strings & args, | |||
|         throw SysError(format("executing ‘%1%’") % program); | ||||
|     }); | ||||
| 
 | ||||
|     out.writeSide.close(); | ||||
|     out.writeSide = -1; | ||||
| 
 | ||||
|     /* FIXME: This can deadlock if the input is too long. */ | ||||
|     if (!input.empty()) { | ||||
|         in.readSide.close(); | ||||
|         writeFull(in.writeSide, input); | ||||
|         in.writeSide.close(); | ||||
|         in.readSide = -1; | ||||
|         writeFull(in.writeSide.get(), input); | ||||
|         in.writeSide = -1; | ||||
|     } | ||||
| 
 | ||||
|     string result = drainFD(out.readSide); | ||||
|     string result = drainFD(out.readSide.get()); | ||||
| 
 | ||||
|     /* Wait for the child to finish. */ | ||||
|     int status = pid.wait(true); | ||||
|  |  | |||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue