#!/bin/bash # $HeadURL: https://svn.pasta.freemyip.com/main/miniade/trunk/bin/nop-sh $ $LastChangedRevision: 10133 $ # Modules . $(miniade) || { echo "${0##*/}: ERROR: miniade failed (hint: run 'miniade' to see error)" >&2; exit 1; } # Configurable stuff # Other globals MODROOT=$(cd $(dirname $(realpath $0))/.. && pwd) main() { local MY_ARGS local PROGNAME VERBOSELEVEL # Defaults for options SETTER_CMD=$MODROOT/bin/setter SOLVER_CMD=$MODROOT/bin/solver SETTER_OPTS="--random" SOLVER_OPTS= CONNECT=unix TIMEOUT=5 WORD_LENGTH=5 miniade_get_progname PROGNAME UNIX_SOCKET=/tmp/$PROGNAME.$$.sock # Process options special_opts_handler() { case $1 in --length=*) WORD_LENGTH=${1#*=} ;; --setter=*) SETTER_CMD=${1#*=} ;; --setter-opts=*) SETTER_OPTS=${1#*=} ;; --solver=*) SOLVER_CMD=${1#*=} ;; --solver-opts=*) SOLVER_OPTS=${1#*=} ;; --unix=*) CONNECT=unix UNIX_SOCKET=${1#*=} ;; --tcp=*) CONNECT=tcp TCP_PORT=${1#*=} ;; --pipe=*) CONNECT=pipe NAMED_PIPE=${1#*=} ;; *) return 1 ;; esac } miniade_process_options --help-handler=usage --special-opts-handler=special_opts_handler MY_ARGS "$@" && set -- "${MY_ARGS[@]}" # Process arguments [ $# = 0 ] || usage # Sanity checks and derivations miniade_get_verboselevel VERBOSELEVEL SETTER_CMDLINE="$SETTER_CMD --debug=$VERBOSELEVEL --length=$WORD_LENGTH${SETTER_OPTS:+ }$SETTER_OPTS" # We don't let the solver write its guess to stdout because that's # connected to the setter, or at least it is until the solver and # the setter have exited. So we tell the solver to write the answer # elsewhere and then, after the solver and the setter have exited, # cat and remove that file. OUTPUT_FILE=/tmp/$PROGNAME.$$.out SOLVER_CMDLINE="$SOLVER_CMD --debug=$VERBOSELEVEL --length=$WORD_LENGTH --output=$OUTPUT_FILE${SOLVER_OPTS:+ }$SOLVER_OPTS" # Guts if [ $CONNECT = tcp -o $CONNECT = unix ]; then miniade_debug 10 "main: calling [$SETTER_CMDLINE] ..." if [ $CONNECT = tcp ]; then socat TCP4-LISTEN:$TCP_PORT,reuseaddr EXEC:"$SETTER_CMDLINE" & else socat UNIX-LISTEN:$UNIX_SOCKET EXEC:"$SETTER_CMDLINE" & fi SETTER_PID=$! miniade_debug 10 "main: waiting for setter to become ready ..." while :; do if [ $CONNECT = tcp ]; then netstat -pltn 2>/dev/null | grep -q ":$TCP_PORT.*LISTEN" || continue break elif [ $CONNECT = unix ]; then [ -S $UNIX_SOCKET ] || continue break else [ -p $UNIX_SOCKET ] || continue break fi done miniade_debug 10 "main: calling [$SOLVER_CMDLINE] ..." if [ $CONNECT = tcp ]; then socat EXEC:"$SOLVER_CMDLINE" TCP4:localhost:$TCP_PORT & else socat EXEC:"$SOLVER_CMDLINE" UNIX-CONNECT:$UNIX_SOCKET & fi SOLVER_PID=$! wait $SETTER_PID $SOLVER_PID else miniade_debug 10 "main: starting solver and setter together ..." rm -f $NAMED_PIPE mkfifo -m 600 $NAMED_PIPE miniade_debug 10 "main: calling [$SOLVER_CMDLINE <> $SETTER_CMDLINE] ..." miniade_evaler "eval \"$SOLVER_CMDLINE\" < $NAMED_PIPE | eval \"$SETTER_CMDLINE\" > $NAMED_PIPE" rm -f $NAMED_PIPE fi cat $OUTPUT_FILE rm -f $OUTPUT_FILE } usage() { local PROGNAME miniade_get_progname PROGNAME echo "Usage: $PROGNAME [ ] [ --length= ] [ --tcp= | --unix= | --pipe= ] [ --{setter|solver}= ] [ --{setter|solver}-opts= ]" exit 0 } main "$@"