Module Name: src
Committed By: kre
Date: Fri Feb 9 23:41:48 UTC 2024
Modified Files:
src/usr.bin/touch: touch.1 touch.c
Log Message:
Add a -R option, which is identical to -r, except that if the reference file
is a symbolic link, the times to use are taken from those of the symbolic
link itself, instead of from the file it references. If the reference file
is not a symbolic link, -R and -r are identical.
This allows the BUGS entry in the manual page to be removed.
To generate a diff of this commit:
cvs rdiff -u -r1.27 -r1.28 src/usr.bin/touch/touch.1
cvs rdiff -u -r1.38 -r1.39 src/usr.bin/touch/touch.c
Please note that diffs are not public domain; they are subject to the
copyright notices on the relevant files.
Modified files:
Index: src/usr.bin/touch/touch.1
diff -u src/usr.bin/touch/touch.1:1.27 src/usr.bin/touch/touch.1:1.28
--- src/usr.bin/touch/touch.1:1.27 Thu Feb 8 02:54:13 2024
+++ src/usr.bin/touch/touch.1 Fri Feb 9 23:41:48 2024
@@ -1,4 +1,4 @@
-.\" $NetBSD: touch.1,v 1.27 2024/02/08 02:54:13 kre Exp $
+.\" $NetBSD: touch.1,v 1.28 2024/02/09 23:41:48 kre Exp $
.\"
.\" Copyright (c) 1991, 1993
.\" The Regents of the University of California. All rights reserved.
@@ -32,7 +32,7 @@
.\"
.\" @(#)touch.1 8.3 (Berkeley) 4/28/95
.\"
-.Dd February 7, 2024
+.Dd February 9, 2024
.Dt TOUCH 1
.Os
.Sh NAME
@@ -43,6 +43,7 @@
.Op Fl acfhm
.Op Fl d Ar posix-datetime|human-datetime
.Op Fl Fl \|date Ar posix-datetime|human-datetime
+.Op Fl R Ar ref-file
.Op Fl r Ar ref-file
.Op Fl Fl \|reference Ar ref-file
.Op Fl t Ar datetime
@@ -193,6 +194,7 @@ is not changed unless the
.Fl a
flag is also specified.
.Pp
+.It Fl R Ar ref-file
.It Fl r Ar ref-file
.It Fl Fl \|reference Ar ref-file
Use the access and modification times,
@@ -203,7 +205,15 @@ instead of the current time of day.
If the
.Ar ref-file
is a symbolic link,
+then if the
+.Fl R
+form of this option was used,
+the times are taken from the symbolic link itself,
+otherwise
the times are taken from the file referenced by it.
+If
+.Ar ref-file
+is not a symbolic link, all three forms are identical.
.Pp
.It Fl t Ar datetime
Change the access and modification times of the
@@ -292,6 +302,7 @@ all conversions use decimal numbers.
.Pp
The
.Fl d ,
+.Fl R ,
.Fl r ,
and
.Fl t
@@ -301,10 +312,12 @@ each will be evaluated, and may cause an
then the result from the last one specified is used.
.Pp
The options which specify any part of the time
-.Pq Fl d , Fl r , Fl t
+.Pq Fl d , Fl R, Fl r , Fl t
apply to both the access and modification times
(with
.Fl r
+and
+.Fl R
obtaining those values independently from the
.Ar ref-file ) ,
though which is actually applied depends upon
@@ -421,5 +434,3 @@ A
.Nm
utility appeared in
.At v7 .
-.Sh BUGS
-A symbolic link can't be a reference file of access and/or modification time.
Index: src/usr.bin/touch/touch.c
diff -u src/usr.bin/touch/touch.c:1.38 src/usr.bin/touch/touch.c:1.39
--- src/usr.bin/touch/touch.c:1.38 Thu Feb 8 02:54:07 2024
+++ src/usr.bin/touch/touch.c Fri Feb 9 23:41:48 2024
@@ -1,4 +1,4 @@
-/* $NetBSD: touch.c,v 1.38 2024/02/08 02:54:07 kre Exp $ */
+/* $NetBSD: touch.c,v 1.39 2024/02/09 23:41:48 kre Exp $ */
/*
* Copyright (c) 1993
@@ -39,7 +39,7 @@ __COPYRIGHT("@(#) Copyright (c) 1993\
#if 0
static char sccsid[] = "@(#)touch.c 8.2 (Berkeley) 4/28/95";
#endif
-__RCSID("$NetBSD: touch.c,v 1.38 2024/02/08 02:54:07 kre Exp $");
+__RCSID("$NetBSD: touch.c,v 1.39 2024/02/09 23:41:48 kre Exp $");
#endif /* not lint */
#include <sys/types.h>
@@ -65,7 +65,8 @@ __RCSID("$NetBSD: touch.c,v 1.38 2024/02
static void stime_arg0(const char *, struct timespec *);
static void stime_arg1(char *, struct timespec *);
static void stime_arg2(const char *, int, struct timespec *);
-static void stime_file(const char *, struct timespec *);
+static void stime_file(const char *, struct timespec *,
+ int (const char *, struct stat *));
static int stime_posix(const char *, struct timespec *);
static int difftm(const struct tm *, const struct tm *);
__dead static void usage(void);
@@ -101,7 +102,7 @@ main(int argc, char *argv[])
if (clock_gettime(CLOCK_REALTIME, &ts[0]))
err(1, "clock_gettime");
- while ((ch = getopt_long(argc, argv, "acd:fhmr:t:", touch_longopts,
+ while ((ch = getopt_long(argc, argv, "acd:fhmR:r:t:", touch_longopts,
NULL)) != -1)
switch (ch) {
case 'a':
@@ -123,9 +124,13 @@ main(int argc, char *argv[])
case 'm':
mflag = 1;
break;
+ case 'R':
+ timeset = 1;
+ stime_file(optarg, ts, lstat);
+ break;
case 'r':
timeset = 1;
- stime_file(optarg, ts);
+ stime_file(optarg, ts, stat);
break;
case 't':
timeset = 1;
@@ -335,11 +340,12 @@ stime_arg2(const char *arg, int year, st
}
static void
-stime_file(const char *fname, struct timespec *tsp)
+stime_file(const char *fname, struct timespec *tsp,
+ int statfunc(const char *, struct stat *))
{
struct stat sb;
- if (stat(fname, &sb))
+ if (statfunc(fname, &sb))
err(1, "%s", fname);
tsp[0] = sb.st_atimespec;
tsp[1] = sb.st_mtimespec;
@@ -521,7 +527,7 @@ static void
usage(void)
{
(void)fprintf(stderr,
- "Usage: %s [-acfhm] [-d|--date datetime] [-r|--reference file]"
+ "Usage: %s [-acfhm] [-d|--date datetime] [-R|-r|--reference file]"
" [-t time] file ...\n", getprogname());
exit(EXIT_FAILURE);
}