libutil: make AutoCloseFD a better resource

add a reset() method to close the wrapped fd instead of assigning magic
constants. also make the from-fd constructor explicit so you can't
accidentally assign the *wrong* magic constant, or even an unrelated
integer that also just happens to be an fd by pure chance.

Change-Id: I51311b0f6e040240886b5103d39d1794a6acc325
This commit is contained in:
eldritch horrors 2024-03-18 14:52:04 +01:00
parent 0f518f44e2
commit f38ae92a38
18 changed files with 59 additions and 60 deletions

View file

@ -126,7 +126,7 @@ static int main_build_remote(int argc, char * * argv)
mkdir(currentLoad.c_str(), 0777); mkdir(currentLoad.c_str(), 0777);
while (true) { while (true) {
bestSlotLock = -1; bestSlotLock.reset();
AutoCloseFD lock = openLockFile(currentLoad + "/main-lock", true); AutoCloseFD lock = openLockFile(currentLoad + "/main-lock", true);
lockFile(lock.get(), ltWrite, true); lockFile(lock.get(), ltWrite, true);
@ -229,7 +229,7 @@ static int main_build_remote(int argc, char * * argv)
futimens(bestSlotLock.get(), NULL); futimens(bestSlotLock.get(), NULL);
#endif #endif
lock = -1; lock.reset();
try { try {
@ -282,7 +282,7 @@ connected:
copyPaths(*store, *sshStore, store->parseStorePathSet(inputs), NoRepair, NoCheckSigs, substitute); copyPaths(*store, *sshStore, store->parseStorePathSet(inputs), NoRepair, NoCheckSigs, substitute);
} }
uploadLock = -1; uploadLock.reset();
auto drv = store->readDerivation(*drvPath); auto drv = store->readDerivation(*drvPath);

View file

@ -124,7 +124,7 @@ void BinaryCacheStore::writeNarInfo(ref<NarInfo> narInfo)
AutoCloseFD openFile(const Path & path) AutoCloseFD openFile(const Path & path)
{ {
auto fd = open(path.c_str(), O_RDONLY | O_CLOEXEC); AutoCloseFD fd{open(path.c_str(), O_RDONLY | O_CLOEXEC)};
if (!fd) if (!fd)
throw SysError("opening file '%1%'", path); throw SysError("opening file '%1%'", path);
return fd; return fd;

View file

@ -846,8 +846,8 @@ int DerivationGoal::getChildStatus()
void DerivationGoal::closeReadPipes() void DerivationGoal::closeReadPipes()
{ {
hook->builderOut.readSide = -1; hook->builderOut.readSide.reset();
hook->fromHook.readSide = -1; hook->fromHook.readSide.reset();
} }
@ -1227,7 +1227,7 @@ HookReply DerivationGoal::tryBuildHook()
} }
hook->sink = FdSink(); hook->sink = FdSink();
hook->toHook.writeSide = -1; hook->toHook.writeSide.reset();
/* Create the log file and pipe. */ /* Create the log file and pipe. */
Path logFile = openLogFile(); Path logFile = openLogFile();
@ -1273,7 +1273,7 @@ Path DerivationGoal::openLogFile()
Path logFileName = fmt("%s/%s%s", dir, baseName.substr(2), Path logFileName = fmt("%s/%s%s", dir, baseName.substr(2),
settings.compressLog ? ".bz2" : ""); settings.compressLog ? ".bz2" : "");
fdLogFile = open(logFileName.c_str(), O_CREAT | O_WRONLY | O_TRUNC | O_CLOEXEC, 0666); fdLogFile = AutoCloseFD{open(logFileName.c_str(), O_CREAT | O_WRONLY | O_TRUNC | O_CLOEXEC, 0666)};
if (!fdLogFile) throw SysError("creating log file '%1%'", logFileName); if (!fdLogFile) throw SysError("creating log file '%1%'", logFileName);
logFileSink = std::make_shared<FdSink>(fdLogFile.get()); logFileSink = std::make_shared<FdSink>(fdLogFile.get());
@ -1293,7 +1293,7 @@ void DerivationGoal::closeLogFile()
if (logSink2) logSink2->finish(); if (logSink2) logSink2->finish();
if (logFileSink) logFileSink->flush(); if (logFileSink) logFileSink->flush();
logSink = logFileSink = 0; logSink = logFileSink = 0;
fdLogFile = -1; fdLogFile.reset();
} }

View file

@ -61,8 +61,8 @@ HookInstance::HookInstance()
}); });
pid.setSeparatePG(true); pid.setSeparatePG(true);
fromHook.writeSide = -1; fromHook.writeSide.reset();
toHook.readSide = -1; toHook.readSide.reset();
sink = FdSink(toHook.writeSide.get()); sink = FdSink(toHook.writeSide.get());
std::map<std::string, Config::SettingInfo> settings; std::map<std::string, Config::SettingInfo> settings;
@ -76,7 +76,7 @@ HookInstance::HookInstance()
HookInstance::~HookInstance() HookInstance::~HookInstance()
{ {
try { try {
toHook.writeSide = -1; toHook.writeSide.reset();
if (pid != -1) pid.kill(); if (pid != -1) pid.kill();
} catch (...) { } catch (...) {
ignoreException(); ignoreException();

View file

@ -309,8 +309,8 @@ void LocalDerivationGoal::cleanupHookFinally()
void LocalDerivationGoal::cleanupPreChildKill() void LocalDerivationGoal::cleanupPreChildKill()
{ {
sandboxMountNamespace = -1; sandboxMountNamespace.reset();
sandboxUserNamespace = -1; sandboxUserNamespace.reset();
} }
@ -807,7 +807,7 @@ void LocalDerivationGoal::startBuilder()
Path logFile = openLogFile(); Path logFile = openLogFile();
/* Create a pseudoterminal to get the output of the builder. */ /* Create a pseudoterminal to get the output of the builder. */
builderOut = posix_openpt(O_RDWR | O_NOCTTY); builderOut = AutoCloseFD{posix_openpt(O_RDWR | O_NOCTTY)};
if (!builderOut) if (!builderOut)
throw SysError("opening pseudoterminal master"); throw SysError("opening pseudoterminal master");
@ -834,7 +834,7 @@ void LocalDerivationGoal::startBuilder()
/* Open the slave side of the pseudoterminal and use it as stderr. */ /* Open the slave side of the pseudoterminal and use it as stderr. */
auto openSlave = [&]() auto openSlave = [&]()
{ {
AutoCloseFD builderOut = open(slaveName.c_str(), O_RDWR | O_NOCTTY); AutoCloseFD builderOut{open(slaveName.c_str(), O_RDWR | O_NOCTTY)};
if (!builderOut) if (!builderOut)
throw SysError("opening pseudoterminal slave"); throw SysError("opening pseudoterminal slave");
@ -937,12 +937,12 @@ void LocalDerivationGoal::startBuilder()
if (helper.wait() != 0) if (helper.wait() != 0)
throw Error("unable to start build process"); throw Error("unable to start build process");
userNamespaceSync.readSide = -1; userNamespaceSync.readSide.reset();
/* Close the write side to prevent runChild() from hanging /* Close the write side to prevent runChild() from hanging
reading from this. */ reading from this. */
Finally cleanup([&]() { Finally cleanup([&]() {
userNamespaceSync.writeSide = -1; userNamespaceSync.writeSide.reset();
}); });
auto ss = tokenizeString<std::vector<std::string>>(readLine(sendPid.readSide.get())); auto ss = tokenizeString<std::vector<std::string>>(readLine(sendPid.readSide.get()));
@ -981,12 +981,12 @@ void LocalDerivationGoal::startBuilder()
/* Save the mount- and user namespace of the child. We have to do this /* Save the mount- and user namespace of the child. We have to do this
*before* the child does a chroot. */ *before* the child does a chroot. */
sandboxMountNamespace = open(fmt("/proc/%d/ns/mnt", (pid_t) pid).c_str(), O_RDONLY); sandboxMountNamespace = AutoCloseFD{open(fmt("/proc/%d/ns/mnt", (pid_t) pid).c_str(), O_RDONLY)};
if (sandboxMountNamespace.get() == -1) if (sandboxMountNamespace.get() == -1)
throw SysError("getting sandbox mount namespace"); throw SysError("getting sandbox mount namespace");
if (usingUserNamespace) { if (usingUserNamespace) {
sandboxUserNamespace = open(fmt("/proc/%d/ns/user", (pid_t) pid).c_str(), O_RDONLY); sandboxUserNamespace = AutoCloseFD{open(fmt("/proc/%d/ns/user", (pid_t) pid).c_str(), O_RDONLY)};
if (sandboxUserNamespace.get() == -1) if (sandboxUserNamespace.get() == -1)
throw SysError("getting sandbox user namespace"); throw SysError("getting sandbox user namespace");
} }
@ -1471,8 +1471,8 @@ void LocalDerivationGoal::startDaemon()
struct sockaddr_un remoteAddr; struct sockaddr_un remoteAddr;
socklen_t remoteAddrLen = sizeof(remoteAddr); socklen_t remoteAddrLen = sizeof(remoteAddr);
AutoCloseFD remote = accept(daemonSocket.get(), AutoCloseFD remote{accept(daemonSocket.get(),
(struct sockaddr *) &remoteAddr, &remoteAddrLen); (struct sockaddr *) &remoteAddr, &remoteAddrLen)};
if (!remote) { if (!remote) {
if (errno == EINTR || errno == EAGAIN) continue; if (errno == EINTR || errno == EAGAIN) continue;
if (errno == EINVAL || errno == ECONNABORTED) break; if (errno == EINVAL || errno == ECONNABORTED) break;
@ -1705,12 +1705,12 @@ void LocalDerivationGoal::runChild()
#if __linux__ #if __linux__
if (useChroot) { if (useChroot) {
userNamespaceSync.writeSide = -1; userNamespaceSync.writeSide.reset();
if (drainFD(userNamespaceSync.readSide.get()) != "1") if (drainFD(userNamespaceSync.readSide.get()) != "1")
throw Error("user namespace initialisation failed"); throw Error("user namespace initialisation failed");
userNamespaceSync.readSide = -1; userNamespaceSync.readSide.reset();
if (privateNetwork) { if (privateNetwork) {

View file

@ -549,7 +549,7 @@ void LocalStore::collectGarbage(const GCOptions & options, GCResults & results)
if (fds[1].revents) { if (fds[1].revents) {
/* Accept a new connection. */ /* Accept a new connection. */
assert(fds[1].revents & POLLIN); assert(fds[1].revents & POLLIN);
AutoCloseFD fdClient = accept(fdServer.get(), nullptr, nullptr); AutoCloseFD fdClient{accept(fdServer.get(), nullptr, nullptr)};
if (!fdClient) continue; if (!fdClient) continue;
debug("GC roots server accepted new client"); debug("GC roots server accepted new client");
@ -647,7 +647,7 @@ void LocalStore::collectGarbage(const GCOptions & options, GCResults & results)
by another process. We need to be sure that we can acquire an by another process. We need to be sure that we can acquire an
exclusive lock before deleting them. */ exclusive lock before deleting them. */
if (baseName.find("tmp-", 0) == 0) { if (baseName.find("tmp-", 0) == 0) {
AutoCloseFD tmpDirFd = open(realPath.c_str(), O_RDONLY | O_DIRECTORY); AutoCloseFD tmpDirFd{open(realPath.c_str(), O_RDONLY | O_DIRECTORY)};
if (tmpDirFd.get() == -1 || !lockFile(tmpDirFd.get(), ltWrite, false)) { if (tmpDirFd.get() == -1 || !lockFile(tmpDirFd.get(), ltWrite, false)) {
debug("skipping locked tempdir '%s'", realPath); debug("skipping locked tempdir '%s'", realPath);
return; return;

View file

@ -263,7 +263,7 @@ LocalStore::LocalStore(const Params & params)
if (stat(reservedPath.c_str(), &st) == -1 || if (stat(reservedPath.c_str(), &st) == -1 ||
st.st_size != settings.reservedSize) st.st_size != settings.reservedSize)
{ {
AutoCloseFD fd = open(reservedPath.c_str(), O_WRONLY | O_CREAT | O_CLOEXEC, 0600); AutoCloseFD fd{open(reservedPath.c_str(), O_WRONLY | O_CREAT | O_CLOEXEC, 0600)};
int res = -1; int res = -1;
#if HAVE_POSIX_FALLOCATE #if HAVE_POSIX_FALLOCATE
res = posix_fallocate(fd.get(), 0, settings.reservedSize); res = posix_fallocate(fd.get(), 0, settings.reservedSize);
@ -453,7 +453,7 @@ LocalStore::LocalStore(std::string scheme, std::string path, const Params & para
AutoCloseFD LocalStore::openGCLock() AutoCloseFD LocalStore::openGCLock()
{ {
Path fnGCLock = stateDir + "/gc.lock"; Path fnGCLock = stateDir + "/gc.lock";
auto fdGCLock = open(fnGCLock.c_str(), O_RDWR | O_CREAT | O_CLOEXEC, 0600); AutoCloseFD fdGCLock{open(fnGCLock.c_str(), O_RDWR | O_CREAT | O_CLOEXEC, 0600)};
if (!fdGCLock) if (!fdGCLock)
throw SysError("opening global GC lock '%1%'", fnGCLock); throw SysError("opening global GC lock '%1%'", fnGCLock);
return fdGCLock; return fdGCLock;
@ -478,7 +478,7 @@ LocalStore::~LocalStore()
try { try {
auto fdTempRoots(_fdTempRoots.lock()); auto fdTempRoots(_fdTempRoots.lock());
if (*fdTempRoots) { if (*fdTempRoots) {
*fdTempRoots = -1; fdTempRoots->reset();
unlink(fnTempRoots.c_str()); unlink(fnTempRoots.c_str());
} }
} catch (...) { } catch (...) {
@ -1484,7 +1484,7 @@ std::pair<Path, AutoCloseFD> LocalStore::createTempDirInStore()
the GC between createTempDir() and when we acquire a lock on it. the GC between createTempDir() and when we acquire a lock on it.
We'll repeat until 'tmpDir' exists and we've locked it. */ We'll repeat until 'tmpDir' exists and we've locked it. */
tmpDirFn = createTempDir(realStoreDir, "tmp"); tmpDirFn = createTempDir(realStoreDir, "tmp");
tmpDirFd = open(tmpDirFn.c_str(), O_RDONLY | O_DIRECTORY); tmpDirFd = AutoCloseFD{open(tmpDirFn.c_str(), O_RDONLY | O_DIRECTORY)};
if (tmpDirFd.get() < 0) { if (tmpDirFd.get() < 0) {
continue; continue;
} }

View file

@ -76,7 +76,7 @@ struct SimpleUserLock : UserLock
auto fnUserLock = fmt("%s/userpool/%s", settings.nixStateDir,pw->pw_uid); auto fnUserLock = fmt("%s/userpool/%s", settings.nixStateDir,pw->pw_uid);
AutoCloseFD fd = open(fnUserLock.c_str(), O_RDWR | O_CREAT | O_CLOEXEC, 0600); AutoCloseFD fd{open(fnUserLock.c_str(), O_RDWR | O_CREAT | O_CLOEXEC, 0600)};
if (!fd) if (!fd)
throw SysError("opening user lock '%s'", fnUserLock); throw SysError("opening user lock '%s'", fnUserLock);
@ -148,7 +148,7 @@ struct AutoUserLock : UserLock
auto fnUserLock = fmt("%s/userpool2/slot-%d", settings.nixStateDir, i); auto fnUserLock = fmt("%s/userpool2/slot-%d", settings.nixStateDir, i);
AutoCloseFD fd = open(fnUserLock.c_str(), O_RDWR | O_CREAT | O_CLOEXEC, 0600); AutoCloseFD fd{open(fnUserLock.c_str(), O_RDWR | O_CREAT | O_CLOEXEC, 0600)};
if (!fd) if (!fd)
throw SysError("opening user lock '%s'", fnUserLock); throw SysError("opening user lock '%s'", fnUserLock);

View file

@ -17,9 +17,7 @@ namespace nix {
AutoCloseFD openLockFile(const Path & path, bool create) AutoCloseFD openLockFile(const Path & path, bool create)
{ {
AutoCloseFD fd; AutoCloseFD fd{open(path.c_str(), O_CLOEXEC | O_RDWR | (create ? O_CREAT : 0), 0600)};
fd = open(path.c_str(), O_CLOEXEC | O_RDWR | (create ? O_CREAT : 0), 0600);
if (!fd && (create || errno != ENOENT)) if (!fd && (create || errno != ENOENT))
throw SysError("opening lock file '%1%'", path); throw SysError("opening lock file '%1%'", path);

View file

@ -71,7 +71,7 @@ std::pair<ref<FSAccessor>, Path> RemoteFSAccessor::fetch(const Path & path_, boo
auto narAccessor = makeLazyNarAccessor(listing, auto narAccessor = makeLazyNarAccessor(listing,
[cacheFile](uint64_t offset, uint64_t length) { [cacheFile](uint64_t offset, uint64_t length) {
AutoCloseFD fd = open(cacheFile.c_str(), O_RDONLY | O_CLOEXEC); AutoCloseFD fd{open(cacheFile.c_str(), O_RDONLY | O_CLOEXEC)};
if (!fd) if (!fd)
throw SysError("opening NAR cache file '%s'", cacheFile); throw SysError("opening NAR cache file '%s'", cacheFile);

View file

@ -100,8 +100,8 @@ std::unique_ptr<SSHMaster::Connection> SSHMaster::startCommand(const std::string
}, options); }, options);
in.readSide = -1; in.readSide.reset();
out.writeSide = -1; out.writeSide.reset();
// Wait for the SSH connection to be established, // Wait for the SSH connection to be established,
// So that we don't overwrite the password prompt with our progress bar. // So that we don't overwrite the password prompt with our progress bar.
@ -162,7 +162,7 @@ Path SSHMaster::startMaster()
throw SysError("unable to execute '%s'", args.front()); throw SysError("unable to execute '%s'", args.front());
}, options); }, options);
out.writeSide = -1; out.writeSide.reset();
std::string reply; std::string reply;
try { try {

View file

@ -44,7 +44,7 @@ static void dumpContents(const Path & path, off_t size,
{ {
sink << "contents" << size; sink << "contents" << size;
AutoCloseFD fd = open(path.c_str(), O_RDONLY | O_CLOEXEC); AutoCloseFD fd{open(path.c_str(), O_RDONLY | O_CLOEXEC)};
if (!fd) throw SysError("opening file '%1%'", path); if (!fd) throw SysError("opening file '%1%'", path);
std::vector<char> buf(65536); std::vector<char> buf(65536);
@ -318,7 +318,7 @@ struct RestoreSink : ParseSink
void createRegularFile(const Path & path) override void createRegularFile(const Path & path) override
{ {
Path p = dstPath + path; Path p = dstPath + path;
fd = open(p.c_str(), O_CREAT | O_EXCL | O_WRONLY | O_CLOEXEC, 0666); fd = AutoCloseFD{open(p.c_str(), O_CREAT | O_EXCL | O_WRONLY | O_CLOEXEC, 0666)};
if (!fd) throw SysError("creating file '%1%'", p); if (!fd) throw SysError("creating file '%1%'", p);
} }

View file

@ -379,7 +379,7 @@ std::string readFile(int fd)
std::string readFile(const Path & path) std::string readFile(const Path & path)
{ {
AutoCloseFD fd = open(path.c_str(), O_RDONLY | O_CLOEXEC); AutoCloseFD fd{open(path.c_str(), O_RDONLY | O_CLOEXEC)};
if (!fd) if (!fd)
throw SysError("opening file '%1%'", path); throw SysError("opening file '%1%'", path);
return readFile(fd.get()); return readFile(fd.get());
@ -388,7 +388,7 @@ std::string readFile(const Path & path)
void readFile(const Path & path, Sink & sink) void readFile(const Path & path, Sink & sink)
{ {
AutoCloseFD fd = open(path.c_str(), O_RDONLY | O_CLOEXEC); AutoCloseFD fd{open(path.c_str(), O_RDONLY | O_CLOEXEC)};
if (!fd) if (!fd)
throw SysError("opening file '%s'", path); throw SysError("opening file '%s'", path);
drainFD(fd.get(), sink); drainFD(fd.get(), sink);
@ -397,7 +397,7 @@ void readFile(const Path & path, Sink & sink)
void writeFile(const Path & path, std::string_view s, mode_t mode, bool sync) void writeFile(const Path & path, std::string_view s, mode_t mode, bool sync)
{ {
AutoCloseFD fd = open(path.c_str(), O_WRONLY | O_TRUNC | O_CREAT | O_CLOEXEC, mode); AutoCloseFD fd{open(path.c_str(), O_WRONLY | O_TRUNC | O_CREAT | O_CLOEXEC, mode)};
if (!fd) if (!fd)
throw SysError("opening file '%1%'", path); throw SysError("opening file '%1%'", path);
try { try {
@ -417,7 +417,7 @@ void writeFile(const Path & path, std::string_view s, mode_t mode, bool sync)
void writeFile(const Path & path, Source & source, mode_t mode, bool sync) void writeFile(const Path & path, Source & source, mode_t mode, bool sync)
{ {
AutoCloseFD fd = open(path.c_str(), O_WRONLY | O_TRUNC | O_CREAT | O_CLOEXEC, mode); AutoCloseFD fd{open(path.c_str(), O_WRONLY | O_TRUNC | O_CREAT | O_CLOEXEC, mode)};
if (!fd) if (!fd)
throw SysError("opening file '%1%'", path); throw SysError("opening file '%1%'", path);
@ -444,7 +444,7 @@ void writeFile(const Path & path, Source & source, mode_t mode, bool sync)
void syncParent(const Path & path) void syncParent(const Path & path)
{ {
AutoCloseFD fd = open(dirOf(path).c_str(), O_RDONLY, 0); AutoCloseFD fd{open(dirOf(path).c_str(), O_RDONLY, 0)};
if (!fd) if (!fd)
throw SysError("opening file '%1%'", path); throw SysError("opening file '%1%'", path);
fd.fsync(); fd.fsync();
@ -941,8 +941,8 @@ void Pipe::create()
closeOnExec(fds[0]); closeOnExec(fds[0]);
closeOnExec(fds[1]); closeOnExec(fds[1]);
#endif #endif
readSide = fds[0]; readSide = AutoCloseFD{fds[0]};
writeSide = fds[1]; writeSide = AutoCloseFD{fds[1]};
} }
@ -1718,11 +1718,11 @@ void saveMountNamespace()
#if __linux__ #if __linux__
static std::once_flag done; static std::once_flag done;
std::call_once(done, []() { std::call_once(done, []() {
fdSavedMountNamespace = open("/proc/self/ns/mnt", O_RDONLY); fdSavedMountNamespace = AutoCloseFD{open("/proc/self/ns/mnt", O_RDONLY)};
if (!fdSavedMountNamespace) if (!fdSavedMountNamespace)
throw SysError("saving parent mount namespace"); throw SysError("saving parent mount namespace");
fdSavedRoot = open("/proc/self/root", O_RDONLY); fdSavedRoot = AutoCloseFD{open("/proc/self/root", O_RDONLY)};
}); });
#endif #endif
} }
@ -1777,11 +1777,11 @@ void restoreProcessContext(bool restoreMounts)
AutoCloseFD createUnixDomainSocket() AutoCloseFD createUnixDomainSocket()
{ {
AutoCloseFD fdSocket = socket(PF_UNIX, SOCK_STREAM AutoCloseFD fdSocket{socket(PF_UNIX, SOCK_STREAM
#ifdef SOCK_CLOEXEC #ifdef SOCK_CLOEXEC
| SOCK_CLOEXEC | SOCK_CLOEXEC
#endif #endif
, 0); , 0)};
if (!fdSocket) if (!fdSocket)
throw SysError("cannot create Unix domain socket"); throw SysError("cannot create Unix domain socket");
closeOnExec(fdSocket.get()); closeOnExec(fdSocket.get());

View file

@ -332,7 +332,7 @@ class AutoCloseFD
int fd; int fd;
public: public:
AutoCloseFD(); AutoCloseFD();
AutoCloseFD(int fd); explicit AutoCloseFD(int fd);
AutoCloseFD(const AutoCloseFD & fd) = delete; AutoCloseFD(const AutoCloseFD & fd) = delete;
AutoCloseFD(AutoCloseFD&& fd); AutoCloseFD(AutoCloseFD&& fd);
~AutoCloseFD(); ~AutoCloseFD();
@ -343,6 +343,7 @@ public:
int release(); int release();
void close(); void close();
void fsync(); void fsync();
void reset() { *this = {}; }
}; };

View file

@ -83,7 +83,7 @@ static void update(const StringSet & channelNames)
writeFull(fd.get(), writeFull(fd.get(),
#include "unpack-channel.nix.gen.hh" #include "unpack-channel.nix.gen.hh"
); );
fd = -1; fd.reset();
AutoDelete del(unpackChannelPath, false); AutoDelete del(unpackChannelPath, false);
// Download each channel. // Download each channel.

View file

@ -294,7 +294,7 @@ static void daemonLoop(std::optional<TrustedFlag> forceTrustClientOpt)
if (listenFds) { if (listenFds) {
if (getEnv("LISTEN_PID") != std::to_string(getpid()) || listenFds != "1") if (getEnv("LISTEN_PID") != std::to_string(getpid()) || listenFds != "1")
throw Error("unexpected systemd environment variables"); throw Error("unexpected systemd environment variables");
fdSocket = SD_LISTEN_FDS_START; fdSocket = AutoCloseFD{SD_LISTEN_FDS_START};
closeOnExec(fdSocket.get()); closeOnExec(fdSocket.get());
} }
@ -315,8 +315,8 @@ static void daemonLoop(std::optional<TrustedFlag> forceTrustClientOpt)
struct sockaddr_un remoteAddr; struct sockaddr_un remoteAddr;
socklen_t remoteAddrLen = sizeof(remoteAddr); socklen_t remoteAddrLen = sizeof(remoteAddr);
AutoCloseFD remote = accept(fdSocket.get(), AutoCloseFD remote{accept(fdSocket.get(),
(struct sockaddr *) &remoteAddr, &remoteAddrLen); (struct sockaddr *) &remoteAddr, &remoteAddrLen)};
checkInterrupt(); checkInterrupt();
if (!remote) { if (!remote) {
if (errno == EINTR) continue; if (errno == EINTR) continue;
@ -348,7 +348,7 @@ static void daemonLoop(std::optional<TrustedFlag> forceTrustClientOpt)
options.dieWithParent = false; options.dieWithParent = false;
options.runExitHandlers = true; options.runExitHandlers = true;
startProcess([&]() { startProcess([&]() {
fdSocket = -1; fdSocket.reset();
// Background the daemon. // Background the daemon.
if (setsid() == -1) if (setsid() == -1)

View file

@ -92,7 +92,7 @@ std::tuple<StorePath, Hash> prefetchFile(
if (executable) if (executable)
mode = 0700; mode = 0700;
AutoCloseFD fd = open(tmpFile.c_str(), O_WRONLY | O_CREAT | O_EXCL, mode); AutoCloseFD fd{open(tmpFile.c_str(), O_WRONLY | O_CREAT | O_EXCL, mode)};
if (!fd) throw SysError("creating temporary file '%s'", tmpFile); if (!fd) throw SysError("creating temporary file '%s'", tmpFile);
FdSink sink(fd.get()); FdSink sink(fd.get());

View file

@ -30,7 +30,7 @@ std::set<std::string> readCacheFile(const Path & file)
std::set<std::string> runResolver(const Path & filename) std::set<std::string> runResolver(const Path & filename)
{ {
AutoCloseFD fd = open(filename.c_str(), O_RDONLY); AutoCloseFD fd{open(filename.c_str(), O_RDONLY)};
if (!fd) if (!fd)
throw SysError("opening '%s'", filename); throw SysError("opening '%s'", filename);