/* * Copyright (C) 2001-2017 Colin Watson. * * This file is part of libpipeline. * * libpipeline is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or (at * your option) any later version. * * libpipeline is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public License * along with libpipeline; if not, write to the Free Software * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 * USA. */ #ifndef PIPELINE_PRIVATE_H #define PIPELINE_PRIVATE_H #include "pipeline.h" /* exit codes */ #define OK 0 /* success */ #define FAIL 1 /* usage or syntax error */ #define FATAL 2 /* operational error */ extern char *appendstr (char *, ...) PIPELINE_ATTR_SENTINEL PIPELINE_ATTR_WARN_UNUSED_RESULT; extern void init_debug (void); extern int debug_level; extern void debug (const char *message, ...) PIPELINE_ATTR_FORMAT_PRINTF(1, 2); #if defined(HAVE_SETENV) && !defined(HAVE_CLEARENV) extern int clearenv (void); #endif enum pipecmd_tag { PIPECMD_PROCESS, PIPECMD_FUNCTION, PIPECMD_SEQUENCE }; struct pipecmd_env { char *name; char *value; }; struct pipecmd { enum pipecmd_tag tag; char *name; int nice; int discard_err; /* discard stderr? */ int cwd_fd; char *cwd; int nenv; int env_max; /* size of allocated array */ struct pipecmd_env *env; pipecmd_function_type *pre_exec_func; pipecmd_function_type *pre_exec_free_func; void *pre_exec_data; union { struct pipecmd_process { int argc; int argv_max; /* size of allocated array */ char **argv; } process; struct pipecmd_function { pipecmd_function_type *func; pipecmd_function_free_type *free_func; void *data; } function; struct pipecmd_sequence { int ncommands; int commands_max; struct pipecmd **commands; } sequence; } u; }; enum pipeline_redirect { REDIRECT_NONE, REDIRECT_FD, REDIRECT_FILE_NAME }; struct pipeline { int ncommands; int commands_max; /* size of allocated array */ pipecmd **commands; pid_t *pids; int *statuses; /* -1 until command exits */ /* REDIRECT_NONE for no redirection; REDIRECT_FD for redirection * from/to file descriptor; REDIRECT_FILE_NAME for redirection * from/to file name. */ enum pipeline_redirect redirect_in, redirect_out; /* If non-negative, these contain caller-supplied file descriptors * for the input and output of the whole pipeline. If negative, * pipeline_start() will create pipes and store the input writing * half and the output reading half in infd and outfd as * appropriate. */ int want_in, want_out; /* If non-NULL, these contain files to open and use as the input and * output of the whole pipeline. These are only used if want_in or * want_out respectively is zero. The value of using these rather * than simply opening the files before starting the pipeline is * that the files will be opened with the same privileges under * which the pipeline is being run. */ char *want_infile, *want_outfile; /* See above. Default to -1. The caller should consider these * read-only. */ int infd, outfd; /* Set by pipeline_get_infile() and pipeline_get_outfile() * respectively. Default to NULL. */ FILE *infile, *outfile; /* Set by pipeline_connect() to record that this pipeline reads its * input from another pipeline. Defaults to NULL. */ struct pipeline *source; /* Private buffer for use by read/peek functions. */ char *buffer; size_t buflen, bufmax; /* The last line returned by readline/peekline. Private. */ char *line_cache; /* The amount of data at the end of buffer which has been * read-ahead, either by an explicit peek or by readline/peekline * reading a block at a time to save work. Private. */ size_t peek_offset; /* If set, ignore SIGINT and SIGQUIT while the pipeline is running, * like system(). Defaults to 1. */ int ignore_signals; }; #endif /* PIPELINE_PRIVATE_H */