From ccaa1bdfa70ddc1587b519420e37f7689081bb58 Mon Sep 17 00:00:00 2001 From: jake Date: Thu, 26 Oct 2023 01:39:30 -0400 Subject: GIT THIS --- Changes | 21 +++++++ MANIFEST | 9 +++ META.yml | 10 ++++ Makefile.PL | 19 +++++++ Mknod.xs | 45 +++++++++++++++ README | 86 +++++++++++++++++++++++++++++ lib/Unix/Mknod.pm | 162 ++++++++++++++++++++++++++++++++++++++++++++++++++++++ t/Unix-Mknod.t | 72 ++++++++++++++++++++++++ typemap | 2 + 9 files changed, 426 insertions(+) create mode 100644 Changes create mode 100644 MANIFEST create mode 100644 META.yml create mode 100644 Makefile.PL create mode 100644 Mknod.xs create mode 100644 README create mode 100644 lib/Unix/Mknod.pm create mode 100644 t/Unix-Mknod.t create mode 100644 typemap 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 ') : ()), + 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 +#include + +#ifdef HAS_SYSMKDEV +#include +#endif +#ifdef HAS_SYSSYSMACROS +#include +#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 system call. + +=head1 FUNCTIONS + +=over 4 + +=item I + +Creates a block or character device special file named I<$filename>. +Must be run as a privileged user, usually I. Returns 0 on success +and -1 on failure, like C 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 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 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 system call, +but they have problems working on some platforms. C does not +work on AIX because it uses the C generic system call which +AIX does not have. C implements S_IFIFO, which on most platforms +is not implemented in C, but rather C (which is +implemented in POSIX perl module). + +The perl module C 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 as non root will not truly test the functions, as in +most UNIX like OSes, C needs to be invoked by a privelaged user, +usually I. + +=head1 SEE ALSO + +C<$ERRNO> or C<$!> for the specific error message. + +L, L, L, L + +C, C, C, C + +ftp://ftp-dev.cites.uiuc.edu/pub/Unix-Mknod + +=head1 AUTHOR + +Jim Pirzyk, Epirzyk@uiuc.eduE + +=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 -- cgit v1.2.3