Lines Matching refs:out
68 int (*write_data_chunk)(struct output_file* out, unsigned int len, void* data);
69 int (*write_fill_chunk)(struct output_file* out, unsigned int len, uint32_t fill_val);
70 int (*write_skip_chunk)(struct output_file* out, int64_t len);
71 int (*write_end_chunk)(struct output_file* out);
89 struct output_file out; member
93 #define to_output_file_gz(_o) container_of((_o), struct output_file_gz, out)
96 struct output_file out; member
100 #define to_output_file_normal(_o) container_of((_o), struct output_file_normal, out)
103 struct output_file out; member
108 #define to_output_file_callback(_o) container_of((_o), struct output_file_callback, out)
110 static int file_open(struct output_file* out, int fd) { in file_open() argument
111 struct output_file_normal* outn = to_output_file_normal(out); in file_open()
117 static int file_skip(struct output_file* out, int64_t cnt) { in file_skip() argument
119 struct output_file_normal* outn = to_output_file_normal(out); in file_skip()
129 static int file_pad(struct output_file* out, int64_t len) { in file_pad() argument
131 struct output_file_normal* outn = to_output_file_normal(out); in file_pad()
141 static int file_write(struct output_file* out, void* data, size_t len) { in file_write() argument
143 struct output_file_normal* outn = to_output_file_normal(out); in file_write()
162 static void file_close(struct output_file* out) { in file_close() argument
163 struct output_file_normal* outn = to_output_file_normal(out); in file_close()
176 static int gz_file_open(struct output_file* out, int fd) { in gz_file_open() argument
177 struct output_file_gz* outgz = to_output_file_gz(out); in gz_file_open()
188 static int gz_file_skip(struct output_file* out, int64_t cnt) { in gz_file_skip() argument
190 struct output_file_gz* outgz = to_output_file_gz(out); in gz_file_skip()
200 static int gz_file_pad(struct output_file* out, int64_t len) { in gz_file_pad() argument
202 struct output_file_gz* outgz = to_output_file_gz(out); in gz_file_pad()
223 static int gz_file_write(struct output_file* out, void* data, size_t len) { in gz_file_write() argument
225 struct output_file_gz* outgz = to_output_file_gz(out); in gz_file_write()
240 static void gz_file_close(struct output_file* out) { in gz_file_close() argument
241 struct output_file_gz* outgz = to_output_file_gz(out); in gz_file_close()
255 static int callback_file_open(struct output_file* out __unused, int fd __unused) { in callback_file_open()
259 static int callback_file_skip(struct output_file* out, int64_t off) { in callback_file_skip() argument
260 struct output_file_callback* outc = to_output_file_callback(out); in callback_file_skip()
276 static int callback_file_pad(struct output_file* out __unused, int64_t len __unused) { in callback_file_pad()
280 static int callback_file_write(struct output_file* out, void* data, size_t len) { in callback_file_write() argument
281 struct output_file_callback* outc = to_output_file_callback(out); in callback_file_write()
286 static void callback_file_close(struct output_file* out) { in callback_file_close() argument
287 struct output_file_callback* outc = to_output_file_callback(out); in callback_file_close()
319 static int write_sparse_skip_chunk(struct output_file* out, int64_t skip_len) { in write_sparse_skip_chunk() argument
323 if (skip_len % out->block_size) { in write_sparse_skip_chunk()
325 out->block_size); in write_sparse_skip_chunk()
332 chunk_header.chunk_sz = skip_len / out->block_size; in write_sparse_skip_chunk()
334 ret = out->ops->write(out, &chunk_header, sizeof(chunk_header)); in write_sparse_skip_chunk()
337 out->cur_out_ptr += skip_len; in write_sparse_skip_chunk()
338 out->chunk_cnt++; in write_sparse_skip_chunk()
343 static int write_sparse_fill_chunk(struct output_file* out, unsigned int len, uint32_t fill_val) { in write_sparse_fill_chunk() argument
349 rnd_up_len = ALIGN(len, out->block_size); in write_sparse_fill_chunk()
354 chunk_header.chunk_sz = rnd_up_len / out->block_size; in write_sparse_fill_chunk()
356 ret = out->ops->write(out, &chunk_header, sizeof(chunk_header)); in write_sparse_fill_chunk()
359 ret = out->ops->write(out, &fill_val, sizeof(fill_val)); in write_sparse_fill_chunk()
362 if (out->use_crc) { in write_sparse_fill_chunk()
363 count = out->block_size / sizeof(uint32_t); in write_sparse_fill_chunk()
364 while (count--) out->crc32 = sparse_crc32(out->crc32, &fill_val, sizeof(uint32_t)); in write_sparse_fill_chunk()
367 out->cur_out_ptr += rnd_up_len; in write_sparse_fill_chunk()
368 out->chunk_cnt++; in write_sparse_fill_chunk()
373 static int write_sparse_data_chunk(struct output_file* out, unsigned int len, void* data) { in write_sparse_data_chunk() argument
379 rnd_up_len = ALIGN(len, out->block_size); in write_sparse_data_chunk()
385 chunk_header.chunk_sz = rnd_up_len / out->block_size; in write_sparse_data_chunk()
387 ret = out->ops->write(out, &chunk_header, sizeof(chunk_header)); in write_sparse_data_chunk()
390 ret = out->ops->write(out, data, len); in write_sparse_data_chunk()
393 ret = out->ops->write(out, out->zero_buf, zero_len); in write_sparse_data_chunk()
397 if (out->use_crc) { in write_sparse_data_chunk()
398 out->crc32 = sparse_crc32(out->crc32, data, len); in write_sparse_data_chunk()
399 if (zero_len) out->crc32 = sparse_crc32(out->crc32, out->zero_buf, zero_len); in write_sparse_data_chunk()
402 out->cur_out_ptr += rnd_up_len; in write_sparse_data_chunk()
403 out->chunk_cnt++; in write_sparse_data_chunk()
408 int write_sparse_end_chunk(struct output_file* out) { in write_sparse_end_chunk() argument
412 if (out->use_crc) { in write_sparse_end_chunk()
418 ret = out->ops->write(out, &chunk_header, sizeof(chunk_header)); in write_sparse_end_chunk()
422 out->ops->write(out, &out->crc32, 4); in write_sparse_end_chunk()
427 out->chunk_cnt++; in write_sparse_end_chunk()
440 static int write_normal_data_chunk(struct output_file* out, unsigned int len, void* data) { in write_normal_data_chunk() argument
442 unsigned int rnd_up_len = ALIGN(len, out->block_size); in write_normal_data_chunk()
444 ret = out->ops->write(out, data, len); in write_normal_data_chunk()
450 ret = out->ops->skip(out, rnd_up_len - len); in write_normal_data_chunk()
456 static int write_normal_fill_chunk(struct output_file* out, unsigned int len, uint32_t fill_val) { in write_normal_fill_chunk() argument
462 for (i = 0; i < out->block_size / sizeof(uint32_t); i++) { in write_normal_fill_chunk()
463 out->fill_buf[i] = fill_val; in write_normal_fill_chunk()
467 write_len = std::min(len, out->block_size); in write_normal_fill_chunk()
468 ret = out->ops->write(out, out->fill_buf, write_len); in write_normal_fill_chunk()
479 static int write_normal_skip_chunk(struct output_file* out, int64_t len) { in write_normal_skip_chunk() argument
480 return out->ops->skip(out, len); in write_normal_skip_chunk()
483 int write_normal_end_chunk(struct output_file* out) { in write_normal_end_chunk() argument
484 return out->ops->pad(out, out->len); in write_normal_end_chunk()
494 void output_file_close(struct output_file* out) { in output_file_close() argument
495 out->sparse_ops->write_end_chunk(out); in output_file_close()
496 free(out->zero_buf); in output_file_close()
497 free(out->fill_buf); in output_file_close()
498 out->zero_buf = nullptr; in output_file_close()
499 out->fill_buf = nullptr; in output_file_close()
500 out->ops->close(out); in output_file_close()
503 static int output_file_init(struct output_file* out, int block_size, int64_t len, bool sparse, in output_file_init() argument
507 out->len = len; in output_file_init()
508 out->block_size = block_size; in output_file_init()
509 out->cur_out_ptr = 0LL; in output_file_init()
510 out->chunk_cnt = 0; in output_file_init()
511 out->crc32 = 0; in output_file_init()
512 out->use_crc = crc; in output_file_init()
514 out->zero_buf = reinterpret_cast<char*>(calloc(block_size, 1)); in output_file_init()
515 if (!out->zero_buf) { in output_file_init()
520 out->fill_buf = reinterpret_cast<uint32_t*>(calloc(block_size, 1)); in output_file_init()
521 if (!out->fill_buf) { in output_file_init()
528 out->sparse_ops = &sparse_file_ops; in output_file_init()
530 out->sparse_ops = &normal_file_ops; in output_file_init()
540 .blk_sz = out->block_size, in output_file_init()
541 .total_blks = static_cast<unsigned>(DIV_ROUND_UP(out->len, out->block_size)), in output_file_init()
545 if (out->use_crc) { in output_file_init()
549 ret = out->ops->write(out, &sparse_header, sizeof(sparse_header)); in output_file_init()
558 free(out->fill_buf); in output_file_init()
560 free(out->zero_buf); in output_file_init()
572 outgz->out.ops = &gz_file_ops; in output_file_new_gz()
574 return &outgz->out; in output_file_new_gz()
585 outn->out.ops = &file_ops; in output_file_new_normal()
587 return &outn->out; in output_file_new_normal()
603 outc->out.ops = &callback_file_ops; in output_file_open_callback()
607 ret = output_file_init(&outc->out, block_size, len, sparse, chunks, crc); in output_file_open_callback()
613 return &outc->out; in output_file_open_callback()
619 struct output_file* out; in output_file_open_fd() local
622 out = output_file_new_gz(); in output_file_open_fd()
624 out = output_file_new_normal(); in output_file_open_fd()
626 if (!out) { in output_file_open_fd()
630 out->ops->open(out, fd); in output_file_open_fd()
632 ret = output_file_init(out, block_size, len, sparse, chunks, crc); in output_file_open_fd()
634 free(out); in output_file_open_fd()
638 return out; in output_file_open_fd()
642 int write_data_chunk(struct output_file* out, unsigned int len, void* data) { in write_data_chunk() argument
643 return out->sparse_ops->write_data_chunk(out, len, data); in write_data_chunk()
647 int write_fill_chunk(struct output_file* out, unsigned int len, uint32_t fill_val) { in write_fill_chunk() argument
648 return out->sparse_ops->write_fill_chunk(out, len, fill_val); in write_fill_chunk()
651 int write_fd_chunk(struct output_file* out, unsigned int len, int fd, int64_t offset) { in write_fd_chunk() argument
689 ret = out->sparse_ops->write_data_chunk(out, len, ptr); in write_fd_chunk()
701 int write_file_chunk(struct output_file* out, unsigned int len, const char* file, int64_t offset) { in write_file_chunk() argument
709 ret = write_fd_chunk(out, len, file_fd, offset); in write_file_chunk()
716 int write_skip_chunk(struct output_file* out, int64_t len) { in write_skip_chunk() argument
717 return out->sparse_ops->write_skip_chunk(out, len); in write_skip_chunk()