From 4aca87515a5083ae0e31ce3177189fd43b6d05ac Mon Sep 17 00:00:00 2001 From: Andreas Baumann Date: Sat, 3 Jan 2015 13:58:15 +0100 Subject: patch to Vanilla Tomato 1.28 --- release/src/router/busybox/coreutils/touch.c | 91 ++++++++++++++++++---------- 1 file changed, 60 insertions(+), 31 deletions(-) (limited to 'release/src/router/busybox/coreutils/touch.c') diff --git a/release/src/router/busybox/coreutils/touch.c b/release/src/router/busybox/coreutils/touch.c index 3d780e16..20191546 100644 --- a/release/src/router/busybox/coreutils/touch.c +++ b/release/src/router/busybox/coreutils/touch.c @@ -2,22 +2,9 @@ /* * Mini touch implementation for busybox * - * Copyright (C) 1999-2003 by Erik Andersen - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * Copyright (C) 1999-2004 by Erik Andersen * + * Licensed under GPLv2 or later, see file LICENSE in this tarball for details. */ /* BB_AUDIT SUSv3 _NOT_ compliant -- options -a, -m, -r, -t not supported. */ @@ -30,33 +17,73 @@ * Also, exiting on a failure was a bug. All args should be processed. */ -#include -#include -#include -#include -#include -#include -#include -#include "busybox.h" +#include "libbb.h" -extern int touch_main(int argc, char **argv) +/* This is a NOFORK applet. Be very careful! */ + +/* coreutils implements: + * -a change only the access time + * -c, --no-create + * do not create any files + * -d, --date=STRING + * parse STRING and use it instead of current time + * -f (ignored, BSD compat) + * -m change only the modification time + * -r, --reference=FILE + * use this file's times instead of current time + * -t STAMP + * use [[CC]YY]MMDDhhmm[.ss] instead of current time + * --time=WORD + * change the specified time: WORD is access, atime, or use + */ + +int touch_main(int argc, char **argv) MAIN_EXTERNALLY_VISIBLE; +int touch_main(int argc UNUSED_PARAM, char **argv) { +#if ENABLE_DESKTOP +#if ENABLE_GETOPT_LONG + static const char longopts[] ALIGN1 = + /* name, has_arg, val */ + "no-create\0" No_argument "c" + "reference\0" Required_argument "r" + ; +#endif + struct utimbuf timebuf; + char *reference_file = NULL; +#else +#define reference_file NULL +#define timebuf (*(struct utimbuf*)NULL) +#endif int fd; - int flags; int status = EXIT_SUCCESS; + int opts; - flags = bb_getopt_ulflags(argc, argv, "c"); +#if ENABLE_DESKTOP +#if ENABLE_GETOPT_LONG + applet_long_options = longopts; +#endif +#endif + opts = getopt32(argv, "c" USE_DESKTOP("r:") + /*ignored:*/ "fma" + USE_DESKTOP(, &reference_file)); + opts &= 1; /* only -c bit is left */ argv += optind; - if (!*argv) { bb_show_usage(); } + if (reference_file) { + struct stat stbuf; + xstat(reference_file, &stbuf); + timebuf.actime = stbuf.st_atime; + timebuf.modtime = stbuf.st_mtime; + } + do { - if (utime(*argv, NULL)) { - if (errno == ENOENT) { /* no such file*/ - if (flags & 1) { /* Creation is disabled, so ignore. */ + if (utime(*argv, reference_file ? &timebuf : NULL)) { + if (errno == ENOENT) { /* no such file */ + if (opts) { /* creation is disabled, so ignore */ continue; } /* Try to create the file. */ @@ -64,11 +91,13 @@ extern int touch_main(int argc, char **argv) S_IRUSR | S_IWUSR | S_IRGRP | S_IWGRP | S_IROTH | S_IWOTH ); if ((fd >= 0) && !close(fd)) { + if (reference_file) + utime(*argv, &timebuf); continue; } } status = EXIT_FAILURE; - bb_perror_msg("%s", *argv); + bb_simple_perror_msg(*argv); } } while (*++argv); -- cgit v1.2.3-54-g00ecf