1 | # vi:set sts=2 sw=2 ai:
|
---|
2 | #
|
---|
3 | # coshell.bash - Control shell coprocesses (see coprocess.bash).
|
---|
4 | #
|
---|
5 |
|
---|
6 | function 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 |
|
---|