tag 618782 + patch
thanks
On Mon, Mar 28, 2011 at 06:00:42AM +0000, Clint Adams wrote:
> On Mon, Mar 28, 2011 at 01:17:34AM +0200, Aurelien Jarno wrote:
> > The missing function is lchmod(), not lchown(), but I guess I can have
> > a look at how lchown() is implemented to understand how to fix this
> > issue.
>
> That's what I get for reading email in a hurry instead of when
> I'm sleep-deprived. The answer is almost the same though: just
> copy the entirety of chmod() in libfakeroot.c instead, and
> s/chmod/lchmod/ in the function declaration and the next_ call,
> sandwich it within #ifdef HAVE_LCHMOD, add the test to
> configure.ac, and the same #ifdef'd prototype to wrapfunc.inp,
> then borrow the STAT/LSTAT logic from the lchown stuff.
> Something close to that, anyway.
>
Thanks for the hints. I have been able to create the following patch. I
have verified it fixes the issues with tar on GNU/kFreeBSD (which means
that now the testsuite passes), and that is still builds on GNU/Linux.
--- fakeroot-1.14.5.orig/configure.ac
+++ fakeroot-1.14.5/configure.ac
@@ -274,7 +274,7 @@ AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[
])
done
-AC_CHECK_FUNCS(fchmodat fchownat fstatat mkdirat mknodat openat renameat
unlinkat)
+AC_CHECK_FUNCS(fchmodat fchownat fstatat mkdirat mknodat openat renameat
unlinkat lchmod)
dnl find out how stat() etc are called. On linux systems, we really
dnl need to wrap (IIRC):
--- fakeroot-1.14.5.orig/libfakeroot.c
+++ fakeroot-1.14.5/libfakeroot.c
@@ -894,6 +894,40 @@ int chmod(const char *path, mode_t mode)
return r;
}
+#ifdef HAVE_LCHMOD
+int lchmod(const char *path, mode_t mode){
+ INT_STRUCT_STAT st;
+ int r;
+
+#ifdef LIBFAKEROOT_DEBUGGING
+ if (fakeroot_debug) {
+ fprintf(stderr, "lchmod path %s\n", path);
+ }
+#endif /* LIBFAKEROOT_DEBUGGING */
+ r=INT_NEXT_LSTAT(path, &st);
+ if(r)
+ return r;
+
+ st.st_mode=(mode&ALLPERMS)|(st.st_mode&~ALLPERMS);
+
+ INT_SEND_STAT(&st, chmod_func);
+
+ /* see chmod() for comment */
+ mode |= 0600;
+ if(S_ISDIR(st.st_mode))
+ mode |= 0100;
+
+ r=next_chmod(path, mode);
+ if(r&&(errno==EPERM))
+ r=0;
+#ifdef EFTYPE /* available under FreeBSD kernel */
+ if(r&&(errno==EFTYPE))
+ r=0;
+#endif
+ return r;
+}
+#endif
+
int fchmod(int fd, mode_t mode){
int r;
INT_STRUCT_STAT st;
--- fakeroot-1.14.5.orig/wrapfunc.inp
+++ fakeroot-1.14.5/wrapfunc.inp
@@ -65,6 +65,9 @@ lchown;int;(const char *path, uid_t owne
fchown;int;(int fd, uid_t owner, gid_t group);(fd, owner, group)
chmod;int;(const char *path, mode_t mode);(path, mode)
fchmod;int;(int fd, mode_t mode);(fd, mode)
+#if defined HAVE_LCHMOD
+lchmod;int;(const char *path, mode_t mode);(path, mode)
+#endif
#if defined __APPLE__ && !defined __LP64__
lchown$UNIX2003;int;(const char *path, uid_t owner, gid_t group);(path, owner,
group)
chmod$UNIX2003;int;(const char *path, mode_t mode);(path, mode)
--
Aurelien Jarno GPG: 1024D/F1BCDB73
[email protected] http://www.aurel32.net
--
To UNSUBSCRIBE, email to [email protected]
with a subject of "unsubscribe". Trouble? Contact [email protected]