summaryrefslogtreecommitdiff
path: root/gnu/usr.sbin/sendmail/contrib/socketmapClient.pl
blob: 4b72b76c44fca17ec6ef62cfaac91fa5383a0cf0 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
#!/usr/bin/perl -w
#
# Contributed by Bastiaan Bakker for SOCKETMAP
# $Sendmail: socketmapClient.pl,v 1.1 2003/05/21 15:36:33 ca Exp $

use strict;
use IO::Socket;

die "usage: $0 <connection> <mapname> <key> [<key2> ...]" if (@ARGV < 3);

my $connection = shift @ARGV;
my $mapname = shift @ARGV;

my $sock;

if ($connection =~ /tcp:(.+):([0-9]*)/) {
    $sock = new IO::Socket::INET (
				  PeerAddr => $1,
				  PeerPort => $2,
				  Proto => 'tcp',
				  );
} elsif ($connection =~ /((unix)|(local)):(.+)/) {
    $sock = new IO::Socket::UNIX (
				  Type => SOCK_STREAM,
				  Peer => $4
				  );
} else {
    die "unrecognized connection specification $connection";
}

die "Could not create socket: $!\n" unless $sock;

while(my $key = shift @ARGV) {
    my $request = "$mapname $key";
    netstringWrite($sock, $request);
    $sock->flush();
    my $response = netstringRead($sock);

    print "$key => $response\n";
}

$sock->close();

sub netstringWrite {
    my $sock = shift;
    my $data = shift;

    print $sock length($data).':'.$data.',';
}

sub netstringRead {
    my $sock = shift;
    my $saveSeparator = $/;
    $/ = ':';
    my $dataLength = <$sock>;
    die "cannot read netstring length" unless defined($dataLength);
    chomp $dataLength;
    my $data;
    if ($sock->read($data, $dataLength) == $dataLength) {
	($sock->getc() eq ',') or die "data misses closing ,";
    } else {
	die "received only ".length($data)." of $dataLength bytes";
    }
    
    $/ = $saveSeparator;
    return $data;
}