]> git.saurik.com Git - apple/file_cmds.git/blobdiff - compress/compress.c
file_cmds-321.100.10.0.1.tar.gz
[apple/file_cmds.git] / compress / compress.c
index 0732fa46238a8bf42a265d51e1d49955bf3d3cc2..97c70f291e278016d2e8e84133f16c35ee81569f 100644 (file)
@@ -46,6 +46,7 @@ __FBSDID("$FreeBSD: src/usr.bin/compress/compress.c,v 1.23 2010/12/11 08:32:16 j
 #include <sys/param.h>
 #include <sys/stat.h>
 #include <sys/time.h>
+#include <sys/attr.h>
 
 #include <err.h>
 #include <errno.h>
@@ -54,6 +55,7 @@ __FBSDID("$FreeBSD: src/usr.bin/compress/compress.c,v 1.23 2010/12/11 08:32:16 j
 #include <stdlib.h>
 #include <string.h>
 #include <unistd.h>
+#include <locale.h>
 
 #include "zopen.h"
 
@@ -132,8 +134,9 @@ main(int argc, char *argv[])
                exit (eval);
        }
 
-       if (cat == 1 && argc > 1)
-               errx(1, "the -c option permits only a single file argument");
+    /*
+     * The UNIX standard requires that `uncompress -c` be able to have multiple file parameters given.
+     */
 
        for (; *argv; ++argv)
                switch(style) {
@@ -380,14 +383,21 @@ err:      if (ofp) {
 void
 setfile(const char *name, struct stat *fs)
 {
-       static struct timeval tv[2];
+       struct attrlist ts_req = {};
+       struct {
+               struct timespec mtime;
+               struct timespec atime;
+       } set_ts;
 
        fs->st_mode &= S_ISUID|S_ISGID|S_IRWXU|S_IRWXG|S_IRWXO;
 
-       TIMESPEC_TO_TIMEVAL(&tv[0], &fs->st_atimespec);
-       TIMESPEC_TO_TIMEVAL(&tv[1], &fs->st_mtimespec);
-       if (utimes(name, tv))
-               cwarn("utimes: %s", name);
+       ts_req.bitmapcount = ATTR_BIT_MAP_COUNT;
+       ts_req.commonattr = ATTR_CMN_MODTIME | ATTR_CMN_ACCTIME;
+       set_ts.mtime = fs->st_mtimespec;
+       set_ts.atime = fs->st_atimespec;
+
+       if (setattrlist(name, &ts_req, &set_ts, sizeof(set_ts), 0))
+               cwarn("setattrlist: %s", name);
 
        /*
         * Changing the ownership probably won't succeed, unless we're root
@@ -411,14 +421,23 @@ int
 permission(const char *fname)
 {
        int ch, first;
+       char resp[] = {'\0', '\0'};
 
        if (!isatty(fileno(stderr)))
                return (0);
        (void)fprintf(stderr, "overwrite %s? ", fname);
+
+       /* Load user specified locale */
+       setlocale(LC_MESSAGES, "");
+
        first = ch = getchar();
        while (ch != '\n' && ch != EOF)
                ch = getchar();
-       return (first == 'y');
+
+       /* only care about first character */
+       resp[0] = first;
+
+       return (rpmatch(resp) == 1);
 }
 
 void
@@ -429,7 +448,7 @@ usage(int iscompress)
                    "usage: compress [-cfv] [-b bits] [file ...]\n");
        else
                (void)fprintf(stderr,
-                   "usage: uncompress [-cfv] [-b bits] [file ...]\n");
+                   "usage: uncompress [-cfv] [file ...]\n");
        exit(1);
 }