diff options
| author | Congcong Kuo <congcong.kuo@gmail.com> | 2025-07-21 11:02:40 +0800 |
|---|---|---|
| committer | Ludovic Courtès <ludo@gnu.org> | 2025-10-19 21:29:39 +0200 |
| commit | 3af52f845fe2ceb448416ac7b9f48925673c594e (patch) | |
| tree | c8623599d15363a8e760adf1ad9dd01477ceabd7 /nix/libutil/spawn.cc | |
| parent | cbda925613b2962db8c6dbb2ea3dda7e3b433611 (diff) | |
daemon: Bump to C++20 and use ‘std::format’ instead of ‘boost::format’.
* nix/boost: This directory and all files inside it are removed.
* nix/libstore/build.cc (Goal::trace): Use ‘std::string’ instead of ‘const format &’.
(DerivationGoal::startBuilder, ...): Use ‘std::format’ or ‘std::vformat’ instead of ‘boost::format’.
* nix/libstore/builtins.cc (builtinDownload): Same.
* nix/libstore/derivations.cc (DerivationOutput::parseHashInfo, ...): Same.
* nix/libstore/gc.cc (LocalStore::openGCLock, ...): Same.
* nix/libstore/globals.cc (Settings::_get): Same.
* nix/libstore/local-store.cc: (checkStoreNotSymlink, ...): Same.
* nix/libstore/misc.cc (dfsVisit, showBytes): Same
* nix/libstore/optimise-store.cc (makeWritable, ...): Same.
* nix/libstore/pathlocks.cc (openLockFile, ...): Same.
* nix/libstore/references.cc (search, scanForReferences): Same.
* nix/libstore/sqlite.hh (throwSQLiteError): Use ‘std::string’ instead of ‘const format &’.
* nix/libstore/sqlite.cc (throwSQLiteError): Use ‘std::string’ instead of ‘const format &’.
* nix/libstore/store-api.cc (assertStorePath, ...): Use ‘std::format’ instead of ‘boost::format’.
* nix/libutil/affinity.cc (setAffinityTo): Same.
* nix/libutil/archive.cc (dumpContents, ...): Same.
* nix/libutil/hash.cc (parseHash, parseHash32, parseHash16or32, hashFile): Same.
* nix/libutil/hash.hh (parseHash, parseHash32, parseHash16or32, isHash): Same.
* nix/libutil/serialise.cc : Add ‘<cassert>’ header file.
* nix/libutil/spawn.cc (addPhaseAfter, ...): Use ‘std::format’ instead of ‘boost::format’.
* nix/libutil/types.hh (FormatOrString): Removed.
(BaseError, BaseError::addPrefix, SysError, MakeError):
Use ‘std::string or std::string_view’ instead of ‘FormatOrString’.
* nix/libutil/util.hh (Nest::open, printMsg_, warnOnce, expect): Same.
* nix/libutil/util.cc (BaseError::BaseError, ...): Same.
(writeToStderr, _interrupted): Use std::uncaught_exceptions() instead of std::uncaught_exception()
* nix/nix-daemon/nix-daemon.cc (performOp, ...): Same.
* nix/nix-daemon/guix-daemon.cc (string_to_bool, ...): Same.
* nix/local.mk: Remove ‘libformat.a’ from ‘noinst_LIBRARIES’,
remove ‘libformat_a_SOURCES’ and ‘libformat_headers’,
remove ‘libformat_a_CPPFLAGS’ from ‘libutil_a_CPPFLAGS’ and ‘guix_daemon_LDADD’,
update ‘AM_CXXFLAGS’ to ‘-std=c++20’.
Signed-off-by: Ludovic Courtès <ludo@gnu.org>
Diffstat (limited to 'nix/libutil/spawn.cc')
| -rw-r--r-- | nix/libutil/spawn.cc | 59 |
1 files changed, 32 insertions, 27 deletions
diff --git a/nix/libutil/spawn.cc b/nix/libutil/spawn.cc index 7855275494f..c25c3a681f2 100644 --- a/nix/libutil/spawn.cc +++ b/nix/libutil/spawn.cc @@ -30,6 +30,8 @@ #include <cstring> #include <cstdlib> #include <cstdint> +#include <cassert> +#include <format> #if HAVE_SYS_MOUNT_H #include <sys/mount.h> @@ -61,8 +63,11 @@ #define pivot_root(new_root, put_old) (syscall(SYS_pivot_root, new_root,put_old)) #endif - -#define CLONE_ENABLED defined(CLONE_NEWNS) +#if defined(CLONE_NEWNS) +#define CLONE_ENABLED 1 +#else +#define CLONE_ENABLED 0 +#endif #if CLONE_ENABLED #include <sys/ioctl.h> @@ -84,7 +89,7 @@ void addPhaseAfter(Phases & phases, string afterLabel, string addLabel, Action a phases.insert(i, p); return; } - throw Error(format("label `%1%' not found in phases") % afterLabel); + throw Error(std::format("label `{}' not found in phases", afterLabel)); } @@ -98,7 +103,7 @@ void addPhaseBefore(Phases & phases, string beforeLabel, string addLabel, Action phases.insert(i, p); return; } - throw Error(format("label `%1%' not found in phases") % beforeLabel); + throw Error(std::format("label `{}' not found in phases", beforeLabel)); } @@ -127,7 +132,7 @@ void deletePhase(Phases & phases, string delLabel) phases.erase(i); return; } - throw Error(format("label `%1%' not found in phases") % delLabel); + throw Error(std::format("label `{}' not found in phases", delLabel)); } @@ -138,7 +143,7 @@ void replacePhase(Phases & phases, string replaceLabel, Action newAction) (*i).action = newAction; return; } - throw Error(format("label `%1' not found in phases") % replaceLabel); + throw Error(std::format("label `{}' not found in phases", replaceLabel)); } @@ -190,7 +195,7 @@ static void earlyIOSetupAction(SpawnContext & ctx) /* Doesn't make sense for it to be writable, but compatibility... */ AutoCloseFD fd = open(ctx.stdinFile.c_str(), O_RDWR); if(fd == -1) - throw SysError(format("cannot open `%1%'") % ctx.stdinFile); + throw SysError(std::format("cannot open `{}'", ctx.stdinFile)); if(dup2(fd, STDIN_FILENO) == -1) throw SysError("cannot dup2 fd into stdin fd"); } @@ -216,7 +221,7 @@ static void chrootAction(SpawnContext & ctx) if(ctx.doChroot) #if HAVE_CHROOT if(chroot(ctx.chrootRootDir.c_str()) == -1) - throw SysError(format("cannot change root directory to '%1%'") % ctx.chrootRootDir); + throw SysError(std::format("cannot change root directory to '{}'", ctx.chrootRootDir)); #else throw Error("chroot is not supported on this system"); #endif @@ -227,7 +232,7 @@ static void chdirAction(SpawnContext & ctx) { if(ctx.setcwd) if(chdir(ctx.cwd.c_str()) == -1) - throw SysError(format("changing into `%1%'") % ctx.cwd); + throw SysError(std::format("changing into `{}'", ctx.cwd)); } @@ -353,7 +358,7 @@ void execAction(SpawnContext & ctx) // kept public for use in 'build.cc' env = envPtrs.data(); } if(execvpe(ctx.program.c_str(), stringsToCharPtrs(ctx.args).data(), env) == -1) - throw SysError(format("executing `%1%'") % ctx.program); + throw SysError(std::format("executing `{}'", ctx.program)); } @@ -478,11 +483,11 @@ static void makeChrootSeparateFilesystemAction(SpawnContext & sctx) a tmpfs on it. */ if(ctx.mountTmpfsOnChroot) { if(mount("none", ctx.chrootRootDir.c_str(), "tmpfs", 0, 0) == -1) - throw SysError(format("unable to mount tmpfs on `%1%'") % ctx.chrootRootDir); + throw SysError(std::format("unable to mount tmpfs on `{}'", ctx.chrootRootDir)); } else { if(mount(ctx.chrootRootDir.c_str(), ctx.chrootRootDir.c_str(), 0, MS_BIND, 0) == -1) - throw SysError(format("unable to bind mount ‘%1%’") % ctx.chrootRootDir); + throw SysError(std::format("unable to bind mount `{}'", ctx.chrootRootDir)); } } #endif @@ -526,7 +531,7 @@ static void bindMount(Path source, Path target, bool readOnly) #if HAVE_SYS_MOUNT_H && defined(MS_BIND) struct stat st; if (lstat(source.c_str(), &st) == -1) - throw SysError(format("getting attributes of path `%1%'") % source); + throw SysError(std::format("getting attributes of path `{}'", source)); if(S_ISDIR(st.st_mode)) createDirs(target); @@ -545,11 +550,11 @@ static void bindMount(Path source, Path target, bool readOnly) while(true){ if(lstat(target.c_str(), &st2) != -1) { if(!S_ISREG(st2.st_mode)) - throw Error(format("mount target `%1%' exists but is not a regular file") % target); + throw Error(std::format("mount target `{}' exists but is not a regular file", target)); break; } if(errno != ENOENT) { - throw SysError(format("stat'ing path `%1%'") % target); + throw SysError(std::format("stat'ing path `{}'", target)); } AutoCloseFD fd = open(target.c_str(), O_WRONLY | O_NOFOLLOW | O_CREAT | O_EXCL, @@ -561,7 +566,7 @@ static void bindMount(Path source, Path target, bool readOnly) /* Note: because of O_CREAT | O_EXCL, EACCES can only mean a * permission issue with the parent directory */ if(errno != EEXIST) - throw SysError(format("Creating placeholder regular file target mount `%1%'") % target); + throw SysError(std::format("Creating placeholder regular file target mount `{}'", target)); } } @@ -569,7 +574,7 @@ static void bindMount(Path source, Path target, bool readOnly) are in an unprivileged mount namespace and not specifying MS_REC would reveal subtrees that had been covered up. */ if (mount(source.c_str(), target.c_str(), 0, MS_BIND|MS_REC, 0) == -1) - throw SysError(format("bind mount from `%1%' to `%2%' failed") % source % target); + throw SysError(std::format("bind mount from `{}' to `{}' failed", source, target)); if(readOnly) { #if defined(MS_REMOUNT) && defined(MS_RDONLY) /* Extra flags passed with MS_BIND are ignored, hence the extra @@ -581,12 +586,12 @@ static void bindMount(Path source, Path target, bool readOnly) #if HAVE_STATVFS struct statvfs stvfs; if(statvfs(target.c_str(), &stvfs) == -1) - throw SysError(format("statvfs of `%1%'") % target); + throw SysError(std::format("statvfs of `{}'", target)); mount_flags |= statfsToMountFlags(stvfs.f_flag); #endif if (mount(source.c_str(), target.c_str(), 0, mount_flags, 0) == -1) - throw SysError(format("read-only remount of `%1%' failed") % target); + throw SysError(std::format("read-only remount of `{}' failed", target)); #else throw Error("remounting read-only is not supported on this platform"); #endif @@ -631,7 +636,7 @@ static void mountProcAction(SpawnContext & sctx) Path target = (ctx.doChroot ? ctx.chrootRootDir : "") + "/proc"; createDirs(target); if(mount("none", target.c_str(), "proc", 0, 0) == -1) - throw SysError(format("mounting `%1%'") % target); + throw SysError(std::format("mounting `{}'", target)); } #endif } @@ -645,7 +650,7 @@ static void mountDevshmAction(SpawnContext & sctx) Path target = (ctx.doChroot ? ctx.chrootRootDir : "") + "/dev/shm"; createDirs(target); if(mount("none", target.c_str(), "tmpfs", 0, 0) == -1) - throw SysError(format("mounting `%1%'") % target); + throw SysError(std::format("mounting `{}'", target)); } #endif } @@ -661,13 +666,13 @@ static void mountDevptsAction(SpawnContext & sctx) if(pathExists(chroot + "/dev/ptmx")) return; createDirs(target); if(mount("none", target.c_str(), "devpts", 0, "newinstance,mode=0620") == -1) - throw SysError(format("mounting `%1%'") % target); + throw SysError(std::format("mounting `{}'", target)); createSymlink("/dev/pts/ptmx", chroot + "/dev/ptmx"); /* Make sure /dev/pts/ptmx is world-writable. With some Linux versions, it is created with permissions 0. */ Path targetPtmx = chroot + "/dev/pts/ptmx"; if (chmod(targetPtmx.c_str(), 0666) == -1) - throw SysError(format("setting permissions on `%1%'") % targetPtmx); + throw SysError(std::format("setting permissions on `{}'", targetPtmx)); } #endif } @@ -679,16 +684,16 @@ static void pivotRootAction(SpawnContext & sctx) CloneSpawnContext & ctx = (CloneSpawnContext &) sctx; if((ctx.cloneFlags & CLONE_NEWNS) != 0 && ctx.doChroot) { if (chdir(ctx.chrootRootDir.c_str()) == -1) - throw SysError(format("cannot change directory to '%1%'") % ctx.chrootRootDir); + throw SysError(std::format("cannot change directory to '{}'", ctx.chrootRootDir)); if (mkdir("real-root", 0) == -1) throw SysError("cannot create real-root directory"); if (pivot_root(".", "real-root") == -1) - throw SysError(format("cannot pivot old root directory onto '%1%'") % (ctx.chrootRootDir + "/real-root")); + throw SysError(std::format("cannot pivot old root directory onto '{}'", (ctx.chrootRootDir + "/real-root"))); if (chroot(".") == -1) - throw SysError(format("cannot change root directory to '%1%'") % ctx.chrootRootDir); + throw SysError(std::format("cannot change root directory to '{}'", ctx.chrootRootDir)); if (umount2("real-root", MNT_DETACH) == -1) throw SysError("cannot unmount real root filesystem"); @@ -761,7 +766,7 @@ void unshareAndInitUserns(int flags, const string & uidMap, throw SysError("reaping userns init process"); } if(!(WIFEXITED(status) != 0 && WEXITSTATUS(status) == EXIT_SUCCESS)) - throw Error(format("userns init child exited with status %1%") % WEXITSTATUS(status)); + throw Error(std::format("userns init child exited with status {}", WEXITSTATUS(status))); } #endif } |
