Make sure EOF is defined
[xapian.git] / xapian-applications / omega / runfilter.h
blob1617f07f1e09071d30c8026b5a7d1d36ce4a06fa
1 /* runfilter.h: run an external filter and capture its output in a std::string.
3 * Copyright (C) 2007,2013,2015 Olly Betts
5 * This program is free software; you can redistribute it and/or modify
6 * it under the terms of the GNU General Public License as published by
7 * the Free Software Foundation; either version 2 of the License, or
8 * (at your option) any later version.
10 * This program is distributed in the hope that it will be useful,
11 * but WITHOUT ANY WARRANTY; without even the implied warranty of
12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 * GNU General Public License for more details.
15 * You should have received a copy of the GNU General Public License
16 * along with this program; if not, write to the Free Software
17 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
20 #ifndef OMEGA_INCLUDED_RUNFILTER_H
21 #define OMEGA_INCLUDED_RUNFILTER_H
23 #include <string>
24 #include <cstdio>
26 /// Exception thrown if we encounter a read error.
27 struct ReadError {
28 const char * msg;
29 int status;
30 explicit ReadError(const char * m) : msg(m) { }
31 explicit ReadError(int s) : msg(NULL), status(s) { }
32 std::string str() const { if (msg) return msg; char buf[32]; std::sprintf(buf, "0x%08x", status); return buf; }
35 /// Exception thrown if the filter program isn't found.
36 struct NoSuchFilter { };
38 /** Analyse if a command needs the shell.
40 * The return value of this function can be passed as the second argument of
41 * stdout_to_string().
43 bool command_needs_shell(const char * p);
45 /// Initialise the runfilter module.
46 void runfilter_init();
48 /** Run command @a cmd, capture its stdout, and return it as a std::string.
50 * @param use_shell If false, try to avoid using a shell to run the command.
51 * @param alt_status Exit status to treat as success in addition to 0
52 * (default: Only treat exit status 0 as success).
54 * Note: use_shell=false mode makes some assumptions about the command:
56 * * only single quotes are used (double quotes and backslash quoting are
57 * not currently handled, aside from in the four character sequence '\''
58 * within single quotes).
59 * * the following redirections are supported, but they must be unquoted and
60 * appear exactly as shown, and each be a separate word in the command:
61 * >/dev/null 2>/dev/null 2>&1 1>&2
62 * * environment variables set before the command are handled correctly,
63 * for example: LANG=C some-command
65 * The command_needs_shell() function above can be used to check a command,
66 * but is somewhat more conservative than what this function actually
67 * supports.
69 * Currently the shell is only actually avoided for systems with both fork()
70 * and socketpair(). Other systems will ignore use_shell and always use the
71 * same code path (which may or may not involve some analog of the Unix
72 * shell).
74 std::string stdout_to_string(const std::string &cmd, bool use_shell,
75 int alt_status = 0);
77 #endif // OMEGA_INCLUDED_RUNFILTER_H