Compress-Stream-Zstd

 view release on metacpan or  search on metacpan

ext/zstd/programs/fileio.c  view on Meta::CPAN

/*-*************************************
*  Constants
***************************************/
#define ADAPT_WINDOWLOG_DEFAULT 23   /* 8 MB */
#define DICTSIZE_MAX (32 MB)   /* protection against large input (attack scenario) */

#define FNSPACE 30

/* Default file permissions 0666 (modulated by umask) */
/* Temporary restricted file permissions are used when we're going to
 * chmod/chown at the end of the operation. */
#if !defined(_WIN32)
/* These macros aren't defined on windows. */
#define DEFAULT_FILE_PERMISSIONS (S_IRUSR|S_IWUSR|S_IRGRP|S_IWGRP|S_IROTH|S_IWOTH)
#define TEMPORARY_FILE_PERMISSIONS (S_IRUSR|S_IWUSR)
#else
#define DEFAULT_FILE_PERMISSIONS (0666)
#define TEMPORARY_FILE_PERMISSIONS (0600)
#endif

/*-************************************

ext/zstd/programs/fileio.c  view on Meta::CPAN

        return 0;
    }
    if (!UTIL_isRegularFileStat(&statbuf)) {
        DISPLAYLEVEL(2, "zstd: Refusing to remove non-regular file %s\n", path);
        return 0;
    }
#if defined(_WIN32) || defined(WIN32)
    /* windows doesn't allow remove read-only files,
     * so try to make it writable first */
    if (!(statbuf.st_mode & _S_IWRITE)) {
        UTIL_chmod(path, &statbuf, _S_IWRITE);
    }
#endif
    return remove(path);
}

/** FIO_openSrcFile() :
 *  condition : `srcFileName` must be non-NULL. `prefs` may be NULL.
 * @result : FILE* to `srcFileName`, or NULL if it fails */
static FILE* FIO_openSrcFile(const FIO_prefs_t* const prefs, const char* srcFileName, stat_t* statbuf)
{

ext/zstd/programs/util.c  view on Meta::CPAN

******************************************/
#include "util.h"       /* note : ensure that platform.h is included first ! */
#include <stdlib.h>     /* malloc, realloc, free */
#include <stdio.h>      /* fprintf */
#include <time.h>       /* clock_t, clock, CLOCKS_PER_SEC, nanosleep */
#include <errno.h>
#include <assert.h>

#if defined(_WIN32)
#  include <sys/utime.h>  /* utime */
#  include <io.h>         /* _chmod */
#else
#  include <unistd.h>     /* chown, stat */
#  if PLATFORM_POSIX_VERSION < 200809L || !defined(st_mtime)
#    include <utime.h>    /* utime */
#  else
#    include <fcntl.h>    /* AT_FDCWD */
#    include <sys/stat.h> /* utimensat */
#  endif
#endif

ext/zstd/programs/util.c  view on Meta::CPAN

 */
UTIL_STATIC void* UTIL_realloc(void *ptr, size_t size)
{
    void *newptr = realloc(ptr, size);
    if (newptr) return newptr;
    free(ptr);
    return NULL;
}

#if defined(_MSC_VER)
    #define chmod _chmod
#endif

#ifndef ZSTD_HAVE_FCHMOD
#if PLATFORM_POSIX_VERSION >= 199309L
#define ZSTD_HAVE_FCHMOD
#endif
#endif

#ifndef ZSTD_HAVE_FCHOWN
#if PLATFORM_POSIX_VERSION >= 200809L

ext/zstd/programs/util.c  view on Meta::CPAN


int UTIL_isRegularFileStat(const stat_t* statbuf)
{
#if defined(_MSC_VER)
    return (statbuf->st_mode & S_IFREG) != 0;
#else
    return S_ISREG(statbuf->st_mode) != 0;
#endif
}

/* like chmod, but avoid changing permission of /dev/null */
int UTIL_chmod(char const* filename, const stat_t* statbuf, mode_t permissions)
{
    return UTIL_fchmod(-1, filename, statbuf, permissions);
}

int UTIL_fchmod(const int fd, char const* filename, const stat_t* statbuf, mode_t permissions)
{
    stat_t localStatBuf;
    UTIL_TRACE_CALL("UTIL_chmod(%s, %#4o)", filename, (unsigned)permissions);
    if (statbuf == NULL) {
        if (!UTIL_fstat(fd, filename, &localStatBuf)) {
            UTIL_TRACE_RET(0);
            return 0;
        }
        statbuf = &localStatBuf;
    }
    if (!UTIL_isRegularFileStat(statbuf)) {
        UTIL_TRACE_RET(0);
        return 0; /* pretend success, but don't change anything */
    }
#ifdef ZSTD_HAVE_FCHMOD
    if (fd >= 0) {
        int ret;
        UTIL_TRACE_CALL("fchmod");
        ret = fchmod(fd, permissions);
        UTIL_TRACE_RET(ret);
        UTIL_TRACE_RET(ret);
        return ret;
    } else
#endif
    {
        int ret;
        UTIL_TRACE_CALL("chmod");
        ret = chmod(filename, permissions);
        UTIL_TRACE_RET(ret);
        UTIL_TRACE_RET(ret);
        return ret;
    }
}

/* set access and modification times */
int UTIL_utime(const char* filename, const stat_t *statbuf)
{
    int ret;

ext/zstd/programs/util.c  view on Meta::CPAN

#ifdef ZSTD_HAVE_FCHOWN
    if (fd >= 0) {
        res += fchown(fd, -1, statbuf->st_gid);  /* Apply group ownership */
    } else
#endif
    {
        res += chown(filename, -1, statbuf->st_gid);  /* Apply group ownership */
    }
#endif

    res += UTIL_fchmod(fd, filename, &curStatBuf, statbuf->st_mode & 0777);  /* Copy file permissions */

#if !defined(_WIN32)
#ifdef ZSTD_HAVE_FCHOWN
    if (fd >= 0) {
        res += fchown(fd, statbuf->st_uid, -1);  /* Apply user ownership */
    } else
#endif
    {
        res += chown(filename, statbuf->st_uid, -1);  /* Apply user ownership */
    }

ext/zstd/programs/util.h  view on Meta::CPAN

extern "C" {
#endif


/*-****************************************
*  Dependencies
******************************************/
#include "platform.h"     /* PLATFORM_POSIX_VERSION, ZSTD_NANOSLEEP_SUPPORT, ZSTD_SETPRIORITY_SUPPORT */
#include <stddef.h>       /* size_t, ptrdiff_t */
#include <sys/types.h>    /* stat, utime */
#include <sys/stat.h>     /* stat, chmod */
#include "../lib/common/mem.h"          /* U64 */


/*-************************************************************
* Avoid fseek()'s 2GiB barrier with MSVC, macOS, *BSD, MinGW
***************************************************************/
#if defined(_MSC_VER) && (_MSC_VER >= 1400)
#  define UTIL_fseek _fseeki64
#elif !defined(__64BIT__) && (PLATFORM_POSIX_VERSION >= 200112L) /* No point defining Large file for 64 bit */
#  define UTIL_fseek fseeko

ext/zstd/programs/util.h  view on Meta::CPAN

 * calling one of the above functions.
 */

int UTIL_isRegularFileStat(const stat_t* statbuf);
int UTIL_isDirectoryStat(const stat_t* statbuf);
int UTIL_isFIFOStat(const stat_t* statbuf);
int UTIL_isBlockDevStat(const stat_t* statbuf);
U64 UTIL_getFileSizeStat(const stat_t* statbuf);

/**
 * Like chmod(), but only modifies regular files. Provided statbuf may be NULL,
 * in which case this function will stat() the file internally, in order to
 * check whether it should be modified.
 *
 * If fd is -1, fd is ignored and the filename is used.
 */
int UTIL_chmod(char const* filename, const stat_t* statbuf, mode_t permissions);
int UTIL_fchmod(const int fd, char const* filename, const stat_t* statbuf, mode_t permissions);

/*
 * In the absence of a pre-existing stat result on the file in question, these
 * functions will do a stat() call internally and then use that result to
 * compute the needed information.
 */

int UTIL_isRegularFile(const char* infilename);
int UTIL_isDirectory(const char* infilename);
int UTIL_isSameFile(const char* file1, const char* file2);

ext/zstd/tests/cli-tests/file-stat/compress-file-to-dir-without-write-perm.sh  view on Meta::CPAN

#!/bin/sh

# motivated by issue #3523

datagen > file
mkdir out
chmod 000 out

zstd file -q --trace-file-stat -o out/file.zst
zstd -tq out/file.zst

chmod 777 out

ext/zstd/tests/cli-tests/file-stat/compress-file-to-file.sh  view on Meta::CPAN

#!/bin/sh

set -e

datagen > file
chmod 642 file

zstd file -q --trace-file-stat -o file.zst
zstd -tq file.zst

ext/zstd/tests/cli-tests/file-stat/compress-file-to-file.sh.stderr.exact  view on Meta::CPAN

Trace:FileStat:  > UTIL_stat(-1, file.zst)
Trace:FileStat:  < 1
Trace:FileStat: < 1
Trace:FileStat: > UTIL_getFileSize(file)
Trace:FileStat:  > UTIL_stat(-1, file)
Trace:FileStat:  < 1
Trace:FileStat: < 65537
Trace:FileStat: > UTIL_setFileStat(4, file.zst)
Trace:FileStat:  > UTIL_stat(4, file.zst)
Trace:FileStat:  < 1
Trace:FileStat:  > UTIL_chmod(file.zst, 0642)
Trace:FileStat:   > fchmod
Trace:FileStat:   < 0
Trace:FileStat:  < 0
Trace:FileStat: < 0
Trace:FileStat: > UTIL_utime(file.zst)
Trace:FileStat: < 0

ext/zstd/tests/cli-tests/file-stat/decompress-file-to-file.sh  view on Meta::CPAN

#!/bin/sh

set -e

datagen | zstd -q > file.zst
chmod 642 file.zst

zstd -dq --trace-file-stat file.zst

ext/zstd/tests/cli-tests/file-stat/decompress-file-to-file.sh.stderr.exact  view on Meta::CPAN

Trace:FileStat:  > UTIL_stat(-1, file)
Trace:FileStat:  < 0
Trace:FileStat: < 0
Trace:FileStat: > UTIL_isRegularFile(file)
Trace:FileStat:  > UTIL_stat(-1, file)
Trace:FileStat:  < 1
Trace:FileStat: < 1
Trace:FileStat: > UTIL_setFileStat(4, file)
Trace:FileStat:  > UTIL_stat(4, file)
Trace:FileStat:  < 1
Trace:FileStat:  > UTIL_chmod(file, 0642)
Trace:FileStat:   > fchmod
Trace:FileStat:   < 0
Trace:FileStat:  < 0
Trace:FileStat: < 0
Trace:FileStat: > UTIL_utime(file)
Trace:FileStat: < 0

ext/zstd/tests/gzip/help-version.sh  view on Meta::CPAN

tmp_out=out-$$
mkdir $tmp || fail=1
cd $tmp || fail=1

comm_setup () { args="$tmp_in $tmp_in"; }
csplit_setup () { args="$tmp_in //"; }
cut_setup () { args='-f 1'; }
join_setup () { args="$tmp_in $tmp_in"; }
tr_setup () { args='a a'; }

chmod_setup () { args="a+x $tmp_in"; }
# Punt on these.
chgrp_setup () { args=--version; }
chown_setup () { args=--version; }
mkfifo_setup () { args=--version; }
mknod_setup () { args=--version; }
# Punt on uptime, since it fails (e.g., failing to get boot time)
# on some systems, and we shouldn't let that stop `make check'.
uptime_setup () { args=--version; }

# Create a file in the current directory, not in $TMPDIR.

ext/zstd/tests/gzip/init.sh  view on Meta::CPAN

testdir_prefix_ () { printf gt; }

# Run the user-overridable cleanup_ function, remove the temporary
# directory and exit with the incoming value of $?.
remove_tmp_ ()
{
  __st=$?
  cleanup_
  # cd out of the directory we're about to remove
  cd "$initial_cwd_" || cd / || cd /tmp
  chmod -R u+rwx "$test_dir_"
  # If removal fails and exit status was to be 0, then change it to 1.
  rm -rf "$test_dir_" || { test $__st = 0 && __st=1; }
  exit $__st
}

# Given a directory name, DIR, if every entry in it that matches *.exe
# contains only the specified bytes (see the case stmt below), then print
# a space-separated list of those names and return 0.  Otherwise, don't
# print anything and return 1.  Naming constraints apply also to DIR.
find_exe_basenames_ ()

ext/zstd/tests/gzip/znew-k.sh  view on Meta::CPAN

# along with this program.  If not, see <https://www.gnu.org/licenses/>.
# limit so don't run it by default.

. "${srcdir=.}/init.sh"; path_prepend_ .

cat <<'EOF' >compress || framework_failure_
#!/bin/sh
echo >&2 'compress has been invoked'
exit 1
EOF
chmod +x compress || framework_failure_

# Note that the basename must have a length of 6 or greater.
# Otherwise, "test -f $name" below would fail.
name=123456.Z

printf '%1012977s' ' ' | gzip -c > $name || framework_failure_

fail=0

znew -K $name || fail=1

ext/zstd/tests/playTests.sh  view on Meta::CPAN

rm -f tmplimit tmplimit.zst
println "test : overwrite protection"
zstd -q tmp && die "overwrite check failed!"
println "test : force overwrite"
zstd -q -f tmp
zstd -q --force tmp
println "test : overwrite readonly file"
rm -f tmpro tmpro.zst
println foo > tmpro.zst
println foo > tmpro
chmod 400 tmpro.zst
zstd -q tmpro && die "should have refused to overwrite read-only file"
zstd -q -f tmpro
println "test: --no-progress flag"
zstd tmpro -c --no-progress | zstd -d -f -o "$INTOVOID" --no-progress
zstd tmpro -cv --no-progress | zstd -dv -f -o "$INTOVOID" --no-progress
println "test: --progress flag"
zstd tmpro -c | zstd -d -f -o "$INTOVOID" --progress 2>&1 | grep -E "[A-Za-z0-9._ ]+: [0-9]+ bytes"
zstd tmpro -c | zstd -d -f -q -o "$INTOVOID" --progress 2>&1 | grep -E "[A-Za-z0-9._ ]+: [0-9]+ bytes"
zstd tmpro -c | zstd -d -f -v -o "$INTOVOID" 2>&1 | grep -E "[A-Za-z0-9._ ]+: [0-9]+ bytes"
rm -f tmpro tmpro.zst

ext/zstd/tests/playTests.sh  view on Meta::CPAN

    println "test : copy 666 permissions in file -> file compression "
    zstd -f tmp1 -o tmp1.zst
    assertSamePermissions tmp1 tmp1.zst
    println "test : copy 666 permissions in file -> file decompression "
    zstd -f -d tmp1.zst -o tmp1.out
    assertSamePermissions tmp1.zst tmp1.out

    rm -f tmp1.zst tmp1.out

    println "test : copy 400 permissions in file -> file compression (write to a read-only file) "
    chmod 0400 tmp1
    assertFilePermissions tmp1 400
    zstd -f tmp1 -o tmp1.zst
    assertSamePermissions tmp1 tmp1.zst
    println "test : copy 400 permissions in file -> file decompression (write to a read-only file) "
    zstd -f -d tmp1.zst -o tmp1
    assertSamePermissions tmp1.zst tmp1

    rm -f tmp1.zst tmp1.out

    println "test : check created permissions from stdin input in compression "

ext/zstd/tests/playTests.sh  view on Meta::CPAN

    zstd -f tmp1 tmp2 -o tmp1.zst
    assertFilePermissions tmp1.zst 666
    println "test : check created permissions from multiple inputs in decompression "
    cp tmp1.zst tmp2.zst
    zstd -f -d tmp1.zst tmp2.zst -o tmp1.out
    assertFilePermissions tmp1.out 666

    rm -f tmp1.zst tmp2.zst tmp1.out tmp2.out

    println "test : check permissions on pre-existing output file in compression "
    chmod 0600 tmp1
    touch tmp1.zst
    chmod 0400 tmp1.zst
    zstd -f tmp1 -o tmp1.zst
    assertFilePermissions tmp1.zst 600
    println "test : check permissions on pre-existing output file in decompression "
    chmod 0400 tmp1.zst
    touch tmp1.out
    chmod 0200 tmp1.out
    zstd -f -d tmp1.zst -o tmp1.out
    assertFilePermissions tmp1.out 400

    umask 0666
    chmod 0666 tmp1 tmp2

    rm -f tmp1.zst tmp1.out

    println "test : respect umask when compressing from stdin input "
    zstd -f -o tmp1.zst < tmp1
    assertFilePermissions tmp1.zst 0
    println "test : respect umask when decompressing from stdin input "
    chmod 0666 tmp1.zst
    zstd -f -d -o tmp1.out < tmp1.zst
    assertFilePermissions tmp1.out 0

    rm -f tmp1 tmp2 tmp1.zst tmp2.zst tmp1.out tmp2.out
    umask $ORIGINAL_UMASK
fi

if [ -n "$DEVNULLRIGHTS" ] ; then
    # these tests requires sudo rights, which is uncommon.
    # they are only triggered if DEVNULLRIGHTS macro is defined.



( run in 0.397 second using v1.01-cache-2.11-cpan-8d75d55dd25 )