X-Git-Url: https://git.distorted.org.uk/~mdw/fwd/blobdiff_plain/48bb1f76fd805b19aa32a374a8a9d8106ab7f420..a9bd543ab4ebe415bca9d6f27b90f16ddac79bc0:/exec.c diff --git a/exec.c b/exec.c index 1900017..f7c96ef 100644 --- a/exec.c +++ b/exec.c @@ -1,13 +1,11 @@ /* -*-c-*- * - * $Id: exec.c,v 1.1 1999/07/26 23:33:32 mdw Exp $ - * * Source and target for executable programs * * (c) 1999 Straylight/Edgeware */ -/*----- Licensing notice --------------------------------------------------* +/*----- Licensing notice --------------------------------------------------* * * This file is part of the `fw' port forwarder. * @@ -15,77 +13,18 @@ * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. - * + * * `fw' 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 `fw'; if not, write to the Free Software Foundation, * 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" - -#define _GNU_SOURCE - -#include -#include -#include -#include -#include -#include - -#include -#include -#include -#include -#include - -#ifdef HAVE_SETRLIMIT -# include -#endif - -#ifndef DECL_ENVIRON - extern char **environ; -#endif - -#include -#include - -#include - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#include "conf.h" -#include "endpt.h" -#include "exec.h" -#include "fattr.h" #include "fw.h" -#include "reffd.h" -#include "scan.h" -#include "source.h" -#include "target.h" /*----- Data structures ---------------------------------------------------*/ @@ -146,7 +85,8 @@ typedef struct xept { endpt e; struct xept *next, *prev; pid_t kid; - const char *desc; + endpt *f; + char *desc; int st; xargs *xa; xopts *xo; @@ -459,9 +399,9 @@ static void xenv_destroy(xenv *xe) while (xe) { xenv *xxe = xe; xe = xe->next; - free(xxe->name); + xfree(xxe->name); if (xxe->value) - free(xxe->value); + xfree(xxe->value); DESTROY(xxe); } } @@ -482,7 +422,7 @@ static void x_tidy(xargs *xa, xopts *xo) { xa->ref--; if (!xa->ref) - free(xa); + xfree(xa); xo->ref--; if (!xo->ref) { @@ -495,7 +435,7 @@ static void x_tidy(xargs *xa, xopts *xo) /* --- @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) { @@ -573,7 +513,7 @@ static void xept_attach(endpt *e, reffd *in, reffd *out) /* --- 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); @@ -587,7 +527,7 @@ static void xept_attach(endpt *e, reffd *in, reffd *out) /* --- 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); @@ -627,12 +567,22 @@ static void xept_attach(endpt *e, reffd *in, reffd *out) 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) { + if (xe->f) + xe->f->ops->close(xe->f); x_tidy(xe->xa, xe->xo); DESTROY(xe); fw_dec(); @@ -678,6 +628,9 @@ static void xept_destroy(xept *xe) 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); @@ -717,6 +670,7 @@ static void xept_chld(int n, void *p) /* --- @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: --- @@ -724,14 +678,14 @@ static void xept_chld(int n, void *p) * 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 { - selbuf_disable(&xe->err); close(xe->err.reader.fd); + selbuf_destroy(&xe->err); xe->e.f |= XEF_CLOSE; if (xe->e.f & XEF_EXIT) xept_destroy(xe); @@ -740,7 +694,7 @@ static void xept_error(char *p, void *v) /* --- 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 -------------------------*/ @@ -755,7 +709,9 @@ static endpt_ops xept_ops = { xept_attach, 0, xept_close }; void exec_init(void) { +#ifdef HAVE_SETRLIMIT rlimit_get(&exec_opts.xl); +#endif sig_add(&xept_sig, SIGCHLD, xept_chld, 0); sym_create(&env); env_import(&env, environ); @@ -805,7 +761,7 @@ static int exec_option(xdata *x, scanner *sc) /* --- Set a chroot prison --- */ if (strcmp(sc->d.buf, "root") == 0 || - strcmp(sc->d.buf, "chroot") == 0) { + strcmp(sc->d.buf, "chroot") == 0) { dstr d = DSTR_INIT; token(sc); if (sc->t == '=') @@ -860,8 +816,10 @@ static int exec_option(xdata *x, scanner *sc) /* --- Now try resource limit settings --- */ +#ifdef HAVE_SETRLIMIT if (rlimit_option(&xo->xl, sc)) CONF_ACCEPT; +#endif /* --- And then environment settings --- */ @@ -939,8 +897,12 @@ static void exec_read(xdata *x, scanner *sc) 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 --- */ @@ -950,6 +912,7 @@ static void exec_read(xdata *x, scanner *sc) token(sc); argc++; } + conf_undelim(sc, 0, 0); /* --- Expect the closing `]' --- */ @@ -1007,7 +970,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->desc = desc; + xe->f = 0; + xe->desc = xstrdup(desc); return (&xe->e); } @@ -1085,6 +1049,7 @@ tidy: static void xsource_destroy(source *s) { xsource *xs = (xsource *)s; + xfree(xs->s.desc); exec_destroy(&xs->x); DESTROY(xs); } @@ -1138,6 +1103,7 @@ static endpt *xtarget_create(target *t, const char *desc) static void xtarget_destroy(target *t) { xtarget *xt = (xtarget *)t; + xfree(xt->t.desc); exec_destroy(&xt->x); DESTROY(xt); } @@ -1146,7 +1112,7 @@ static void xtarget_destroy(target *t) 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 -------------------------------------------------*/