Fix touch so it behaves itself (it could segfault in some cases).

Fix uname help info formatting.
 -Erik
This commit is contained in:
Eric Andersen 2000-06-02 23:26:44 +00:00
parent 808d03ec19
commit 5a0a2aa00b
4 changed files with 58 additions and 54 deletions

View File

@ -33,26 +33,21 @@
static const char touch_usage[] = "touch [-c] file [file ...]\n" static const char touch_usage[] = "touch [-c] file [file ...]\n"
#ifndef BB_FEATURE_TRIVIAL_HELP #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 #endif
; ;
extern int touch_main(int argc, char **argv) extern int touch_main(int argc, char **argv)
{ {
int fd; int fd;
int create = TRUE; int create = TRUE;
if (argc < 2) {
usage(touch_usage);
}
argc--;
argv++;
/* Parse options */ /* Parse options */
while (**argv == '-') { while (--argc > 0 && **(++argv) == '-') {
while (*++(*argv)) while (*(++(*argv))) {
switch (**argv) { switch (**argv) {
case 'c': case 'c':
create = FALSE; create = FALSE;
@ -61,23 +56,30 @@ extern int touch_main(int argc, char **argv)
usage(touch_usage); usage(touch_usage);
exit(FALSE); exit(FALSE);
} }
argc--; }
argv++;
} }
fd = open(*argv, (create == FALSE) ? O_RDWR : O_RDWR | O_CREAT, 0644); 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 (fd < 0) {
if (create == FALSE && errno == ENOENT) if (create == FALSE && errno == ENOENT)
exit(TRUE); exit(TRUE);
else { else {
perror("touch"); fatalError("touch: %s", strerror(errno));
exit(FALSE);
} }
} }
close(fd); close(fd);
if (utime(*argv, NULL)) { if (utime(*argv, NULL)) {
perror("touch"); fatalError("touch: %s", strerror(errno));
exit(FALSE); }
} else argc--;
argv++;
}
exit(TRUE); exit(TRUE);
} }

View File

@ -42,9 +42,9 @@
static const char uname_usage[] = static const char uname_usage[] =
"uname [OPTION]...\n\n" "uname [OPTION]...\n"
#ifndef BB_FEATURE_TRIVIAL_HELP #ifndef BB_FEATURE_TRIVIAL_HELP
"Print certain system information. With no OPTION, same as -s.\n\n" "\nPrint certain system information. With no OPTION, same as -s.\n\n"
"Options:\n" "Options:\n"
"\t-a\tprint all information\n" "\t-a\tprint all information\n"
"\t-m\tthe machine (hardware) type\n" "\t-m\tthe machine (hardware) type\n"

38
touch.c
View File

@ -33,26 +33,21 @@
static const char touch_usage[] = "touch [-c] file [file ...]\n" static const char touch_usage[] = "touch [-c] file [file ...]\n"
#ifndef BB_FEATURE_TRIVIAL_HELP #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 #endif
; ;
extern int touch_main(int argc, char **argv) extern int touch_main(int argc, char **argv)
{ {
int fd; int fd;
int create = TRUE; int create = TRUE;
if (argc < 2) {
usage(touch_usage);
}
argc--;
argv++;
/* Parse options */ /* Parse options */
while (**argv == '-') { while (--argc > 0 && **(++argv) == '-') {
while (*++(*argv)) while (*(++(*argv))) {
switch (**argv) { switch (**argv) {
case 'c': case 'c':
create = FALSE; create = FALSE;
@ -61,23 +56,30 @@ extern int touch_main(int argc, char **argv)
usage(touch_usage); usage(touch_usage);
exit(FALSE); exit(FALSE);
} }
argc--; }
argv++;
} }
fd = open(*argv, (create == FALSE) ? O_RDWR : O_RDWR | O_CREAT, 0644); 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 (fd < 0) {
if (create == FALSE && errno == ENOENT) if (create == FALSE && errno == ENOENT)
exit(TRUE); exit(TRUE);
else { else {
perror("touch"); fatalError("touch: %s", strerror(errno));
exit(FALSE);
} }
} }
close(fd); close(fd);
if (utime(*argv, NULL)) { if (utime(*argv, NULL)) {
perror("touch"); fatalError("touch: %s", strerror(errno));
exit(FALSE); }
} else argc--;
argv++;
}
exit(TRUE); exit(TRUE);
} }

View File

@ -42,9 +42,9 @@
static const char uname_usage[] = static const char uname_usage[] =
"uname [OPTION]...\n\n" "uname [OPTION]...\n"
#ifndef BB_FEATURE_TRIVIAL_HELP #ifndef BB_FEATURE_TRIVIAL_HELP
"Print certain system information. With no OPTION, same as -s.\n\n" "\nPrint certain system information. With no OPTION, same as -s.\n\n"
"Options:\n" "Options:\n"
"\t-a\tprint all information\n" "\t-a\tprint all information\n"
"\t-m\tthe machine (hardware) type\n" "\t-m\tthe machine (hardware) type\n"