/* * Copyright 2001-2004 Brandon Long * All Rights Reserved. * * ClearSilver Templating System * * This code is made available under the terms of the ClearSilver License. * http://www.clearsilver.net/license.hdf * */ #ifndef __NEO_FILTER_H_ #define __NEO_FILTER_H_ 1 __BEGIN_DECLS #include <stdarg.h> #include <stdio.h> #include "util/neo_misc.h" #include "util/neo_err.h" /* * Function: filter_wait - wrap waitpid to decode the exitcode and why * your filter quit * Description: filter_wait wraps the waitpid call and raises an error * (with description) if the call failed. Note that if the * ask for the exitcode and the process exited with a code * other than zero, we don't raise an error. If you don't * ask for the exitcode, and it is non-zero, we raise an * error * Input: pid -> the process identifier to wait for * options -> the options to pass to waitpid (see wait(2)) * Output: exitcode -> the exitcode if the process existed normally * Returns: NERR_SYSTEM, NERR_ASSERT */ NEOERR *filter_wait(pid_t pid, int options, int *exitcode); /* * Function: filter_create_fd - Create a sub process and return the * requested pipes * Description: filter_create_fd and filter_create_fp are what popen * should have been: a mechanism to create sub processes * and have pipes to all their input/output. The concept * was taken from mutt, though python has something similar * with popen3/popen4. You control which pipes the * function returns by the fdin/fdout/fderr arguments. A * NULL value means "don't create a pipe", a pointer to an * int will cause the pipes to be created and the value * of the file descriptor stored in the int. You will have * to close(2) the file descriptors yourself. * Input: cmd -> the sub command to execute. Will be executed with * /bin/sh -c * fdin -> pointer to return the stdin pipe, or NULL if you don't * want the stdin pipe * fdout -> pointer to return the stdout pipe, or NULL if you don't * want the stdout pipe * fderr -> pointer to return the stderr pipe, or NULL if you don't * want the stderr pipe * Output: fdin -> the stdin file descriptor of the sub process * fdout -> the stdout file descriptor of the sub process * fderr -> the stderr file descriptor of the sub process * pid -> the pid of the sub process * Returns: NERR_SYSTEM */ NEOERR *filter_create_fd(const char *cmd, int *fdin, int *fdout, int *fderr, pid_t *pid); /* * Function: filter_create_fp - similar to filter_create_fd except with * buffered FILE* * Description: filter_create_fp is identical to filter_create_fd, * except each of the pipes is wrapped in a buffered stdio FILE * Input: cmd -> the sub command to execute. Will be executed with * /bin/sh -c * in -> pointer to return the stdin pipe, or NULL if you don't * want the stdin pipe * out -> pointer to return the stdout pipe, or NULL if you don't * want the stdout pipe * err -> pointer to return the stderr pipe, or NULL if you don't * want the stderr pipe * Output: in -> the stdin FILE of the sub process * out -> the stdout FILE of the sub process * err -> the stderr FILE of the sub process * pid -> the pid of the sub process * Returns: NERR_SYSTEM, NERR_IO */ NEOERR *filter_create_fp(const char *cmd, FILE **in, FILE **out, FILE **err, pid_t *pid); __END_DECLS #endif /* __NEO_FILTER_H_ */