"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 <dkg@fifthhorseman.net> Tue, 29 Mar 2011 01:07:44 -0400
+
fakechroot (2.9-1.1) unstable; urgency=low
* Non-maintainer upload.
Attachment:
signature.asc
Description: OpenPGP digital signature