1132943Sgshapiro#!/usr/bin/perl -w
2132943Sgshapiro#
3132943Sgshapiro# Contributed by Bastiaan Bakker for SOCKETMAP
4266711Sgshapiro# $Id: socketmapClient.pl,v 1.1 2003-05-21 15:36:33 ca Exp $
5132943Sgshapiro
6132943Sgshapirouse strict;
7132943Sgshapirouse IO::Socket;
8132943Sgshapiro
9132943Sgshapirodie "usage: $0 <connection> <mapname> <key> [<key2> ...]" if (@ARGV < 3);
10132943Sgshapiro
11132943Sgshapiromy $connection = shift @ARGV;
12132943Sgshapiromy $mapname = shift @ARGV;
13132943Sgshapiro
14132943Sgshapiromy $sock;
15132943Sgshapiro
16132943Sgshapiroif ($connection =~ /tcp:(.+):([0-9]*)/) {
17132943Sgshapiro    $sock = new IO::Socket::INET (
18132943Sgshapiro				  PeerAddr => $1,
19132943Sgshapiro				  PeerPort => $2,
20132943Sgshapiro				  Proto => 'tcp',
21132943Sgshapiro				  );
22132943Sgshapiro} elsif ($connection =~ /((unix)|(local)):(.+)/) {
23132943Sgshapiro    $sock = new IO::Socket::UNIX (
24132943Sgshapiro				  Type => SOCK_STREAM,
25132943Sgshapiro				  Peer => $4
26132943Sgshapiro				  );
27132943Sgshapiro} else {
28132943Sgshapiro    die "unrecognized connection specification $connection";
29132943Sgshapiro}
30132943Sgshapiro
31132943Sgshapirodie "Could not create socket: $!\n" unless $sock;
32132943Sgshapiro
33132943Sgshapirowhile(my $key = shift @ARGV) {
34132943Sgshapiro    my $request = "$mapname $key";
35132943Sgshapiro    netstringWrite($sock, $request);
36132943Sgshapiro    $sock->flush();
37132943Sgshapiro    my $response = netstringRead($sock);
38132943Sgshapiro
39132943Sgshapiro    print "$key => $response\n";
40132943Sgshapiro}
41132943Sgshapiro
42132943Sgshapiro$sock->close();
43132943Sgshapiro
44132943Sgshapirosub netstringWrite {
45132943Sgshapiro    my $sock = shift;
46132943Sgshapiro    my $data = shift;
47132943Sgshapiro
48132943Sgshapiro    print $sock length($data).':'.$data.',';
49132943Sgshapiro}
50132943Sgshapiro
51132943Sgshapirosub netstringRead {
52132943Sgshapiro    my $sock = shift;
53132943Sgshapiro    my $saveSeparator = $/;
54132943Sgshapiro    $/ = ':';
55132943Sgshapiro    my $dataLength = <$sock>;
56132943Sgshapiro    die "cannot read netstring length" unless defined($dataLength);
57132943Sgshapiro    chomp $dataLength;
58132943Sgshapiro    my $data;
59132943Sgshapiro    if ($sock->read($data, $dataLength) == $dataLength) {
60132943Sgshapiro	($sock->getc() eq ',') or die "data misses closing ,";
61132943Sgshapiro    } else {
62132943Sgshapiro	die "received only ".length($data)." of $dataLength bytes";
63132943Sgshapiro    }
64132943Sgshapiro
65132943Sgshapiro    $/ = $saveSeparator;
66132943Sgshapiro    return $data;
67132943Sgshapiro}
68