Magellan Linux

Annotation of /trunk/mkinitrd-magellan/busybox/coreutils/touch.c

Parent Directory Parent Directory | Revision Log Revision Log


Revision 984 - (hide annotations) (download)
Sun May 30 11:32:42 2010 UTC (14 years ago) by niro
File MIME type: text/plain
File size: 3427 byte(s)
-updated to busybox-1.16.1 and enabled blkid/uuid support in default config
1 niro 532 /* vi: set sw=4 ts=4: */
2     /*
3     * Mini touch implementation for busybox
4     *
5     * Copyright (C) 1999-2004 by Erik Andersen <andersen@codepoet.org>
6     *
7     * Licensed under GPLv2 or later, see file LICENSE in this tarball for details.
8     */
9    
10     /* BB_AUDIT SUSv3 _NOT_ compliant -- options -a, -m, -r, -t not supported. */
11     /* http://www.opengroup.org/onlinepubs/007904975/utilities/touch.html */
12    
13     /* Mar 16, 2003 Manuel Novoa III (mjn3@codepoet.org)
14     *
15     * Previous version called open() and then utime(). While this will be
16     * be necessary to implement -r and -t, it currently only makes things bigger.
17     * Also, exiting on a failure was a bug. All args should be processed.
18     */
19    
20 niro 816 #include "libbb.h"
21 niro 532
22 niro 816 /* This is a NOFORK applet. Be very careful! */
23    
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)
42 niro 532 {
43 niro 984 int fd;
44     int status = EXIT_SUCCESS;
45     int opts;
46 niro 816 #if ENABLE_DESKTOP
47 niro 984 # 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 niro 816 char *reference_file = NULL;
56 niro 984 char *date_str = NULL;
57     struct timeval timebuf[2];
58     timebuf[1].tv_usec = timebuf[0].tv_usec = 0;
59 niro 816 #else
60 niro 984 # define reference_file NULL
61     # define date_str NULL
62     # define timebuf ((struct timeval*)NULL)
63 niro 816 #endif
64 niro 984
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 niro 816 /*ignored:*/ "fma"
73 niro 984 IF_DESKTOP(, &reference_file)
74     IF_DESKTOP(, &date_str)
75     IF_DESKTOP(, &date_str)
76     );
77 niro 532
78 niro 984 opts &= 1; /* only -c bit is left */
79 niro 532 argv += optind;
80     if (!*argv) {
81     bb_show_usage();
82     }
83    
84 niro 816 if (reference_file) {
85     struct stat stbuf;
86     xstat(reference_file, &stbuf);
87 niro 984 timebuf[1].tv_sec = timebuf[0].tv_sec = stbuf.st_mtime;
88 niro 816 }
89    
90 niro 984 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    
106 niro 532 do {
107 niro 984 if (utimes(*argv, (reference_file || date_str) ? timebuf : NULL) != 0) {
108 niro 816 if (errno == ENOENT) { /* no such file */
109 niro 984 if (opts) { /* creation is disabled, so ignore */
110 niro 532 continue;
111     }
112 niro 984 /* 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);
118 niro 532 continue;
119     }
120     }
121     status = EXIT_FAILURE;
122 niro 816 bb_simple_perror_msg(*argv);
123 niro 532 }
124     } while (*++argv);
125    
126     return status;
127     }