{
struct addrinfo aihint = { 0 }, *ai0, *ai1;
int len = PKBUFSZ, yes = 1;
+ const char *outf, *serv;
+ FILE *fp;
+ union {
+ struct sockaddr sa;
+ struct sockaddr_in sin;
+ struct sockaddr_in6 sin6;
+ } addr;
+ socklen_t salen;
int err;
peer *p;
- int fd;
+ int fd, port;
if (ac != 4) die(1, "syntax: %s:NAME:PORT:ADDR:PORT", cmd);
if (!key_bytag(&keys, av[0])) die(1, "no key named `%s'", av[0]);
aihint.ai_flags = AI_ADDRCONFIG;
if ((err = getaddrinfo(av[2], av[3], &aihint, &ai1)) != 0)
die(1, "getaddrinfo(`%s', `%s'): %s", av[2], av[3], gai_strerror(err));
+ if (*av[1] == '?') { serv = "0"; outf = av[1] + 1; }
+ else { serv = av[1]; outf = 0; }
aihint.ai_family = ai1->ai_family;
aihint.ai_flags = AI_ADDRCONFIG | AI_PASSIVE;
- if ((err = getaddrinfo(0, av[1], &aihint, &ai0)) != 0)
+ if ((err = getaddrinfo(0, serv, &aihint, &ai0)) != 0)
die(1, "getaddrinfo(passive, `%s'): %s", av[1], gai_strerror(err));
if ((fd = socket(ai1->ai_family, SOCK_DGRAM, ai1->ai_protocol)) < 0)
die(1, "socket: %s", strerror(errno));
die(1, "setsockopt: %s", strerror(errno));
if (connect(fd, ai1->ai_addr, ai1->ai_addrlen))
die(1, "connect: %s", strerror(errno));
+ if (outf) {
+ salen = sizeof(addr);
+ if (getsockname(fd, &addr.sa, &salen))
+ die(1, "getsockname: %s", strerror(errno));
+ switch (addr.sa.sa_family) {
+ case AF_INET: port = ntohs(addr.sin.sin_port); break;
+ case AF_INET6: port = ntohs(addr.sin6.sin6_port); break;
+ default: assert(0);
+ }
+ fp = fopen(outf, "w");
+ if (!fp) die(1, "fopen(%s): %s", outf, strerror(errno));
+ fprintf(fp, "%d\n", port);
+ fclose(fp);
+ }
sel_initfile(&sel, &p->sf, fd, SEL_READ, dopacket, p);
sel_addfile(&p->sf);
freeaddrinfo(ai0); freeaddrinfo(ai1);
[$abs_top_builddir/server/tripe-test \
${TRIPE_TEST_TRACEOPTS+-T$TRIPE_TEST_TRACEOPTS}])
+## Pause for a bit.
+m4_define([SLEEP], [sleep 0.2])
+
## WITH_STRACE(tag, cmd)
##
## There's an awful hack here. If a process running under strace exits with
## WITH_MITM(adir, aport, bdir, bport, body)
m4_define([WITH_MITM], [
- echo >&2 "mitm: $1 <--> :$2 <-mitm-> :$4 <--> $3"
+ aspec="$2" bspec="$4"
+ case $aspec in =*) aport="?$1/$3.mitm" ;; *) aport=$aspec ;; esac
+ case $bspec in =*) bport="?$3/$1.mitm" ;; *) bport=$bspec ;; esac
MITM -k$1/keyring.pub \
- peer:$1:$2:127.0.0.1:$(cat $1/port) \
- peer:$3:$4:127.0.0.1:$(cat $3/port) \
+ peer:$1:$aport:127.0.0.1:$(cat $1/port) \
+ peer:$3:$bport:127.0.0.1:$(cat $3/port) \
filt:send& mitmpid_$1_$3=$!
+ SLEEP
+ case $aspec in =*) aport=$(cat ${aport#\?}); eval ${aspec#=}=\$aport ;; esac
+ case $bspec in =*) bport=$(cat ${bport#\?}); eval ${bspec#=}=\$bport ;; esac
+ echo >&2 "mitm: $1 <--> :$aport <-mitm-> :$bport <--> $3"
trap 'kill $mitmpid_$1_$3; exit 127' EXIT INT QUIT TERM HUP
- sleep 1
+ SLEEP
$5
kill $mitmpid_$1_$3; trap - EXIT INT QUIT TERM HUP
])
## alice <--> :5311 <-mitm-> :5312 <--> bob
## alice <--> :5321 <-mitm-> :5322 <--> carol
- WITH_MITM([alice], [5311], [bob], [5312], [
- ESTABLISH([alice], [alice], [], [bob], [bob], [-mobile], [5312], [5311])
+ WITH_MITM([alice], [=bob_from_alice], [bob], [=alice_from_bob], [
+ ESTABLISH([alice], [alice], [],
+ [bob], [bob], [-mobile],
+ [$alice_from_bob], [$bob_from_alice])
])
- WITH_MITM([alice], [5319], [bob], [5312], [
+ WITH_MITM([alice], [=new_bob_from_alice], [bob], [$alice_from_bob], [
COMMS_EPING([bob], [bob], [alice], [alice])
COMMS_SLIP([bob], [bob], [alice], [alice])
])
- WITH_MITM([alice], [5321], [carol], [5322], [
- ESTABLISH([alice], [alice], [], [carol], [carol], [-mobile],
- [5322], [5321])
+ WITH_MITM([alice], [=carol_from_alice], [carol], [=alice_from_carol], [
+ ESTABLISH([alice], [alice], [],
+ [carol], [carol], [-mobile],
+ [$alice_from_carol], [$carol_from_alice])
])
- WITH_MITM([alice], [5311], [bob], [5312], [
- WITH_MITM([alice], [5321], [carol], [5322], [
+ WITH_MITM([alice], [$bob_from_alice], [bob], [$alice_from_bob], [
+ WITH_MITM([alice], [$carol_from_alice], [carol], [$alice_from_carol], [
COMMS_EPING([bob], [bob], [alice], [alice])
COMMS_EPING([carol], [carol], [alice], [alice])
COMMS_SLIP([bob], [bob], [alice], [alice])
COMMS_SLIP([carol], [carol], [alice], [alice])
])])
- WITH_MITM([alice], [5321], [bob], [5312], [
- WITH_MITM([alice], [5311], [carol], [5322], [
+ WITH_MITM([alice], [$carol_from_alice], [bob], [$alice_from_bob], [
+ WITH_MITM([alice], [$bob_from_alice], [carol], [$alice_from_carol], [
COMMS_EPING([bob], [bob], [alice], [alice])
COMMS_EPING([carol], [carol], [alice], [alice])
COMMS_SLIP([bob], [bob], [alice], [alice])
WITH_2TRIPES([alice], [bob], [-nslip], [-talice], [-tbob], [
## Set up the evil proxy.
- alicemitm=24516 bobmitm=14016
mknod pipe-mitmpid p
WITH_STRACE([mitm],
[sh -c 'echo $$ >pipe-mitmpid; exec "$@"' - \
MITM -kalice/keyring.pub >mitm.out 2>mitm.err \
- peer:alice:$alicemitm:127.0.0.1:$(cat alice/port) \
- peer:bob:$bobmitm:127.0.0.1:$(cat bob/port) \
+ peer:alice:\?alice.mitm:127.0.0.1:$(cat alice/port) \
+ peer:bob:\?bob.mitm:127.0.0.1:$(cat bob/port) \
filt:drop:5 filt:send])&
read mitmpid <pipe-mitmpid
+ SLEEP
+ alicemitm=$(cat alice.mitm) bobmitm=$(cat bob.mitm)
trap 'kill $mitmpid; exit 127' EXIT INT QUIT TERM HUP
exec 3>&-
for i in alice bob; do (mkdir $i; cd $i; SETUPDIR([gamma])); done
WITH_2TRIPES([alice], [bob], [-nslip], [-talice], [-tbob], [
- WITH_MITM([alice], [5311], [bob], [5312], [
+ WITH_MITM([alice], [=bob_from_alice], [bob], [=alice_from_bob], [
COPROCESSES([wait-knock], [
echo WATCH +n
TRIPECTL -dalice
])& waiter=$!
- AT_CHECK([TRIPECTL -dbob ADD -knock bob alice INET 127.0.0.1 5312])
+ AT_CHECK([TRIPECTL -dbob ADD -knock bob alice INET 127.0.0.1 $alice_from_bob])
wait $waiter; waitrc=$?
AT_CHECK([echo $waitrc],, [0[]nl])
- AT_CHECK([cat knock-addr],, [INET 127.0.0.1 5311[]nl])
+ AT_CHECK_UNQUOTED([cat knock-addr],, [INET 127.0.0.1 $bob_from_alice[]nl])
AWAIT_KXDONE([alice], [alice], [bob], [bob], [
- AT_CHECK([TRIPECTL -dalice ADD -ephemeral bob INET 127.0.0.1 5311])
+ AT_CHECK([TRIPECTL -dalice ADD -ephemeral bob INET 127.0.0.1 $bob_from_alice])
])
COMMS_EPING([alice], [alice], [bob], [bob])
COMMS_SLIP([alice], [alice], [bob], [bob])
])
- WITH_MITM([alice], [5319], [bob], [5312], [
+ WITH_MITM([alice], [=new_bob_from_alice], [bob], [$alice_from_bob], [
AWAIT_KXDONE([alice], [alice], [bob], [bob], [
AT_CHECK([TRIPECTL -dalice FORCEKX bob])
AT_CHECK([TRIPECTL -dbob FORCEKX alice])