Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

stdin multiple file fixes #3222

Merged
merged 2 commits into from
Jul 29, 2022
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
10 changes: 10 additions & 0 deletions programs/fileio.c
Original file line number Diff line number Diff line change
Expand Up @@ -1796,6 +1796,11 @@ FIO_determineCompressedName(const char* srcFileName, const char* outDirName, con
char* outDirFilename = NULL;
size_t sfnSize = strlen(srcFileName);
size_t const srcSuffixLen = strlen(suffix);

if(!strcmp(srcFileName, stdinmark)) {
return stdoutmark;
}

if (outDirName) {
outDirFilename = FIO_createFilename_fromOutDir(srcFileName, outDirName, srcSuffixLen);
sfnSize = strlen(outDirFilename);
Expand Down Expand Up @@ -2576,6 +2581,11 @@ FIO_determineDstName(const char* srcFileName, const char* outDirName)

size_t srcSuffixLen;
const char* const srcSuffix = strrchr(srcFileName, '.');

if(!strcmp(srcFileName, stdinmark)) {
return stdoutmark;
}

if (srcSuffix == NULL) {
DISPLAYLEVEL(1,
"zstd: %s: unknown suffix (%s expected). "
Expand Down
10 changes: 10 additions & 0 deletions programs/util.c
Original file line number Diff line number Diff line change
Expand Up @@ -509,6 +509,16 @@ FileNamesTable* UTIL_allocateFileNamesTable(size_t tableSize)
return fnt;
}

int UTIL_searchFileNamesTable(FileNamesTable* table, char const* name) {
size_t i;
for(i=0 ;i < table->tableSize; i++) {
if(!strcmp(table->fileNames[i], name)) {
return (int)i;
}
}
return -1;
}

void UTIL_refFilename(FileNamesTable* fnt, const char* filename)
{
assert(fnt->tableSize < fnt->tableCapacity);
Expand Down
5 changes: 5 additions & 0 deletions programs/util.h
Original file line number Diff line number Diff line change
Expand Up @@ -269,6 +269,11 @@ UTIL_createFNT_fromROTable(const char** filenames, size_t nbFilenames);
*/
FileNamesTable* UTIL_allocateFileNamesTable(size_t tableSize);

/*! UTIL_searchFileNamesTable() :
* Searched through entries in FileNamesTable for a specific name.
* @return : index of entry if found or -1 if not found
*/
int UTIL_searchFileNamesTable(FileNamesTable* table, char const* name);

/*! UTIL_refFilename() :
* Add a reference to read-only name into @fnt table.
Expand Down
8 changes: 4 additions & 4 deletions programs/zstdcli.c
Original file line number Diff line number Diff line change
Expand Up @@ -1388,19 +1388,19 @@ int main(int argCount, const char* argv[])
UTIL_refFilename(filenames, stdinmark);
}

if (!strcmp(filenames->fileNames[0], stdinmark) && !outFileName)
if (filenames->tableSize == 1 && !strcmp(filenames->fileNames[0], stdinmark) && !outFileName)
outFileName = stdoutmark; /* when input is stdin, default output is stdout */

/* Check if input/output defined as console; trigger an error in this case */
if (!forceStdin
&& !strcmp(filenames->fileNames[0], stdinmark)
&& (UTIL_searchFileNamesTable(filenames, stdinmark) != -1)
&& IS_CONSOLE(stdin) ) {
DISPLAYLEVEL(1, "stdin is a console, aborting\n");
CLEAN_RETURN(1);
}
if ( outFileName && !strcmp(outFileName, stdoutmark)
if ( (!outFileName || !strcmp(outFileName, stdoutmark))
&& IS_CONSOLE(stdout)
&& !strcmp(filenames->fileNames[0], stdinmark)
&& (UTIL_searchFileNamesTable(filenames, stdinmark) != -1)
&& !forceStdout
&& operation!=zom_decompress ) {
DISPLAYLEVEL(1, "stdout is a console, aborting\n");
Expand Down
21 changes: 21 additions & 0 deletions tests/cli-tests/compression/multiple-files.sh
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
#!/bin/sh
set -e

# setup
echo "file1" > file1
echo "file2" > file2

echo "Test zstd ./file1 - file2"
rm -f ./file*.zst
echo "stdin" | zstd ./file1 - ./file2 | zstd -d
cat file1.zst | zstd -d
cat file2.zst | zstd -d

echo "Test zstd -d ./file1.zst - file2.zst"
rm ./file1 ./file2
echo "stdin" | zstd - | zstd -d ./file1.zst - file2.zst
cat file1
cat file2

echo "zstd -d ./file1.zst - file2.zst -c"
echo "stdin" | zstd | zstd -d ./file1.zst - file2.zst -c
12 changes: 12 additions & 0 deletions tests/cli-tests/compression/multiple-files.sh.stdout.exact
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
Test zstd ./file1 - file2
stdin
file1
file2
Test zstd -d ./file1.zst - file2.zst
stdin
file1
file2
zstd -d ./file1.zst - file2.zst -c
file1
stdin
file2