NeoMutt  2024-11-14-34-g5aaf0d
Teaching an old dog new tricks
DOXYGEN
Loading...
Searching...
No Matches
filter.c File Reference

Pass files through external commands (filters) More...

#include "config.h"
#include <stdbool.h>
#include <stdlib.h>
#include <sys/wait.h>
#include <unistd.h>
#include "filter.h"
#include "signal2.h"
+ Include dependency graph for filter.c:

Go to the source code of this file.

Functions

pid_t filter_create_fd (const char *cmd, FILE **fp_in, FILE **fp_out, FILE **fp_err, int fdin, int fdout, int fderr, char **envlist)
 Run a command on a pipe (optionally connect stdin/stdout)
 
pid_t filter_create (const char *cmd, FILE **fp_in, FILE **fp_out, FILE **fp_err, char **envlist)
 Set up filter program.
 
int filter_wait (pid_t pid)
 Wait for the exit of a process and return its status.
 

Detailed Description

Pass files through external commands (filters)

Authors
  • Richard Russon
  • Dennis Schön

This program 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 this program. If not, see http://www.gnu.org/licenses/.

Definition in file filter.c.

Function Documentation

◆ filter_create_fd()

pid_t filter_create_fd ( const char *  cmd,
FILE **  fp_in,
FILE **  fp_out,
FILE **  fp_err,
int  fdin,
int  fdout,
int  fderr,
char **  envlist 
)

Run a command on a pipe (optionally connect stdin/stdout)

Parameters
[in]cmdCommand line to invoke using sh -c
[out]fp_inFile stream pointing to stdin for the command process, can be NULL
[out]fp_outFile stream pointing to stdout for the command process, can be NULL
[out]fp_errFile stream pointing to stderr for the command process, can be NULL
[in]fdinIf fp_in is NULL and fdin is not -1 then fdin will be used as stdin for the command process
[in]fdoutIf fp_out is NULL and fdout is not -1 then fdout will be used as stdout for the command process
[in]fderrIf fp_err is NULL and fderr is not -1 then fderr will be used as stderr for the command process
[in]envlistEnvironment variables
Return values
numPID of the created process
-1Error creating pipes or forking

This function provides multiple mechanisms to handle IO sharing for the command process. File streams are prioritized over file descriptors if present.

filter_create_fd(commandline, NULL, NULL, NULL, -1, -1, -1);
pid_t filter_create_fd(const char *cmd, FILE **fp_in, FILE **fp_out, FILE **fp_err, int fdin, int fdout, int fderr, char **envlist)
Run a command on a pipe (optionally connect stdin/stdout)
Definition: filter.c:62

Additionally, fp_in, fp_out, and fp_err will point to FILE* streams representing the processes stdin, stdout, and stderr.

Definition at line 62 of file filter.c.

64{
65 int pin[2], pout[2], perr[2], pid;
66
67 if (fp_in)
68 {
69 *fp_in = NULL;
70 if (pipe(pin) == -1)
71 return -1;
72 }
73
74 if (fp_out)
75 {
76 *fp_out = NULL;
77 if (pipe(pout) == -1)
78 {
79 if (fp_in)
80 {
81 close(pin[0]);
82 close(pin[1]);
83 }
84 return -1;
85 }
86 }
87
88 if (fp_err)
89 {
90 *fp_err = NULL;
91 if (pipe(perr) == -1)
92 {
93 if (fp_in)
94 {
95 close(pin[0]);
96 close(pin[1]);
97 }
98 if (fp_out)
99 {
100 close(pout[0]);
101 close(pout[1]);
102 }
103 return -1;
104 }
105 }
106
108
109 pid = fork();
110 if (pid == 0)
111 {
114
115 if (fp_in)
116 {
117 close(pin[1]);
118 dup2(pin[0], 0);
119 close(pin[0]);
120 }
121 else if (fdin != -1)
122 {
123 dup2(fdin, 0);
124 close(fdin);
125 }
126
127 if (fp_out)
128 {
129 close(pout[0]);
130 dup2(pout[1], 1);
131 close(pout[1]);
132 }
133 else if (fdout != -1)
134 {
135 dup2(fdout, 1);
136 close(fdout);
137 }
138
139 if (fp_err)
140 {
141 close(perr[0]);
142 dup2(perr[1], 2);
143 close(perr[1]);
144 }
145 else if (fderr != -1)
146 {
147 dup2(fderr, 2);
148 close(fderr);
149 }
150
151 execle(EXEC_SHELL, "sh", "-c", cmd, NULL, envlist);
152 _exit(127);
153 }
154 else if (pid == -1)
155 {
157
158 if (fp_in)
159 {
160 close(pin[0]);
161 close(pin[1]);
162 }
163
164 if (fp_out)
165 {
166 close(pout[0]);
167 close(pout[1]);
168 }
169
170 if (fp_err)
171 {
172 close(perr[0]);
173 close(perr[1]);
174 }
175
176 return -1;
177 }
178
179 if (fp_out)
180 {
181 close(pout[1]);
182 *fp_out = fdopen(pout[0], "r");
183 }
184
185 if (fp_in)
186 {
187 close(pin[0]);
188 *fp_in = fdopen(pin[1], "w");
189 }
190
191 if (fp_err)
192 {
193 close(perr[1]);
194 *fp_err = fdopen(perr[0], "r");
195 }
196
197 return pid;
198}
#define EXEC_SHELL
Definition: filter.h:29
void mutt_sig_reset_child_signals(void)
Reset ignored signals back to the default.
Definition: signal.c:321
void mutt_sig_block_system(void)
Block signals before calling exec()
Definition: signal.c:245
void mutt_sig_unblock_system(bool restore)
Restore previously blocked signals.
Definition: signal.c:269
+ Here is the call graph for this function:
+ Here is the caller graph for this function:

◆ filter_create()

pid_t filter_create ( const char *  cmd,
FILE **  fp_in,
FILE **  fp_out,
FILE **  fp_err,
char **  envlist 
)

Set up filter program.

Parameters
[in]cmdCommand string
[out]fp_inFILE pointer of stdin
[out]fp_outFILE pointer of stdout
[out]fp_errFILE pointer of stderr
[in]envlistEnvironment variables
Return values
numPID of filter

Definition at line 209 of file filter.c.

210{
211 return filter_create_fd(cmd, fp_in, fp_out, fp_err, -1, -1, -1, envlist);
212}
+ Here is the call graph for this function:
+ Here is the caller graph for this function:

◆ filter_wait()

int filter_wait ( pid_t  pid)

Wait for the exit of a process and return its status.

Parameters
pidProcess id of the process to wait for
Return values
numExit status of the process identified by pid
-1Error

Definition at line 220 of file filter.c.

221{
222 int rc = 0;
223
224 waitpid(pid, &rc, 0);
226 rc = WIFEXITED(rc) ? WEXITSTATUS(rc) : -1;
227
228 return rc;
229}
+ Here is the call graph for this function:
+ Here is the caller graph for this function: