summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorjake <jake@jakes-mail.top>2023-10-26 01:39:30 -0400
committerjake <jake@jakes-mail.top>2023-10-26 01:39:30 -0400
commitccaa1bdfa70ddc1587b519420e37f7689081bb58 (patch)
tree2358bf588314d2ae4e38499a73077b236bccd386
GIT THISHEADmaster
-rw-r--r--Changes21
-rw-r--r--MANIFEST9
-rw-r--r--META.yml10
-rw-r--r--Makefile.PL19
-rw-r--r--Mknod.xs45
-rw-r--r--README86
-rw-r--r--lib/Unix/Mknod.pm162
-rw-r--r--t/Unix-Mknod.t72
-rw-r--r--typemap2
9 files changed, 426 insertions, 0 deletions
diff --git a/Changes b/Changes
new file mode 100644
index 0000000..7185337
--- /dev/null
+++ b/Changes
@@ -0,0 +1,21 @@
+Revision history for Perl extension Unix::Mknod.
+
+0.05 Thu Oct 26 01:32:27 AM EDT 2023
+ - Make it work by adding patch that was in the comment for years.
+
+0.04 Sat Dec 22 22:26:48 CST 2007
+ - Update Copyright for 2008
+ - Ignore make test running as non-root, for cpan compilance.
+ - More documentation fixes (pointed out by Bryan Henderson).
+
+0.03 Wed May 10 11:50:45 2006
+ - Documentation fixes (pointed out by Brian Finley finley at anl.gov)
+
+0.02 Sun Jun 19 20:01:16 2005
+ - Renamed package Unix::Mknod
+ - Cleaned up the make test cases
+
+0.01 Sun Jun 19 20:01:16 2005
+ - original version; created by h2xs 1.23 with options
+ -b 5.6.0 -A -n Sys::Mknod2
+
diff --git a/MANIFEST b/MANIFEST
new file mode 100644
index 0000000..5b52742
--- /dev/null
+++ b/MANIFEST
@@ -0,0 +1,9 @@
+Changes
+Makefile.PL
+MANIFEST
+Mknod.xs
+README
+t/Unix-Mknod.t
+typemap
+lib/Unix/Mknod.pm
+META.yml Module meta-data (added by MakeMaker)
diff --git a/META.yml b/META.yml
new file mode 100644
index 0000000..f4534bc
--- /dev/null
+++ b/META.yml
@@ -0,0 +1,10 @@
+# http://module-build.sourceforge.net/META-spec.html
+#XXXXXXX This is a prototype!!! It will change in the future!!! XXXXX#
+name: Unix-Mknod
+version: 0.05
+version_from: lib/Unix/Mknod.pm
+installdirs: site
+requires:
+
+distribution_type: module
+generated_by: ExtUtils::MakeMaker version 6.17
diff --git a/Makefile.PL b/Makefile.PL
new file mode 100644
index 0000000..f0fe012
--- /dev/null
+++ b/Makefile.PL
@@ -0,0 +1,19 @@
+use 5.006;
+use ExtUtils::MakeMaker;
+use Config(%Config);
+
+$defines= '-DHAS_SYSMKDEV'
+ if ($Config{osname} eq 'solaris');
+$defines= '-DHAS_SYSSYSMACROS'
+ if (defined $Config{d_gnulibc});
+
+# See lib/ExtUtils/MakeMaker.pm for details of how to influence
+# the contents of the Makefile that is written.
+WriteMakefile(
+ NAME => 'Unix::Mknod',
+ VERSION_FROM => 'lib/Unix/Mknod.pm', # finds $VERSION
+ ($] >= 5.005 ? ## Add these new keywords supported since 5.005
+ (ABSTRACT_FROM => 'lib/Unix/Mknod.pm', # retrieve abstract from module
+ AUTHOR => 'Jim Pirzyk <pirzyk@uiuc.edu>') : ()),
+ DEFINE => $defines
+);
diff --git a/Mknod.xs b/Mknod.xs
new file mode 100644
index 0000000..263614e
--- /dev/null
+++ b/Mknod.xs
@@ -0,0 +1,45 @@
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#include "EXTERN.h"
+#include "perl.h"
+#include "XSUB.h"
+#include <unistd.h>
+#include <sys/types.h>
+
+#ifdef HAS_SYSMKDEV
+#include <sys/mkdev.h>
+#endif
+#ifdef HAS_SYSSYSMACROS
+#include <sys/sysmacros.h>
+#endif
+
+#ifdef __cplusplus
+}
+#endif
+
+MODULE = Unix::Mknod PACKAGE = Unix::Mknod
+
+dev_t
+major(dev_t dev)
+ PROTOTYPE: $
+
+dev_t
+minor(dev_t dev)
+ PROTOTYPE: $
+
+dev_t
+makedev(dev_t major, dev_t minor)
+ PROTOTYPE: $;$
+
+int
+mknod(filename, mode, dev)
+ char * filename
+ mode_t mode
+ dev_t dev
+ CODE:
+ TAINT_PROPER("mknod");
+ RETVAL = mknod(filename, mode, dev);
+ OUTPUT:
+ RETVAL
diff --git a/README b/README
new file mode 100644
index 0000000..8204166
--- /dev/null
+++ b/README
@@ -0,0 +1,86 @@
+Unix-Mknod version 0.05
+=======================
+
+This module allows access to the device routines major()/minor()/makedev()
+that may or may not be macros in .h files.
+
+It also allows access to the mknod system call.
+
+0.05 adds a patch that was sitting in the comment/issues page on metacpan.
+
+NOTES
+
+There are 2 other perl modules that implement the mknod(2) system call,
+but they have problems working on some platforms. Sys::Mknod does not
+work on AIX because it uses the syscall(2) generic system call which
+AIX does not have. Mknod implements S_IFIFO, which on most platforms
+is not implemented in mknod, but rather mkfifo (which is implemented
+in POSIX perl module).
+
+The perl module File::Stat::Bits also implements major() and minor() (and
+a version of makedev() called dev_join). They are done as a program to
+get the bit masks at compile time, but if major() and minor() are
+implemented as sub routines, the arugment could be something as simple
+as an index to a lookup table (and thereby having no decernable relation
+to its result).
+
+INSTALLATION
+
+To install this module type the following:
+
+ perl Makefile.PL
+ make
+ make test
+ make install
+
+PLATFORMS
+
+This module has been tested out and verified on the following platforms:
+
+FreeBSD-5.4-STABLE
+Mac OS X 10.3.9
+Solaris 8, 9, 10
+RedHat Linux EL 4.1
+AIX 4.3.3, 5.1
+
+
+DEPENDENCIES
+
+This module does not require any other modules or libraries.
+
+COPYRIGHT AND LICENCE
+
+Copyright (c) 2005-2008 University of Illinois Board of Trustees
+All rights reserved.
+
+Developed by: Campus Information Technologies and Educational Services,
+ University of Illinois at Urbana-Champaign
+
+Permission is hereby granted, free of charge, to any person obtaining
+a copy of this software and associated documentation files (the
+``Software''), to deal with the Software without restriction, including
+without limitation the rights to use, copy, modify, merge, publish,
+distribute, sublicense, and/or sell copies of the Software, and to
+permit persons to whom the Software is furnished to do so, subject to
+the following conditions:
+
+* Redistributions of source code must retain the above copyright
+ notice, this list of conditions and the following disclaimers.
+
+* Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimers in the
+ documentation and/or other materials provided with the distribution.
+
+* Neither the names of Campus Information Technologies and Educational
+ Services, University of Illinois at Urbana-Champaign, nor the names
+ of its contributors may be used to endorse or promote products derived
+ from this Software without specific prior written permission.
+
+THE SOFTWARE IS PROVIDED ``AS IS'', WITHOUT WARRANTY OF ANY KIND,
+EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
+IN NO EVENT SHALL THE CONTRIBUTORS OR COPYRIGHT HOLDERS BE LIABLE FOR
+ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
+TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE
+OR THE USE OR OTHER DEALINGS WITH THE SOFTWARE.
+
diff --git a/lib/Unix/Mknod.pm b/lib/Unix/Mknod.pm
new file mode 100644
index 0000000..a158ebe
--- /dev/null
+++ b/lib/Unix/Mknod.pm
@@ -0,0 +1,162 @@
+package Unix::Mknod;
+
+use 5.006;
+use strict;
+use warnings;
+
+require Exporter;
+
+our @ISA = qw(Exporter);
+
+# Items to export into callers namespace by default. Note: do not export
+# names by default without a very good reason. Use EXPORT_OK instead.
+# Do not simply export all your public functions/methods/constants.
+
+# This allows declaration use Unix::Mknod qw(:all);
+# If you do not need this, moving things directly into @EXPORT or @EXPORT_OK
+# will save memory.
+our %EXPORT_TAGS = ( 'all' => [ qw(
+ mknod major minor makedev
+) ] );
+
+our @EXPORT_OK = ( @{ $EXPORT_TAGS{'all'} });
+
+our @EXPORT = qw(
+
+);
+
+our $VERSION = '0.05';
+
+require XSLoader;
+XSLoader::load('Unix::Mknod', $VERSION);
+
+1;
+__END__
+
+=head1 NAME
+
+Unix::Mknod - Perl extension for mknod, major, minor, and makedev
+
+=head1 SYNOPSIS
+
+ use Unix::Mknod qw(:all);
+ use File::stat;
+ use Fcntl qw(:mode);
+
+ $st=stat('/dev/null');
+ $major=major($st->rdev);
+ $minor=minor($st->rdev);
+
+ mknod('/tmp/special', S_IFCHR|0600, makedev($major,$minor+1));
+
+=head1 DESCRIPTION
+
+This module allows access to the device routines major()/minor()/makedev()
+that may or may not be macros in .h files.
+
+0.05 adds a fix that was in the comments for several years.
+
+(Easy install would be to 'git clone'/aquire this source and `cpanm .` in the appropriate directory)
+
+It also allows access to the C<mknod(2)> system call.
+
+=head1 FUNCTIONS
+
+=over 4
+
+=item I<mknod($filename, $mode, $rdev)>
+
+Creates a block or character device special file named I<$filename>.
+Must be run as a privileged user, usually I<root>. Returns 0 on success
+and -1 on failure, like C<POSIX::mkfifo> does.
+
+=item I<$major = major($rdev)>
+
+Returns the major number for the device special file as defined by the
+st_rdev field from the C<stat(3)> call.
+
+=item I<$minor = minor($rdev)>
+
+Returns the minor number for the device special file as defined by the
+st_rdev field from the C<stat(3)> call.
+
+=item I<$rdev = makedev($major, $minor)>
+
+Returns the st_rdev number for the device special file from the I<$major>
+and I<$minor> numbers.
+
+=back
+
+=head1 NOTES
+
+There are 2 other perl modules that implement the C<mknod(2)> system call,
+but they have problems working on some platforms. C<Sys::Mknod> does not
+work on AIX because it uses the C<syscall(2)> generic system call which
+AIX does not have. C<Mknod> implements S_IFIFO, which on most platforms
+is not implemented in C<mknod(1)>, but rather C<mkfifo(1)> (which is
+implemented in POSIX perl module).
+
+The perl module C<File::Stat::Bits> also implements major() and minor() (and
+a version of makedev() called dev_join). They are done as a program to
+get the bit masks at compile time, but if major() and minor() are
+implemented as sub routines, the arugment could be something as simple
+as an index to a lookup table (and thereby having no decernable relation
+to its result).
+
+=head1 BUGS
+
+Running C<make test> as non root will not truly test the functions, as in
+most UNIX like OSes, C<mknod(2)> needs to be invoked by a privelaged user,
+usually I<root>.
+
+=head1 SEE ALSO
+
+C<$ERRNO> or C<$!> for the specific error message.
+
+L<File::Stat::Bits>, L<Mknod>, L<POSIX>, L<Sys::Mknod>
+
+C<major(9)>, C<minor(9)>, C<mkfifo(1)>, C<mknod(8)>
+
+ftp://ftp-dev.cites.uiuc.edu/pub/Unix-Mknod
+
+=head1 AUTHOR
+
+Jim Pirzyk, E<lt>pirzyk@uiuc.eduE<gt>
+
+=head1 COPYRIGHT AND LICENSE
+
+Copyright (c) 2005-2008 University of Illinois Board of Trustees
+All rights reserved.
+
+Developed by: Campus Information Technologies and Educational Services,
+ University of Illinois at Urbana-Champaign
+
+Permission is hereby granted, free of charge, to any person obtaining
+a copy of this software and associated documentation files (the
+``Software''), to deal with the Software without restriction, including
+without limitation the rights to use, copy, modify, merge, publish,
+distribute, sublicense, and/or sell copies of the Software, and to
+permit persons to whom the Software is furnished to do so, subject to
+the following conditions:
+
+* Redistributions of source code must retain the above copyright
+ notice, this list of conditions and the following disclaimers.
+
+* Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimers in the
+ documentation and/or other materials provided with the distribution.
+
+* Neither the names of Campus Information Technologies and Educational
+ Services, University of Illinois at Urbana-Champaign, nor the names
+ of its contributors may be used to endorse or promote products derived
+ from this Software without specific prior written permission.
+
+THE SOFTWARE IS PROVIDED ``AS IS'', WITHOUT WARRANTY OF ANY KIND,
+EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
+IN NO EVENT SHALL THE CONTRIBUTORS OR COPYRIGHT HOLDERS BE LIABLE FOR
+ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
+TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE
+OR THE USE OR OTHER DEALINGS WITH THE SOFTWARE.
+
+=cut
diff --git a/t/Unix-Mknod.t b/t/Unix-Mknod.t
new file mode 100644
index 0000000..66c540d
--- /dev/null
+++ b/t/Unix-Mknod.t
@@ -0,0 +1,72 @@
+# Before `make install' is performed this script should be runnable with
+# `make test'. After `make install' it should work as `perl Unix-Mknod.t'
+
+#########################
+
+# change 'tests => 1' to 'tests => last_test_to_print';
+
+use Test;
+BEGIN { plan tests => 11 };
+use Unix::Mknod qw(:all);
+use Fcntl qw(:mode);
+use File::stat;
+
+$file='/tmp/special';
+
+#########################
+
+# Check to make sure major maps back to itself
+ok(major(makedev(10,2)), 10);
+
+# Same with minor
+ok(minor(makedev(7,5)), 5);
+
+# Check that makedev does as well, using the rdev from /dev/null
+my ($st)=stat('/dev/null');
+ok(makedev(major($st->rdev), minor($st->rdev)), $st->rdev);
+
+# Can only run mknod if we are root
+skip (
+ ($< != 0? "Test needs to be run as root": 0),
+ mknod($file, S_IFCHR|0600, makedev(1,2)),
+ 0
+);
+
+$st=stat($file);
+skip (
+ ($< != 0? "Test needs to be run as root": 0),
+ defined($st) && &S_ISCHR($st->mode)
+);
+skip (
+ ($< != 0? "Test needs to be run as root": 0),
+ defined($st) && !&S_ISBLK($st->mode)
+);
+skip(
+ ($< != 0? "Test needs to be run as root": 0),
+ defined($st) && ($st->mode & S_IRUSR|S_IWUSR)
+);
+unlink $file
+ if ( -e $file);
+
+skip (
+ ($< != 0? "Test needs to be run as root": 0),
+ mknod($file, S_IFBLK|0600, makedev(1,2)),
+ 0
+);
+$st=stat($file);
+skip (
+ ($< != 0? "Test needs to be run as root": 0),
+ defined($st) && &S_ISBLK($st->mode)
+);
+skip (
+ ($< != 0? "Test needs to be run as root": 0),
+ defined($st) && !&S_ISCHR($st->mode)
+);
+skip (
+ ($< != 0? "Test needs to be run as root": 0),
+ defined($st) && ($st->mode & S_IRUSR|S_IWUSR)
+);
+
+unlink $file
+ if ( -e $file);
+
diff --git a/typemap b/typemap
new file mode 100644
index 0000000..b992a12
--- /dev/null
+++ b/typemap
@@ -0,0 +1,2 @@
+mode_t T_UV
+dev_t T_UV