From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: <pve-devel-bounces@lists.proxmox.com> Received: from firstgate.proxmox.com (firstgate.proxmox.com [IPv6:2a01:7e0:0:424::9]) by lore.proxmox.com (Postfix) with ESMTPS id 7B7771FF176 for <inbox@lore.proxmox.com>; Fri, 7 Feb 2025 15:04:32 +0100 (CET) Received: from firstgate.proxmox.com (localhost [127.0.0.1]) by firstgate.proxmox.com (Proxmox) with ESMTP id DD89BCC7E; Fri, 7 Feb 2025 15:04:20 +0100 (CET) From: Max Carrara <m.carrara@proxmox.com> To: pve-devel@lists.proxmox.com Date: Fri, 7 Feb 2025 15:03:54 +0100 Message-Id: <20250207140355.280472-12-m.carrara@proxmox.com> X-Mailer: git-send-email 2.39.5 In-Reply-To: <20250207140355.280472-1-m.carrara@proxmox.com> References: <20250207140355.280472-1-m.carrara@proxmox.com> MIME-Version: 1.0 X-SPAM-LEVEL: Spam detection results: 0 AWL 0.070 Adjusted score from AWL reputation of From: address BAYES_00 -1.9 Bayes spam probability is 0 to 1% DMARC_MISSING 0.1 Missing DMARC policy KAM_DMARC_STATUS 0.01 Test Rule for DKIM or SPF Failure with Strict Alignment SPF_HELO_NONE 0.001 SPF: HELO does not publish an SPF Record SPF_PASS -0.001 SPF: sender matches SPF record Subject: [pve-devel] [PATCH v4 pve-common 11/12] introduce PVE::Filesystem X-BeenThere: pve-devel@lists.proxmox.com X-Mailman-Version: 2.1.29 Precedence: list List-Id: Proxmox VE development discussion <pve-devel.lists.proxmox.com> List-Unsubscribe: <https://lists.proxmox.com/cgi-bin/mailman/options/pve-devel>, <mailto:pve-devel-request@lists.proxmox.com?subject=unsubscribe> List-Archive: <http://lists.proxmox.com/pipermail/pve-devel/> List-Post: <mailto:pve-devel@lists.proxmox.com> List-Help: <mailto:pve-devel-request@lists.proxmox.com?subject=help> List-Subscribe: <https://lists.proxmox.com/cgi-bin/mailman/listinfo/pve-devel>, <mailto:pve-devel-request@lists.proxmox.com?subject=subscribe> Reply-To: Proxmox VE development discussion <pve-devel@lists.proxmox.com> Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: 7bit Errors-To: pve-devel-bounces@lists.proxmox.com Sender: "pve-devel" <pve-devel-bounces@lists.proxmox.com> The PVE::Filesystem module implements filesystem manipulation operations. Currently, this is limited to two wrapper functions, but in the future anything that concernts itself with altering the filesystem should be added to it. This module can be seen as the "complement" to PVE::Path -- while PVE::Path doesn't ever alter the filesystem, PVE::Filesystem does, as the name implies. This is done in order to clearly separate concerns. Signed-off-by: Max Carrara <m.carrara@proxmox.com> --- Changes v3 --> v4: * add missing "1;" at the bottom of the module - Thanks to Fiona for noticing! Changes v2 --> v3: * None Changes v1 --> v2: * None src/Makefile | 1 + src/PVE/Filesystem.pm | 79 +++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 80 insertions(+) create mode 100644 src/PVE/Filesystem.pm diff --git a/src/Makefile b/src/Makefile index 25bc490..20a0988 100644 --- a/src/Makefile +++ b/src/Makefile @@ -16,6 +16,7 @@ LIB_SOURCES = \ CpuSet.pm \ Daemon.pm \ Exception.pm \ + Filesystem.pm \ Format.pm \ INotify.pm \ JSONSchema.pm \ diff --git a/src/PVE/Filesystem.pm b/src/PVE/Filesystem.pm new file mode 100644 index 0000000..d08d6e1 --- /dev/null +++ b/src/PVE/Filesystem.pm @@ -0,0 +1,79 @@ +=head1 NAME + +C<PVE::Filesystem> - Utilities related to filesystem manipulations + +=head1 DESCRIPTION + +This module implements utilities for manipulating the filesystem. Like +L<C<PVE::Path>>, this module exists to address certain shortcomings of the Perl +core modules without relying on third-party solutions / abstractions. + +=cut + +package PVE::Filesystem; + +use strict; +use warnings; + +use Carp qw(carp croak confess); +use Cwd (); + +use Exporter qw(import); + +our @EXPORT_OK = qw( + fs_cwd + fs_canonicalize +); + +=head2 FUNCTIONS + +=cut + +=head3 fs_getcwd() + +Wrapper for C<L<< getcwd()|Cwd/getcwd >>>. + +Returns the absolute form of the current working directory. + +Unlike the original C<L<< getcwd()|Cwd/getcwd >>>, an exception is thrown if an +error occurs instead of setting C<$!>. + +=cut + +sub fs_getcwd : prototype() { + my $cwd = Cwd::getcwd(); + + croak "failed to get current working directory: $!" if !defined($cwd); + + return $cwd; +} + +=head3 fs_canonicalize($path) + +Wrapper for C<L<< abs_path()|Cwd/abs_path >>>. + +Returns the canonical, absolute form of the given path with all logical +components normalized and symlinks resolved. + +B<Note:> This requires the path to exist on the filesystem. If you want to +avoid that, use C<L<< path_normalize()|PVE::Path/"path_normalize($path)" >>> +instead. + +Unlike the original C<L<< abs_path()|Cwd/abs_path >>>, an exception is thrown +if an error occurs instead of setting C<$!>. + +=cut + +sub fs_canonicalize : prototype($) { + my ($path) = @_; + + croak "\$path is undef" if !defined($path); + + my $canonicalized_path = Cwd::abs_path($path); + + croak "failed to canonicalize path: $!" if !defined($canonicalized_path); + + return $canonicalized_path; +} + +1; -- 2.39.5 _______________________________________________ pve-devel mailing list pve-devel@lists.proxmox.com https://lists.proxmox.com/cgi-bin/mailman/listinfo/pve-devel