* Check for lchown.

This commit is contained in:
Eelco Dolstra 2006-12-07 18:51:11 +00:00
parent c3286ec020
commit d03f0d4117
2 changed files with 8 additions and 9 deletions

View file

@ -237,15 +237,7 @@ AM_CONDITIONAL(INIT_STATE, test "$init_state" = "yes")
# Setuid installations. # Setuid installations.
AC_CHECK_FUNC(setresuid, [HAVE_SETRESUID=1], [HAVE_SETRESUID=]) AC_CHECK_FUNCS([setresuid setreuid lchown])
if test "$HAVE_SETRESUID" = "1"; then
AC_DEFINE(HAVE_SETRESUID, 1, [whether we have setresuid()])
fi
AC_CHECK_FUNC(setreuid, [HAVE_SETREUID=1], [HAVE_SETREUID=])
if test "$HAVE_SETREUID" = "1"; then
AC_DEFINE(HAVE_SETREUID, 1, [whether we have setreuid()])
fi
# This is needed if ATerm, Berkeley DB or bzip2 are static libraries, # This is needed if ATerm, Berkeley DB or bzip2 are static libraries,

View file

@ -10,6 +10,7 @@
#include <iostream> #include <iostream>
#include <vector> #include <vector>
#include "config.h"
#include "util.hh" #include "util.hh"
using namespace nix; using namespace nix;
@ -46,8 +47,14 @@ static void secureChown(uid_t uidFrom, gid_t gidFrom,
assert(uidTo != 0 && gidTo != 0); assert(uidTo != 0 && gidTo != 0);
#if HAVE_LCHOWN
if (lchown(path.c_str(), uidTo, gidTo) == -1) if (lchown(path.c_str(), uidTo, gidTo) == -1)
throw Error(error); throw Error(error);
#else
if (!S_ISLNK(st.st_mode) &&
chown(path.c_str(), uidTo, gidTo) == -1)
throw Error(error);
#endif
if (S_ISDIR(st.st_mode)) { if (S_ISDIR(st.st_mode)) {
Strings names = readDirectory(path); Strings names = readDirectory(path);