summaryrefslogtreecommitdiffhomepage
path: root/touch.c
diff options
context:
space:
mode:
authorEric Andersen <andersen@codepoet.org>2000-06-02 23:26:44 +0000
committerEric Andersen <andersen@codepoet.org>2000-06-02 23:26:44 +0000
commit5a0a2aa00be4a19dd52b65b70c7cc6d944a5aef6 (patch)
treec2256921b9067191a1a556d1e3244b4105fb9e27 /touch.c
parent808d03ec19e0c8f0c06d9a9defb85fc9a1100441 (diff)
Fix touch so it behaves itself (it could segfault in some cases).
Fix uname help info formatting. -Erik
Diffstat (limited to 'touch.c')
-rw-r--r--touch.c52
1 files changed, 27 insertions, 25 deletions
diff --git a/touch.c b/touch.c
index 207692826..1364bb7d5 100644
--- a/touch.c
+++ b/touch.c
@@ -33,26 +33,21 @@
static const char touch_usage[] = "touch [-c] file [file ...]\n"
#ifndef BB_FEATURE_TRIVIAL_HELP
- "\nUpdate the last-modified date on the given file[s].\n"
+ "\nUpdate the last-modified date on the given file[s].\n\n"
+ "Options:\n"
+ "\t-c\tDo not create any files\n"
#endif
;
-
extern int touch_main(int argc, char **argv)
{
int fd;
int create = TRUE;
- if (argc < 2) {
- usage(touch_usage);
- }
- argc--;
- argv++;
-
/* Parse options */
- while (**argv == '-') {
- while (*++(*argv))
+ while (--argc > 0 && **(++argv) == '-') {
+ while (*(++(*argv))) {
switch (**argv) {
case 'c':
create = FALSE;
@@ -61,23 +56,30 @@ extern int touch_main(int argc, char **argv)
usage(touch_usage);
exit(FALSE);
}
- argc--;
- argv++;
+ }
}
- fd = open(*argv, (create == FALSE) ? O_RDWR : O_RDWR | O_CREAT, 0644);
- if (fd < 0) {
- if (create == FALSE && errno == ENOENT)
- exit(TRUE);
- else {
- perror("touch");
- exit(FALSE);
+ if (argc < 1) {
+ usage(touch_usage);
+ }
+
+ while (argc > 0) {
+ fd = open(*argv, (create == FALSE) ? O_RDWR : O_RDWR | O_CREAT,
+ S_IRUSR | S_IWUSR | S_IRGRP | S_IWGRP | S_IROTH | S_IWOTH);
+ if (fd < 0) {
+ if (create == FALSE && errno == ENOENT)
+ exit(TRUE);
+ else {
+ fatalError("touch: %s", strerror(errno));
+ }
+ }
+ close(fd);
+ if (utime(*argv, NULL)) {
+ fatalError("touch: %s", strerror(errno));
}
+ argc--;
+ argv++;
}
- close(fd);
- if (utime(*argv, NULL)) {
- perror("touch");
- exit(FALSE);
- } else
- exit(TRUE);
+
+ exit(TRUE);
}