baca020bc55f5ae5145010c2ef607db44a544e84
[miniexpect.git] / miniexpect.pod
1 =encoding utf8
2
3 =head1 NAME
4
5 miniexpect - A very simple expect library for C.
6
7 =head1 SYNOPSIS
8
9  #include <errno.h>
10  #include <sys/wait.h>
11  #include <pcre.h>
12  #include <miniexpect.h>
13  
14  mexp_h *h;
15  h = mexp_spawnl ("ssh", "ssh", "host");
16  switch (mexp_expect (h, regexps, ovector, ovecsize)) {
17    ...
18  }
19  mexp_close (h);
20
21  cc prog.c -o prog -lminiexpect -lpcre
22
23 =head1 DESCRIPTION
24
25 Miniexpect is a very simple expect-like library for C.  Expect is a
26 way to control an external program that wants to be run interactively.
27
28 Miniexpect has a saner interface than libexpect, and doesn't depend on
29 Tcl.  It is also thread safe, const-correct and uses modern C
30 standards.
31
32 Miniexpect is a standalone library, except for a single dependency: it
33 requires the PCRE (Perl Compatible Regular Expressions) library from
34 L<http://www.pcre.org/>.  The PCRE dependency is fundamental because
35 we want to offer the most powerful regular expression syntax to match
36 on, but more importantly because PCRE has a convenient way to detect
37 partial matches which made this library very simple to implement.
38
39 This manual page documents the API.  Examples of how to use the API
40 can be found in the source directory.
41
42 =head1 CONCEPTS
43
44 Miniexpect lets you start up an external program, control it (by
45 sending commands to it), and close it down gracefully.  Two things
46 make this different from other APIs like L<popen(3)> and L<system(3)>:
47 Firstly miniexpect creates a pseudoterminal (pty).  Secondly
48 miniexpect lets you match the output of the program using regular
49 expressions.  Both of these are handy for controlling interactive
50 programs that might (for example) ask for passwords, but you can use
51 miniexpect on just about any external program.
52
53 You can control multiple programs at the same time.
54
55 =head1 SPAWNING THE SUBPROCESS
56
57 There are two calls for creating a subprocess:
58
59 B<mexp_h *mexp_spawnl (const char *file, const char *arg, ...);>
60
61 This creates a subprocess running the external program C<file> (the
62 current C<$PATH> is searched unless you give an absolute path).
63 C<arg, ...> are the arguments to the program.  Usually the first
64 argument should be the name of the program.
65
66 The return value is a handle (see next section).
67
68 If there was an error running the subprocess, C<NULL> is returned and
69 the error is available in C<errno>.
70
71 For example, to run an ssh subprocess you could do:
72
73  h = mexp_spawnl ("ssh", "ssh", "-l", "root", "host");
74
75 or to run a particular ssh binary:
76
77  h = mexp_spawnl ("/usr/local/bin/ssh", "ssh", "-l", "root", "host");
78
79 An alternative to C<mexp_spawnl> is:
80
81 B<mexp_h *mexp_spawnv (const char *file, char **argv);>
82
83 This is the same as C<mexp_spawnl> except that you pass the arguments
84 in a NULL-terminated array.
85
86 =head1 HANDLES
87
88 After spawning a subprocess, you get back a handle which is a pointer
89 to a struct:
90
91  struct mexp_h;
92  typedef struct mexp_h mexp_h;
93
94 Various methods can be used on the handle:
95
96 B<int mexp_get_fd (mexp_h *h);>
97
98 Return the file descriptor of the pty of the subprocess.  You can read
99 and write to this if you want, although convenience functions are also
100 provided (see below).
101
102 B<pid_t mexp_get_pid (mexp_h *h);>
103
104 Return the process ID of the subprocess.  You can send it signals if
105 you want.
106
107 B<int mexp_get_timeout_ms (mexp_h *h);>
108
109 B<void mexp_set_timeout_ms (mexp_h *h, int millisecs);>
110
111 B<void mexp_set_timeout (mexp_h *h, int secs);>
112
113 Get and set the timeout used by C<mexp_expect> (see below).  The
114 resolution is milliseconds (1/1000th of a second).  Set this before
115 calling C<mexp_expect>.  Passing -1 to either of the C<set_> methods
116 means no timeout.  The default setting is 60000 milliseconds (60
117 seconds).
118
119 B<size_t mexp_get_read_size (mexp *h);>
120
121 B<void mexp_set_read_size (mexp *h, size_t read_size);>
122
123 Get or set the natural size (in bytes) for reads from the subprocess.
124 The default is 1024.  Most callers will not need to change this.
125
126 B<int mexp_get_pcre_error (mexp *h);>
127
128 If C<mexp_expect> returns C<MEXP_PCRE_ERROR>, then the actual PCRE
129 error code returned by L<pcre_exec(3)> is available by calling this
130 method.  For a list of PCRE error codes, see L<pcreapi(3)>.
131
132 The following fields in the handle do not have methods, but can be
133 accessed directly instead:
134
135  char *buffer;
136  size_t len;
137  size_t alloc;
138
139 If C<mexp_expect> returns a match then these variables contain the
140 read buffer.  Note this buffer does not contain the full input from
141 the process, but it will contain at least the part matched by the
142 regular expression (and maybe some more).  C<buffer> is the read
143 buffer and C<len> is the number of bytes of data in the buffer.
144
145  ssize_t next_match;
146
147 If C<mexp_expect> returns a match, then C<next_match> points to the
148 first byte in the buffer I<after> the fully matched expression.  (It
149 may be C<-1> which means it is invalid).  The next time that
150 C<mexp_expect> is called, it will start by consuming the data
151 C<buffer[next_match...len-1]>.  Callers may also need to read from
152 that point in the buffer before calling L<read(2)> on the file
153 descriptor.  Callers may also set this, for example setting it to
154 C<-1> in order to ignore the remainder of the buffer.  In most cases
155 callers can ignore this field, and C<mexp_expect> will just do the
156 right thing when called repeatedly.
157
158  void *user1;
159  void *user2;
160  void *user3;
161
162 Opaque pointers for use by the caller.  The library will not touch
163 these.
164
165 =head1 CLOSING THE HANDLE
166
167 To close the handle and clean up the subprocess, call:
168
169 B<int mexp_close (mexp_h *h);>
170
171 This returns the status code from the subprocess.  This is in the form
172 of a L<waitpid(2)>/L<system(3)> status so you have to use the macros
173 C<WIFEXITED>, C<WEXITSTATUS>, C<WIFSIGNALED>, C<WTERMSIG> etc defined
174 in C<E<lt>sys/wait.hE<gt>> to parse it.
175
176 If there was a system call error, then C<-1> is returned.  The error
177 will be in C<errno>.
178
179 Notes:
180
181 =over 4
182
183 =item *
184
185 Even in error cases, the handle is always closed and its memory is
186 freed by this call.
187
188 =item *
189
190 It is normal for the kernel to send SIGHUP to the subprocess.
191
192 If the subprocess doesn't catch the SIGHUP, then it will die
193 with status:
194
195  WIFSIGNALED (status) && WTERMSIG (status) == SIGHUP
196
197 This case should not necessarily be considered an error.
198
199 =back
200
201 This is how code should check for and print errors from C<mexp_close>:
202
203   status = mexp_close (h);
204   if (status == -1) {
205     perror ("mexp_close");
206     return -1;
207   }
208   if (WIFSIGNALED (status) && WTERMSIG (status) == SIGHUP)
209     goto ignore; /* not an error */
210   if (!WIFEXITED (status) || WEXITSTATUS (status) != 0)
211     /* You could use the W* macros to print a better error message. */
212     fprintf (stderr, "error: subprocess failed, status = %d", status);
213     return -1;
214   }
215  ignore:
216   /* no error case */
217
218 =head1 EXPECT FUNCTION
219
220 Miniexpect contains a powerful regular expression matching function
221 based on L<pcre(3)>:
222
223 B<int mexp_expect (mexp_h *h, const mexp_regexp *regexps,
224 int *ovector, int ovecsize);>
225
226 The output of the subprocess is matched against the list of PCRE
227 regular expressions in C<regexps>.  C<regexps> is a list of regular
228 expression structures:
229
230  struct mexp_regexp {
231    int r;
232    const pcre *re;
233    const pcre_extra *extra;
234    int options;
235  };
236  typedef struct mexp_regexp mexp_regexp;
237
238 C<r> is the integer code returned from C<mexp_expect> if this regular
239 expression matches.  It B<must> be E<gt> 0.  C<r == 0> indicates the
240 end of the list of regular expressions.  C<re> is the compiled regular
241 expression.
242
243 Possible return values are:
244
245 =over 4
246
247 =item C<MEXP_TIMEOUT>
248
249 No input matched before the timeout (C<h-E<gt>timeout>) was
250 reached.
251
252 =item C<MEXP_EOF>
253
254 The subprocess closed the connection.
255
256 =item C<MEXP_ERROR>
257
258 There was a system call error (eg. from the read call).  The error is
259 returned in C<errno>.
260
261 =item C<MEXP_PCRE_ERROR>
262
263 There was a C<pcre_exec> error.  C<h-E<gt>pcre_error> is set to the
264 error code.  See L<pcreapi(3)> for a list of the C<PCRE_*> error codes
265 and what they mean.
266
267 =item C<r> E<gt> 0
268
269 If any regexp matches, the associated integer code (C<regexps[].r>)
270 is returned.
271
272 =back
273
274 Notes:
275
276 =over 4
277
278 =item *
279
280 C<regexps> may be NULL or an empty list, which means we don't match
281 against a regular expression.  This is useful if you just want to wait
282 for EOF or timeout.
283
284 =item *
285
286 C<regexps[].re>, C<regexps[].extra>, C<regexps[].options>, C<ovector>
287 and C<ovecsize> are passed through to the L<pcre_exec(3)> function.
288
289 =item *
290
291 If multiple regular expressions are passed, then they are checked in
292 turn and the I<first> regular expression that matches is returned
293 I<even if the match happens later in the input than another regular
294 expression>.
295
296 For example if the input is C<"hello world"> and you pass the two
297 regular expressions:
298
299  regexps[0].re = world
300  regexps[1].re = hello
301
302 then the first regular expression (C<"world">) may match and the
303 C<"hello"> part of the input may be ignored.
304
305 In some cases this can even lead to unpredictable matching.  In the
306 case above, if we only happened to read C<"hello wor">, then the
307 second regular expression (C<"hello">) I<would> match.
308
309 If this is a concern, combine your regular expressions into a single
310 one, eg. C<(hello)|(world)>.
311
312 =back
313
314 =head2 mexp_expect example
315
316 It is easier to understand C<mexp_expect> by considering a simple
317 example.
318
319 In this example we are waiting for ssh to either send us a password
320 prompt, or (if no password was required) a command prompt, and based
321 on the output we will either send back a password or a command.
322
323 The unusual C<(mexp_regexp[]){...}> syntax is called a "compound
324 literal" and is available in C99.  If you need to use an older
325 compiler, you can just use a local variable instead.
326
327  mexp_h *h;
328  char *errptr;
329  int offset;
330  pcre *password_re, *prompt_re;
331  const int ovecsize = 12;
332  int ovector[ovecsize];
333  
334  password_re = pcre_compile ("assword", 0, &errptr, &offset, NULL);
335  prompt_re = pcre_compile ("[$#] ", 0, &errptr, &offset, NULL);
336  
337  switch (mexp_expect (h,
338                       (mexp_regexp[]) {
339                         { 100, .re = password_re },
340                         { 101, .re = prompt_re },
341                         { 0 },
342                       }, ovector, ovecsize)) {
343   case 100:
344     /* here you would send a password */
345     break;
346   case 101:
347     /* here you would send a command */
348     break;
349   case MEXP_EOF:
350     fprintf (stderr, "error: ssh closed the connection unexpectedly\n");
351     exit (EXIT_FAILURE);
352   case MEXP_TIMEOUT:
353     fprintf (stderr, "error: timeout before reaching the prompt\n");
354     exit (EXIT_FAILURE);
355   case MEXP_ERROR:
356     perror ("mexp_expect");
357     exit (EXIT_FAILURE);
358   case MEXP_PCRE_ERROR:
359     fprintf (stderr, "error: PCRE error: %d\n", h->pcre_error);
360     exit (EXIT_FAILURE);
361  }
362
363 =head1 SENDING COMMANDS TO THE SUBPROCESS
364
365 You can write to the subprocess simply by writing to C<h-E<gt>fd>.
366 However we also provide a convenience function:
367
368 B<int mexp_printf (mexp_h *h, const char *fs, ...);>
369
370 This returns the number of bytes, if the whole message was written OK.
371 If there was an error, -1 is returned and the error is available in
372 C<errno>.
373
374 Notes:
375
376 =over 4
377
378 =item *
379
380 C<mexp_printf> will not do a partial write.  If it cannot write all
381 the data, then it will return an error.
382
383 =item *
384
385 This function does not write a newline automatically.  If you want to
386 send a command followed by a newline you have to do something like:
387
388  mexp_printf (h, "exit\n");
389
390 =back
391
392 =head1 SOURCE
393
394 Source is available from:
395 L<http://git.annexia.org/?p=miniexpect.git;a=summary>
396
397 =head1 SEE ALSO
398
399 L<pcre(3)>,
400 L<pcre_exec(3)>,
401 L<pcreapi(3)>,
402 L<waitpid(2)>,
403 L<system(3)>.
404
405 =head1 AUTHORS
406
407 Richard W.M. Jones (C<rjones at redhat dot com>)
408
409 =head1 LICENSE
410
411 The library is released under the Library GPL (LGPL) version 2 or at
412 your option any later version.
413
414 =head1 COPYRIGHT
415
416 Copyright (C) 2014 Red Hat Inc.