Yann Collet | 32fb407 | 2017-08-18 16:52:05 -0700 | [diff] [blame] | 1 | /* |
Elliott Hughes | 44aba64 | 2023-09-12 20:18:59 +0000 | [diff] [blame] | 2 | * Copyright (c) Meta Platforms, Inc. and affiliates. |
Yann Collet | 4ded9e5 | 2016-08-30 10:04:33 -0700 | [diff] [blame] | 3 | * All rights reserved. |
| 4 | * |
Yann Collet | 32fb407 | 2017-08-18 16:52:05 -0700 | [diff] [blame] | 5 | * This source code is licensed under both the BSD-style license (found in the |
| 6 | * LICENSE file in the root directory of this source tree) and the GPLv2 (found |
| 7 | * in the COPYING file in the root directory of this source tree). |
Yann Collet | 3128e03 | 2017-09-08 00:09:23 -0700 | [diff] [blame] | 8 | * You may select, at your option, one of the above-listed licenses. |
Yann Collet | 4ded9e5 | 2016-08-30 10:04:33 -0700 | [diff] [blame] | 9 | */ |
Yann Collet | 439eb77 | 2015-01-31 10:52:59 +0100 | [diff] [blame] | 10 | |
Yann Collet | 439eb77 | 2015-01-31 10:52:59 +0100 | [diff] [blame] | 11 | |
Yann Collet | a6bdf55 | 2016-09-15 17:02:06 +0200 | [diff] [blame] | 12 | #ifndef FILEIO_H_23981798732 |
| 13 | #define FILEIO_H_23981798732 |
Yann Collet | 439eb77 | 2015-01-31 10:52:59 +0100 | [diff] [blame] | 14 | |
Elliott Hughes | 44aba64 | 2023-09-12 20:18:59 +0000 | [diff] [blame] | 15 | #include "fileio_types.h" |
| 16 | #include "util.h" /* FileNamesTable */ |
Yann Collet | a925362 | 2022-08-03 20:52:15 +0200 | [diff] [blame] | 17 | #define ZSTD_STATIC_LINKING_ONLY /* ZSTD_compressionParameters */ |
W. Felix Handte | 7dcca6b | 2020-05-01 16:20:40 -0400 | [diff] [blame] | 18 | #include "../lib/zstd.h" /* ZSTD_* */ |
Przemyslaw Skibinski | 8349d67 | 2016-12-13 13:24:59 +0100 | [diff] [blame] | 19 | |
Yann Collet | 439eb77 | 2015-01-31 10:52:59 +0100 | [diff] [blame] | 20 | #if defined (__cplusplus) |
| 21 | extern "C" { |
| 22 | #endif |
| 23 | |
Yann Collet | 8dafb1a | 2017-01-25 17:01:13 -0800 | [diff] [blame] | 24 | |
Yann Collet | f3eca25 | 2015-10-22 15:31:46 +0100 | [diff] [blame] | 25 | /* ************************************* |
Yann Collet | 439eb77 | 2015-01-31 10:52:59 +0100 | [diff] [blame] | 26 | * Special i/o constants |
| 27 | **************************************/ |
Yann Collet | 743b33f | 2016-12-02 15:18:57 -0800 | [diff] [blame] | 28 | #define stdinmark "/*stdin*\\" |
Przemyslaw Skibinski | d081558 | 2016-11-04 11:37:27 +0100 | [diff] [blame] | 29 | #define stdoutmark "/*stdout*\\" |
Yann Collet | 439eb77 | 2015-01-31 10:52:59 +0100 | [diff] [blame] | 30 | #ifdef _WIN32 |
Yann Collet | 0a24d4e | 2019-10-17 16:39:47 -0700 | [diff] [blame] | 31 | # define nulmark "NUL" |
Yann Collet | 439eb77 | 2015-01-31 10:52:59 +0100 | [diff] [blame] | 32 | #else |
| 33 | # define nulmark "/dev/null" |
| 34 | #endif |
W. Felix Handte | 91c3f54 | 2019-10-24 20:18:57 -0400 | [diff] [blame] | 35 | |
W. Felix Handte | 4eccc82 | 2019-10-25 13:58:58 -0400 | [diff] [blame] | 36 | /** |
| 37 | * We test whether the extension we found starts with 't', and if so, we append |
W. Felix Handte | 91c3f54 | 2019-10-24 20:18:57 -0400 | [diff] [blame] | 38 | * ".tar" to the end of the output name. |
| 39 | */ |
Nick Terrell | aa8bcf3 | 2017-03-13 18:11:07 -0700 | [diff] [blame] | 40 | #define LZMA_EXTENSION ".lzma" |
| 41 | #define XZ_EXTENSION ".xz" |
W. Felix Handte | 91c3f54 | 2019-10-24 20:18:57 -0400 | [diff] [blame] | 42 | #define TXZ_EXTENSION ".txz" |
| 43 | |
Nick Terrell | aa8bcf3 | 2017-03-13 18:11:07 -0700 | [diff] [blame] | 44 | #define GZ_EXTENSION ".gz" |
W. Felix Handte | 91c3f54 | 2019-10-24 20:18:57 -0400 | [diff] [blame] | 45 | #define TGZ_EXTENSION ".tgz" |
| 46 | |
Nick Terrell | aa8bcf3 | 2017-03-13 18:11:07 -0700 | [diff] [blame] | 47 | #define ZSTD_EXTENSION ".zst" |
W. Felix Handte | 91c3f54 | 2019-10-24 20:18:57 -0400 | [diff] [blame] | 48 | #define TZSTD_EXTENSION ".tzst" |
senhuang42 | 6b6cc80 | 2020-09-18 12:49:51 -0400 | [diff] [blame] | 49 | #define ZSTD_ALT_EXTENSION ".zstd" /* allow decompression of .zstd files */ |
W. Felix Handte | 91c3f54 | 2019-10-24 20:18:57 -0400 | [diff] [blame] | 50 | |
Sean Purcell | 4de8632 | 2017-04-24 16:48:25 -0700 | [diff] [blame] | 51 | #define LZ4_EXTENSION ".lz4" |
W. Felix Handte | 91c3f54 | 2019-10-24 20:18:57 -0400 | [diff] [blame] | 52 | #define TLZ4_EXTENSION ".tlz4" |
Yann Collet | 439eb77 | 2015-01-31 10:52:59 +0100 | [diff] [blame] | 53 | |
| 54 | |
Yann Collet | 8a1d1a6 | 2016-03-10 21:02:25 +0100 | [diff] [blame] | 55 | /*-************************************* |
Przemyslaw Skibinski | cfd4dc2 | 2017-02-08 15:17:55 +0100 | [diff] [blame] | 56 | * Types |
| 57 | ***************************************/ |
Karl Ostmo | 5e220bf | 2019-01-22 17:31:13 -0800 | [diff] [blame] | 58 | FIO_prefs_t* FIO_createPreferences(void); |
| 59 | void FIO_freePreferences(FIO_prefs_t* const prefs); |
| 60 | |
senhuang42 | a480b02 | 2020-09-03 09:26:30 -0400 | [diff] [blame] | 61 | /* Mutable struct containing relevant context and state regarding (de)compression with respect to file I/O */ |
senhuang42 | d54566f | 2020-08-28 11:01:04 -0400 | [diff] [blame] | 62 | typedef struct FIO_ctx_s FIO_ctx_t; |
| 63 | |
| 64 | FIO_ctx_t* FIO_createContext(void); |
| 65 | void FIO_freeContext(FIO_ctx_t* const fCtx); |
| 66 | |
sen | 6030cdf | 2021-05-06 14:50:28 -0400 | [diff] [blame] | 67 | |
Przemyslaw Skibinski | cfd4dc2 | 2017-02-08 15:17:55 +0100 | [diff] [blame] | 68 | /*-************************************* |
Yann Collet | 439eb77 | 2015-01-31 10:52:59 +0100 | [diff] [blame] | 69 | * Parameters |
Yann Collet | f3eca25 | 2015-10-22 15:31:46 +0100 | [diff] [blame] | 70 | ***************************************/ |
senhuang42 | d54566f | 2020-08-28 11:01:04 -0400 | [diff] [blame] | 71 | /* FIO_prefs_t functions */ |
Karl Ostmo | 5e220bf | 2019-01-22 17:31:13 -0800 | [diff] [blame] | 72 | void FIO_setCompressionType(FIO_prefs_t* const prefs, FIO_compressionType_t compressionType); |
| 73 | void FIO_overwriteMode(FIO_prefs_t* const prefs); |
Elliott Hughes | 44aba64 | 2023-09-12 20:18:59 +0000 | [diff] [blame] | 74 | void FIO_setAdaptiveMode(FIO_prefs_t* const prefs, int adapt); |
Karl Ostmo | 5e220bf | 2019-01-22 17:31:13 -0800 | [diff] [blame] | 75 | void FIO_setAdaptMin(FIO_prefs_t* const prefs, int minCLevel); |
| 76 | void FIO_setAdaptMax(FIO_prefs_t* const prefs, int maxCLevel); |
Nick Terrell | 4694423 | 2020-11-02 17:52:29 -0800 | [diff] [blame] | 77 | void FIO_setUseRowMatchFinder(FIO_prefs_t* const prefs, int useRowMatchFinder); |
Yann Collet | 07e0478 | 2019-01-25 14:42:44 -0800 | [diff] [blame] | 78 | void FIO_setBlockSize(FIO_prefs_t* const prefs, int blockSize); |
| 79 | void FIO_setChecksumFlag(FIO_prefs_t* const prefs, int checksumFlag); |
| 80 | void FIO_setDictIDFlag(FIO_prefs_t* const prefs, int dictIDFlag); |
| 81 | void FIO_setLdmBucketSizeLog(FIO_prefs_t* const prefs, int ldmBucketSizeLog); |
Karl Ostmo | 5e220bf | 2019-01-22 17:31:13 -0800 | [diff] [blame] | 82 | void FIO_setLdmFlag(FIO_prefs_t* const prefs, unsigned ldmFlag); |
Yann Collet | 07e0478 | 2019-01-25 14:42:44 -0800 | [diff] [blame] | 83 | void FIO_setLdmHashRateLog(FIO_prefs_t* const prefs, int ldmHashRateLog); |
| 84 | void FIO_setLdmHashLog(FIO_prefs_t* const prefs, int ldmHashLog); |
| 85 | void FIO_setLdmMinMatch(FIO_prefs_t* const prefs, int ldmMinMatch); |
Karl Ostmo | 5e220bf | 2019-01-22 17:31:13 -0800 | [diff] [blame] | 86 | void FIO_setMemLimit(FIO_prefs_t* const prefs, unsigned memLimit); |
Yann Collet | 07e0478 | 2019-01-25 14:42:44 -0800 | [diff] [blame] | 87 | void FIO_setNbWorkers(FIO_prefs_t* const prefs, int nbWorkers); |
| 88 | void FIO_setOverlapLog(FIO_prefs_t* const prefs, int overlapLog); |
Elliott Hughes | 44aba64 | 2023-09-12 20:18:59 +0000 | [diff] [blame] | 89 | void FIO_setRemoveSrcFile(FIO_prefs_t* const prefs, int flag); |
| 90 | void FIO_setSparseWrite(FIO_prefs_t* const prefs, int sparse); /**< 0: no sparse; 1: disable on stdout; 2: always enabled */ |
Yann Collet | 07e0478 | 2019-01-25 14:42:44 -0800 | [diff] [blame] | 91 | void FIO_setRsyncable(FIO_prefs_t* const prefs, int rsyncable); |
Nick Magerko | af0c950 | 2019-08-15 23:57:55 -0700 | [diff] [blame] | 92 | void FIO_setStreamSrcSize(FIO_prefs_t* const prefs, size_t streamSrcSize); |
Ephraim Park | 9007701 | 2019-06-24 13:40:52 -0700 | [diff] [blame] | 93 | void FIO_setTargetCBlockSize(FIO_prefs_t* const prefs, size_t targetCBlockSize); |
Nick Magerko | dffbac5 | 2019-08-19 08:52:08 -0700 | [diff] [blame] | 94 | void FIO_setSrcSizeHint(FIO_prefs_t* const prefs, size_t srcSizeHint); |
Yann Collet | 0ee3609 | 2019-10-17 16:09:53 -0700 | [diff] [blame] | 95 | void FIO_setTestMode(FIO_prefs_t* const prefs, int testMode); |
Nick Terrell | 0c53c5a | 2019-02-15 14:15:36 -0800 | [diff] [blame] | 96 | void FIO_setLiteralCompressionMode( |
| 97 | FIO_prefs_t* const prefs, |
senhuang42 | b5c35d7 | 2021-09-20 09:04:07 -0400 | [diff] [blame] | 98 | ZSTD_paramSwitch_e mode); |
Yann Collet | 439eb77 | 2015-01-31 10:52:59 +0100 | [diff] [blame] | 99 | |
sen | 6030cdf | 2021-05-06 14:50:28 -0400 | [diff] [blame] | 100 | void FIO_setProgressSetting(FIO_progressSetting_e progressSetting); |
Yann Collet | 07e0478 | 2019-01-25 14:42:44 -0800 | [diff] [blame] | 101 | void FIO_setNotificationLevel(int level); |
Shashank Tavildar | 0f2bff2 | 2019-10-28 18:21:47 -0700 | [diff] [blame] | 102 | void FIO_setExcludeCompressedFile(FIO_prefs_t* const prefs, int excludeCompressedFiles); |
W. Felix Handte | 33f3e29 | 2021-05-04 16:24:46 -0400 | [diff] [blame] | 103 | void FIO_setAllowBlockDevices(FIO_prefs_t* const prefs, int allowBlockDevices); |
Bimba Shrestha | f25a6e9 | 2020-01-10 14:25:24 -0800 | [diff] [blame] | 104 | void FIO_setPatchFromMode(FIO_prefs_t* const prefs, int value); |
Bimba Shrestha | 6d8e761 | 2020-03-09 14:12:52 -0500 | [diff] [blame] | 105 | void FIO_setContentSize(FIO_prefs_t* const prefs, int value); |
Kevin Svetlitski | df9b775 | 2021-11-10 17:25:27 -0800 | [diff] [blame] | 106 | void FIO_displayCompressionParameters(const FIO_prefs_t* prefs); |
Elliott Hughes | 44aba64 | 2023-09-12 20:18:59 +0000 | [diff] [blame] | 107 | void FIO_setAsyncIOFlag(FIO_prefs_t* const prefs, int value); |
| 108 | void FIO_setPassThroughFlag(FIO_prefs_t* const prefs, int value); |
| 109 | void FIO_setMMapDict(FIO_prefs_t* const prefs, ZSTD_paramSwitch_e value); |
senhuang42 | d54566f | 2020-08-28 11:01:04 -0400 | [diff] [blame] | 110 | |
| 111 | /* FIO_ctx_t functions */ |
senhuang42 | 3a7d625 | 2020-09-01 12:52:18 -0400 | [diff] [blame] | 112 | void FIO_setNbFilesTotal(FIO_ctx_t* const fCtx, int value); |
senhuang42 | 93cd9d8 | 2020-10-07 13:44:25 -0400 | [diff] [blame] | 113 | void FIO_setHasStdoutOutput(FIO_ctx_t* const fCtx, int value); |
senhuang42 | 432186c | 2020-09-24 15:55:30 -0400 | [diff] [blame] | 114 | void FIO_determineHasStdinInput(FIO_ctx_t* const fCtx, const FileNamesTable* const filenames); |
Yann Collet | 439eb77 | 2015-01-31 10:52:59 +0100 | [diff] [blame] | 115 | |
Yann Collet | 8a1d1a6 | 2016-03-10 21:02:25 +0100 | [diff] [blame] | 116 | /*-************************************* |
Yann Collet | 4f13703 | 2015-12-17 02:23:58 +0100 | [diff] [blame] | 117 | * Single File functions |
Yann Collet | f3eca25 | 2015-10-22 15:31:46 +0100 | [diff] [blame] | 118 | ***************************************/ |
Yann Collet | 883a67e | 2016-02-12 03:50:05 +0100 | [diff] [blame] | 119 | /** FIO_compressFilename() : |
Yann Collet | 0ee3609 | 2019-10-17 16:09:53 -0700 | [diff] [blame] | 120 | * @return : 0 == ok; 1 == pb with src file. */ |
senhuang42 | 5123496 | 2020-09-07 13:13:05 -0400 | [diff] [blame] | 121 | int FIO_compressFilename (FIO_ctx_t* const fCtx, FIO_prefs_t* const prefs, |
Sen Huang | 7f98b46 | 2019-09-05 16:03:35 -0700 | [diff] [blame] | 122 | const char* outfilename, const char* infilename, |
| 123 | const char* dictFileName, int compressionLevel, |
| 124 | ZSTD_compressionParameters comprParams); |
Yann Collet | 439eb77 | 2015-01-31 10:52:59 +0100 | [diff] [blame] | 125 | |
Yann Collet | 883a67e | 2016-02-12 03:50:05 +0100 | [diff] [blame] | 126 | /** FIO_decompressFilename() : |
Yann Collet | 0ee3609 | 2019-10-17 16:09:53 -0700 | [diff] [blame] | 127 | * @return : 0 == ok; 1 == pb with src file. */ |
senhuang42 | 5123496 | 2020-09-07 13:13:05 -0400 | [diff] [blame] | 128 | int FIO_decompressFilename (FIO_ctx_t* const fCtx, FIO_prefs_t* const prefs, |
Karl Ostmo | 5e220bf | 2019-01-22 17:31:13 -0800 | [diff] [blame] | 129 | const char* outfilename, const char* infilename, const char* dictFileName); |
Yann Collet | 439eb77 | 2015-01-31 10:52:59 +0100 | [diff] [blame] | 130 | |
Paul Cruz | bda5775 | 2017-06-20 12:43:10 -0700 | [diff] [blame] | 131 | int FIO_listMultipleFiles(unsigned numFiles, const char** filenameTable, int displayLevel); |
Yann Collet | 439eb77 | 2015-01-31 10:52:59 +0100 | [diff] [blame] | 132 | |
Yann Collet | 6c51bf4 | 2018-09-24 18:16:08 -0700 | [diff] [blame] | 133 | |
Yann Collet | 8a1d1a6 | 2016-03-10 21:02:25 +0100 | [diff] [blame] | 134 | /*-************************************* |
Yann Collet | 4f13703 | 2015-12-17 02:23:58 +0100 | [diff] [blame] | 135 | * Multiple File functions |
| 136 | ***************************************/ |
Yann Collet | 883a67e | 2016-02-12 03:50:05 +0100 | [diff] [blame] | 137 | /** FIO_compressMultipleFilenames() : |
Yann Collet | 0ee3609 | 2019-10-17 16:09:53 -0700 | [diff] [blame] | 138 | * @return : nb of missing files */ |
senhuang42 | 5123496 | 2020-09-07 13:13:05 -0400 | [diff] [blame] | 139 | int FIO_compressMultipleFilenames(FIO_ctx_t* const fCtx, |
| 140 | FIO_prefs_t* const prefs, |
senhuang42 | b6abbc3 | 2020-08-26 11:35:07 -0400 | [diff] [blame] | 141 | const char** inFileNamesTable, |
Xin Xie | 9a8ccd4 | 2020-06-19 19:35:51 -0700 | [diff] [blame] | 142 | const char* outMirroredDirName, |
Yann Collet | 1795133 | 2019-10-17 15:32:03 -0700 | [diff] [blame] | 143 | const char* outDirName, |
Nick Terrell | 4680e85 | 2017-12-12 18:32:50 -0800 | [diff] [blame] | 144 | const char* outFileName, const char* suffix, |
Przemyslaw Skibinski | 8349d67 | 2016-12-13 13:24:59 +0100 | [diff] [blame] | 145 | const char* dictFileName, int compressionLevel, |
Yann Collet | 33f7709 | 2018-08-13 13:02:03 -0700 | [diff] [blame] | 146 | ZSTD_compressionParameters comprParams); |
Yann Collet | 883a67e | 2016-02-12 03:50:05 +0100 | [diff] [blame] | 147 | |
| 148 | /** FIO_decompressMultipleFilenames() : |
Yann Collet | 0ee3609 | 2019-10-17 16:09:53 -0700 | [diff] [blame] | 149 | * @return : nb of missing or skipped files */ |
senhuang42 | 5123496 | 2020-09-07 13:13:05 -0400 | [diff] [blame] | 150 | int FIO_decompressMultipleFilenames(FIO_ctx_t* const fCtx, |
| 151 | FIO_prefs_t* const prefs, |
senhuang42 | b6abbc3 | 2020-08-26 11:35:07 -0400 | [diff] [blame] | 152 | const char** srcNamesTable, |
Xin Xie | 9a8ccd4 | 2020-06-19 19:35:51 -0700 | [diff] [blame] | 153 | const char* outMirroredDirName, |
Sen Huang | 64bc441 | 2019-10-03 13:53:04 -0400 | [diff] [blame] | 154 | const char* outDirName, |
Nick Terrell | 4680e85 | 2017-12-12 18:32:50 -0800 | [diff] [blame] | 155 | const char* outFileName, |
Yann Collet | deb078b | 2015-12-17 20:30:14 +0100 | [diff] [blame] | 156 | const char* dictFileName); |
Yann Collet | 4f13703 | 2015-12-17 02:23:58 +0100 | [diff] [blame] | 157 | |
Sen Huang | 64bc441 | 2019-10-03 13:53:04 -0400 | [diff] [blame] | 158 | /* FIO_checkFilenameCollisions() : |
Yann Collet | 0ee3609 | 2019-10-17 16:09:53 -0700 | [diff] [blame] | 159 | * Checks for and warns if there are any files that would have the same output path |
Sen Huang | 64bc441 | 2019-10-03 13:53:04 -0400 | [diff] [blame] | 160 | */ |
| 161 | int FIO_checkFilenameCollisions(const char** filenameTable, unsigned nbFiles); |
Yann Collet | 439eb77 | 2015-01-31 10:52:59 +0100 | [diff] [blame] | 162 | |
Yann Collet | 0ee3609 | 2019-10-17 16:09:53 -0700 | [diff] [blame] | 163 | |
Yann Collet | 439eb77 | 2015-01-31 10:52:59 +0100 | [diff] [blame] | 164 | |
Yann Collet | 6c51bf4 | 2018-09-24 18:16:08 -0700 | [diff] [blame] | 165 | /*-************************************* |
| 166 | * Advanced stuff (should actually be hosted elsewhere) |
| 167 | ***************************************/ |
| 168 | |
Casey McGinty | d4337b6 | 2018-09-11 11:39:49 -0700 | [diff] [blame] | 169 | /* custom crash signal handler */ |
| 170 | void FIO_addAbortHandler(void); |
| 171 | |
Elliott Hughes | 44aba64 | 2023-09-12 20:18:59 +0000 | [diff] [blame] | 172 | char const* FIO_zlibVersion(void); |
| 173 | char const* FIO_lz4Version(void); |
| 174 | char const* FIO_lzmaVersion(void); |
Yann Collet | 6c51bf4 | 2018-09-24 18:16:08 -0700 | [diff] [blame] | 175 | |
| 176 | |
Yann Collet | 439eb77 | 2015-01-31 10:52:59 +0100 | [diff] [blame] | 177 | #if defined (__cplusplus) |
| 178 | } |
Yann Collet | f3eca25 | 2015-10-22 15:31:46 +0100 | [diff] [blame] | 179 | #endif |
Yann Collet | a6bdf55 | 2016-09-15 17:02:06 +0200 | [diff] [blame] | 180 | |
| 181 | #endif /* FILEIO_H_23981798732 */ |