diff options
author | Denys Vlasenko <vda.linux@googlemail.com> | 2021-04-13 15:11:47 +0200 |
---|---|---|
committer | Denys Vlasenko <vda.linux@googlemail.com> | 2021-04-13 15:11:47 +0200 |
commit | 6f63a2ba0e54f7fc8ec66d470beb0212dd1b4d4f (patch) | |
tree | 322ea42f38b7669f648b8610b1c61b020893ddf1 /coreutils/touch.c | |
parent | e3c6a0973c8a4fe17d2510093738ef5ae052523e (diff) | |
download | busybox-w32-6f63a2ba0e54f7fc8ec66d470beb0212dd1b4d4f.tar.gz busybox-w32-6f63a2ba0e54f7fc8ec66d470beb0212dd1b4d4f.tar.bz2 busybox-w32-6f63a2ba0e54f7fc8ec66d470beb0212dd1b4d4f.zip |
touch: code shrink
function old new delta
.rodata 103215 103218 +3
touch_main 460 450 -10
------------------------------------------------------------------------------
(add/remove: 0/0 grow/shrink: 1/1 up/down: 3/-10) Total: -7 bytes
Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
Diffstat (limited to 'coreutils/touch.c')
-rw-r--r-- | coreutils/touch.c | 40 |
1 files changed, 17 insertions, 23 deletions
diff --git a/coreutils/touch.c b/coreutils/touch.c index 189428a79..43312d22a 100644 --- a/coreutils/touch.c +++ b/coreutils/touch.c | |||
@@ -85,8 +85,19 @@ int touch_main(int argc, char **argv) MAIN_EXTERNALLY_VISIBLE; | |||
85 | int touch_main(int argc UNUSED_PARAM, char **argv) | 85 | int touch_main(int argc UNUSED_PARAM, char **argv) |
86 | { | 86 | { |
87 | int fd; | 87 | int fd; |
88 | int status = EXIT_SUCCESS; | ||
89 | int opts; | 88 | int opts; |
89 | smalluint status = EXIT_SUCCESS; | ||
90 | #if ENABLE_FEATURE_TOUCH_SUSV3 | ||
91 | char *reference_file = NULL; | ||
92 | char *date_str = NULL; | ||
93 | /* timebuf[0] is atime, timebuf[1] is mtime */ | ||
94 | struct timespec timebuf[2]; | ||
95 | #else | ||
96 | # define reference_file NULL | ||
97 | # define date_str NULL | ||
98 | # define timebuf ((struct timespec*)NULL) | ||
99 | #endif | ||
100 | |||
90 | enum { | 101 | enum { |
91 | OPT_c = (1 << 0), | 102 | OPT_c = (1 << 0), |
92 | OPT_h = (1 << 1) * ENABLE_FEATURE_TOUCH_NODEREF, | 103 | OPT_h = (1 << 1) * ENABLE_FEATURE_TOUCH_NODEREF, |
@@ -105,17 +116,6 @@ int touch_main(int argc UNUSED_PARAM, char **argv) | |||
105 | IF_FEATURE_TOUCH_NODEREF("no-dereference\0" No_argument "h") | 116 | IF_FEATURE_TOUCH_NODEREF("no-dereference\0" No_argument "h") |
106 | ; | 117 | ; |
107 | #endif | 118 | #endif |
108 | #if ENABLE_FEATURE_TOUCH_SUSV3 | ||
109 | char *reference_file = NULL; | ||
110 | char *date_str = NULL; | ||
111 | /* timebuf[0] is atime, timebuf[1] is mtime */ | ||
112 | struct timespec timebuf[2]; | ||
113 | #else | ||
114 | # define reference_file NULL | ||
115 | # define date_str NULL | ||
116 | # define timebuf ((struct timespec*)NULL) | ||
117 | #endif | ||
118 | |||
119 | /* -d and -t both set time. In coreutils, | 119 | /* -d and -t both set time. In coreutils, |
120 | * accepted data format differs a bit between -d and -t. | 120 | * accepted data format differs a bit between -d and -t. |
121 | * We accept the same formats for both | 121 | * We accept the same formats for both |
@@ -125,9 +125,10 @@ int touch_main(int argc UNUSED_PARAM, char **argv) | |||
125 | IF_FEATURE_TOUCH_SUSV3("r:d:t:am") | 125 | IF_FEATURE_TOUCH_SUSV3("r:d:t:am") |
126 | /*ignored:*/ "f" IF_NOT_FEATURE_TOUCH_SUSV3("am") | 126 | /*ignored:*/ "f" IF_NOT_FEATURE_TOUCH_SUSV3("am") |
127 | "\0" /* opt_complementary: */ | 127 | "\0" /* opt_complementary: */ |
128 | /* coreutils forbids -r and -t at once: */ IF_FEATURE_TOUCH_SUSV3("r--t:t--r") | 128 | /* at least one arg: */ "-1" |
129 | /* but allows these combinations: "r--d:d--r:t--d:d--t" */, | 129 | /* coreutils forbids -r and -t at once: */ IF_FEATURE_TOUCH_SUSV3(":r--t:t--r") |
130 | touch_longopts | 130 | /* but allows these combinations: "r--d:d--r:t--d:d--t" */ |
131 | , touch_longopts | ||
131 | #if ENABLE_FEATURE_TOUCH_SUSV3 | 132 | #if ENABLE_FEATURE_TOUCH_SUSV3 |
132 | , &reference_file | 133 | , &reference_file |
133 | , &date_str | 134 | , &date_str |
@@ -135,13 +136,7 @@ int touch_main(int argc UNUSED_PARAM, char **argv) | |||
135 | #endif | 136 | #endif |
136 | ); | 137 | ); |
137 | 138 | ||
138 | argv += optind; | ||
139 | if (!*argv) { | ||
140 | bb_show_usage(); | ||
141 | } | ||
142 | |||
143 | timebuf[0].tv_nsec = timebuf[1].tv_nsec = UTIME_NOW; | 139 | timebuf[0].tv_nsec = timebuf[1].tv_nsec = UTIME_NOW; |
144 | |||
145 | if (reference_file) { | 140 | if (reference_file) { |
146 | struct stat stbuf; | 141 | struct stat stbuf; |
147 | xstat(reference_file, &stbuf); | 142 | xstat(reference_file, &stbuf); |
@@ -150,7 +145,6 @@ int touch_main(int argc UNUSED_PARAM, char **argv) | |||
150 | timebuf[0].tv_nsec = stbuf.st_atim.tv_nsec; | 145 | timebuf[0].tv_nsec = stbuf.st_atim.tv_nsec; |
151 | timebuf[1].tv_nsec = stbuf.st_mtim.tv_nsec; | 146 | timebuf[1].tv_nsec = stbuf.st_mtim.tv_nsec; |
152 | } | 147 | } |
153 | |||
154 | if (date_str) { | 148 | if (date_str) { |
155 | struct tm tm_time; | 149 | struct tm tm_time; |
156 | time_t t; | 150 | time_t t; |
@@ -168,7 +162,6 @@ int touch_main(int argc UNUSED_PARAM, char **argv) | |||
168 | timebuf[1].tv_sec = timebuf[0].tv_sec = t; | 162 | timebuf[1].tv_sec = timebuf[0].tv_sec = t; |
169 | timebuf[1].tv_nsec = timebuf[0].tv_nsec = 0; | 163 | timebuf[1].tv_nsec = timebuf[0].tv_nsec = 0; |
170 | } | 164 | } |
171 | |||
172 | if (opts & OPT_a) { | 165 | if (opts & OPT_a) { |
173 | timebuf[1].tv_nsec = UTIME_OMIT; | 166 | timebuf[1].tv_nsec = UTIME_OMIT; |
174 | } | 167 | } |
@@ -176,6 +169,7 @@ int touch_main(int argc UNUSED_PARAM, char **argv) | |||
176 | timebuf[0].tv_nsec = UTIME_OMIT; | 169 | timebuf[0].tv_nsec = UTIME_OMIT; |
177 | } | 170 | } |
178 | 171 | ||
172 | argv += optind; | ||
179 | do { | 173 | do { |
180 | int result = utimensat(AT_FDCWD, *argv, timebuf, | 174 | int result = utimensat(AT_FDCWD, *argv, timebuf, |
181 | (opts & OPT_h) ? AT_SYMLINK_NOFOLLOW : 0); | 175 | (opts & OPT_h) ? AT_SYMLINK_NOFOLLOW : 0); |