~mdw
/
fwd
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
Fix the manpage too.
[fwd]
/
exec.c
diff --git
a/exec.c
b/exec.c
index
1900017
..
f4c93af
100644
(file)
--- a/
exec.c
+++ b/
exec.c
@@
-1,6
+1,6
@@
/* -*-c-*-
*
/* -*-c-*-
*
- * $Id: exec.c,v 1.
1 1999/07/26 23:33:32
mdw Exp $
+ * $Id: exec.c,v 1.
9 2004/04/08 01:36:25
mdw Exp $
*
* Source and target for executable programs
*
*
* Source and target for executable programs
*
@@
-26,14
+26,6
@@
* Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
*/
* Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
*/
-/*----- Revision history --------------------------------------------------*
- *
- * $Log: exec.c,v $
- * Revision 1.1 1999/07/26 23:33:32 mdw
- * New sources and targets.
- *
- */
-
/*----- Header files ------------------------------------------------------*/
#include "config.h"
/*----- Header files ------------------------------------------------------*/
#include "config.h"
@@
-146,7
+138,8
@@
typedef struct xept {
endpt e;
struct xept *next, *prev;
pid_t kid;
endpt e;
struct xept *next, *prev;
pid_t kid;
- const char *desc;
+ endpt *f;
+ char *desc;
int st;
xargs *xa;
xopts *xo;
int st;
xargs *xa;
xopts *xo;
@@
-459,9
+452,9
@@
static void xenv_destroy(xenv *xe)
while (xe) {
xenv *xxe = xe;
xe = xe->next;
while (xe) {
xenv *xxe = xe;
xe = xe->next;
- free(xxe->name);
+
x
free(xxe->name);
if (xxe->value)
if (xxe->value)
- free(xxe->value);
+
x
free(xxe->value);
DESTROY(xxe);
}
}
DESTROY(xxe);
}
}
@@
-482,7
+475,7
@@
static void x_tidy(xargs *xa, xopts *xo)
{
xa->ref--;
if (!xa->ref)
{
xa->ref--;
if (!xa->ref)
- free(xa);
+
x
free(xa);
xo->ref--;
if (!xo->ref) {
xo->ref--;
if (!xo->ref) {
@@
-495,7
+488,7
@@
static void x_tidy(xargs *xa, xopts *xo)
/* --- @attach@ --- */
/* --- @attach@ --- */
-static void xept_error(char */*p*/, void */*v*/);
+static void xept_error(char */*p*/,
size_t /*len*/,
void */*v*/);
static void xept_attach(endpt *e, reffd *in, reffd *out)
{
static void xept_attach(endpt *e, reffd *in, reffd *out)
{
@@
-573,7
+566,7
@@
static void xept_attach(endpt *e, reffd *in, reffd *out)
/* --- Set group id --- */
/* --- Set group id --- */
- if (xo->gid != -1) {
+ if (xo->gid !=
(gid_t)
-1) {
if (setgid(xo->gid)) {
moan("couldn't set gid %i: %s", xo->gid, strerror(errno));
_exit(1);
if (setgid(xo->gid)) {
moan("couldn't set gid %i: %s", xo->gid, strerror(errno));
_exit(1);
@@
-587,7
+580,7
@@
static void xept_attach(endpt *e, reffd *in, reffd *out)
/* --- Set uid --- */
/* --- Set uid --- */
- if (xo->uid != -1) {
+ if (xo->uid !=
(uid_t)
-1) {
if (setuid(xo->uid)) {
moan("couldn't set uid %i: %s", xo->uid, strerror(errno));
_exit(1);
if (setuid(xo->uid)) {
moan("couldn't set uid %i: %s", xo->uid, strerror(errno));
_exit(1);
@@
-627,12
+620,22
@@
static void xept_attach(endpt *e, reffd *in, reffd *out)
return;
}
return;
}
+/* --- @xept_file@ --- */
+
+static void xept_file(endpt *e, endpt *f)
+{
+ xept *xe = (xept *)e;
+ xe->f = f;
+}
+
/* --- @xept_close@ --- */
static void xept_close(endpt *e)
{
xept *xe = (xept *)e;
if (xe->kid == -1) {
/* --- @xept_close@ --- */
static void xept_close(endpt *e)
{
xept *xe = (xept *)e;
if (xe->kid == -1) {
+ if (xe->f)
+ xe->f->ops->close(xe->f);
x_tidy(xe->xa, xe->xo);
DESTROY(xe);
fw_dec();
x_tidy(xe->xa, xe->xo);
DESTROY(xe);
fw_dec();
@@
-678,6
+681,9
@@
static void xept_destroy(xept *xe)
else
xept_list = xe->next;
else
xept_list = xe->next;
+ xfree(xe->desc);
+ if (xe->f)
+ xe->f->ops->close(xe->f);
x_tidy(xe->xa, xe->xo);
fw_dec();
DESTROY(xe);
x_tidy(xe->xa, xe->xo);
fw_dec();
DESTROY(xe);
@@
-717,6
+723,7
@@
static void xept_chld(int n, void *p)
/* --- @xept_error@ --- *
*
* Arguments: @char *p@ = pointer to string read from stderr
/* --- @xept_error@ --- *
*
* Arguments: @char *p@ = pointer to string read from stderr
+ * @size_t len@ = length of the string
* @void *v@ = pointer to by endpoint
*
* Returns: ---
* @void *v@ = pointer to by endpoint
*
* Returns: ---
@@
-724,14
+731,14
@@
static void xept_chld(int n, void *p)
* Use: Handles error reports from a child process.
*/
* Use: Handles error reports from a child process.
*/
-static void xept_error(char *p, void *v)
+static void xept_error(char *p,
size_t len,
void *v)
{
xept *xe = v;
if (p)
fw_log(-1, "[%s] pid %i: %s", xe->desc, xe->kid, p);
else {
{
xept *xe = v;
if (p)
fw_log(-1, "[%s] pid %i: %s", xe->desc, xe->kid, p);
else {
- selbuf_disable(&xe->err);
close(xe->err.reader.fd);
close(xe->err.reader.fd);
+ selbuf_destroy(&xe->err);
xe->e.f |= XEF_CLOSE;
if (xe->e.f & XEF_EXIT)
xept_destroy(xe);
xe->e.f |= XEF_CLOSE;
if (xe->e.f & XEF_EXIT)
xept_destroy(xe);
@@
-740,7
+747,7
@@
static void xept_error(char *p, void *v)
/* --- Endpoint operations --- */
/* --- Endpoint operations --- */
-static endpt_ops xept_ops = { xept_attach, 0, xept_close };
+static endpt_ops xept_ops = { xept_attach,
xept_file,
0, xept_close };
/*----- General operations on sources and targets -------------------------*/
/*----- General operations on sources and targets -------------------------*/
@@
-755,7
+762,9
@@
static endpt_ops xept_ops = { xept_attach, 0, xept_close };
void exec_init(void)
{
void exec_init(void)
{
+#ifdef HAVE_SETRLIMIT
rlimit_get(&exec_opts.xl);
rlimit_get(&exec_opts.xl);
+#endif
sig_add(&xept_sig, SIGCHLD, xept_chld, 0);
sym_create(&env);
env_import(&env, environ);
sig_add(&xept_sig, SIGCHLD, xept_chld, 0);
sym_create(&env);
env_import(&env, environ);
@@
-860,8
+869,10
@@
static int exec_option(xdata *x, scanner *sc)
/* --- Now try resource limit settings --- */
/* --- Now try resource limit settings --- */
+#ifdef HAVE_SETRLIMIT
if (rlimit_option(&xo->xl, sc))
CONF_ACCEPT;
if (rlimit_option(&xo->xl, sc))
CONF_ACCEPT;
+#endif
/* --- And then environment settings --- */
/* --- And then environment settings --- */
@@
-939,8
+950,12
@@
static void exec_read(xdata *x, scanner *sc)
char *p, *q;
char **v;
char *p, *q;
char **v;
- /* --- Strip off the leading `[' --- */
+ /* --- Strip off the leading `[' --- *
+ *
+ * Allow various handy filename characters to be entered without quoting.
+ */
+ conf_undelim(sc, "=:/.", "=:/.");
token(sc);
/* --- Read a sequence of arguments --- */
token(sc);
/* --- Read a sequence of arguments --- */
@@
-950,6
+965,7
@@
static void exec_read(xdata *x, scanner *sc)
token(sc);
argc++;
}
token(sc);
argc++;
}
+ conf_undelim(sc, 0, 0);
/* --- Expect the closing `]' --- */
/* --- Expect the closing `]' --- */
@@
-1007,7
+1023,8
@@
static endpt *exec_endpt(xdata *x, const char *desc)
xe->xa = x->xa; xe->xa->ref++;
xe->xo = x->xo; xe->xo->ref++;
xe->kid = -1;
xe->xa = x->xa; xe->xa->ref++;
xe->xo = x->xo; xe->xo->ref++;
xe->kid = -1;
- xe->desc = desc;
+ xe->f = 0;
+ xe->desc = xstrdup(desc);
return (&xe->e);
}
return (&xe->e);
}
@@
-1085,6
+1102,7
@@
tidy:
static void xsource_destroy(source *s)
{
xsource *xs = (xsource *)s;
static void xsource_destroy(source *s)
{
xsource *xs = (xsource *)s;
+ xfree(xs->s.desc);
exec_destroy(&xs->x);
DESTROY(xs);
}
exec_destroy(&xs->x);
DESTROY(xs);
}
@@
-1138,6
+1156,7
@@
static endpt *xtarget_create(target *t, const char *desc)
static void xtarget_destroy(target *t)
{
xtarget *xt = (xtarget *)t;
static void xtarget_destroy(target *t)
{
xtarget *xt = (xtarget *)t;
+ xfree(xt->t.desc);
exec_destroy(&xt->x);
DESTROY(xt);
}
exec_destroy(&xt->x);
DESTROY(xt);
}
@@
-1146,7
+1165,7
@@
static void xtarget_destroy(target *t)
target_ops xtarget_ops = {
"exec",
target_ops xtarget_ops = {
"exec",
- xtarget_option, xtarget_read, xtarget_create, xtarget_destroy
+ xtarget_option, xtarget_read,
0,
xtarget_create, xtarget_destroy
};
/*----- That's all, folks -------------------------------------------------*/
};
/*----- That's all, folks -------------------------------------------------*/