Make sptps_test more easy to work with.
authorGuus Sliepen <guus@tinc-vpn.org>
Sun, 1 Sep 2013 14:02:49 +0000 (16:02 +0200)
committerGuus Sliepen <guus@tinc-vpn.org>
Sun, 1 Sep 2013 14:02:49 +0000 (16:02 +0200)
It now defers reading from stdin until after the authentication phase is
completed.  Furthermore, it supports the -q, -r, -w options similar to those of
Jürgen Nickelsen's socket.

src/sptps_test.c
test/sptps_basic.test

index 98da73e..7aa7a0a 100644 (file)
@@ -33,7 +33,8 @@ bool send_meta(void *c, const char *msg , int len) { return false; }
 char *logfilename = NULL;
 struct timeval now;
 
-ecdsa_t *mykey, *hiskey;
+static bool readonly;
+static bool writeonly;
 
 static bool send_data(void *handle, uint8_t type, const char *data, size_t len) {
        char hex[len * 2 + 1];
@@ -47,14 +48,18 @@ static bool send_data(void *handle, uint8_t type, const char *data, size_t len)
 
 static bool receive_record(void *handle, uint8_t type, const char *data, uint16_t len) {
        fprintf(stderr, "Received type %d record of %hu bytes:\n", type, len);
-       fwrite(data, len, 1, stdout);
+       if(!writeonly)
+               fwrite(data, len, 1, stdout);
        return true;
 }
 
 static struct option const long_options[] = {
        {"datagram", no_argument, NULL, 'd'},
-       {"packet-loss", required_argument, NULL, 'l'},
-       {"replay-window", required_argument, NULL, 'r'},
+       {"quit", no_argument, NULL, 'q'},
+       {"readonly", no_argument, NULL, 'r'},
+       {"writeonly", no_argument, NULL, 'w'},
+       {"packet-loss", required_argument, NULL, 'L'},
+       {"replay-window", required_argument, NULL, 'W'},
        {"help", no_argument, NULL, 1},
        {NULL, 0, NULL, 0}
 };
@@ -65,8 +70,11 @@ static void usage() {
        fprintf(stderr, "Usage: %s [options] my_ecdsa_key_file his_ecdsa_key_file [host] port\n\n", program_name);
        fprintf(stderr, "Valid options are:\n"
                        "  -d, --datagram          Enable datagram mode.\n"
-                       "  -l, --packet-loss RATE  Fake packet loss of RATE percent.\n"
-                       "  -r, --replay-window N   Set replay window to N bytes.\n"
+                       "  -q, --quit              Quit when EOF occurs on stdin.\n"
+                       "  -r, --readonly          Only send data from the socket to stdout.\n"
+                       "  -w, --writeonly         Only send data from stdin to the socket.\n"
+                       "  -L, --packet-loss RATE  Fake packet loss of RATE percent.\n"
+                       "  -R, --replay-window N   Set replay window to N bytes.\n"
                        "\n");
        fprintf(stderr, "Report bugs to tinc@tinc-vpn.org.\n");
 }
@@ -78,8 +86,10 @@ int main(int argc, char *argv[]) {
        int packetloss = 0;
        int r;
        int option_index = 0;
+       ecdsa_t *mykey = NULL, *hiskey = NULL;
+       bool quit = false;
 
-       while((r = getopt_long(argc, argv, "dl:r:", long_options, &option_index)) != EOF) {
+       while((r = getopt_long(argc, argv, "dqrwL:W:", long_options, &option_index)) != EOF) {
                switch (r) {
                        case 0:   /* long option */
                                break;
@@ -88,11 +98,23 @@ int main(int argc, char *argv[]) {
                                datagram = true;
                                break;
 
-                       case 'l': /* packet loss rate */
+                       case 'q': /* close connection on EOF from stdin */
+                               quit = true;
+                               break;
+
+                       case 'r': /* read only */
+                               readonly = true;
+                               break;
+
+                       case 'w': /* write only */
+                               writeonly = true;
+                               break;
+
+                       case 'L': /* packet loss rate */
                                packetloss = atoi(optarg);
                                break;
 
-                       case 'r': /* replay window size */
+                       case 'W': /* replay window size */
                                sptps_replaywin = atoi(optarg);
                                break;
 
@@ -215,12 +237,16 @@ int main(int argc, char *argv[]) {
                return 1;
 
        while(true) {
+               if(writeonly && readonly)
+                       break;
+
                char buf[65535] = "";
 
                fd_set fds;
                FD_ZERO(&fds);
 #ifndef HAVE_MINGW
-               FD_SET(0, &fds);
+               if(!readonly && s.instate)
+                       FD_SET(0, &fds);
 #endif
                FD_SET(sock, &fds);
                if(select(sock + 1, &fds, NULL, NULL, NULL) <= 0)
@@ -228,12 +254,17 @@ int main(int argc, char *argv[]) {
 
                if(FD_ISSET(0, &fds)) {
                        ssize_t len = read(0, buf, sizeof buf);
+                       fprintf(stderr, "%zd\n", len);
                        if(len < 0) {
                                fprintf(stderr, "Could not read from stdin: %s\n", strerror(errno));
                                return 1;
                        }
-                       if(len == 0)
-                               break;
+                       if(len == 0) {
+                               if(quit)
+                                       break;
+                               readonly = true;
+                               continue;
+                       }
                        if(buf[0] == '#')
                                s.outseqno = atoi(buf + 1);
                        if(buf[0] == '^')
index e18d063..2abb99c 100755 (executable)
@@ -15,7 +15,18 @@ echo
 
 # Test transfer of a simple file.
 
-(sleep 2; cat ../README; sleep 1) | $sptps_test $d1/server.priv $d1/client.pub 32750 &
+(sleep 1; $sptps_test -q $d1/client.priv $d1/server.pub localhost 32750 <../README) &
+$sptps_test $d1/server.priv $d1/client.pub 32750 >$d1/out1
+cmp $d1/out1 ../README
+
+$sptps_test -q $d1/server.priv $d1/client.pub 32750 <../NEWS &
+sleep 1
+$sptps_test $d1/client.priv $d1/server.pub localhost 32750 > $d1/out2
+cmp $d1/out2 ../NEWS
+
+# Datagram mode
+
+$sptps_test -dq $d1/server.priv $d1/client.pub 32750 <../COPYING &
 sleep 1
-sleep 3 | $sptps_test $d1/client.priv $d1/server.pub localhost 32750 >$d1/out
-cmp $d1/out ../README
+sleep 1 | $sptps_test -dq $d1/client.priv $d1/server.pub localhost 32750 >$d1/out3
+cmp $d1/out3 ../COPYING