(touch): Handle "touch -c - >&-" by checking for EBADF

and ENOSYS.
Do not pass "-" to futimens; pass NULL instead.
If close (STDIN_FILENO) fails, report the error separately instead
of letting the 'close' pollute errno.
This commit is contained in:
Paul Eggert 2005-09-26 23:02:14 +00:00
parent 80065b498b
commit 2f897e7258

View File

@ -154,7 +154,7 @@ touch (const char *file)
error (0, open_errno, _("creating %s"), quote (file));
else
{
if (no_create && errno == ENOENT)
if (no_create && (errno == ENOENT || errno == EBADF))
return true;
error (0, errno, _("failed to get attributes of %s"),
quote (file));
@ -182,9 +182,23 @@ touch (const char *file)
t = timespec;
}
ok = (futimens (fd, file, t) == 0);
ok = (futimens (fd, (fd == STDOUT_FILENO ? NULL : file), t) == 0);
if (fd == STDIN_FILENO)
ok &= (close (fd) == 0);
{
if (close (STDIN_FILENO) != 0)
{
error (0, errno, _("closing %s"), quote (file));
return false;
}
}
else if (fd == STDOUT_FILENO)
{
/* Do not diagnose "touch -c - >&-". */
if (!ok && errno == EBADF && no_create
&& change_times == (CH_ATIME | CH_MTIME))
return true;
}
if (!ok)
{