mirror of
git://anongit.mindrot.org/openssh.git
synced 2024-11-24 10:53:24 +08:00
Add minimal fchownat and fchmodat implementations.
Fixes builds on at least OS X Lion, NetBSD 6 and Solaris 10.
This commit is contained in:
parent
091093d258
commit
a6258e5dc3
@ -1719,7 +1719,9 @@ AC_CHECK_FUNCS([ \
|
|||||||
errx \
|
errx \
|
||||||
explicit_bzero \
|
explicit_bzero \
|
||||||
fchmod \
|
fchmod \
|
||||||
|
fchmodat \
|
||||||
fchown \
|
fchown \
|
||||||
|
fchownat \
|
||||||
flock \
|
flock \
|
||||||
freeaddrinfo \
|
freeaddrinfo \
|
||||||
freezero \
|
freezero \
|
||||||
|
@ -154,6 +154,64 @@ utimensat(int fd, const char *path, const struct timespec times[2],
|
|||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#ifndef HAVE_FCHOWNAT
|
||||||
|
/*
|
||||||
|
* A limited implementation of fchownat() that only implements the
|
||||||
|
* functionality used by OpenSSH, currently only AT_FDCWD and
|
||||||
|
* AT_SYMLINK_NOFOLLOW.
|
||||||
|
*/
|
||||||
|
int
|
||||||
|
fchownat(int fd, const char *path, uid_t owner, gid_t group, int flag)
|
||||||
|
{
|
||||||
|
int ret, oflags = O_WRONLY;
|
||||||
|
|
||||||
|
if (fd != AT_FDCWD) {
|
||||||
|
errno = ENOSYS;
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
# ifndef HAVE_FCHOWN
|
||||||
|
return chown(pathname, owner, group);
|
||||||
|
# else
|
||||||
|
if (flag & AT_SYMLINK_NOFOLLOW)
|
||||||
|
oflags |= O_NOFOLLOW;
|
||||||
|
if ((fd = open(path, oflags)) == -1)
|
||||||
|
return -1;
|
||||||
|
ret = fchown(fd, owner, group);
|
||||||
|
close(fd);
|
||||||
|
return ret;
|
||||||
|
# endif
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifndef HAVE_FCHMODAT
|
||||||
|
/*
|
||||||
|
* A limited implementation of fchmodat() that only implements the
|
||||||
|
* functionality used by OpenSSH, currently only AT_FDCWD and
|
||||||
|
* AT_SYMLINK_NOFOLLOW.
|
||||||
|
*/
|
||||||
|
int
|
||||||
|
fchmodat(int fd, const char *path, mode_t mode, int flag)
|
||||||
|
{
|
||||||
|
int ret, oflags = O_WRONLY;
|
||||||
|
|
||||||
|
if (fd != AT_FDCWD) {
|
||||||
|
errno = ENOSYS;
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
# ifndef HAVE_FCHMOD
|
||||||
|
return chown(pathname, owner, group);
|
||||||
|
# else
|
||||||
|
if (flag & AT_SYMLINK_NOFOLLOW)
|
||||||
|
oflags |= O_NOFOLLOW;
|
||||||
|
if ((fd = open(path, oflags)) == -1)
|
||||||
|
return -1;
|
||||||
|
ret = fchmod(fd, mode);
|
||||||
|
close(fd);
|
||||||
|
return ret;
|
||||||
|
# endif
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
#ifndef HAVE_TRUNCATE
|
#ifndef HAVE_TRUNCATE
|
||||||
int truncate(const char *path, off_t length)
|
int truncate(const char *path, off_t length)
|
||||||
{
|
{
|
||||||
|
@ -72,6 +72,18 @@ int utimes(char *, struct timeval *);
|
|||||||
int utimensat(int, const char *, const struct timespec[2], int);
|
int utimensat(int, const char *, const struct timespec[2], int);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#ifndef AT_FDCWD
|
||||||
|
# define AT_FDCWD (-2)
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifndef HAVE_FCHMODAT
|
||||||
|
int fchmodat(int, const char *, mode_t, int);
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifndef HAVE_FCHOWNAT
|
||||||
|
int fchownat(int, const char *, uid_t, gid_t, int);
|
||||||
|
#endif
|
||||||
|
|
||||||
#ifndef HAVE_TRUNCATE
|
#ifndef HAVE_TRUNCATE
|
||||||
int truncate (const char *, off_t);
|
int truncate (const char *, off_t);
|
||||||
#endif /* HAVE_TRUNCATE */
|
#endif /* HAVE_TRUNCATE */
|
||||||
|
Loading…
Reference in New Issue
Block a user