Init data reader for Files
Fixed File.Size() Don't use extractor for small files
This commit is contained in:
+21
-5
@@ -40,7 +40,7 @@ pub const File = struct {
|
|||||||
const name = try rdr.alloc.alloc(u8, ent.name.len);
|
const name = try rdr.alloc.alloc(u8, ent.name.len);
|
||||||
errdefer rdr.alloc.free(name);
|
errdefer rdr.alloc.free(name);
|
||||||
@memcpy(name, ent.name);
|
@memcpy(name, ent.name);
|
||||||
return .{
|
var out: File = .{
|
||||||
.name = name,
|
.name = name,
|
||||||
.inode = try .init(
|
.inode = try .init(
|
||||||
rdr.alloc,
|
rdr.alloc,
|
||||||
@@ -48,6 +48,13 @@ pub const File = struct {
|
|||||||
rdr.super.block_size,
|
rdr.super.block_size,
|
||||||
),
|
),
|
||||||
};
|
};
|
||||||
|
switch (out.inode.header.inode_type) {
|
||||||
|
.file, .ext_file => {
|
||||||
|
out.data_rdr = try .init(&out, rdr);
|
||||||
|
},
|
||||||
|
else => {},
|
||||||
|
}
|
||||||
|
return out;
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn deinit(self: *File, alloc: std.mem.Allocator) void {
|
pub fn deinit(self: *File, alloc: std.mem.Allocator) void {
|
||||||
@@ -155,11 +162,11 @@ pub const File = struct {
|
|||||||
}
|
}
|
||||||
|
|
||||||
pub fn size(self: File) u64 {
|
pub fn size(self: File) u64 {
|
||||||
switch (self.inode.data) {
|
return switch (self.inode.data) {
|
||||||
.file => |f| f.size,
|
.file => |f| f.size,
|
||||||
.ext_file => |f| f.size,
|
.ext_file => |f| f.size,
|
||||||
else => 0,
|
else => 0,
|
||||||
}
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
/// If the file is a normal file, reads it's data.
|
/// If the file is a normal file, reads it's data.
|
||||||
@@ -255,19 +262,28 @@ pub const File = struct {
|
|||||||
@memcpy(extr_path, real_path);
|
@memcpy(extr_path, real_path);
|
||||||
}
|
}
|
||||||
defer rdr.alloc.free(extr_path);
|
defer rdr.alloc.free(extr_path);
|
||||||
var ext = try self.extractor(rdr);
|
|
||||||
defer ext.deinit();
|
|
||||||
var fil = fs.cwd().createFile(extr_path, .{}) catch |err| {
|
var fil = fs.cwd().createFile(extr_path, .{}) catch |err| {
|
||||||
if (config.verbose)
|
if (config.verbose)
|
||||||
std.log.err("error creating file {s}: {any}", .{ extr_path, err });
|
std.log.err("error creating file {s}: {any}", .{ extr_path, err });
|
||||||
return err;
|
return err;
|
||||||
};
|
};
|
||||||
defer fil.close();
|
defer fil.close();
|
||||||
|
if (self.size() > rdr.super.block_size) {
|
||||||
|
var ext = try self.extractor(rdr);
|
||||||
|
defer ext.deinit();
|
||||||
ext.writeToFile(pool, &fil) catch |err| {
|
ext.writeToFile(pool, &fil) catch |err| {
|
||||||
if (config.verbose)
|
if (config.verbose)
|
||||||
std.log.err("error writing file {s}: {any}", .{ self.name, err });
|
std.log.err("error writing file {s}: {any}", .{ self.name, err });
|
||||||
return err;
|
return err;
|
||||||
};
|
};
|
||||||
|
} else {
|
||||||
|
var buf = [1]u8{0} ** 8192;
|
||||||
|
var total_red: u64 = 0;
|
||||||
|
while (total_red < self.size()) {
|
||||||
|
const red = try self.read(&buf);
|
||||||
|
total_red += red;
|
||||||
|
}
|
||||||
|
}
|
||||||
},
|
},
|
||||||
.sym, .ext_sym => {
|
.sym, .ext_sym => {
|
||||||
//TODO: unbreak symlinks & dereference symlinks
|
//TODO: unbreak symlinks & dereference symlinks
|
||||||
|
|||||||
Reference in New Issue
Block a user