1# vi:set sts=2 sw=2 ai:
2#
3# coshell.bash - Control shell coprocesses (see coprocess.bash).
4#
5
6function coshell ()
7{
8  while (( $# > 0 )) ; do
9    case "$1" in
10      #
11      # coshell open
12      #
13      o|op|ope|open)
14	shift
15	coprocess open "$@"
16	local ret=$?
17
18	# This should eat any ssh error messages or what not.
19	coshell eval : >/dev/null 2>&1
20	return $ret
21	;;
22
23      #
24      # coshell close
25      #
26      c|cl|clo|close)
27	shift
28	coprocess close "$@"
29	return $?
30	;;
31
32      #
33      # coshell eval
34      #
35      e|ev|eva|eval)
36	shift
37	local cookie=$RANDOM
38	if (( $# == 0 )) ; then
39	  echo "coshell eval: no argumentsl" >&2
40	  return 1
41	fi
42	if [ x$coprocess_pid = x ] ; then
43	  echo "coshell eval: no active coshell" >&2
44	  return 1
45	fi
46
47	coprocess print "$@" 
48	coprocess print "coprocess_rc=\$?"
49	coprocess print "printf 'coprocess-$cookie----\n%d\n' \$coprocess_rc"
50	if [ x$coprocess_pid = x ] ; then
51	  return 0
52	fi
53
54	local ol
55	while coprocess read ol ; do
56	  case "$ol" in
57	    *coprocess-$cookie----*)
58	      ol="${ol%coprocess-$cookie----}"
59	      echo -n "$ol"
60	      break
61	      ;;
62	  esac
63	  echo "$ol"
64	done
65	coprocess read ol
66	return $ol
67	;;
68
69      #
70      # coshell sendfile
71      #
72      s|se|sen|send|sendf|sendfi|sendfil|sendfile)
73	shift
74	if (( $# != 2 )) ; then
75	  echo "coshell sendfile: syntax is 'coshell sendfile SRC TARGET'" >&2
76	  return 1
77	fi
78	if [ x$coprocess_pid = x ] ; then
79	  echo "coshell sendfile: no active coshell" >&2
80	  return 1
81	fi
82
83	local target=$2
84	if coshell test -d "$target" ; then
85	  target="$target/${1##*/}" 
86	fi
87
88	coprocess print "uudecode <<END_OF_FILE"
89	uuencode -m "$target" <$1 |coprocess print --stdin
90	coshell eval "END_OF_FILE"
91	return $?
92	;;
93
94      #
95      # coshell getfile
96      #
97      g|ge|get|getf|getfi|getfil|getfile)
98	shift
99	if (( $# != 2 )) ; then
100	  echo "coshell getfile: syntax is 'coshell getfile SRC TARGET'" >&2
101	  return 1
102	fi
103	if [ x$coprocess_pid = x ] ; then
104	  echo "coshell getfile: no active coshell" >&2
105	  return 1
106	fi
107
108	local target=$2
109	if test -d "$target" ; then
110	  target="$target/${1##*/}" 
111	fi
112
113	coshell eval uuencode -m "$target" "<" "$1" |uudecode
114	return $?
115	;;
116
117      *)
118	coshell eval "$@"
119	return $?
120	;;
121    esac
122    shift
123  done
124  coprocess status
125  return $?
126}
127
128