ViewVC Help
View File | Revision Log | Show Annotations | Download File
/cvs/Linux-NBD/lib/Linux/NBD.pm
Revision: 1.9
Committed: Sun Nov 21 03:24:38 2010 UTC (15 years, 10 months ago) by root
Branch: MAIN
CVS Tags: rel-1_0, HEAD
Changes since 1.8: +1 -1 lines
Log Message:
1.0

File Contents

# User Rev Content
1 root 1.1 =head1 NAME
2    
3     Linux::NBD - interface to the linux network block device.
4    
5     =head1 SYNOPSIS
6    
7 root 1.3 # Kernel 2.4+ is required
8 root 1.1 use Linux::NBD;
9    
10     =head1 DESCRIPTION
11    
12     See L<Linux::NBD::Client> and L<Linux::NBD::Server>, or no, better idea:
13     use the source :)
14 root 1.3
15     NOTICE: Only the Linux 2.4 and newer nbd device is supported by this
16     module. For older kernels you are on your own.
17 root 1.1
18     =head1 FUNCTIONS
19    
20     =over 4
21    
22     =cut
23    
24     package Linux::NBD;
25    
26     BEGIN {
27 root 1.9 $VERSION = '1.0';
28 root 1.1
29     require XSLoader;
30     XSLoader::load Linux::NBD, $VERSION;
31     }
32    
33     use Socket;
34    
35     =item ($a, $b) = tcp_socketpair;
36    
37     Creates a pair of interconnected tcp sockets, which is extremely ugly, so be
38     happy that this function exists.
39    
40     =cut
41    
42     sub tcp_socketpair {
43     open my $fh, "</dev/urandom" or die "/dev/urandom: $!";
44    
45     # this works by creating a listening socket
46     # and connect to it, then exchange a 256 bit random cookie
47     # to authentify.
48     # the server is created first, and thus cannot be spoofed. i think.
49     while () {
50     socket my $a, PF_INET, SOCK_STREAM, 0 or die "tcp_socketpair/socket: $!";
51     bind $a, sockaddr_in (0, inet_aton "127.0.0.1") or die "tcp_socketpair/bind $!";
52     listen $a, 1 or die "tcp_socketpair/listen $!";
53     socket my $b, PF_INET, SOCK_STREAM, 0 or die "tcp_socketpair/socket: $!";
54     connect $b, getsockname $a or die "tcp_socketpair/connect: $!";
55     accept $a, $a or die "tcp_socketpair/accept: $!";
56    
57     sysread $fh, (my $rand), 32;
58     syswrite $b, $rand or die "tcp_socketpair/write_cookie: $!";
59     sysread $a, (my $cookie), 32 or die "tcp_socketpair/read_cookie: $!";
60    
61     return ($a, $b) if $rand eq $cookie;
62     }
63     }
64    
65     1;
66    
67     =back
68    
69     =head1 AUTHOR
70    
71 root 1.6 Marc Lehmann <schmorp@schmorp.de>
72     http://home.schmorp.de/
73 root 1.1
74     =cut
75