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:
parent
73b71f381d
commit
7aca89a7a3
@ -142,12 +142,11 @@ int date_main(int argc UNUSED_PARAM, char **argv)
|
|||||||
} else {
|
} else {
|
||||||
parse_datestr(date_str, &tm_time);
|
parse_datestr(date_str, &tm_time);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Correct any day of week and day of year etc. fields */
|
/* Correct any day of week and day of year etc. fields */
|
||||||
tm_time.tm_isdst = -1; /* Be sure to recheck dst */
|
tm_time.tm_isdst = -1; /* Be sure to recheck dst */
|
||||||
tm = mktime(&tm_time);
|
tm = validate_tm_time(date_str, &tm_time);
|
||||||
if (tm < 0) {
|
|
||||||
bb_error_msg_and_die(bb_msg_invalid_date, date_str);
|
|
||||||
}
|
|
||||||
maybe_set_utc(opt);
|
maybe_set_utc(opt);
|
||||||
|
|
||||||
/* if setting time, set it */
|
/* if setting time, set it */
|
||||||
|
@ -41,31 +41,34 @@ int touch_main(int argc, char **argv) MAIN_EXTERNALLY_VISIBLE;
|
|||||||
int touch_main(int argc UNUSED_PARAM, char **argv)
|
int touch_main(int argc UNUSED_PARAM, char **argv)
|
||||||
{
|
{
|
||||||
#if ENABLE_DESKTOP
|
#if ENABLE_DESKTOP
|
||||||
#if ENABLE_LONG_OPTS
|
# if ENABLE_LONG_OPTS
|
||||||
static const char longopts[] ALIGN1 =
|
static const char touch_longopts[] ALIGN1 =
|
||||||
/* name, has_arg, val */
|
/* name, has_arg, val */
|
||||||
"no-create\0" No_argument "c"
|
"no-create\0" No_argument "c"
|
||||||
"reference\0" Required_argument "r"
|
"reference\0" Required_argument "r"
|
||||||
|
"date\0" Required_argument "d"
|
||||||
;
|
;
|
||||||
#endif
|
# endif
|
||||||
struct utimbuf timebuf;
|
struct utimbuf timebuf;
|
||||||
char *reference_file = NULL;
|
char *reference_file = NULL;
|
||||||
|
char *date_str = NULL;
|
||||||
#else
|
#else
|
||||||
#define reference_file NULL
|
# define reference_file NULL
|
||||||
#define timebuf (*(struct utimbuf*)NULL)
|
# define date_str NULL
|
||||||
|
# define timebuf (*(struct utimbuf*)NULL)
|
||||||
#endif
|
#endif
|
||||||
int fd;
|
int fd;
|
||||||
int status = EXIT_SUCCESS;
|
int status = EXIT_SUCCESS;
|
||||||
int opts;
|
int opts;
|
||||||
|
|
||||||
#if ENABLE_DESKTOP
|
#if ENABLE_DESKTOP && ENABLE_LONG_OPTS
|
||||||
#if ENABLE_LONG_OPTS
|
applet_long_options = touch_longopts;
|
||||||
applet_long_options = longopts;
|
|
||||||
#endif
|
#endif
|
||||||
#endif
|
opts = getopt32(argv, "c" IF_DESKTOP("r:d:")
|
||||||
opts = getopt32(argv, "c" IF_DESKTOP("r:")
|
|
||||||
/*ignored:*/ "fma"
|
/*ignored:*/ "fma"
|
||||||
IF_DESKTOP(, &reference_file));
|
IF_DESKTOP(, &reference_file)
|
||||||
|
IF_DESKTOP(, &date_str)
|
||||||
|
);
|
||||||
|
|
||||||
opts &= 1; /* only -c bit is left */
|
opts &= 1; /* only -c bit is left */
|
||||||
argv += optind;
|
argv += optind;
|
||||||
@ -80,6 +83,23 @@ int touch_main(int argc UNUSED_PARAM, char **argv)
|
|||||||
timebuf.modtime = stbuf.st_mtime;
|
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 {
|
do {
|
||||||
if (utime(*argv, reference_file ? &timebuf : NULL)) {
|
if (utime(*argv, reference_file ? &timebuf : NULL)) {
|
||||||
if (errno == ENOENT) { /* no such file */
|
if (errno == ENOENT) { /* no such file */
|
||||||
|
@ -74,7 +74,7 @@ int uname_main(int argc, char **argv) MAIN_EXTERNALLY_VISIBLE;
|
|||||||
int uname_main(int argc UNUSED_PARAM, char **argv)
|
int uname_main(int argc UNUSED_PARAM, char **argv)
|
||||||
{
|
{
|
||||||
#if ENABLE_LONG_OPTS
|
#if ENABLE_LONG_OPTS
|
||||||
static const char longopts[] ALIGN1 =
|
static const char uname_longopts[] ALIGN1 =
|
||||||
/* name, has_arg, val */
|
/* name, has_arg, val */
|
||||||
"all\0" No_argument "a"
|
"all\0" No_argument "a"
|
||||||
"kernel-name\0" No_argument "s"
|
"kernel-name\0" No_argument "s"
|
||||||
@ -97,7 +97,7 @@ int uname_main(int argc UNUSED_PARAM, char **argv)
|
|||||||
const unsigned short *delta;
|
const unsigned short *delta;
|
||||||
unsigned toprint;
|
unsigned toprint;
|
||||||
|
|
||||||
IF_LONG_OPTS(applet_long_options = longopts);
|
IF_LONG_OPTS(applet_long_options = uname_longopts);
|
||||||
toprint = getopt32(argv, options);
|
toprint = getopt32(argv, options);
|
||||||
|
|
||||||
if (argv[optind]) { /* coreutils-6.9 compat */
|
if (argv[optind]) { /* coreutils-6.9 compat */
|
||||||
|
@ -438,6 +438,7 @@ struct BUG_too_small {
|
|||||||
|
|
||||||
|
|
||||||
void parse_datestr(const char *date_str, struct tm *tm_time) FAST_FUNC;
|
void parse_datestr(const char *date_str, struct tm *tm_time) FAST_FUNC;
|
||||||
|
time_t validate_tm_time(const char *date_str, struct tm *tm_time) FAST_FUNC;
|
||||||
|
|
||||||
|
|
||||||
int xsocket(int domain, int type, int protocol) FAST_FUNC;
|
int xsocket(int domain, int type, int protocol) FAST_FUNC;
|
||||||
|
@ -4556,11 +4556,12 @@
|
|||||||
"and show the status for however many processes will fit on the screen." \
|
"and show the status for however many processes will fit on the screen." \
|
||||||
|
|
||||||
#define touch_trivial_usage \
|
#define touch_trivial_usage \
|
||||||
"[-c] FILE [FILE]..."
|
"[-c] [-d DATE] FILE [FILE]..."
|
||||||
#define touch_full_usage "\n\n" \
|
#define touch_full_usage "\n\n" \
|
||||||
"Update the last-modified date on the given FILE[s]\n" \
|
"Update the last-modified date on the given FILE[s]\n" \
|
||||||
"\nOptions:" \
|
"\nOptions:" \
|
||||||
"\n -c Do not create any files" \
|
"\n -c Do not create files" \
|
||||||
|
"\n -d DT Date/time to use" \
|
||||||
|
|
||||||
#define touch_example_usage \
|
#define touch_example_usage \
|
||||||
"$ ls -l /tmp/foo\n" \
|
"$ ls -l /tmp/foo\n" \
|
||||||
|
@ -71,6 +71,15 @@ void FAST_FUNC parse_datestr(const char *date_str, struct tm *tm_time)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
time_t FAST_FUNC validate_tm_time(const char *date_str, struct tm *tm_time)
|
||||||
|
{
|
||||||
|
time_t t = mktime(tm_time);
|
||||||
|
if (t == (time_t) -1L) {
|
||||||
|
bb_error_msg_and_die(bb_msg_invalid_date, date_str);
|
||||||
|
}
|
||||||
|
return t;
|
||||||
|
}
|
||||||
|
|
||||||
#if ENABLE_MONOTONIC_SYSCALL
|
#if ENABLE_MONOTONIC_SYSCALL
|
||||||
|
|
||||||
#include <sys/syscall.h>
|
#include <sys/syscall.h>
|
||||||
|
@ -517,8 +517,8 @@ if test "${0##*/}" = "bunzip2.tests"; then
|
|||||||
if test1_bz2 | ${bb}bunzip2 >/dev/null \
|
if test1_bz2 | ${bb}bunzip2 >/dev/null \
|
||||||
&& test "`test1_bz2 | ${bb}bunzip2 | md5sum`" = "61bbeee4be9c6f110a71447f584fda7b -"
|
&& test "`test1_bz2 | ${bb}bunzip2 | md5sum`" = "61bbeee4be9c6f110a71447f584fda7b -"
|
||||||
then
|
then
|
||||||
echo "$unpack: test bz2 file: PASS"
|
echo "PASS: $unpack: test bz2 file"
|
||||||
else
|
else
|
||||||
echo "$unpack: test bz2 file: FAIL"
|
echo "FAIL: $unpack: test bz2 file"
|
||||||
fi
|
fi
|
||||||
fi
|
fi
|
||||||
|
@ -32,9 +32,9 @@ prep() {
|
|||||||
check() {
|
check() {
|
||||||
eval $2 >t_actual 2>&1
|
eval $2 >t_actual 2>&1
|
||||||
if $ECHO -ne "$expected" | cmp - t_actual; then
|
if $ECHO -ne "$expected" | cmp - t_actual; then
|
||||||
echo "$1: PASS"
|
echo "PASS: $1"
|
||||||
else
|
else
|
||||||
echo "$1: FAIL"
|
echo "FAIL: $1"
|
||||||
fi
|
fi
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -3,7 +3,7 @@ echo file number two > file2
|
|||||||
ln -s file2 link1
|
ln -s file2 link1
|
||||||
mkdir dir1
|
mkdir dir1
|
||||||
# why???
|
# why???
|
||||||
#touch --date='Sat Jan 29 21:24:08 PST 2000' dir1/file3
|
#TZ=UTC0 touch -d '2000-01-30 05:24:08' dir1/file3
|
||||||
mkdir there
|
mkdir there
|
||||||
busybox cp -a file1 file2 link1 dir1 there
|
busybox cp -a file1 file2 link1 dir1 there
|
||||||
test -f there/file1
|
test -f there/file1
|
||||||
|
@ -2,7 +2,7 @@ echo file number one > file1
|
|||||||
echo file number two > file2
|
echo file number two > file2
|
||||||
ln -s file2 link1
|
ln -s file2 link1
|
||||||
mkdir dir1
|
mkdir dir1
|
||||||
touch --date='Sat Jan 29 21:24:08 PST 2000' dir1/file3
|
TZ=UTC0 touch -d '2000-01-30 05:24:08' dir1/file3
|
||||||
mkdir there
|
mkdir there
|
||||||
busybox mv file1 file2 link1 dir1 there
|
busybox mv file1 file2 link1 dir1 there
|
||||||
test -f there/file1
|
test -f there/file1
|
||||||
|
@ -2,7 +2,7 @@ echo file number one > file1
|
|||||||
echo file number two > file2
|
echo file number two > file2
|
||||||
ln -s file2 link1
|
ln -s file2 link1
|
||||||
mkdir dir1
|
mkdir dir1
|
||||||
touch --date='Sat Jan 29 21:24:08 PST 2000' dir1/file3
|
TZ=UTC0 touch -d '2000-01-30 05:24:08' dir1/file3
|
||||||
mkdir there
|
mkdir there
|
||||||
busybox mv file1 file2 link1 dir1 there
|
busybox mv file1 file2 link1 dir1 there
|
||||||
test -f there/file1
|
test -f there/file1
|
||||||
|
@ -120,12 +120,17 @@ fi
|
|||||||
|
|
||||||
# Populate a directory with links to all busybox applets
|
# Populate a directory with links to all busybox applets
|
||||||
|
|
||||||
# Note: if $LINKSDIR/applet exists, we do not overwrite it.
|
|
||||||
# Useful if one wants to run tests against a standard utility, not an applet.
|
|
||||||
LINKSDIR="$bindir/runtest-tempdir-links"
|
LINKSDIR="$bindir/runtest-tempdir-links"
|
||||||
#rm -rf "$LINKSDIR" 2>/dev/null
|
|
||||||
|
# Comment this line out if you have put a different binary in $LINKSDIR
|
||||||
|
# (say, a "standard" tool's binary) in order to run tests against it:
|
||||||
|
rm -rf "$LINKSDIR" 2>/dev/null
|
||||||
|
|
||||||
mkdir "$LINKSDIR" 2>/dev/null
|
mkdir "$LINKSDIR" 2>/dev/null
|
||||||
for i in $implemented; do
|
for i in $implemented; do
|
||||||
|
# Note: if $LINKSDIR/applet exists, we do not overwrite it.
|
||||||
|
# Useful if one wants to run tests against a standard utility,
|
||||||
|
# not an applet.
|
||||||
ln -s "$bindir/busybox" "$LINKSDIR/$i" 2>/dev/null
|
ln -s "$bindir/busybox" "$LINKSDIR/$i" 2>/dev/null
|
||||||
done
|
done
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user