"debootstrap --variant=fakechroot" does not currently work on squeeze. It fails with error messages like:
> W: Failure while unpacking required packages. This will be attempted up to > five times. These errors appear to be due to two distinct bugs: #561991 and #588508 Maybe a targeted patch of these two bugs in fakechroot is a good candidate for the next point release of squeeze? I'm attaching a debdiff against what is currently in stable (2.9-1.1). i tested this as a non-privileged user on an i386 squeeze environment with: mkdir root PATH=/sbin:/usr/sbin:$PATH fakeroot \ -i $(pwd)/fakeroot.state \ -s $(pwd)/fakeroot.state \ fakechroot \ debootstrap --variant=fakechroot squeeze root Without these patches applied, the base fakechroot does not succeed. With these patches applied, it completes successfully. I also tried fixing only one bug or the other, but debootstrap failed to complete without both fixes together, so i think they are both necessary. I ran into these bugs while building debirf images. It would be nice for users of debian stable to not have to use a backported fakechroot for debirf. I do not believe these fixes have any adverse affect on other uses of fakechroot. Is there anything else you need from me in order to consider this request for a future point release? Regards, --dkg PS i am not subscribed to debian-release -- please CC me on replies. thanks!
diff -u fakechroot-2.9/configure.ac fakechroot-2.9/configure.ac --- fakechroot-2.9/configure.ac +++ fakechroot-2.9/configure.ac @@ -172,6 +172,7 @@ unlinkat \ ulckpwdf \ utime \ +utimensat \ utimes \ ]) diff -u fakechroot-2.9/config.h.in fakechroot-2.9/config.h.in --- fakechroot-2.9/config.h.in +++ fakechroot-2.9/config.h.in @@ -368,6 +368,9 @@ /* Define to 1 if you have the `utimes' function. */ #undef HAVE_UTIMES +/* Define to 1 if you have the `utimensat' function. */ +#undef HAVE_UTIMENSAT + /* Define to 1 if you have the <utime.h> header file. */ #undef HAVE_UTIME_H diff -u fakechroot-2.9/configure fakechroot-2.9/configure --- fakechroot-2.9/configure +++ fakechroot-2.9/configure @@ -12458,6 +12458,7 @@ unlinkat \ ulckpwdf \ utime \ +utimensat \ utimes \ do : diff -u fakechroot-2.9/src/libfakechroot.c fakechroot-2.9/src/libfakechroot.c --- fakechroot-2.9/src/libfakechroot.c +++ fakechroot-2.9/src/libfakechroot.c @@ -543,6 +543,9 @@ /* static int (*next_ulckpwdf) (void) = NULL; */ #endif static int (*next_utime) (const char *filename, const struct utimbuf *buf) = NULL; +#ifdef HAVE_UTIMENSAT +static int (*next_utimensat) (int dirfd, const char *pathname, const struct timespec times[2], int flags) = NULL; +#endif static int (*next_utimes) (const char *filename, const struct timeval tv[2]) = NULL; @@ -821,6 +824,9 @@ /* nextsym(ulckpwdf, "ulckpwdf"); */ #endif nextsym(utime, "utime"); +#ifdef HAVE_UTIMENSAT + nextsym(utimensat, "utimensat"); +#endif nextsym(utimes, "utimes"); } @@ -896,10 +902,19 @@ /* #include <unistd.h> */ int __lxstat (int ver, const char *filename, struct stat *buf) { - char *fakechroot_path, *fakechroot_ptr, fakechroot_buf[FAKECHROOT_MAXPATH]; + char *fakechroot_path, *fakechroot_ptr, fakechroot_buf[FAKECHROOT_MAXPATH], tmp[FAKECHROOT_MAXPATH]; + int retval; + READLINK_TYPE_RETURN status; + const char* orig; + orig = filename; expand_chroot_path(filename, fakechroot_path, fakechroot_ptr, fakechroot_buf); if (next___lxstat == NULL) fakechroot_init(); - return next___lxstat(ver, filename, buf); + retval = next___lxstat(ver, filename, buf); + /* deal with http://bugs.debian.org/561991 */ + if ((buf->st_mode & S_IFMT) == S_IFLNK) + if ((status = readlink(orig, tmp, sizeof(tmp)-1)) != -1) + buf->st_size = status; + return retval; } #endif @@ -909,10 +924,19 @@ /* #include <unistd.h> */ int __lxstat64 (int ver, const char *filename, struct stat64 *buf) { - char *fakechroot_path, *fakechroot_ptr, fakechroot_buf[FAKECHROOT_MAXPATH]; + char *fakechroot_path, *fakechroot_ptr, fakechroot_buf[FAKECHROOT_MAXPATH], tmp[FAKECHROOT_MAXPATH]; + int retval; + READLINK_TYPE_RETURN status; + const char* orig; + orig = filename; expand_chroot_path(filename, fakechroot_path, fakechroot_ptr, fakechroot_buf); if (next___lxstat64 == NULL) fakechroot_init(); - return next___lxstat64(ver, filename, buf); + retval = next___lxstat64(ver, filename, buf); + /* deal with http://bugs.debian.org/561991 */ + if ((buf->st_mode & S_IFMT) == S_IFLNK) + if ((status = readlink(orig, tmp, sizeof(tmp)-1)) != -1) + buf->st_size = status; + return retval; } #endif @@ -2158,10 +2182,19 @@ /* #include <unistd.h> */ int lstat (const char *file_name, struct stat *buf) { - char *fakechroot_path, *fakechroot_ptr, fakechroot_buf[FAKECHROOT_MAXPATH]; + char *fakechroot_path, *fakechroot_ptr, fakechroot_buf[FAKECHROOT_MAXPATH], tmp[FAKECHROOT_MAXPATH]; + int retval; + READLINK_TYPE_RETURN status; + const char* orig; + orig = file_name; expand_chroot_path(file_name, fakechroot_path, fakechroot_ptr, fakechroot_buf); if (next_lstat == NULL) fakechroot_init(); - return next_lstat(file_name, buf); + retval = next_lstat(file_name, buf); + /* deal with http://bugs.debian.org/561991 */ + if ((buf->st_mode & S_IFMT) == S_IFLNK) + if ((status = readlink(orig, tmp, sizeof(tmp)-1)) != -1) + buf->st_size = status; + return retval; } #endif @@ -2172,10 +2205,19 @@ /* #include <unistd.h> */ int lstat64 (const char *file_name, struct stat64 *buf) { - char *fakechroot_path, *fakechroot_ptr, fakechroot_buf[FAKECHROOT_MAXPATH]; + char *fakechroot_path, *fakechroot_ptr, fakechroot_buf[FAKECHROOT_MAXPATH], tmp[FAKECHROOT_MAXPATH]; + int retval; + READLINK_TYPE_RETURN status; + const char* orig; + orig = file_name; expand_chroot_path(file_name, fakechroot_path, fakechroot_ptr, fakechroot_buf); if (next_lstat64 == NULL) fakechroot_init(); - return next_lstat64(file_name, buf); + retval = next_lstat64(file_name, buf); + /* deal with http://bugs.debian.org/561991 */ + if ((buf->st_mode & S_IFMT) == S_IFLNK) + if ((status = readlink(orig, tmp, sizeof(tmp)-1)) != -1) + buf->st_size = status; + return retval; } #endif #endif @@ -2789,6 +2831,18 @@ } +#ifdef HAVE_UTIMENSAT +/* #include <sys/stat.h> */ +int utimensat (int dirfd, const char *pathname, const struct timespec times[2], int flags) +{ + char *fakechroot_path, *fakechroot_ptr, fakechroot_buf[FAKECHROOT_MAXPATH]; + expand_chroot_path(pathname, fakechroot_path, fakechroot_ptr, fakechroot_buf); + if (next_utimensat == NULL) fakechroot_init(); + return next_utimensat(dirfd, pathname, times, flags); +} +#endif + + /* #include <sys/time.h> */ int utimes (const char *filename, const struct timeval tv[2]) { diff -u fakechroot-2.9/debian/changelog fakechroot-2.9/debian/changelog --- fakechroot-2.9/debian/changelog +++ fakechroot-2.9/debian/changelog @@ -1,3 +1,12 @@ +fakechroot (2.9-1.1+squeeze1) unstable; urgency=low + + * Non-maintainer upload. + * get debootstrap --variant=fakechroot working in squeeze again + - fix length returned by readlink() (Closes: #561991) + - add new utimensat to handle cp -dp (Closes: #588508) + + -- Daniel Kahn Gillmor <d...@fifthhorseman.net> Tue, 29 Mar 2011 01:07:44 -0400 + fakechroot (2.9-1.1) unstable; urgency=low * Non-maintainer upload.
signature.asc
Description: OpenPGP digital signature