touch: implement -d --date (our own testsuite needs that)

function                                             old     new   delta
static.uname_longopts                                  -     137    +137
touch_main                                           231     360    +129
static.touch_longopts                                  -      32     +32
validate_tm_time                                       -      28     +28
packed_usage                                       26616   26624      +8
date_main                                            687     686      -1
static.longopts                                      162       -    -162
------------------------------------------------------------------------------
(add/remove: 3/1 grow/shrink: 2/1 up/down: 334/-163)          Total: 171 bytes

Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
This commit is contained in:
Denys Vlasenko
2009-07-18 03:41:29 +02:00
parent 73b71f381d
commit 7aca89a7a3
12 changed files with 64 additions and 29 deletions

View File

@@ -41,31 +41,34 @@ int touch_main(int argc, char **argv) MAIN_EXTERNALLY_VISIBLE;
int touch_main(int argc UNUSED_PARAM, char **argv)
{
#if ENABLE_DESKTOP
#if ENABLE_LONG_OPTS
static const char longopts[] ALIGN1 =
# if ENABLE_LONG_OPTS
static const char touch_longopts[] ALIGN1 =
/* name, has_arg, val */
"no-create\0" No_argument "c"
"reference\0" Required_argument "r"
"date\0" Required_argument "d"
;
#endif
# endif
struct utimbuf timebuf;
char *reference_file = NULL;
char *date_str = NULL;
#else
#define reference_file NULL
#define timebuf (*(struct utimbuf*)NULL)
# define reference_file NULL
# define date_str NULL
# define timebuf (*(struct utimbuf*)NULL)
#endif
int fd;
int status = EXIT_SUCCESS;
int opts;
#if ENABLE_DESKTOP
#if ENABLE_LONG_OPTS
applet_long_options = longopts;
#if ENABLE_DESKTOP && ENABLE_LONG_OPTS
applet_long_options = touch_longopts;
#endif
#endif
opts = getopt32(argv, "c" IF_DESKTOP("r:")
opts = getopt32(argv, "c" IF_DESKTOP("r:d:")
/*ignored:*/ "fma"
IF_DESKTOP(, &reference_file));
IF_DESKTOP(, &reference_file)
IF_DESKTOP(, &date_str)
);
opts &= 1; /* only -c bit is left */
argv += optind;
@@ -80,6 +83,23 @@ int touch_main(int argc UNUSED_PARAM, char **argv)
timebuf.modtime = stbuf.st_mtime;
}
if (date_str) {
struct tm tm_time;
time_t t;
//time(&t);
//localtime_r(&t, &tm_time);
memset(&tm_time, 0, sizeof(tm_time));
parse_datestr(date_str, &tm_time);
/* Correct any day of week and day of year etc. fields */
tm_time.tm_isdst = -1; /* Be sure to recheck dst */
t = validate_tm_time(date_str, &tm_time);
timebuf.actime = t;
timebuf.modtime = t;
}
do {
if (utime(*argv, reference_file ? &timebuf : NULL)) {
if (errno == ENOENT) { /* no such file */