AC_CONFIG_HEADERS(src/config.h)
AC_CONFIG_AUX_DIR([libltdl/config])
+dnl older automake's default of ARFLAGS=cru is noisy on newer binutils;
+dnl we don't really need the 'u' even in older toolchains. Then there is
+dnl older libtool, which spelled it AR_FLAGS
+m4_divert_text([DEFAULTS], [: "${ARFLAGS=cr} ${AR_FLAGS=cr}"])
+
m4_ifdef([LT_PACKAGE_VERSION],
# libtool >= 2.2
[
]
)
+AM_CONDITIONAL([BUILD_INCLUDED_LTDL], [test "x$LTDLDEPS" != "x"])
+
AM_INIT_AUTOMAKE([tar-pax dist-bzip2 foreign])
m4_ifdef([AM_SILENT_RULES], [AM_SILENT_RULES([yes])])
AC_LANG(C)
#if HAVE_NET_IF_H
# include <net/if.h>
#endif
+#if HAVE_NETINET_IN_H
+# include <netinet/in.h>
+#endif
])
# For the multimeter plugin
fi
if test "x$with_libpcap" = "xyes"
then
- AC_CHECK_HEADERS(pcap-bpf.h,,
- [with_libpcap="no (pcap-bpf.h not found)"])
-fi
-if test "x$with_libpcap" = "xyes"
-then
AC_CACHE_CHECK([whether libpcap has PCAP_ERROR_IFACE_NOT_UP],
[c_cv_libpcap_have_pcap_error_iface_not_up],
AC_COMPILE_IFELSE([AC_LANG_PROGRAM(
sigprocmask (SIG_SETMASK, &ss, /* old mask = */ NULL);
} /* }}} void reset_signal_mask */
+static int create_pipe (int fd_pipe[2]) /* {{{ */
+{
+ char errbuf[1024];
+ int status;
+
+ status = pipe (fd_pipe);
+ if (status != 0)
+ {
+ ERROR ("exec plugin: pipe failed: %s",
+ sstrerror (errno, errbuf, sizeof (errbuf)));
+ return (-1);
+ }
+
+ return 0;
+} /* }}} int create_pipe */
+
+static void close_pipe (int fd_pipe[2]) /* {{{ */
+{
+ if (fd_pipe[0] != -1)
+ close (fd_pipe[0]);
+
+ if (fd_pipe[1] != -1)
+ close (fd_pipe[1]);
+} /* }}} void close_pipe */
+
/*
* Creates three pipes (one for reading, one for writing and one for errors),
* forks a child, sets up the pipes so that fd_in is connected to STDIN of
*/
static int fork_child (program_list_t *pl, int *fd_in, int *fd_out, int *fd_err) /* {{{ */
{
- int fd_pipe_in[2];
- int fd_pipe_out[2];
- int fd_pipe_err[2];
+ int fd_pipe_in[2] = {-1, -1};
+ int fd_pipe_out[2] = {-1, -1};
+ int fd_pipe_err[2] = {-1, -1};
char errbuf[1024];
int status;
int pid;
if (pl->pid != 0)
return (-1);
- status = pipe (fd_pipe_in);
- if (status != 0)
- {
- ERROR ("exec plugin: pipe failed: %s",
- sstrerror (errno, errbuf, sizeof (errbuf)));
- return (-1);
- }
-
- status = pipe (fd_pipe_out);
- if (status != 0)
- {
- ERROR ("exec plugin: pipe failed: %s",
- sstrerror (errno, errbuf, sizeof (errbuf)));
- return (-1);
- }
-
- status = pipe (fd_pipe_err);
- if (status != 0)
- {
- ERROR ("exec plugin: pipe failed: %s",
- sstrerror (errno, errbuf, sizeof (errbuf)));
- return (-1);
- }
+ if ((create_pipe(fd_pipe_in) == -1)
+ || (create_pipe(fd_pipe_out) == -1)
+ || (create_pipe(fd_pipe_err) == -1))
+ goto failed;
sp_ptr = NULL;
status = getpwnam_r (pl->user, &sp, nambuf, sizeof (nambuf), &sp_ptr);
{
ERROR ("exec plugin: Failed to get user information for user ``%s'': %s",
pl->user, sstrerror (errno, errbuf, sizeof (errbuf)));
- return (-1);
+ goto failed;
}
+
if (sp_ptr == NULL)
{
ERROR ("exec plugin: No such user: `%s'", pl->user);
- return (-1);
+ goto failed;
}
uid = sp.pw_uid;
if (uid == 0)
{
ERROR ("exec plugin: Cowardly refusing to exec program as root.");
- return (-1);
+ goto failed;
}
/* The group configured in the configfile is set as effective group, because
ERROR ("exec plugin: Failed to get group information "
"for group ``%s'': %s", pl->group,
sstrerror (errno, errbuf, sizeof (errbuf)));
- return (-1);
+ goto failed;
}
if (NULL == gr_ptr)
{
ERROR ("exec plugin: No such group: `%s'", pl->group);
- return (-1);
+ goto failed;
}
egid = gr.gr_gid;
{
ERROR ("exec plugin: fork failed: %s",
sstrerror (errno, errbuf, sizeof (errbuf)));
- return (-1);
+ goto failed;
}
else if (pid == 0)
{
close (fd_pipe_err[0]);
return (pid);
+
+failed:
+ close_pipe(fd_pipe_in);
+ close_pipe(fd_pipe_out);
+ close_pipe(fd_pipe_err);
+
+ return (-1);
} /* int fork_child }}} */
static int parse_line (char *buffer) /* {{{ */