From 444de72fd32218764b8e053f0dc32b6af423524c Mon Sep 17 00:00:00 2001 From: Connor Lane Smith Date: Sat, 18 Jun 2011 06:43:10 +0100 Subject: [PATCH] touch: posix open --- kill.1 | 3 ++- touch.c | 27 +++++++++++++++------------ 2 files changed, 17 insertions(+), 13 deletions(-) diff --git a/kill.1 b/kill.1 index 983bffd..237ecfb 100644 --- a/kill.1 +++ b/kill.1 @@ -25,4 +25,5 @@ lists available signals. If a .I signum is given, only the corresponding signal name will be printed. .SH SEE ALSO -.IR kill (2) +.IR kill (2), +.IR signal (7) diff --git a/touch.c b/touch.c index 5988989..d336695 100644 --- a/touch.c +++ b/touch.c @@ -43,17 +43,20 @@ touch(const char *str) struct stat st; struct utimbuf ut; - if(stat(str, &st) == -1) { - if(errno != ENOENT) - eprintf("stat %s:", str); - if(cflag) - return; - if((fd = creat(str, O_EXCL|S_IRUSR|S_IWUSR|S_IRGRP|S_IWGRP|S_IROTH|S_IWOTH)) < 0) - eprintf("creat %s:", str); - close(fd); + if(stat(str, &st) == 0) { + ut.actime = st.st_atime; + ut.modtime = t; + if(utime(str, &ut) == -1) + eprintf("utime %s:", str); + return; } - ut.actime = st.st_atime; - ut.modtime = t; - if(utime(str, &ut) == -1) - eprintf("utime %s:", str); + 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)) == -1) + eprintf("open %s:", str); + close(fd); + touch(str); }