1 // Copyright 2022 Google LLC
2 //
3 // Licensed under the Apache License, Version 2.0 (the "License");
4 // you may not use this file except in compliance with the License.
5 // You may obtain a copy of the License at
6 //
7 // https://www.apache.org/licenses/LICENSE-2.0
8 //
9 // Unless required by applicable law or agreed to in writing, software
10 // distributed under the License is distributed on an "AS IS" BASIS,
11 // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12 // See the License for the specific language governing permissions and
13 // limitations under the License.
14
15 #include "contrib/zopfli/wrapper/wrapper_zopfli.h"
16
17 #include <fcntl.h>
18 #include <unistd.h>
19
20 #include <cstdio>
21 #include <cstdlib>
22 #include <memory>
23
ZopfliCompressFD(const ZopfliOptions * options,ZopfliFormat output_type,int infd,int outfd)24 int ZopfliCompressFD(const ZopfliOptions* options, ZopfliFormat output_type,
25 int infd, int outfd) {
26 off_t insize = lseek(infd, 0, SEEK_END);
27 if (insize < 0) {
28 return -1;
29 }
30 if (lseek(infd, 0, SEEK_SET) < 0) {
31 return -1;
32 }
33
34 auto inbuf = std::make_unique<uint8_t[]>(insize);
35 if (read(infd, inbuf.get(), insize) != insize) {
36 return -1;
37 }
38
39 size_t outsize = 0;
40 uint8_t* outbuf = nullptr;
41 ZopfliCompress(options, output_type, inbuf.get(), insize, &outbuf, &outsize);
42 size_t retsize = write(outfd, outbuf, outsize);
43 free(outbuf);
44
45 if (outsize != retsize) {
46 return -1;
47 }
48
49 return 0;
50 }
51