NeoMutt  2023-05-17-33-gce4425
Teaching an old dog new tricks
DOXYGEN
system.c File Reference

Execute external programs. More...

#include "config.h"
#include <signal.h>
#include <stdbool.h>
#include <stdlib.h>
#include <sys/wait.h>
#include <unistd.h>
#include "mutt/lib.h"
#include "globals.h"
#include "protos.h"
#include "imap/lib.h"
+ Include dependency graph for system.c:

Go to the source code of this file.

Functions

int mutt_system (const char *cmd)
 Run an external command. More...
 

Detailed Description

Execute external programs.

Authors
  • Michael R. Elkins

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 system.c.

Function Documentation

◆ mutt_system()

int mutt_system ( const char *  cmd)

Run an external command.

Parameters
cmdCommand and arguments
Return values
-1Error
>=0Success (command's return code)

Fork and run an external command with arguments.

Note
This function won't return until the command finishes.

Definition at line 52 of file system.c.

53{
54 int rc = -1;
55 struct sigaction act;
56 struct sigaction oldtstp;
57 struct sigaction oldcont;
58 pid_t pid;
59
60 if (!cmd || (*cmd == '\0'))
61 return 0;
62
63 /* must ignore SIGINT and SIGQUIT */
64
66
67 act.sa_handler = SIG_DFL;
68/* we want to restart the waitpid() below */
69#ifdef SA_RESTART
70 act.sa_flags = SA_RESTART;
71#endif
72 sigemptyset(&act.sa_mask);
73 sigaction(SIGTSTP, &act, &oldtstp);
74 sigaction(SIGCONT, &act, &oldcont);
75
76 pid = fork();
77 if (pid == 0)
78 {
79 act.sa_flags = 0;
80
81 /* reset signals for the child; not really needed, but... */
83 act.sa_handler = SIG_DFL;
84 act.sa_flags = 0;
85 sigemptyset(&act.sa_mask);
86 sigaction(SIGTERM, &act, NULL);
87 sigaction(SIGTSTP, &act, NULL);
88 sigaction(SIGCONT, &act, NULL);
89
90 execle(EXEC_SHELL, "sh", "-c", cmd, NULL, EnvList);
91 _exit(127); /* execl error */
92 }
93 else if (pid != -1)
94 {
95#ifdef USE_IMAP
96 rc = imap_wait_keepalive(pid);
97#endif
98 }
99
100 sigaction(SIGCONT, &oldcont, NULL);
101 sigaction(SIGTSTP, &oldtstp, NULL);
102
103 /* reset SIGINT, SIGQUIT and SIGCHLD */
105
106 rc = (pid != -1) ? (WIFEXITED(rc) ? WEXITSTATUS(rc) : -1) : -1;
107
108 return rc;
109}
#define EXEC_SHELL
Definition: filter.h:27
char ** EnvList
Private copy of the environment variables.
Definition: globals.c:91
int imap_wait_keepalive(pid_t pid)
Wait for a process to change state.
Definition: util.c:964
void mutt_sig_block_system(void)
Block signals before calling exec()
Definition: signal.c:197
void mutt_sig_unblock_system(bool restore)
Restore previously blocked signals.
Definition: signal.c:221
+ Here is the call graph for this function:
+ Here is the caller graph for this function: