mirror of
https://github.com/sheumann/hush.git
synced 2024-12-22 14:30:31 +00:00
touch: support -r REF_FILE if ENABLE_DESKTOP (needed for blackfin compile)
function old new delta touch_main 136 221 +85
This commit is contained in:
parent
b75fe798bb
commit
ed90bdabb4
@ -21,24 +21,55 @@
|
|||||||
|
|
||||||
/* This is a NOFORK applet. Be very careful! */
|
/* This is a NOFORK applet. Be very careful! */
|
||||||
|
|
||||||
|
/* coreutils implements:
|
||||||
|
* -a change only the access time
|
||||||
|
* -c, --no-create
|
||||||
|
* do not create any files
|
||||||
|
* -d, --date=STRING
|
||||||
|
* parse STRING and use it instead of current time
|
||||||
|
* -f (ignored, BSD compat)
|
||||||
|
* -m change only the modification time
|
||||||
|
* -r, --reference=FILE
|
||||||
|
* use this file's times instead of current time
|
||||||
|
* -t STAMP
|
||||||
|
* use [[CC]YY]MMDDhhmm[.ss] instead of current time
|
||||||
|
* --time=WORD
|
||||||
|
* change the specified time: WORD is access, atime, or use
|
||||||
|
*/
|
||||||
|
|
||||||
int touch_main(int argc, char **argv) MAIN_EXTERNALLY_VISIBLE;
|
int touch_main(int argc, char **argv) MAIN_EXTERNALLY_VISIBLE;
|
||||||
int touch_main(int argc ATTRIBUTE_UNUSED, char **argv)
|
int touch_main(int argc ATTRIBUTE_UNUSED, char **argv)
|
||||||
{
|
{
|
||||||
|
#if ENABLE_DESKTOP
|
||||||
|
struct utimbuf timebuf;
|
||||||
|
char *reference_file = NULL;
|
||||||
|
#else
|
||||||
|
#define reference_file NULL
|
||||||
|
#define timebuf (*(struct utimbuf*)NULL)
|
||||||
|
#endif
|
||||||
int fd;
|
int fd;
|
||||||
int status = EXIT_SUCCESS;
|
int status = EXIT_SUCCESS;
|
||||||
int flags = getopt32(argv, "cf");
|
int flags = getopt32(argv, "c" USE_DESKTOP("r:")
|
||||||
|
/*ignored:*/ "fma"
|
||||||
|
USE_DESKTOP(, &reference_file));
|
||||||
|
|
||||||
flags &= 1; /* ignoring -f (BSD compat thingy) */
|
flags &= 1; /* only -c bit is left */
|
||||||
argv += optind;
|
argv += optind;
|
||||||
|
|
||||||
if (!*argv) {
|
if (!*argv) {
|
||||||
bb_show_usage();
|
bb_show_usage();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (reference_file) {
|
||||||
|
struct stat stbuf;
|
||||||
|
xstat(reference_file, &stbuf);
|
||||||
|
timebuf.actime = stbuf.st_atime;
|
||||||
|
timebuf.modtime = stbuf.st_mtime;
|
||||||
|
}
|
||||||
|
|
||||||
do {
|
do {
|
||||||
if (utime(*argv, NULL)) {
|
if (utime(*argv, reference_file ? &timebuf : NULL)) {
|
||||||
if (errno == ENOENT) { /* no such file */
|
if (errno == ENOENT) { /* no such file */
|
||||||
if (flags) { /* Creation is disabled, so ignore. */
|
if (flags) { /* creation is disabled, so ignore */
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
/* Try to create the file. */
|
/* Try to create the file. */
|
||||||
@ -46,6 +77,8 @@ int touch_main(int argc ATTRIBUTE_UNUSED, char **argv)
|
|||||||
S_IRUSR | S_IWUSR | S_IRGRP | S_IWGRP | S_IROTH | S_IWOTH
|
S_IRUSR | S_IWUSR | S_IRGRP | S_IWGRP | S_IROTH | S_IWOTH
|
||||||
);
|
);
|
||||||
if ((fd >= 0) && !close(fd)) {
|
if ((fd >= 0) && !close(fd)) {
|
||||||
|
if (reference_file)
|
||||||
|
utime(*argv, &timebuf);
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user