During various stages of emerge, portage outputs a bunch of errors if emerge was started in a directory which no longer exists. I just emerged gettext from a deleted directory and got: ... >>> Completed installing gettext-0.18.1.1-r1 into /var/tmp/portage/sys-devel/gettext-0.18.1.1-r1/image/ Fixing .la files usr/lib64/libgettextlib.la usr/lib64/libgettextsrc.la shell-init: error retrieving current directory: getcwd: cannot access parent directories: No such file or directory shell-init: error retrieving current directory: getcwd: cannot access parent directories: No such file or directory job-working-directory: error retrieving current directory: getcwd: cannot access parent directories: No such file or directory chdir: error retrieving current directory: getcwd: cannot access parent directories: No such file or directory strip: x86_64-pc-linux-gnu-strip --strip-unneeded -R .comment -R .GCC.command.line ... >>> Installing (1 of 1) sys-devel/gettext-0.18.1.1-r1 * checking 216 files for package collisions >>> Merging sys-devel/gettext-0.18.1.1-r1 to / shell-init: error retrieving current directory: getcwd: cannot access parent directories: No such file or directory shell-init: error retrieving current directory: getcwd: cannot access parent directories: No such file or directory job-working-directory: error retrieving current directory: getcwd: cannot access parent directories: No such file or directory chdir: error retrieving current directory: getcwd: cannot access parent directories: No such file or directory shell-init: error retrieving current directory: getcwd: cannot access parent directories: No such file or directory shell-init: error retrieving current directory: getcwd: cannot access parent directories: No such file or directory job-working-directory: error retrieving current directory: getcwd: cannot access parent directories: No such file or directory chdir: error retrieving current directory: getcwd: cannot access parent directories: No such file or directory --- /usr/ --- /usr/bin/ >>> /usr/bin/msgen ... >>> Safely unmerging already-installed instance... shell-init: error retrieving current directory: getcwd: cannot access parent directories: No such file or directory shell-init: error retrieving current directory: getcwd: cannot access parent directories: No such file or directory shell-init: error retrieving current directory: getcwd: cannot access parent directories: No such file or directory job-working-directory: error retrieving current directory: getcwd: cannot access parent directories: No such file or directory chdir: error retrieving current directory: getcwd: cannot access parent directories: No such file or directory No package files given... Grabbing a set. ... <<< dir /usr/share/doc/gettext-0.17 shell-init: error retrieving current directory: getcwd: cannot access parent directories: No such file or directory shell-init: error retrieving current directory: getcwd: cannot access parent directories: No such file or directory job-working-directory: error retrieving current directory: getcwd: cannot access parent directories: No such file or directory chdir: error retrieving current directory: getcwd: cannot access parent directories: No such file or directory shell-init: error retrieving current directory: getcwd: cannot access parent directories: No such file or directory shell-init: error retrieving current directory: getcwd: cannot access parent directories: No such file or directory chdir: error retrieving current directory: getcwd: cannot access parent directories: No such file or directory >>> Regenerating /etc/ld.so.cache... shell-init: error retrieving current directory: getcwd: cannot access parent directories: No such file or directory chdir: error retrieving current directory: getcwd: cannot access parent directories: No such file or directory >>> Original instance of package unmerged safely. shell-init: error retrieving current directory: getcwd: cannot access parent directories: No such file or directory shell-init: error retrieving current directory: getcwd: cannot access parent directories: No such file or directory job-working-directory: error retrieving current directory: getcwd: cannot access parent directories: No such file or directory chdir: error retrieving current directory: getcwd: cannot access parent directories: No such file or directory >>> sys-devel/gettext-0.18.1.1-r1 merged. >>> Regenerating /etc/ld.so.cache... shell-init: error retrieving current directory: getcwd: cannot access parent directories: No such file or directory chdir: error retrieving current directory: getcwd: cannot access parent directories: No such file or directory shell-init: error retrieving current directory: getcwd: cannot access parent directories: No such file or directory shell-init: error retrieving current directory: getcwd: cannot access parent directories: No such file or directory job-working-directory: error retrieving current directory: getcwd: cannot access parent directories: No such file or directory chdir: error retrieving current directory: getcwd: cannot access parent directories: No such file or directory shell-init: error retrieving current directory: getcwd: cannot access parent directories: No such file or directory shell-init: error retrieving current directory: getcwd: cannot access parent directories: No such file or directory chdir: error retrieving current directory: getcwd: cannot access parent directories: No such file or directory >>> Auto-cleaning packages... >>> No outdated packages were found on your system. * Regenerating GNU info directory index... * Processed 97 info files. Perhaps it would be a good idea to do a chdir('/') before anything else?
maybe it makes more sense to just stat CWD/PWD when emerge starts, and error out if doesn't exist?
(In reply to comment #1) > maybe it makes more sense to just stat CWD/PWD when emerge starts, and error > out if doesn't exist? That seems like an artificial restriction. The emerge does work, so the directory isn't strictly needed.. / would be a safe bet that should exist on all systems. :)
it's as artificial as always performing a chdir("/") imo
(In reply to comment #3) > it's as artificial as always performing a chdir("/") imo With the slight difference that chdir() to a directory that is known to always exist allows to avoid any error and complete the user's command.
I don't see why emerge/portage should be able to operate per se in a h0rkened environment. fail early, instead of working around the issue and perhaps causing issues lateron
(In reply to comment #5) > I don't see why emerge/portage should be able to operate per se in a > h0rkened environment. Portage's environment often doesn't include the current working directory, which is of course why emerge does succeed even though $PWD is gone. > fail early, instead of working around the issue and perhaps causing issues > lateron I agree, if the environment is so broken that emerge can not work. But that would be stuff like /usr/portage, /var/db, or /var/tmp gone missing, it doesn't seem that the random directory emerge was started from matters, which I think is very good and wise. Maybe the next step would be to look at what exact operations cause the error messages. Since there doesn't seem to be a policy either way on whether $PWD must exist or not, maybe that's what this bug is really about. I'm in favor of not depending on $PWD existing.
We've already got the following code in /usr/lib/portage/pym/portage/__init__.py that's executed every time portage imported: try: return os.getcwd() except OSError: #dir doesn't exist os.chdir("/") return "/" So, it's already supposed to chdir("/") if the current cwd doesn't exist. Maybe the problem is that os.getcwd() doesn't raise OSError when it's supposed to. It works for me.
I think the issue is triggered when you start in a /var/tmp/portage subdirectory that is going to be removed during emerge run.
(In reply to comment #8) > I think the issue is triggered when you start in a /var/tmp/portage > subdirectory that is going to be removed during emerge run. I'd say it's the user's responsibility to choose a sane cwd before invoking emerge.
(In reply to comment #7) yeah, i think it's "easy" to make the active dir disappear after the initial import. related, i'm not sure putting this logic into the portage module is correct. if you wanted to start off `emerge` with os.chdir("/"), that'd make sense to me (i can't see how it'd really be harmful), but emerge/etc... aren't the only packages that import portage, and i think it's a reasonable expectation that doing "import foo" in python shouldn't cause modification of the active environment (regardless of how "valid" it might be).
shell-init: error retrieving current directory: getcwd: cannot access parent directories: No such file or directory had no idea the simple fix is: cd .
by the way, running bash in a non-existent directory causes it to yell like that. concrete example: # cd /var/tmp/portage/dev-libs/gmp-6.0.0a/work/ hardeneduclibc1 work # pwd /var/tmp/portage/dev-libs/gmp-6.0.0a/work hardeneduclibc1 work # time emerge -av -u dev-libs/gmp * IMPORTANT: 8 news items need reading for repository 'gentoo'. * Use eselect news to read news items. These are the packages that would be merged, in order: Calculating dependencies... done! [ebuild U ] dev-libs/gmp-6.0.0a [5.1.3-r1] USE="cxx -doc -pgo -static-libs" 0 KiB Total: 1 package (1 upgrade), Size of downloads: 0 KiB Would you like to merge these packages? [Yes/No] >>> Verifying ebuild manifests >>> Emerging (1 of 1) dev-libs/gmp-6.0.0a::gentoo * gmp-6.0.0a.tar.xz SHA256 SHA512 WHIRLPOOL size ;-) ... [ ok ] shell-init: error retrieving current directory: getcwd: cannot access parent directories: No such file or directory shell-init: error retrieving current directory: getcwd: cannot access parent directories: No such file or directory chdir: error retrieving current directory: getcwd: cannot access parent directories: No such file or directory shell-init: error retrieving current directory: getcwd: cannot access parent directories: No such file or directory shell-init: error retrieving current directory: getcwd: cannot access parent directories: No such file or directory job-working-directory: error retrieving current directory: getcwd: cannot access parent directories: No such file or directory chdir: error retrieving current directory: getcwd: cannot access parent directories: No such file or directory >>> Unpacking source... >>> Unpacking gmp-6.0.0a.tar.xz to /var/tmp/portage/dev-libs/gmp-6.0.0a/work >>> Source unpacked in /var/tmp/portage/dev-libs/gmp-6.0.0a/work shell-init: error retrieving current directory: getcwd: cannot access parent directories: No such file or directory shell-init: error retrieving current directory: getcwd: cannot access parent directories: No such file or directory job-working-directory: error retrieving current directory: getcwd: cannot access parent directories: No such file or directory chdir: error retrieving current directory: getcwd: cannot access parent directories: No such file or directory >>> Preparing source in /var/tmp/portage/dev-libs/gmp-6.0.0a/work/gmp-6.0.0 ... * Applying various patches (bugfixes/updates) ... * ppc64-build.diff ... [ ok ] * Done with patching * Running elibtoolize in: gmp-6.0.0/ * Applying portage/1.2.0 patch ... * Applying sed/1.5.6 patch ... * Applying as-needed/2.4.2 patch ... * Applying target-nm/2.4.2 patch ... >>> Source prepared. shell-init: error retrieving current directory: getcwd: cannot access parent directories: No such file or directory shell-init: error retrieving current directory: getcwd: cannot access parent directories: No such file or directory job-working-directory: error retrieving current directory: getcwd: cannot access parent directories: No such file or directory chdir: error retrieving current directory: getcwd: cannot access parent directories: No such file or directory >>> Configuring source in /var/tmp/portage/dev-libs/gmp-6.0.0a/work/gmp-6.0.0 ... * abi_x86_64.amd64: running multilib-minimal_abi_src_configure * econf: updating gmp-6.0.0/config.sub with /usr/share/gnuconfig/config.sub * econf: updating gmp-6.0.0/config.guess with /usr/share/gnuconfig/config.guess /var/tmp/portage/dev-libs/gmp-6.0.0a/work/gmp-6.0.0/configure --prefix=/usr --build=x86_64-gentoo-linux-uclibc --host=x86_64-gentoo-linux-uclibc --mandir=/usr/share/man --infodir=/usr/share/info --datadir=/usr/share --sysconfdir=/etc --localstatedir=/var/lib --libdir=/usr/lib --localstatedir=/var/state/gmp --enable-shared --enable-cxx --disable-static checking build system type... x86_64-gentoo-linux-uclibc checking host system type... x86_64-gentoo-linux-uclibc checking for a BSD-compatible install... /usr/bin/install -c checking whether build environment is sane... yes checking for a thread-safe mkdir -p... /bin/mkdir -p checking for gawk... gawk checking whether make sets $(MAKE)... yes checking whether to enable maintainer-specific portions of Makefiles... no checking ABI=64 checking whether x86_64-gentoo-linux-uclibc-gcc is gcc... yes checking compiler x86_64-gentoo-linux-uclibc-gcc -O2 -pipe -march=native -Wstack-protector -fstack-protector-all ... yes checking for x86_64-gentoo-linux-uclibc-gcc... x86_64-gentoo-linux-uclibc-gcc checking whether the C compiler works... yes checking for C compiler default output file name... a.out checking for suffix of executables... checking whether we are cross compiling... no checking for suffix of object files... o checking whether we are using the GNU C compiler... yes checking whether x86_64-gentoo-linux-uclibc-gcc accepts -g... yes checking for x86_64-gentoo-linux-uclibc-gcc option to accept ISO C89... none needed checking for x86_64-gentoo-linux-uclibc-gcc option to accept ISO C99... -std=gnu99 checking for x86_64-gentoo-linux-uclibc-gcc -std=gnu99 option to accept ISO Standard C... (cached) -std=gnu99 checking how to run the C preprocessor... x86_64-gentoo-linux-uclibc-gcc -std=gnu99 -E checking build system compiler x86_64-gentoo-linux-uclibc-gcc -std=gnu99... yes checking for build system preprocessor... x86_64-gentoo-linux-uclibc-gcc -std=gnu99 -E checking for build system executable suffix... checking whether build system compiler is ANSI... yes checking for build system compiler math library... -lm checking for x86_64-gentoo-linux-uclibc-g++... x86_64-gentoo-linux-uclibc-g++ checking whether we are using the GNU C++ compiler... yes checking whether x86_64-gentoo-linux-uclibc-g++ accepts -g... yes checking C++ compiler x86_64-gentoo-linux-uclibc-g++ -O2 -pipe -march=native -Wstack-protector -fstack-protector-all... no, program does not run configure.wrapped: error: C++ compiler not available, see config.log for details !!! Please attach the following file when seeking support: !!! /var/tmp/portage/dev-libs/gmp-6.0.0a/work/gmp-6.0.0-abi_x86_64.amd64/config.log * ERROR: dev-libs/gmp-6.0.0a::gentoo failed (configure phase): * econf failed * * Call stack: * ebuild.sh, line 93: Called src_configure * environment, line 3092: Called multilib-minimal_src_configure * environment, line 2253: Called multilib_foreach_abi 'multilib-minimal_abi_src_configure' * environment, line 2460: Called multibuild_foreach_variant '_multilib_multibuild_wrapper' 'multilib-minimal_abi_src_configure' * environment, line 2184: Called _multibuild_run '_multilib_multibuild_wrapper' 'multilib-minimal_abi_src_configure' * environment, line 2182: Called _multilib_multibuild_wrapper 'multilib-minimal_abi_src_configure' * environment, line 428: Called multilib-minimal_abi_src_configure * environment, line 2247: Called multilib_src_configure * environment, line 2705: Called econf '--localstatedir=/var/state/gmp' '--enable-shared' '--enable-cxx' '--disable-static' * phase-helpers.sh, line 584: Called die * The specific snippet of code: * die "econf failed" * * If you need support, post the output of `emerge --info '=dev-libs/gmp-6.0.0a::gentoo'`, * the complete build log and the output of `emerge -pqv '=dev-libs/gmp-6.0.0a::gentoo'`. * The complete build log is located at '/var/log/portage/ebuild.logs/build/dev-libs/gmp-6.0.0a:20150208-110049.log'. * For convenience, a symlink to the build log is located at '/var/tmp/portage/dev-libs/gmp-6.0.0a/temp/build.log'. * The ebuild environment file is located at '/var/tmp/portage/dev-libs/gmp-6.0.0a/temp/environment'. * Working directory: '/var/tmp/portage/dev-libs/gmp-6.0.0a/work/gmp-6.0.0-abi_x86_64.amd64' * S: '/var/tmp/portage/dev-libs/gmp-6.0.0a/work/gmp-6.0.0' shell-init: error retrieving current directory: getcwd: cannot access parent directories: No such file or directory shell-init: error retrieving current directory: getcwd: cannot access parent directories: No such file or directory job-working-directory: error retrieving current directory: getcwd: cannot access parent directories: No such file or directory chdir: error retrieving current directory: getcwd: cannot access parent directories: No such file or directory >>> Failed to emerge dev-libs/gmp-6.0.0a, Log file: >>> '/var/log/portage/ebuild.logs/build/dev-libs/gmp-6.0.0a:20150208-110049.log' * Messages for package dev-libs/gmp-6.0.0a: * ERROR: dev-libs/gmp-6.0.0a::gentoo failed (configure phase): * econf failed * * Call stack: * ebuild.sh, line 93: Called src_configure * environment, line 3092: Called multilib-minimal_src_configure * environment, line 2253: Called multilib_foreach_abi 'multilib-minimal_abi_src_configure' * environment, line 2460: Called multibuild_foreach_variant '_multilib_multibuild_wrapper' 'multilib-minimal_abi_src_configure' * environment, line 2184: Called _multibuild_run '_multilib_multibuild_wrapper' 'multilib-minimal_abi_src_configure' * environment, line 2182: Called _multilib_multibuild_wrapper 'multilib-minimal_abi_src_configure' * environment, line 428: Called multilib-minimal_abi_src_configure * environment, line 2247: Called multilib_src_configure * environment, line 2705: Called econf '--localstatedir=/var/state/gmp' '--enable-shared' '--enable-cxx' '--disable-static' * phase-helpers.sh, line 584: Called die * The specific snippet of code: * die "econf failed" * * If you need support, post the output of `emerge --info '=dev-libs/gmp-6.0.0a::gentoo'`, * the complete build log and the output of `emerge -pqv '=dev-libs/gmp-6.0.0a::gentoo'`. * The complete build log is located at '/var/log/portage/ebuild.logs/build/dev-libs/gmp-6.0.0a:20150208-110049.log'. * For convenience, a symlink to the build log is located at '/var/tmp/portage/dev-libs/gmp-6.0.0a/temp/build.log'. * The ebuild environment file is located at '/var/tmp/portage/dev-libs/gmp-6.0.0a/temp/environment'. * Working directory: '/var/tmp/portage/dev-libs/gmp-6.0.0a/work/gmp-6.0.0-abi_x86_64.amd64' * S: '/var/tmp/portage/dev-libs/gmp-6.0.0a/work/gmp-6.0.0' real 0m24.158s user 0m12.980s sys 0m5.150s hardeneduclibc1 work # pwd /var/tmp/portage/dev-libs/gmp-6.0.0a/work hardeneduclibc1 work # bash shell-init: error retrieving current directory: getcwd: cannot access parent directories: No such file or directory hardeneduclibc1 work # cd . chdir: error retrieving current directory: getcwd: cannot access parent directories: No such file or directory hardeneduclibc1 . # pwd . hardeneduclibc1 . # exit hardeneduclibc1 work # pwd /var/tmp/portage/dev-libs/gmp-6.0.0a/work hardeneduclibc1 work # bash shell-init: error retrieving current directory: getcwd: cannot access parent directories: No such file or directory hardeneduclibc1 work # cd . chdir: error retrieving current directory: getcwd: cannot access parent directories: No such file or directory hardeneduclibc1 . # pwd . hardeneduclibc1 . # exit hardeneduclibc1 work # cd . hardeneduclibc1 work # pwd /var/tmp/portage/dev-libs/gmp-6.0.0a/work hardeneduclibc1 work # bash hardeneduclibc1 work # exit hardeneduclibc1 work # So "cd ." in the subshell that failed with that message won't work, but in parent will. The above error(with C compiler missing) is for a different reason(yet to find out) so ignore that.