main.c mbox.c mbyte.c mh.c muttlib.c mutt_idna.c mx.c \
pager.c pattern.c postpone.c query.c \
recvattach.c recvcmd.c rfc1524.c rfc3676.c \
- score.c send.c sendlib.c sidebar.c sort.c state.c status.c system.c \
+ score.c send.c sendlib.c sidebar.c sort.c state.c status.c \
thread.c url.c utf8.c wcwidth.c account.c
madmutt_LDADD = @MUTT_LIB_OBJECTS@ @LIBOBJS@ \
#include <lib-lib/macros.h>
#include <lib-lib/debug.h>
+#include <lib-sys/unix.h>
+
#include <lib-mime/mime.h>
#include <lib-ui/curses.h>
#include <lib-mime/mime.h>
#include <lib-sys/exit.h>
+#include <lib-sys/unix.h>
#include <lib-ui/curses.h>
#include <lib-ui/enter.h>
# include "config.h"
#endif
+#include <errno.h>
+#include <string.h>
+#include <sys/stat.h>
+#include <sys/wait.h>
+#include <unistd.h>
+#include <stdlib.h>
+
#include <lib-lib/mem.h>
#include <lib-lib/str.h>
#include <lib-lib/macros.h>
#include <lib-lib/file.h>
#include <lib-lib/mapping.h>
+#include <lib-sys/unix.h>
+
#include <lib-mime/mime.h>
#include <lib-ui/curses.h>
#include "nntp.h"
#endif
-
-#include <errno.h>
-#include <string.h>
-#include <sys/stat.h>
-#include <sys/wait.h>
-#include <unistd.h>
-#include <stdlib.h>
-
static const char *There_are_no_attachments = N_("There are no attachments.");
#define CHECK_COUNT if (idxlen == 0) { mutt_error _(There_are_no_attachments); break; }
#include <lib-lib/debug.h>
#include <lib-sys/mutt_signal.h>
+#include <lib-sys/unix.h>
#include <lib-ui/curses.h>
#include <lib-lib/file.h>
#include <lib-lib/debug.h>
+#include <lib-sys/unix.h>
+
#include <lib-mime/mime.h>
#include <lib-ui/curses.h>
#include "mutt.h"
#include "globals.h"
+#include "unix.h"
#include "mutt_socket.h"
#include "mutt_tunnel.h"
#include "mutt_signal.h"
* please see the file GPL in the top level source directory.
*/
+#include <errno.h>
#include <stdlib.h>
+#include <sys/wait.h>
+#include <unistd.h>
#include <lib-lib/macros.h>
#include <lib-lib/mem.h>
#include <lib-lib/str.h>
#include "unix.h"
+#include "mutt_signal.h"
+
+#include <imap/imap.h> /* for imap_wait_keepalive EEEEK */
+
/* Extract the real name from /etc/passwd's GECOS field.
* When set, honor the regular expression in rx,
return len;
}
+
+int _mutt_system(const char *cmd, int flags)
+{
+ int rc = -1;
+ struct sigaction act;
+ struct sigaction oldtstp;
+ struct sigaction oldcont;
+ sigset_t set;
+ pid_t pid;
+
+ if (m_strisempty(cmd))
+ return 0;
+
+ /* must ignore SIGINT and SIGQUIT */
+ mutt_block_signals_system();
+
+ /* also don't want to be stopped right now */
+ if (flags & M_DETACH_PROCESS) {
+ sigemptyset(&set);
+ sigaddset(&set, SIGTSTP);
+ sigprocmask(SIG_BLOCK, &set, NULL);
+ } else {
+ act.sa_handler = SIG_DFL;
+ /* we want to restart the waitpid() below */
+#ifdef SA_RESTART
+ act.sa_flags = SA_RESTART;
+#endif
+ sigemptyset(&act.sa_mask);
+ sigaction(SIGTSTP, &act, &oldtstp);
+ sigaction(SIGCONT, &act, &oldcont);
+ }
+
+ pid = fork ();
+ if (pid == 0) {
+ act.sa_flags = 0;
+
+ if (flags & M_DETACH_PROCESS) {
+ /* give up controlling terminal */
+ setsid();
+
+ switch (fork()) {
+ int fd, nb_fds;
+
+ case 0:
+ nb_fds = getdtablesize();
+ for (fd = 0; fd < nb_fds; fd++) {
+ close(fd);
+ }
+ chdir ("/");
+ act.sa_handler = SIG_DFL;
+ sigaction(SIGCHLD, &act, NULL);
+ break;
+
+ case -1:
+ _exit(127);
+
+ default:
+ _exit(0);
+ }
+ }
+
+ /* reset signals for the child; not really needed, but... */
+ mutt_unblock_signals_system(0);
+ act.sa_handler = SIG_DFL;
+ act.sa_flags = 0;
+ sigemptyset(&act.sa_mask);
+ sigaction(SIGTERM, &act, NULL);
+ sigaction(SIGTSTP, &act, NULL);
+ sigaction(SIGCONT, &act, NULL);
+
+ execl("/bin/sh", "sh", "-c", cmd, NULL);
+ _exit(127); /* execl error */
+ } else
+ if (pid != -1) {
+ rc = imap_wait_keepalive(pid);
+ }
+
+ sigaction(SIGCONT, &oldcont, NULL);
+ sigaction(SIGTSTP, &oldtstp, NULL);
+
+ /* reset SIGINT, SIGQUIT and SIGCHLD */
+ mutt_unblock_signals_system(1);
+ if (flags & M_DETACH_PROCESS) {
+ sigprocmask (SIG_UNBLOCK, &set, NULL);
+ }
+
+ return (pid > 0 && WIFEXITED(rc)) ? WEXITSTATUS(rc) : -1;
+}
ssize_t mutt_gecos_name(char *dst, ssize_t n, struct passwd *pw, rx_t *rx);
+
+/* flags for _mutt_system() */
+#define M_DETACH_PROCESS 1 /* detach subprocess from group */
+
+#define mutt_system(x) _mutt_system(x,0)
+int _mutt_system (const char *, int);
+
+
#endif /* MUTT_LIB_SYS_UNIX_H */
#include <lib-lib/file.h>
#include <lib-lib/debug.h>
+#include <lib-sys/unix.h>
#include <lib-sys/mutt_signal.h>
#include "curses.h"
int op; /* function op */
} event_t;
-/* flags for _mutt_system() */
-#define M_DETACH_PROCESS 1 /* detach subprocess from group */
-
/* flags for mutt_FormatString() */
typedef enum {
M_FORMAT_FORCESUBJ = (1 << 0), /* print the subject even if unchanged */
#include <lib-lib/file.h>
#include <lib-lib/debug.h>
+#include <lib-sys/unix.h>
+
#include <lib-mime/mime.h>
#include "mutt.h"
void _mutt_make_string (char *, size_t, const char *, CONTEXT *,
HEADER *, format_flag);
-#define mutt_system(x) _mutt_system(x,0)
-int _mutt_system (const char *, int);
-
#define mutt_new_enter_state() p_new(ENTER_STATE, 1)
typedef const char *format_t (char *, size_t, char, const char *,
#include <lib-lib/mapping.h>
#include <lib-lib/rx.h>
+#include <lib-sys/unix.h>
+
#include <lib-ui/curses.h>
#include <lib-ui/menu.h>
#include <lib-lib/file.h>
#include <lib-lib/debug.h>
+#include <lib-sys/unix.h>
+
#include "mutt.h"
#include "rfc1524.h"
#include "attach.h"
+++ /dev/null
-/*
- * Copyright notice from original mutt:
- * Copyright (C) 1996-2000 Michael R. Elkins <me@mutt.org>
- *
- * This file is part of mutt-ng, see http://www.muttng.org/.
- * It's licensed under the GNU General Public License,
- * please see the file GPL in the top level source directory.
- */
-
-#if HAVE_CONFIG_H
-# include "config.h"
-#endif
-
-#include <errno.h>
-#include <stdlib.h>
-#include <signal.h>
-#include <string.h>
-#include <sys/wait.h>
-#include <unistd.h>
-
-#include <lib-sys/mutt_signal.h>
-
-#include "mutt.h"
-#include <imap/imap.h>
-
-int _mutt_system (const char *cmd, int flags)
-{
- int rc = -1;
- struct sigaction act;
- struct sigaction oldtstp;
- struct sigaction oldcont;
- sigset_t set;
- pid_t thepid;
-
- if (!cmd || !*cmd)
- return (0);
-
- /* must ignore SIGINT and SIGQUIT */
-
- mutt_block_signals_system ();
-
- /* also don't want to be stopped right now */
- if (flags & M_DETACH_PROCESS) {
- sigemptyset (&set);
- sigaddset (&set, SIGTSTP);
- sigprocmask (SIG_BLOCK, &set, NULL);
- }
- else {
- act.sa_handler = SIG_DFL;
- /* we want to restart the waitpid() below */
-#ifdef SA_RESTART
- act.sa_flags = SA_RESTART;
-#endif
- sigemptyset (&act.sa_mask);
- sigaction (SIGTSTP, &act, &oldtstp);
- sigaction (SIGCONT, &act, &oldcont);
- }
-
- if ((thepid = fork ()) == 0) {
- act.sa_flags = 0;
-
- if (flags & M_DETACH_PROCESS) {
- int fd;
-
- /* give up controlling terminal */
- setsid ();
-
- switch (fork ()) {
- case 0:
-#if defined(OPEN_MAX)
- for (fd = 0; fd < OPEN_MAX; fd++)
- close (fd);
-#elif defined(_POSIX_OPEN_MAX)
- for (fd = 0; fd < _POSIX_OPEN_MAX; fd++)
- close (fd);
-#else
- close (0);
- close (1);
- close (2);
-#endif
- chdir ("/");
- act.sa_handler = SIG_DFL;
- sigaction (SIGCHLD, &act, NULL);
- break;
-
- case -1:
- _exit (127);
-
- default:
- _exit (0);
- }
- }
-
- /* reset signals for the child; not really needed, but... */
- mutt_unblock_signals_system (0);
- act.sa_handler = SIG_DFL;
- act.sa_flags = 0;
- sigemptyset (&act.sa_mask);
- sigaction (SIGTERM, &act, NULL);
- sigaction (SIGTSTP, &act, NULL);
- sigaction (SIGCONT, &act, NULL);
-
- execl ("/bin/sh", "sh", "-c", cmd, NULL);
- _exit (127); /* execl error */
- }
- else if (thepid != -1) {
- rc = imap_wait_keepalive (thepid);
- }
-
- sigaction (SIGCONT, &oldcont, NULL);
- sigaction (SIGTSTP, &oldtstp, NULL);
-
- /* reset SIGINT, SIGQUIT and SIGCHLD */
- mutt_unblock_signals_system (1);
- if (flags & M_DETACH_PROCESS)
- sigprocmask (SIG_UNBLOCK, &set, NULL);
-
- rc = (thepid != -1) ? (WIFEXITED (rc) ? WEXITSTATUS (rc) : -1) : -1;
-
- return (rc);
-}