sbase

suckless unix tools
git clone git://git.2f30.org/sbase.git
Log | Files | Refs | README | LICENSE

commit 45c54bff0ba8ab7ab1369c5dd229bf498642f9e1
parent 8b623f859386e0ea8511c6f9a6efad92e3ce1129
Author: sin <sin@2f30.org>
Date:   Tue, 20 Jan 2015 11:15:18 +0000

touch: Add support for -a and -m

Update the manpage.

Diffstat:
touch.1 | 56+++++++++++++++++++++++++++++++-------------------------
touch.c | 43+++++++++++++++++++++++++++----------------
2 files changed, 58 insertions(+), 41 deletions(-)

diff --git a/touch.1 b/touch.1 @@ -1,25 +1,31 @@ -.TH TOUCH 1 sbase\-VERSION -.SH NAME -touch \- set files' timestamps -.SH SYNOPSIS -.B touch -.RB [ \-c ] -.RB [ \-t -.IR time ] -.RI [ file ...] -.SH DESCRIPTION -.B touch -sets the given files' modification time to the current time. If a file does not -exist it is created. -.SH OPTIONS -.TP -.B \-c -do not create files if they do not exist. -.TP -.BI \-t " time" -sets the files' modification time to -.IR time , -given as the number of seconds since the Unix epoch. -.SH SEE ALSO -.IR utime (2), -.IR creat (2) +.Dd January 20, 2014 +.Dt TOUCH 1 sbase\-VERSION +.Sh NAME +.Nm touch +.Nd set file timestamps +.Sh SYNOPSIS +.Nm touch +.Op Fl acm +.Op Fl t Ar stamp +.Ar file ... +.Sh DESCRIPTION +.Nm +sets the access and modification times of files to the current time of day. If the file +doesn't exist, it is created with the default permissions. +.Sh OPTIONS +.Bl -tag -width Ds +.It Fl a +Set the access time of the file. +.It Fl c +Do not create the file it it does not exist. The exit +status is not affected. +.It Fl m +Change the modification time of the file. +.It Fl t Ar stamp +Set the timestamp to be used with +.Op Fl am . +The format of the timestamp is simply the number of seconds +since Jan 1, 1970. This specification of time does not conform +to POSIX. +.Sh SEE ALSO +.Xr date 1 diff --git a/touch.c b/touch.c @@ -11,13 +11,15 @@ static void touch(const char *); -static int cflag = 0; +static int aflag; +static int cflag; +static int mflag; static time_t t; static void usage(void) { - eprintf("usage: %s [-c] [-t stamp] file...\n", argv0); + eprintf("usage: %s [-acm] [-t stamp] file ...\n", argv0); } int @@ -26,9 +28,15 @@ main(int argc, char *argv[]) t = time(NULL); ARGBEGIN { + case 'a': + aflag = 1; + break; case 'c': cflag = 1; break; + case 'm': + mflag = 1; + break; case 't': t = estrtol(EARGF(usage()), 0); break; @@ -46,26 +54,29 @@ main(int argc, char *argv[]) } static void -touch(const char *str) +touch(const char *file) { int fd; struct stat st; struct utimbuf ut; + int r; - if (stat(str, &st) == 0) { - ut.actime = st.st_atime; - ut.modtime = t; - if (utime(str, &ut) < 0) - eprintf("utime %s:", str); + if ((r = stat(file, &st)) < 0) { + if (errno != ENOENT) + eprintf("stat %s:", file); + if (cflag) + return; + } else if (r == 0) { + ut.actime = aflag ? t : st.st_atime; + ut.modtime = mflag ? t : st.st_mtime; + if (utime(file, &ut) < 0) + eprintf("utime %s:", file); return; } - else if (errno != ENOENT) - eprintf("stat %s:", str); - else if (cflag) - return; - if ((fd = open(str, O_CREAT|O_EXCL, - S_IRUSR|S_IWUSR|S_IRGRP|S_IWGRP|S_IROTH|S_IWOTH)) < 0) - eprintf("open %s:", str); + + if ((fd = open(file, O_CREAT | O_EXCL, 0644)) < 0) + eprintf("open %s:", file); close(fd); - touch(str); + + touch(file); }