From owner-svn-src-projects@FreeBSD.ORG Sat Jun 18 15:23:09 2011 Return-Path: Delivered-To: svn-src-projects@freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:4f8:fff6::34]) by hub.freebsd.org (Postfix) with ESMTP id 620E51065670; Sat, 18 Jun 2011 15:23:09 +0000 (UTC) (envelope-from jamie@FreeBSD.org) Received: from svn.freebsd.org (svn.freebsd.org [IPv6:2001:4f8:fff6::2c]) by mx1.freebsd.org (Postfix) with ESMTP id 5284C8FC18; Sat, 18 Jun 2011 15:23:09 +0000 (UTC) Received: from svn.freebsd.org (localhost [127.0.0.1]) by svn.freebsd.org (8.14.4/8.14.4) with ESMTP id p5IFN9WP046768; Sat, 18 Jun 2011 15:23:09 GMT (envelope-from jamie@svn.freebsd.org) Received: (from jamie@localhost) by svn.freebsd.org (8.14.4/8.14.4/Submit) id p5IFN9UJ046764; Sat, 18 Jun 2011 15:23:09 GMT (envelope-from jamie@svn.freebsd.org) Message-Id: <201106181523.p5IFN9UJ046764@svn.freebsd.org> From: Jamie Gritton Date: Sat, 18 Jun 2011 15:23:09 +0000 (UTC) To: src-committers@freebsd.org, svn-src-projects@freebsd.org X-SVN-Group: projects MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Cc: Subject: svn commit: r223263 - projects/jailconf/usr.sbin/jail X-BeenThere: svn-src-projects@freebsd.org X-Mailman-Version: 2.1.5 Precedence: list List-Id: "SVN commit messages for the src " projects" tree" List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Sat, 18 Jun 2011 15:23:09 -0000 Author: jamie Date: Sat Jun 18 15:23:08 2011 New Revision: 223263 URL: http://svn.freebsd.org/changeset/base/223263 Log: Move the actual create/remove (IP__OP) handling into run_command, and the cost of an ugly single-use global variable. Modified: projects/jailconf/usr.sbin/jail/command.c projects/jailconf/usr.sbin/jail/jail.c projects/jailconf/usr.sbin/jail/jailp.h Modified: projects/jailconf/usr.sbin/jail/command.c ============================================================================== --- projects/jailconf/usr.sbin/jail/command.c Sat Jun 18 13:56:33 2011 (r223262) +++ projects/jailconf/usr.sbin/jail/command.c Sat Jun 18 15:23:08 2011 (r223263) @@ -94,7 +94,7 @@ next_command(struct cfjail *j) rval = 0; create_failed = (j->flags & (JF_STOP | JF_FAILED)) == JF_FAILED; - for (; (comparam = *j->comparam) && comparam != IP__OP; + for (; (comparam = *j->comparam); j->comparam += create_failed ? -1 : 1) { if (j->comstring == NULL) { switch (comparam) { @@ -102,6 +102,7 @@ next_command(struct cfjail *j) if (!bool_param(j->intparams[IP_MOUNT_DEVFS])) continue; /* FALLTHROUGH */ + case IP__OP: case IP_STOP_TIMEOUT: j->comstring = &dummystring; break; @@ -256,19 +257,43 @@ run_command(struct cfjail *j) static char *cleanenv; + /* Perform some operations that aren't actually commands */ + comparam = *j->comparam; + down = j->flags & (JF_STOP | JF_FAILED); + switch (comparam) { + case IP_STOP_TIMEOUT: + return term_procs(j); + + case IP__OP: + if (down) { + if (jail_remove(j->jid) == 0 && verbose >= 0 && + (verbose > 0 || (j->flags & JF_STOP + ? note_remove : j->name != NULL))) + jail_note(j, "removed\n"); + j->jid = -1; + if (j->flags & JF_STOP) + dep_done(j, DF_LIGHT); + else + j->flags &= ~JF_PERSIST; + } else { + if (create_jail(j) < 0) { + failed(j); + return -1; + } + if (verbose >= 0 && (j->name || verbose > 0)) + jail_note(j, "created\n"); + dep_done(j, DF_LIGHT); + } + requeue(j, &ready); + return 1; + } /* * Collect exec arguments. Internal commands for network and * mounting build their own argument lists. */ - comparam = *j->comparam; comstring = j->comstring; bg = 0; - down = j->flags & (JF_STOP | JF_FAILED); switch (comparam) { - case IP_STOP_TIMEOUT: - /* This isn't really a command */ - return term_procs(j); - case IP__IP4_IFADDR: argv = alloca(8 * sizeof(char *)); *(const char **)&argv[0] = _PATH_IFCONFIG; Modified: projects/jailconf/usr.sbin/jail/jail.c ============================================================================== --- projects/jailconf/usr.sbin/jail/jail.c Sat Jun 18 13:56:33 2011 (r223262) +++ projects/jailconf/usr.sbin/jail/jail.c Sat Jun 18 15:23:08 2011 (r223263) @@ -55,9 +55,9 @@ struct permspec { }; const char *cfname; +int note_remove; int verbose; -static int create_jail(struct cfjail *j); static void clear_persist(struct cfjail *j); static int update_jail(struct cfjail *j); static int rdtun_params(struct cfjail *j, int dofail); @@ -271,6 +271,7 @@ main(int argc, char **argv) if ((docf = !Rflag && (!strcmp(cfname, "-") || stat(cfname, &st) == 0))) load_config(); + note_remove = docf || argc > 1 || wild_jail_name(argv[0]); } else if (argc > 1 || (argc == 1 && strchr(argv[0], '='))) { /* Single jail specified on the command line */ if (Rflag) @@ -388,25 +389,7 @@ main(int argc, char **argv) continue; if (j->jid > 0) goto jail_create_done; - j->comparam == startcommands + 1; - } else if (*j->comparam == IP__OP) { - if (j->flags & JF_FAILED) { - if (jail_remove(j->jid) == 0 && - verbose >= 0 && - (j->name || verbose > 0)) - jail_note(j, "removed\n"); - j->jid = -1; - j->flags &= ~JF_PERSIST; - j->comparam--; - } else if (create_jail(j) < 0) { - j->comparam--; - } else { - if (verbose >= 0 && - (j->name || verbose > 0)) - jail_note(j, "created\n"); - dep_done(j, DF_LIGHT); - j->comparam++; - } + j->comparam = startcommands + 1; } if (next_command(j)) continue; @@ -449,19 +432,9 @@ main(int argc, char **argv) j->name); goto jail_remove_done; } - j->comparam == stopcommands + 1; - } else if ((j->flags & JF_FAILED) && j->jid > 0) { + j->comparam = stopcommands + 1; + } else if ((j->flags & JF_FAILED) && j->jid > 0) goto jail_remove_done; - } else if (*j->comparam == IP__OP) { - if (jail_remove(j->jid) == 0 && - verbose >= 0 && - (docf || argc > 1 || - wild_jail_name(argv[0]) || verbose > 0)) - jail_note(j, "removed\n"); - j->jid = -1; - dep_done(j, DF_LIGHT); - j->comparam++; - } if (next_command(j)) continue; jail_remove_done: @@ -578,7 +551,7 @@ jail_warnx(const struct cfjail *j, const /* * Create a new jail. */ -static int +int create_jail(struct cfjail *j) { struct iovec jiov[4]; @@ -595,17 +568,14 @@ create_jail(struct cfjail *j) if (path[0] != '/') { jail_warnx(j, "path %s: not an absolute pathname", path); - failed(j); return -1; } if (stat(path, &st) < 0) { jail_warnx(j, "path %s: %s", path, strerror(errno)); - failed(j); return -1; } if (!S_ISDIR(st.st_mode)) { jail_warnx(j, "path %s: %s", path, strerror(ENOTDIR)); - failed(j); return -1; } } @@ -621,7 +591,6 @@ create_jail(struct cfjail *j) alloca((j->njp + dopersist) * sizeof(struct jailparam)); if (dopersist && jailparam_init(sjp++, "persist") < 0) { jail_warnx(j, "%s", jail_errmsg); - failed(j); return -1; } for (jp = j->jp; jp < j->jp + j->njp; jp++) Modified: projects/jailconf/usr.sbin/jail/jailp.h ============================================================================== --- projects/jailconf/usr.sbin/jail/jailp.h Sat Jun 18 13:56:33 2011 (r223262) +++ projects/jailconf/usr.sbin/jail/jailp.h Sat Jun 18 15:23:08 2011 (r223263) @@ -182,6 +182,7 @@ struct cfdepend { extern void *emalloc(size_t); extern void *erealloc(void *, size_t); extern char *estrdup(const char *); +extern int create_jail(struct cfjail *j); extern void failed(struct cfjail *j); extern void jail_note(const struct cfjail *j, const char *fmt, ...); extern void jail_warnx(const struct cfjail *j, const char *fmt, ...); @@ -219,5 +220,6 @@ extern struct cfjails cfjails; extern struct cfjails ready; extern struct cfjails depend; extern const char *cfname; +extern int note_remove; extern int paralimit; extern int verbose;