Lines Matching refs:ei
68 static struct exfat2img ei;
97 static void free_exfat2img(struct exfat2img *ei)
99 if (ei->exfat)
100 exfat_free_exfat(ei->exfat);
101 if (ei->dump_bdesc)
102 exfat_free_buffer(ei->dump_bdesc, 2);
103 if (ei->scan_bdesc)
104 exfat_free_buffer(ei->scan_bdesc, 2);
105 if (ei->out_fd)
106 close(ei->out_fd);
107 if (ei->bdev.dev_fd)
108 close(ei->bdev.dev_fd);
111 static int create_exfat2img(struct exfat2img *ei,
117 ei->exfat = exfat_alloc_exfat(&ei->bdev, bs);
118 if (!ei->exfat)
121 ei->dump_bdesc = exfat_alloc_buffer(2,
122 ei->exfat->clus_size,
123 ei->exfat->sect_size);
124 if (!ei->dump_bdesc) {
129 ei->scan_bdesc = exfat_alloc_buffer(2,
130 ei->exfat->clus_size,
131 ei->exfat->sect_size);
132 if (!ei->scan_bdesc) {
138 ei->out_fd = open(out_path, O_CREAT | O_TRUNC | O_RDWR, 0664);
140 ei->is_stdout = true;
141 ei->out_fd = fileno(stdout);
142 ei->save_cc = true;
144 if (ei->out_fd < 0) {
153 free_exfat2img(ei);
160 static ssize_t dump_range(struct exfat2img *ei, off_t start, off_t end)
162 struct exfat *exfat = ei->exfat;
166 if (ei->is_stdout) {
170 if (exfat_o2c(ei->exfat, start, &sc, &sc_offset) < 0)
172 if (exfat_o2c(ei->exfat, end - 1, &ec, &ec_offset) < 0)
174 exfat_bitmap_set_range(ei->exfat, exfat->alloc_bitmap,
183 ei->dump_bdesc[0].buffer,
192 ret = pwrite(ei->out_fd, ei->dump_bdesc[0].buffer,
208 static int dump_sectors(struct exfat2img *ei,
212 struct exfat *exfat = ei->exfat;
217 return dump_range(ei, s, e) <= 0 ? -EIO : 0;
220 static int dump_clusters(struct exfat2img *ei,
224 struct exfat *exfat = ei->exfat;
229 return dump_range(ei, s, e) <= 0 ? -EIO : 0;
232 static int dump_directory(struct exfat2img *ei,
236 struct exfat *exfat = ei->exfat;
261 if (dump_range(ei, start_off, end_off) < 0)
279 static int dump_root(struct exfat2img *ei)
281 struct exfat *exfat = ei->exfat;
290 dump_directory(ei, root, (size_t)-1, &clus_count);
293 ei->exfat->root = root;
365 static int read_bitmap(struct exfat2img *ei, struct exfat_de_iter *iter)
367 struct exfat *exfat = ei->exfat;
390 return dump_clusters(ei,
397 static int read_upcase_table(struct exfat2img *ei,
400 struct exfat *exfat = ei->exfat;
418 return dump_clusters(ei, le32_to_cpu(dentry->upcase_start_clu),
423 static int read_children(struct exfat2img *ei, struct exfat_inode *dir,
426 struct exfat *exfat = ei->exfat;
434 de_iter = &ei->de_iter;
435 ret = exfat_de_iter_init(de_iter, exfat, dir, ei->scan_bdesc);
476 ret = read_bitmap(ei, de_iter);
483 ret = read_upcase_table(ei, de_iter);
506 static int dump_filesystem(struct exfat2img *ei)
508 struct exfat *exfat = ei->exfat;
533 dir_errors = read_children(ei, dir, &end_file_offset);
535 dump_directory(ei, dir, (size_t)end_file_offset,
538 dump_directory(ei, dir, (size_t)-1,
554 static int dump_bytes_to_stdout(struct exfat2img *ei,
557 struct exfat *exfat = ei->exfat;
561 if (start != ei->stdout_offset) {
564 (unsigned long long)ei->stdout_offset);
572 ei->dump_bdesc[0].buffer,
581 ret = write(ei->out_fd, ei->dump_bdesc[0].buffer, len);
589 ret = write(ei->out_fd, exfat->zero_cluster, len);
599 ei->stdout_offset += len;
605 static int dump_clusters_to_stdout(struct exfat2img *ei,
618 if (ei->save_cc) {
636 if (write(ei->out_fd, buf, cc_len) != (ssize_t)cc_len) {
644 start_off = exfat_c2o(ei->exfat, clu);
645 end_off_excl = exfat_c2o(ei->exfat, clu + cc_clu_count);
647 if (dump_bytes_to_stdout(ei, start_off, end_off_excl,
651 ei->stdout_offset += (off_t)cc_clu_count * ei->exfat->clus_size;
659 static int dump_to_stdout(struct exfat2img *ei)
661 struct exfat *exfat = ei->exfat;
668 if (dump_bytes_to_stdout(ei, start_off, end_off, false) < 0) {
687 if (dump_clusters_to_stdout(ei, start_clu, end_clu, false) < 0) {
707 if (dump_clusters_to_stdout(ei, start_clu, end_clu, true) < 0) {
722 static int dump_header(struct exfat2img *ei)
724 struct exfat *exfat = ei->exfat;
736 if (write(ei->out_fd, &ei_hdr, sizeof(ei_hdr)) != (ssize_t)sizeof(ei_hdr)) {
763 static int restore_from_stdin(struct exfat2img *ei)
794 ei->out_fd = ei->bdev.dev_fd;
795 ei->dump_bdesc = exfat_alloc_buffer(2, clus_size, 512);
796 if (!ei->dump_bdesc)
805 if (read_stream(in_fd, ei->dump_bdesc[0].buffer, len) != (ssize_t)len) {
813 if (pwrite(ei->out_fd, ei->dump_bdesc[0].buffer, len, out_start_off)
859 if (read_stream(in_fd, ei->dump_bdesc[0].buffer,
867 if (pwrite(ei->out_fd, ei->dump_bdesc[0].buffer,
883 if (lseek(ei->out_fd, out_start_off, SEEK_SET) == (off_t)-1) {
893 fsync(ei->out_fd);
894 exfat_free_buffer(ei->dump_bdesc, 2);
950 if (exfat_get_blk_dev_info(&ui, &ei.bdev)) {
956 return restore_from_stdin(&ei);
958 err = read_boot_sect(&ei.bdev, &bs);
960 close(ei.bdev.dev_fd);
964 err = create_exfat2img(&ei, bs, out_path);
968 if (!ei.is_stdout) {
969 err = dump_sectors(&ei, 0, le32_to_cpu(ei.exfat->bs->bsx.clu_offset));
975 last_sect = (off_t)le32_to_cpu(ei.exfat->bs->bsx.clu_offset) +
976 (le32_to_cpu(ei.exfat->bs->bsx.clu_count) <<
977 ei.exfat->bs->bsx.sect_per_clus_bits) - 1;
978 err = dump_sectors(&ei, last_sect, last_sect + 1);
985 err = dump_root(&ei);
991 dump_filesystem(&ei);
993 if (ei.is_stdout) {
994 err = dump_header(&ei);
997 err = dump_to_stdout(&ei);
1001 err = fsync(ei.out_fd);
1006 close(ei.out_fd);
1015 free_exfat2img(&ei);