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