Hi again,

I uploaded another fakechroot into Ubuntu to implement some more *at()
calls. It still lacks the proper #ifdef'ing, but maybe it is useful
for somebody.

Martin

-- 
Martin Pitt                        | http://www.piware.de
Ubuntu Developer (www.ubuntu.com)  | Debian Developer  (www.debian.org)
diff -u fakechroot-2.6/src/libfakechroot.c fakechroot-2.6/src/libfakechroot.c
--- fakechroot-2.6/src/libfakechroot.c
+++ fakechroot-2.6/src/libfakechroot.c
@@ -321,7 +321,9 @@
 #endif
 static int     (*next_chdir) (const char *path) = NULL;
 static int     (*next_chmod) (const char *path, mode_t mode) = NULL;
+static int     (*next_fchmodat) (int dfd, const char *path, mode_t mode, int 
flag) = NULL;
 static int     (*next_chown) (const char *path, uid_t owner, gid_t group) = 
NULL;
+static int     (*next_fchownat) (int dfd, const char *path, uid_t owner, gid_t 
group, int flag) = NULL;
 /* static int     (*next_chroot) (const char *path) = NULL; */
 static int     (*next_creat) (const char *pathname, mode_t mode) = NULL;
 static int     (*next_creat64) (const char *pathname, mode_t mode) = NULL;
@@ -422,6 +424,7 @@
 static int     (*next_nftw64) (const char *dir, int (*fn)(const char *file, 
const struct stat64 *sb, int flag, struct FTW *s), int nopenfd, int flags) = 
NULL;
 #endif
 static int     (*next_open) (const char *pathname, int flags, ...) = NULL;
+static int     (*next_openat) (int dfd, const char *pathname, int flags, ...) 
= NULL;
 static int     (*next_open64) (const char *pathname, int flags, ...) = NULL;
 #if !defined(HAVE___OPENDIR2)
 static DIR *   (*next_opendir) (const char *name) = NULL;
@@ -539,7 +542,9 @@
 #endif
     nextsym(chdir, "chdir");
     nextsym(chmod, "chmod");
+    nextsym(fchmodat, "fchmodat");
     nextsym(chown, "chown");
+    nextsym(fchownat, "fchownat");
 /*    nextsym(chroot, "chroot"); */
     nextsym(creat, "creat");
     nextsym(creat64, "creat64");
@@ -640,6 +645,7 @@
     nextsym(nftw64, "nftw64");
 #endif
     nextsym(open, "open");
+    nextsym(openat, "openat");
     nextsym(open64, "open64");
 #if !defined(HAVE___OPENDIR2)
     nextsym(opendir, "opendir");
@@ -927,6 +933,13 @@
     if (next_chmod == NULL) fakechroot_init();
     return next_chmod(path, mode);
 }
+int fchmodat (int dfd, const char *path, mode_t mode, int flag)
+{
+    char *fakechroot_path, *fakechroot_ptr, fakechroot_buf[FAKECHROOT_MAXPATH];
+    expand_chroot_path(path, fakechroot_path, fakechroot_ptr, fakechroot_buf);
+    if (next_fchmodat == NULL) fakechroot_init();
+    return next_fchmodat(dfd, path, mode, flag);
+}
 
 
 /* #include <sys/types.h> */
@@ -939,6 +952,13 @@
     return next_chown(path, owner, group);
 }
 
+int fchownat (int dfd, const char *path, uid_t owner, gid_t group, int flag)
+{
+    char *fakechroot_path, *fakechroot_ptr, fakechroot_buf[FAKECHROOT_MAXPATH];
+    expand_chroot_path(path, fakechroot_path, fakechroot_ptr, fakechroot_buf);
+    if (next_fchownat == NULL) fakechroot_init();
+    return next_fchownat(dfd, path, owner, group, flag);
+}
 
 /* #include <unistd.h> */
 int chroot (const char *path)
@@ -1927,6 +1947,21 @@
     return next_open(pathname, flags, mode);
 }
 
+int openat (int dfd, const char *pathname, int flags, ...) {
+    int mode = 0;
+    char *fakechroot_path, *fakechroot_ptr, fakechroot_buf[FAKECHROOT_MAXPATH];
+    expand_chroot_path(pathname, fakechroot_path, fakechroot_ptr, 
fakechroot_buf);
+
+    if (flags & O_CREAT) {
+        va_list arg;
+        va_start (arg, flags);
+        mode = va_arg (arg, int);
+        va_end (arg);
+    }
+
+    if (next_openat == NULL) fakechroot_init();
+    return next_openat(dfd, pathname, flags, mode);
+}
 
 /* #include <sys/types.h> */
 /* #include <sys/stat.h> */
diff -u fakechroot-2.6/test/fakechroot.sh fakechroot-2.6/test/fakechroot.sh
--- fakechroot-2.6/test/fakechroot.sh
+++ fakechroot-2.6/test/fakechroot.sh
@@ -30,6 +30,9 @@
     /bin/bash \
     /bin/grep \
     /bin/ls \
+    /bin/cp \
+    /bin/mkdir \
+    /bin/chmod \
     /bin/pwd \
     /bin/sh \
     /bin/rm \
diff -u fakechroot-2.6/debian/control fakechroot-2.6/debian/control
--- fakechroot-2.6/debian/control
+++ fakechroot-2.6/debian/control
@@ -7,6 +7,7 @@
 
 Package: fakechroot
 Architecture: any
+Depends: ${fakechroot:Depends}
 Description: gives a fake chroot environment
  This package provides a library which overrides libc functions, so
  it is possible to use root-specific tools without root privileges.
diff -u fakechroot-2.6/debian/changelog fakechroot-2.6/debian/changelog
--- fakechroot-2.6/debian/changelog
+++ fakechroot-2.6/debian/changelog
@@ -1,3 +1,14 @@
+fakechroot (2.6-1.3ubuntu2) intrepid; urgency=low
+
+  * src/libfakechroot.c:
+    - Define openat(), to unbreak rm -r.
+    - Define fchmodat(), to unbreak chmod.
+    - Define fchownat(), to unbreak chown.
+    This fixes everything which broke debootstrapping Hardy.
+  * test/fakechroot.sh: Add cp, mkdir, chmod.
+
+ -- Martin Pitt <[EMAIL PROTECTED]>  Thu, 08 May 2008 22:13:43 +0200
+
 fakechroot (2.6-1.3ubuntu1) intrepid; urgency=low
 
   * src/libfakechroot.c: Provide wrapping of unlinkat(), __fxstatat(), and

Attachment: signature.asc
Description: Digital signature

Reply via email to