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
aurel...@aurel32.net                 http://www.aurel32.net



-- 
To UNSUBSCRIBE, email to debian-bugs-dist-requ...@lists.debian.org
with a subject of "unsubscribe". Trouble? Contact listmas...@lists.debian.org

Reply via email to