Small fix to documentation.
[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 or 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 When C<mexp_expect> [see below] calls the PCRE function
129 L<pcre_exec(3)>, it stashes the return value in the C<pcre_error>
130 field in the handle, and that field is returned by this method.
131
132 There are two uses for this:
133
134 =over 4
135
136 =item 1.
137
138 If C<mexp_expect> returns C<MEXP_PCRE_ERROR>, then the actual PCRE
139 error code returned by L<pcre_exec(3)> is available by calling this
140 method.  For a list of PCRE error codes, see L<pcreapi(3)>.
141
142 =item 2.
143
144 A more unusual use is if you ever need to get the captured substrings
145 from your regular expression (calling L<pcre_get_substring(3)>).  The
146 third parameter of that function (C<stringcount>) is the value
147 returned by L<pcre_exec(3)>, and so you can call it like this:
148
149  pcre_get_substring (h->buffer, ovector,
150                      mexp_get_pcre_error (h), 1, &matched);
151
152 =back
153
154 The following fields in the handle do not have methods, but can be
155 accessed directly instead:
156
157  char *buffer;
158  size_t len;
159  size_t alloc;
160
161 If C<mexp_expect> returns a match then these variables contain the
162 read buffer.  Note this buffer does not contain the full input from
163 the process, but it will contain at least the part matched by the
164 regular expression (and maybe some more).  C<buffer> is the read
165 buffer and C<len> is the number of bytes of data in the buffer.
166
167  ssize_t next_match;
168
169 If C<mexp_expect> returns a match, then C<next_match> points to the
170 first byte in the buffer I<after> the fully matched expression.  (It
171 may be C<-1> which means it is invalid).  The next time that
172 C<mexp_expect> is called, it will start by consuming the data
173 C<buffer[next_match...len-1]>.  Callers may also need to read from
174 that point in the buffer before calling L<read(2)> on the file
175 descriptor.  Callers may also set this, for example setting it to
176 C<-1> in order to ignore the remainder of the buffer.  In most cases
177 callers can ignore this field, and C<mexp_expect> will just do the
178 right thing when called repeatedly.
179
180  void *user1;
181  void *user2;
182  void *user3;
183
184 Opaque pointers for use by the caller.  The library will not touch
185 these.
186
187 =head1 CLOSING THE HANDLE
188
189 To close the handle and clean up the subprocess, call:
190
191 B<int mexp_close (mexp_h *h);>
192
193 This returns the status code from the subprocess.  This is in the form
194 of a L<waitpid(2)>/L<system(3)> status so you have to use the macros
195 C<WIFEXITED>, C<WEXITSTATUS>, C<WIFSIGNALED>, C<WTERMSIG> etc defined
196 in C<E<lt>sys/wait.hE<gt>> to parse it.
197
198 If there was a system call error, then C<-1> is returned.  The error
199 will be in C<errno>.
200
201 Notes:
202
203 =over 4
204
205 =item *
206
207 Even in error cases, the handle is always closed and its memory is
208 freed by this call.
209
210 =item *
211
212 It is normal for the kernel to send SIGHUP to the subprocess.
213
214 If the subprocess doesn't catch the SIGHUP, then it will die
215 with status:
216
217  WIFSIGNALED (status) && WTERMSIG (status) == SIGHUP
218
219 This case should not necessarily be considered an error.
220
221 =back
222
223 This is how code should check for and print errors from C<mexp_close>:
224
225   status = mexp_close (h);
226   if (status == -1) {
227     perror ("mexp_close");
228     return -1;
229   }
230   if (WIFSIGNALED (status) && WTERMSIG (status) == SIGHUP)
231     goto ignore; /* not an error */
232   if (!WIFEXITED (status) || WEXITSTATUS (status) != 0)
233     /* You could use the W* macros to print a better error message. */
234     fprintf (stderr, "error: subprocess failed, status = %d", status);
235     return -1;
236   }
237  ignore:
238   /* no error case */
239
240 =head1 EXPECT FUNCTION
241
242 Miniexpect contains a powerful regular expression matching function
243 based on L<pcre(3)>:
244
245 B<int mexp_expect (mexp_h *h, const mexp_regexp *regexps,
246 int *ovector, int ovecsize);>
247
248 The output of the subprocess is matched against the list of PCRE
249 regular expressions in C<regexps>.  C<regexps> is a list of regular
250 expression structures:
251
252  struct mexp_regexp {
253    int r;
254    const pcre *re;
255    const pcre_extra *extra;
256    int options;
257  };
258  typedef struct mexp_regexp mexp_regexp;
259
260 C<r> is the integer code returned from C<mexp_expect> if this regular
261 expression matches.  It B<must> be E<gt> 0.  C<r == 0> indicates the
262 end of the list of regular expressions.  C<re> is the compiled regular
263 expression.
264
265 Possible return values are:
266
267 =over 4
268
269 =item C<MEXP_TIMEOUT>
270
271 No input matched before the timeout (C<h-E<gt>timeout>) was
272 reached.
273
274 =item C<MEXP_EOF>
275
276 The subprocess closed the connection.
277
278 =item C<MEXP_ERROR>
279
280 There was a system call error (eg. from the read call).  The error is
281 returned in C<errno>.
282
283 =item C<MEXP_PCRE_ERROR>
284
285 There was a C<pcre_exec> error.  C<h-E<gt>pcre_error> is set to the
286 error code.  See L<pcreapi(3)> for a list of the C<PCRE_*> error codes
287 and what they mean.
288
289 =item C<r> E<gt> 0
290
291 If any regexp matches, the associated integer code (C<regexps[].r>)
292 is returned.
293
294 =back
295
296 Notes:
297
298 =over 4
299
300 =item *
301
302 C<regexps> may be NULL or an empty list, which means we don't match
303 against a regular expression.  This is useful if you just want to wait
304 for EOF or timeout.
305
306 =item *
307
308 C<regexps[].re>, C<regexps[].extra>, C<regexps[].options>, C<ovector>
309 and C<ovecsize> are passed through to the L<pcre_exec(3)> function.
310
311 =item *
312
313 If multiple regular expressions are passed, then they are checked in
314 turn and the I<first> regular expression that matches is returned
315 I<even if the match happens later in the input than another regular
316 expression>.
317
318 For example if the input is C<"hello world"> and you pass the two
319 regular expressions:
320
321  regexps[0].re = world
322  regexps[1].re = hello
323
324 then the first regular expression (C<"world">) may match and the
325 C<"hello"> part of the input may be ignored.
326
327 In some cases this can even lead to unpredictable matching.  In the
328 case above, if we only happened to read C<"hello wor">, then the
329 second regular expression (C<"hello">) I<would> match.
330
331 If this is a concern, combine your regular expressions into a single
332 one, eg. C<(hello)|(world)>.
333
334 =back
335
336 =head2 mexp_expect example
337
338 It is easier to understand C<mexp_expect> by considering a simple
339 example.
340
341 In this example we are waiting for ssh to either send us a password
342 prompt, or (if no password was required) a command prompt, and based
343 on the output we will either send back a password or a command.
344
345 The unusual C<(mexp_regexp[]){...}> syntax is called a "compound
346 literal" and is available in C99.  If you need to use an older
347 compiler, you can just use a local variable instead.
348
349  mexp_h *h;
350  char *errptr;
351  int offset;
352  pcre *password_re, *prompt_re;
353  const int ovecsize = 12;
354  int ovector[ovecsize];
355  
356  password_re = pcre_compile ("assword", 0, &errptr, &offset, NULL);
357  prompt_re = pcre_compile ("[$#] ", 0, &errptr, &offset, NULL);
358  
359  switch (mexp_expect (h,
360                       (mexp_regexp[]) {
361                         { 100, .re = password_re },
362                         { 101, .re = prompt_re },
363                         { 0 },
364                       }, ovector, ovecsize)) {
365   case 100:
366     /* here you would send a password */
367     break;
368   case 101:
369     /* here you would send a command */
370     break;
371   case MEXP_EOF:
372     fprintf (stderr, "error: ssh closed the connection unexpectedly\n");
373     exit (EXIT_FAILURE);
374   case MEXP_TIMEOUT:
375     fprintf (stderr, "error: timeout before reaching the prompt\n");
376     exit (EXIT_FAILURE);
377   case MEXP_ERROR:
378     perror ("mexp_expect");
379     exit (EXIT_FAILURE);
380   case MEXP_PCRE_ERROR:
381     fprintf (stderr, "error: PCRE error: %d\n", h->pcre_error);
382     exit (EXIT_FAILURE);
383  }
384
385 =head1 SENDING COMMANDS TO THE SUBPROCESS
386
387 You can write to the subprocess simply by writing to C<h-E<gt>fd>.
388 However we also provide a convenience function:
389
390 B<int mexp_printf (mexp_h *h, const char *fs, ...);>
391
392 This returns the number of bytes, if the whole message was written OK.
393 If there was an error, -1 is returned and the error is available in
394 C<errno>.
395
396 Notes:
397
398 =over 4
399
400 =item *
401
402 C<mexp_printf> will not do a partial write.  If it cannot write all
403 the data, then it will return an error.
404
405 =item *
406
407 This function does not write a newline automatically.  If you want to
408 send a command followed by a newline you have to do something like:
409
410  mexp_printf (h, "exit\n");
411
412 =back
413
414 =head1 SOURCE
415
416 Source is available from:
417 L<http://git.annexia.org/?p=miniexpect.git;a=summary>
418
419 =head1 SEE ALSO
420
421 L<pcre(3)>,
422 L<pcre_exec(3)>,
423 L<pcreapi(3)>,
424 L<waitpid(2)>,
425 L<system(3)>.
426
427 =head1 AUTHORS
428
429 Richard W.M. Jones (C<rjones at redhat dot com>)
430
431 =head1 LICENSE
432
433 The library is released under the Library GPL (LGPL) version 2 or at
434 your option any later version.
435
436 =head1 COPYRIGHT
437
438 Copyright (C) 2014 Red Hat Inc.