From 9ea0943bfd68afa3412a139fa1a29d9b6c046916 Mon Sep 17 00:00:00 2001 From: Eric Blake Date: Thu, 16 Sep 2010 17:12:35 -0600 Subject: fdutimensat: add an atflag parameter * lib/fdutimensat.c (fdutimensat): Add new parameter. * lib/utimens.h (fdutimensat): Update prototype. * tests/test-fdutimensat.c: Adjust test to match. * NEWS: Document the change. Suggested by Paul Eggert. Signed-off-by: Eric Blake --- lib/fdutimensat.c | 21 ++++++++++++++++++--- 1 file changed, 18 insertions(+), 3 deletions(-) (limited to 'lib/fdutimensat.c') diff --git a/lib/fdutimensat.c b/lib/fdutimensat.c index 7c08a525a9..77f893bb3b 100644 --- a/lib/fdutimensat.c +++ b/lib/fdutimensat.c @@ -35,16 +35,31 @@ use just futimes (or equivalent) instead of utimes (or equivalent), and fail if on an old system without futimes (or equivalent). If TIMESPEC is null, set the time stamps to the current time. + ATFLAG must be 0 if FD is non-negative; otherwise it may be + AT_SYMLINK_NOFOLLOW to operate on FILE as a symlink. Return 0 on success, -1 (setting errno) on failure. */ int -fdutimensat (int dir, char const *file, int fd, struct timespec const ts[2]) +fdutimensat (int dir, char const *file, int fd, struct timespec const ts[2], + int atflag) { int result = 1; + if (atflag & ~AT_SYMLINK_NOFOLLOW) + { + errno = EINVAL; + return -1; + } if (0 <= fd) - result = futimens (fd, ts); + { + if (atflag) + { + errno = EINVAL; + return -1; + } + result = futimens (fd, ts); + } if (file && (fd < 0 || (result == -1 && errno == ENOSYS))) - result = utimensat (dir, file, ts, 0); + result = utimensat (dir, file, ts, atflag); if (result == 1) { errno = EBADF; -- cgit v1.2.1