NAME
POSIX::1003::FS - POSIX for the file-system
SYNOPSIS
use POSIX::1003::FS ':access';
if(access $fn, R_OK) # $fn is readible?
use POSIX::1003::FS qw(mkfifo :stat);
mkfifo($path, S_IRUSR|S_IWUSR) or die $!;
# Absorbed from Unix::Mknod
use POSIX::1003::FS qw(mknod major minor makedev);
use File::stat
my $st = stat '/dev/null';
my $major = major $st->rdev;
my $minor = minor $st->rdev;
mknod '/tmp/special', S_IFCHR|0600, makedev($major,$minor+1);
DESCRIPTION
You may also need POSIX::1003::Pathconf.
FUNCTIONS
Standard POSIX
- access($filename, $flags)
-
Read
man filetest
before you start using this function! Use the*_OK
constants for $flags. - fnmatch( $pattern, $name, [$flags] )
-
Check whether $name matches $pattern, under control of $flags (FNM_* constants). Do always check the return value for FNM_NOMATCH (true!!!)
example:
use POSIX::1003::FS ':glob'; next if fnmatch('a*', 'ABC', FNM_CASEFOLD)==FNM_NOMATCH;
- glob($pattern|\@patterns, %options)
-
Returns a list of file and directory names which match the $pattern (or any of the @patterns), using the libc implementation of glob(). Various system shells (sh, bash, tsh, etc) use this same function with different flags. This function provides any possible combination.
BE WARNED that function returns bytes: file names are not printable strings because the encoding used for file names on disk is not defined (on UNIXes). Read more in "Filenames to string"
BE WARNED that File::Glob does not use the system's libc
glob()
, but includes the bare code of that implementation. For that reason, it'sbsd_glob()
does work on Windows and other platforms in the same way. Also,bsd_glob()
supports the non-posix '{}' syntax as BSD has. It also adapts the defaults of the flags to match the default OS behavior. On the other hand, File::Glob does not support theon_error
callback.-Option --Default flags GLOB_NOSORT|GLOB_NOESCAPE|GLOB_BRACE on_error undef unique <false>
- flags => INTEGER
-
There are many interesting flags to tune the expansion. Sorting should happen in a locale context, so there is no use having glob() do it on bytes. GLOB_APPEND will be used automatically, when needed. GLOB_DOOFFS cannot be used (not needed)
- on_error => CODE
-
What to do when an error is encountered. The CODE will be called with the path causing the problem, and the error code. When you want the search to continue, you have to return '0'. This function is not thread safe
- unique => BOOLEAN
-
When you use patterns which overlap, you may want to remove doubles. Still, this happens on bytes... there is a possibility that different byte strings display the same in utf8 space.
example:
my ($err, $fns) = glob(\@roots, flags => GLOB_NOSORT|GLOB_MARK, on_error => sub { warn "skip $_[0]: error $_[1]"; 0} )
- lchown($uid, $gid, $filenames)
-
Like
chown()
, but does not follow symlinks when encountered. Returns the number of files successfully changed.Be Warned that the POSIX specification uses different parameter order. For Perl was decided to accept a list of filenames. Passing more than one filename, however, hinders correct error reporting.
# POSIX specification: # int lchown(const char *path, uid_t owner, gid_t group); # Perl core implementation: my $successes = chown($uid, $gid, @filenames); use POSIX; POSIX::lchown($uid, $gid, $filename) or die $!; use POSIX::1003::FS 'lchown'; my @successes = lchown($uid, $gid, @filenames);
- lstat( [$fh|$fn|$dirfh] )
-
Simply
CORE::lstat()
. See also stat() - mkdir( [$filename [$mask]] )
-
Simple
CORE::mkdir()
- mkfifo($filename, $mode)
- mknod($path, $mode, $device)
-
Create a special device node on $path. Useful symbols for $mode can be collected from Fcntl (import tag
:mode
). The $device number is a combination from the type (major number), a sequence number and usage information (combined in a minor number). - rename($oldname, $newname)
-
[0.93] Give a file or directory a new name, the basis of the UNIX
mv
('move') command. This will useCORE::rename()
.Be warned that Window's
rename
implementation will fail when $newname exists. That behavior is not POSIX compliant. On many platforms (especially the older), arename
between different partitions is not allowed. - stat( [$fh|$fn|$dirfh] )
-
Simply
CORE::stat()
. See also lstat() - utime($atime, $mtime, $filenames)
-
Simply
CORE::utime()
Be Warned that
POSIX.pm
uses a different parameter order than CORE.POSIX::utime($filename, $atime, $mtime); CORE::utime($atime, $mtime, @filenames);
Additional
- S_ISBLK($mode)
- S_ISCHR($mode)
- S_ISDIR($mode)
-
example:
use File::stat 'stat'; if(S_ISDIR(stat($fn)->mode)) ... if(S_ISDIR((lstat $fn)[2])) ...
- S_ISFIFO($mode)
- S_ISLNK($mode)
- S_ISREG($mode)
- S_ISSOCK($mode)
- S_ISVTX($mode)
- S_ISWHT($mode)
- major($device)
- makedev($major, $minor)
-
Combine $major and $minor into a single DEVICE number.
my $device = (stat $filename)[6]; my $device_type = major $device; my $sequence_nr = minor $device; my $device = makedev $major, $minor; mknod $specialfile, $mode, $device;
- minor($device)
CONSTANTS
The following constants are exported, shown here with the values discovered during installation of this module. When you ask for :constants
, you get all, but they are also grouped by tag.
export tag :stat
Export stat() and lstat() including their related constants. Besides, the node related functions mkfifo(), mknod(), mkdir(), and lchown(). Also, the common S_IS*
C-level macro are provided as function.
During installation, a symbol table will get inserted here.
export tag :access
Exports function access() plus its related constants.
During installation, a symbol table will get inserted here.
export tag :glob
The glob() and fnmatch() related constants.
During installation, a symbol table will get inserted here.
SEE ALSO
This module is part of POSIX-1003 distribution version 1.00, built on May 05, 2020. Website: http://perl.overmeer.net/CPAN. The code is based on POSIX, which is released with Perl itself. See also POSIX::Util for additional functionality.
COPYRIGHTS
Copyrights 2011-2020 on the perl code and the related documentation by [Mark Overmeer]. For other contributors see ChangeLog.
This program is free software; you can redistribute it and/or modify it under the same terms as Perl itself. See http://dev.perl.org/licenses/