Magellan Linux

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

Parent Directory Parent Directory | Revision Log Revision Log | View Patch Patch

revision 532 by niro, Sat Sep 1 22:45:15 2007 UTC revision 816 by niro, Fri Apr 24 18:33:46 2009 UTC
# Line 17  Line 17 
17   * Also, exiting on a failure was a bug.  All args should be processed.   * Also, exiting on a failure was a bug.  All args should be processed.
18   */   */
19    
20  #include <stdio.h>  #include "libbb.h"
 #include <sys/types.h>  
 #include <fcntl.h>  
 #include <utime.h>  
 #include <errno.h>  
 #include <unistd.h>  
 #include <stdlib.h>  
 #include "busybox.h"  
21    
22  int touch_main(int argc, char **argv)  /* 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  {  {
43    #if ENABLE_DESKTOP
44     struct utimbuf timebuf;
45     char *reference_file = NULL;
46    #else
47    #define reference_file NULL
48    #define timebuf        (*(struct utimbuf*)NULL)
49    #endif
50   int fd;   int fd;
  int flags;  
51   int status = EXIT_SUCCESS;   int status = EXIT_SUCCESS;
52     int flags = getopt32(argv, "c" USE_DESKTOP("r:")
53     /*ignored:*/ "fma"
54     USE_DESKTOP(, &reference_file));
55    
56   flags = getopt32(argc, argv, "c");   flags &= 1; /* only -c bit is left */
   
57   argv += optind;   argv += optind;
   
58   if (!*argv) {   if (!*argv) {
59   bb_show_usage();   bb_show_usage();
60   }   }
61    
62     if (reference_file) {
63     struct stat stbuf;
64     xstat(reference_file, &stbuf);
65     timebuf.actime = stbuf.st_atime;
66     timebuf.modtime = stbuf.st_mtime;
67     }
68    
69   do {   do {
70   if (utime(*argv, NULL)) {   if (utime(*argv, reference_file ? &timebuf : NULL)) {
71   if (errno == ENOENT) { /* no such file*/   if (errno == ENOENT) { /* no such file */
72   if (flags & 1) { /* Creation is disabled, so ignore. */   if (flags) { /* creation is disabled, so ignore */
73   continue;   continue;
74   }   }
75   /* Try to create the file. */   /* Try to create the file. */
# Line 51  int touch_main(int argc, char **argv) Line 77  int touch_main(int argc, char **argv)
77    S_IRUSR | S_IWUSR | S_IRGRP | S_IWGRP | S_IROTH | S_IWOTH    S_IRUSR | S_IWUSR | S_IRGRP | S_IWGRP | S_IROTH | S_IWOTH
78    );    );
79   if ((fd >= 0) && !close(fd)) {   if ((fd >= 0) && !close(fd)) {
80     if (reference_file)
81     utime(*argv, &timebuf);
82   continue;   continue;
83   }   }
84   }   }
85   status = EXIT_FAILURE;   status = EXIT_FAILURE;
86   bb_perror_msg("%s", *argv);   bb_simple_perror_msg(*argv);
87   }   }
88   } while (*++argv);   } while (*++argv);
89    

Legend:
Removed from v.532  
changed lines
  Added in v.816