Ignore:
Timestamp:
Feb 25, 2011, 9:26:54 PM (13 years ago)
Author:
Bruno Cornec
Message:
  • Update mindi-busybox to 1.18.3 to avoid problems with the tar command which is now failing on recent versions with busybox 1.7.3
File:
1 edited

Legend:

Unmodified
Added
Removed
  • branches/2.2.9/mindi-busybox/coreutils/touch.c

    r1765 r2725  
    55 * Copyright (C) 1999-2004 by Erik Andersen <andersen@codepoet.org>
    66 *
    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.
    88 */
    99
     
    2222/* This is a NOFORK applet. Be very careful! */
    2323
    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
     40int touch_main(int argc, char **argv) MAIN_EXTERNALLY_VISIBLE;
     41int touch_main(int argc UNUSED_PARAM, char **argv)
    2642{
    2743    int fd;
    2844    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
    3064
     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 */
    3179    argv += optind;
    32 
    3380    if (!*argv) {
    3481        bb_show_usage();
    3582    }
    3683
     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
    37106    do {
    38         if (utime(*argv, NULL)) {
    39             if (errno == ENOENT) {  /* no such file */
    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 */
    41110                    continue;
    42111                }
    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);
    48118                    continue;
    49119                }
    50120            }
    51121            status = EXIT_FAILURE;
    52             bb_perror_msg("%s", *argv);
     122            bb_simple_perror_msg(*argv);
    53123        }
    54124    } while (*++argv);
Note: See TracChangeset for help on using the changeset viewer.