Changeset 2725 in MondoRescue for branches/2.2.9/mindi-busybox/coreutils/touch.c
- Timestamp:
- Feb 25, 2011, 9:26:54 PM (13 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
branches/2.2.9/mindi-busybox/coreutils/touch.c
r1765 r2725 5 5 * Copyright (C) 1999-2004 by Erik Andersen <andersen@codepoet.org> 6 6 * 7 * Licensed under GPLv2 or later, see file LICENSE in this tarball for details.7 * Licensed under GPLv2 or later, see file LICENSE in this source tree. 8 8 */ 9 9 … … 22 22 /* This is a NOFORK applet. Be very careful! */ 23 23 24 int touch_main(int argc, char **argv); 25 int touch_main(int argc, char **argv) 24 /* coreutils implements: 25 * -a change only the access time 26 * -c, --no-create 27 * do not create any files 28 * -d, --date=STRING 29 * parse STRING and use it instead of current time 30 * -f (ignored, BSD compat) 31 * -m change only the modification time 32 * -r, --reference=FILE 33 * use this file's times instead of current time 34 * -t STAMP 35 * use [[CC]YY]MMDDhhmm[.ss] instead of current time 36 * --time=WORD 37 * change the specified time: WORD is access, atime, or use 38 */ 39 40 int touch_main(int argc, char **argv) MAIN_EXTERNALLY_VISIBLE; 41 int touch_main(int argc UNUSED_PARAM, char **argv) 26 42 { 27 43 int fd; 28 44 int status = EXIT_SUCCESS; 29 int flags = getopt32(argv, "c"); 45 int opts; 46 #if ENABLE_DESKTOP 47 # if ENABLE_LONG_OPTS 48 static const char touch_longopts[] ALIGN1 = 49 /* name, has_arg, val */ 50 "no-create\0" No_argument "c" 51 "reference\0" Required_argument "r" 52 "date\0" Required_argument "d" 53 ; 54 # endif 55 char *reference_file = NULL; 56 char *date_str = NULL; 57 struct timeval timebuf[2]; 58 timebuf[1].tv_usec = timebuf[0].tv_usec = 0; 59 #else 60 # define reference_file NULL 61 # define date_str NULL 62 # define timebuf ((struct timeval*)NULL) 63 #endif 30 64 65 #if ENABLE_DESKTOP && ENABLE_LONG_OPTS 66 applet_long_options = touch_longopts; 67 #endif 68 /* -d and -t both set time. In coreutils, 69 * accepted data format differs a bit between -d and -t. 70 * We accept the same formats for both */ 71 opts = getopt32(argv, "c" IF_DESKTOP("r:d:t:") 72 /*ignored:*/ "fma" 73 IF_DESKTOP(, &reference_file) 74 IF_DESKTOP(, &date_str) 75 IF_DESKTOP(, &date_str) 76 ); 77 78 opts &= 1; /* only -c bit is left */ 31 79 argv += optind; 32 33 80 if (!*argv) { 34 81 bb_show_usage(); 35 82 } 36 83 84 if (reference_file) { 85 struct stat stbuf; 86 xstat(reference_file, &stbuf); 87 timebuf[1].tv_sec = timebuf[0].tv_sec = stbuf.st_mtime; 88 } 89 90 if (date_str) { 91 struct tm tm_time; 92 time_t t; 93 94 //time(&t); 95 //localtime_r(&t, &tm_time); 96 memset(&tm_time, 0, sizeof(tm_time)); 97 parse_datestr(date_str, &tm_time); 98 99 /* Correct any day of week and day of year etc. fields */ 100 tm_time.tm_isdst = -1; /* Be sure to recheck dst */ 101 t = validate_tm_time(date_str, &tm_time); 102 103 timebuf[1].tv_sec = timebuf[0].tv_sec = t; 104 } 105 37 106 do { 38 if (utime (*argv, NULL)) {39 if (errno == ENOENT) { 40 if ( flags) { /* Creation is disabled, so ignore.*/107 if (utimes(*argv, (reference_file || date_str) ? timebuf : NULL) != 0) { 108 if (errno == ENOENT) { /* no such file */ 109 if (opts) { /* creation is disabled, so ignore */ 41 110 continue; 42 111 } 43 /* Try to create the file. */ 44 fd = open(*argv, O_RDWR | O_CREAT, 45 S_IRUSR | S_IWUSR | S_IRGRP | S_IWGRP | S_IROTH | S_IWOTH 46 ); 47 if ((fd >= 0) && !close(fd)) { 112 /* Try to create the file */ 113 fd = open(*argv, O_RDWR | O_CREAT, 0666); 114 if (fd >= 0) { 115 xclose(fd); 116 if (reference_file || date_str) 117 utimes(*argv, timebuf); 48 118 continue; 49 119 } 50 120 } 51 121 status = EXIT_FAILURE; 52 bb_ perror_msg("%s",*argv);122 bb_simple_perror_msg(*argv); 53 123 } 54 124 } while (*++argv);
Note:
See TracChangeset
for help on using the changeset viewer.