On Sun, Aug 18, Olaf Hering wrote:
daemon.c does just a chroot, without chdir. The result is that pwd does not
work correctly (it causes fs/dcache.c:prepend_unreachable() to add the
unreachable string). A workaround is to add "cd /" before each sh command.
><fs> mount /dev/sda2 /
><fs> sh "cd / ; chroot / ; /bin/pwd"
/
><fs> sh "/bin/pwd"
(unreachable)/
><fs> sh "cd / ; /bin/pwd"
/
This change fixes the "pwd" output for me.
guestfish add-drive /dev/shm/olaf/vdisk-sles11sp2_full_fate310510-disk0 : launch : mount
/dev/sda2 / : sh pwd : quit
/
Olaf
---
daemon/command.c | 11 +++++++++++
1 file changed, 11 insertions(+)
Index: libguestfs-1.20.10/daemon/command.c
===================================================================
--- libguestfs-1.20.10.orig/daemon/command.c
+++ libguestfs-1.20.10/daemon/command.c
@@ -21,6 +21,9 @@
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
+#include <sys/types.h>
+#include <sys/stat.h>
+#include <fcntl.h>
#include "guestfs_protocol.h"
#include "daemon.h"
@@ -46,6 +49,7 @@ do_command (char *const *argv)
CLEANUP_FREE char *sysroot_dev = NULL, *sysroot_dev_pts = NULL,
*sysroot_proc = NULL, *sysroot_selinux = NULL, *sysroot_sys = NULL;
int dev_ok, dev_pts_ok, proc_ok, sys_ok;
+ int cwd_fd;
/* We need a root filesystem mounted to do this. */
NEED_ROOT (, return NULL);
@@ -89,8 +93,15 @@ do_command (char *const *argv)
r = command (NULL, NULL, str_mount, "--bind", "/sys", sysroot_sys,
NULL);
sys_ok = r != -1;
+ cwd_fd = open(".", O_DIRECTORY);
CHROOT_IN;
+ if (cwd_fd >= 0)
+ chdir("/");
r = commandv (&out, &err, (const char * const *) argv);
+ if (cwd_fd >= 0) {
+ fchdir(cwd_fd);
+ close(cwd_fd);
+ }
CHROOT_OUT;
if (sys_ok) umount_ignore_fail (sysroot_sys);