File Coverage

blib/lib/Sys/Mknod.pm
Criterion Covered Total %
statement 14 27 51.8
branch 0 12 0.0
condition n/a
subroutine 5 7 71.4
pod n/a
total 19 46 41.3


line stmt bran cond sub pod time code
1             =head1 NAME
2              
3             Sys::Mknod - make special files
4              
5             =head1 SYNOPSIS
6              
7             use Sys::Mknod;
8              
9             mknod ("/dev/filename", type, $major, $minor, $mode);
10             mkfifo ("filename", $mode);
11              
12             =head1 DESCRIPTION
13              
14             mknod - creates special files. Why use system() when you can use
15             syscall()?
16              
17             $mode is the resultant file mode, and defaults to 0666. It does not
18             override your umask.
19              
20             =head1 SPECIAL FILE TYPES
21              
22             $type must be one of:
23              
24             =over 4
25              
26             =item m/^c/i
27              
28             Creates a "Character Special" device.
29              
30             =item m/^b/i
31              
32             Creates a "Block Special" device"
33              
34             =back
35              
36             =cut
37              
38             package Sys::Mknod;
39              
40 1     1   902 use 5.006;
  1         4  
  1         41  
41 1     1   6 use strict;
  1         3  
  1         36  
42 1     1   29 use warnings;
  1         2  
  1         97  
43              
44             require Exporter;
45             our @ISA = qw(Exporter);
46              
47             # OK, so the overhead of interpreting these files pretty much
48             # obliviates the beneifit of avoiding a system(). See if I care.
49             {
50             local $^W = 0;
51             require "sys/sysmacros.ph";
52             require "sys/types.ph";
53             require "sys/syscall.ph";
54             }
55 1     1   5 use Fcntl qw(S_IFCHR S_IFIFO S_IFBLK);
  1         2  
  1         485  
56              
57             # I'm exporting all these functions for DWIM's sake.
58             our @EXPORT = qw(mknod mkfifo);
59              
60             our $VERSION = '0.02';
61              
62             # Preloaded methods go here.
63              
64             sub mknod($$$$;$) {
65 0     0   0 my ($filename, $type, $major, $minor, $mode) = (@_);
66              
67 0 0       0 $mode = 0666 unless defined $mode;
68              
69 0 0       0 if ($type =~ m/^b/i) {
    0          
    0          
70 0         0 $mode |= S_IFBLK;
71             } elsif ($type =~ m/^c/i) {
72 0         0 $mode |= S_IFCHR;
73             } elsif ($type =~ m/^f/i) {
74 0         0 $mode |= S_IFIFO;
75             } else {
76 0         0 croak ("Invalid special file type `$type'");
77             }
78              
79 0 0       0 my $return = syscall( &SYS_mknod, $filename, $mode,
80             ( defined $major
81             ? makedev($major, $minor)
82             : 0 ) );
83 0 0       0 if ($return < 0) {
84 0         0 die $!;
85             } else {
86 0         0 return 1;
87             }
88             }
89              
90             sub mkfifo($;$) {
91 0     0   0 my ($filename, $mode) = (@_);
92              
93 0         0 mknod($filename, "fifo", undef, undef, $mode);
94              
95             }
96              
97             sub make_dev($$) {
98 1     1   760 my ($major, $minor) = (@_);
99 1         14 return makedev($major, $minor);
100             }
101              
102             1;
103             __END__