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:
@@ -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 */
|
||||
|
Reference in New Issue
Block a user