summaryrefslogtreecommitdiff
path: root/include/data_writer.h
blob: 7107868c9117cbd0ad0a6cb36ca5eaa1d919c8af (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
/* SPDX-License-Identifier: GPL-3.0-or-later */
#ifndef DATA_WRITER_H
#define DATA_WRITER_H

#include "config.h"

#include "squashfs.h"
#include "compress.h"
#include "fstree.h"
#include "util.h"

typedef struct data_writer_t data_writer_t;

enum {
	/* Don't generate fragments, always write the last block to disk as a
	   block, even if it is incomplete. */
	DW_DONT_FRAGMENT = 0x01,

	/* Intentionally write all blocks uncompressed. This implies
	   DW_DONT_FRAGMENT since sharing a fragment block with other files
	   would otherwise require the entire fragment block to be
	   uncompressed. */
	DW_DONT_COMPRESS = 0x03,

	/* Make sure the first block of a file is alligned to
	   device block size */
	DW_ALLIGN_DEVBLK = 0x04,
};

/*
  Create a data writer. The pointer to the super block is kept internally and
  used to automatically update various counters when writing data.

  Returns NULL on failure and prints errors to stderr.
 */
data_writer_t *data_writer_create(sqfs_super_t *super, compressor_t *cmp,
				  int outfd, size_t devblksize);

void data_writer_destroy(data_writer_t *data);

/*
  Write the finalfragment table to the underlying file.

  Returns 0 on success, prints errors to stderr.
*/
int data_writer_write_fragment_table(data_writer_t *data);

/*
  Compress and flush the current fragment buffer even if it is not full yet.

  Returns 0 on success, prints errors to stderr.
*/
int data_writer_flush_fragments(data_writer_t *data);

/*
  Read data from the given file descriptor, partition it into blocks and
  write them out (possibly compressed) to the underlying file. If the size
  is not a multiple of the block size, the last bit is kept in an internal
  fragment buffer which is written out if full.

  The file_info_t object is updated accordingly and used to determine the
  number of bytes to write and the input file name to report errors.

  Blocks or fragments that are all zero bytes automatically detected,
  not written out and the sparse file accounting updated accordingly.

  The flags argument is a combination of DW_* flags.

  Returns 0 on success, prints errors to stderr.
*/
int write_data_from_fd(data_writer_t *data, file_info_t *fi, int infd,
		       int flags);

/*
  Does the same as write_data_from_fd but the input file is the condensed
  representation of a sparse file. The layout must be in order and
  non-overlapping.

  The flags argument is a combination of DW_* flags.

  Returns 0 on success, prints errors to stderr.
 */
int write_data_from_fd_condensed(data_writer_t *data, file_info_t *fi,
				 int infd, sparse_map_t *map, int flags);

#endif /* DATA_WRITER_H */