Commit | Line | Data |
0d1a41d9 |
1 | package DX::Lib::FS::Guts; |
2 | |
3 | use File::stat; |
4 | use File::Copy; |
5 | use Fcntl qw(O_CREAT O_WRONLY); |
6 | use POSIX qw(ENOENT); |
7 | use Moo; |
8 | |
9 | sub create_directory { |
10 | my ($self, $path, $mode) = @_; |
11 | if (defined $mode) { |
12 | my $umask = umask(0000); |
13 | mkdir($path, oct($mode)) |
14 | or do { umask($umask); die "Couldn't mkdir ${path}: $!" }; |
15 | umask($umask); |
16 | } else { |
17 | mkdir($path) or die "Couldn't mkdir ${path}: $!"; |
18 | } |
19 | return; |
20 | } |
21 | |
22 | sub create_file { |
23 | my ($self, $path, $mode, $data) = @_; |
24 | my $fh; |
25 | if (defined $mode) { |
26 | my $umask = umask(0000); |
27 | sysopen( |
28 | $fh, $path, O_CREAT | O_WRONLY, oct($mode) |
29 | ) or do { umask($umask); die "Couldn't create ${path}: $!" }; |
30 | umask($umask); |
31 | } else { |
32 | sysopen($fh, $path, O_CREAT | O_WRONLY) |
33 | or die "Couldn't create ${path}: $!"; |
34 | } |
35 | print $fh $data if length($data); |
36 | return; |
37 | } |
38 | |
39 | sub set_path_mode { |
40 | my ($self, $path, $mode) = @_; |
41 | chmod oct($mode), $path |
42 | or die "Failed to chmod ${path} to ${mode}: $!"; |
43 | return; |
44 | } |
45 | |
46 | sub rewrite_file { |
47 | my ($self, $path, $final_content) = @_; |
48 | my $stat = stat($path) or die "Couldn't stat ${path}: $!"; |
49 | my $perms = $stat->mode & 07777; |
50 | my $new = $path.'.new'; |
51 | unlink($new); |
52 | sysopen my $fh, $new, O_CREAT | O_WRONLY, $perms |
53 | or die "Couldn't open ${new}: $!"; |
54 | print $fh $final_content |
55 | or die "Couldn't write data to ${new}: $!"; |
56 | close $fh; |
57 | move($new, $path) or die "Couldn't install ${new}: $!"; |
58 | return; |
59 | } |
60 | |
61 | sub path_status_info { |
62 | my ($self, $path) = @_; |
63 | if (my $stat = stat($path)) { |
64 | return +{ |
65 | is_directory => -d _, |
66 | is_file => -f _, |
67 | mode => sprintf("%04o", ($stat->mode & 07777)) |
68 | }; |
69 | } elsif ($! == ENOENT) { |
70 | return undef; |
71 | } else { |
72 | die "Couldn't stat ${path}: $!"; |
73 | } |
74 | } |
75 | |
76 | sub file_content { |
77 | my ($self, $path) = @_; |
78 | return undef unless -e $path; |
79 | my $data = do { |
80 | open my $fh, '<', $path or die "Couldn't open ${path}: $!"; |
81 | local $/; |
82 | readline($fh) |
83 | }; |
84 | return $data; |
85 | } |
86 | |
87 | 1; |