Combine check_intparams() and ip_params(), JF_CHECKINT and JF_IPPARAMS.

This commit is contained in:
Jamie Gritton 2010-11-01 21:37:28 +00:00
parent 47fdec177a
commit e3c69673a6
Notes: svn2git 2020-12-20 02:59:44 +00:00
svn path=/projects/jailconf/; revision=214649
3 changed files with 54 additions and 69 deletions

View File

@ -379,45 +379,6 @@ add_param(struct cfjail *j, const struct cfparam *p, enum intparam ipnum,
}
}
/*
* Check syntax of internal parameters.
*/
int
check_intparams(struct cfjail *j)
{
struct cfparam *p;
const char *val;
char *ep;
int error;
error = 0;
TAILQ_FOREACH(p, &j->params, tq) {
if (!STAILQ_EMPTY(&p->val) &&
(p->flags & (PF_BOOL | PF_INT))) {
val = STAILQ_LAST(&p->val, cfstring, tq)->s;
if (p->flags & PF_BOOL) {
if (strcasecmp(val, "false") &&
strcasecmp(val, "true") &&
((void)strtol(val, &ep, 10), *ep)) {
jail_warnx(j,
"%s: unknown boolean value \"%s\"",
p->name, val);
error = -1;
}
} else {
(void)strtol(val, &ep, 10);
if (ep == val || *ep) {
jail_warnx(j,
"%s: non-integer value \"%s\"",
p->name, val);
error = -1;
}
}
}
}
return error;
}
/*
* Return if a boolean parameter exists and is true.
*/
@ -458,18 +419,21 @@ string_param(const struct cfparam *p)
}
/*
* Look up extra IP addresses from the hostname and save interface and netmask.
* Check syntax and values of internal parameters. Set some internal
* parameters based on the values of others.
*/
int
ip_params(struct cfjail *j)
check_intparams(struct cfjail *j)
{
struct in_addr addr4;
struct addrinfo hints, *ai0, *ai;
struct addrinfo hints;
struct addrinfo *ai0, *ai;
struct cfparam *p;
struct cfstring *s, *ns;
const char *hostname, *val;
char *cs, *ep;
const char *hostname;
size_t size;
int error, ip4ok, defif, prefix;
int error, gicode, ip4ok, defif, prefix;
int mib[4];
char avalue4[INET_ADDRSTRLEN];
#ifdef INET6
@ -479,11 +443,39 @@ ip_params(struct cfjail *j)
#endif
error = 0;
/* Check format of boolan and integer values. */
TAILQ_FOREACH(p, &j->params, tq) {
if (!STAILQ_EMPTY(&p->val) &&
(p->flags & (PF_BOOL | PF_INT))) {
val = STAILQ_LAST(&p->val, cfstring, tq)->s;
if (p->flags & PF_BOOL) {
if (strcasecmp(val, "false") &&
strcasecmp(val, "true") &&
((void)strtol(val, &ep, 10), *ep)) {
jail_warnx(j,
"%s: unknown boolean value \"%s\"",
p->name, val);
error = -1;
}
} else {
(void)strtol(val, &ep, 10);
if (ep == val || *ep) {
jail_warnx(j,
"%s: non-integer value \"%s\"",
p->name, val);
error = -1;
}
}
}
}
/*
* The ip_hostname parameter looks up the hostname, and adds parameters
* for any IP addresses it finds.
*/
if (bool_param(j->intparams[IP_IP_HOSTNAME]) &&
if (((j->flags & JF_OP_MASK) != JF_STOP ||
j->intparams[IP_INTERFACE] != NULL) &&
bool_param(j->intparams[IP_IP_HOSTNAME]) &&
(hostname = string_param(j->intparams[KP_HOST_HOSTNAME]))) {
j->intparams[IP_IP_HOSTNAME] = NULL;
/*
@ -511,10 +503,10 @@ ip_params(struct cfjail *j)
ip6ok ? (ip4ok ? PF_UNSPEC : PF_INET6) :
#endif
PF_INET;
error = getaddrinfo(hostname, NULL, &hints, &ai0);
if (error != 0) {
gicode = getaddrinfo(hostname, NULL, &hints, &ai0);
if (gicode != 0) {
jail_warnx(j, "host.hostname %s: %s", hostname,
gai_strerror(error));
gai_strerror(gicode));
error = -1;
} else {
/*
@ -555,6 +547,7 @@ ip_params(struct cfjail *j)
}
}
}
/*
* IP addresses may include an interface to set that address on,
* and a netmask/suffix for that address.

View File

@ -311,23 +311,17 @@ main(int argc, char **argv)
dep_done(j, 0);
continue;
}
if (!(j->flags & JF_CHECKINT))
if (!(j->flags & JF_PARAMS))
{
j->flags |= JF_CHECKINT;
j->flags |= JF_PARAMS;
if (dflag)
add_param(j, NULL, IP_ALLOW_DYING, NULL);
if (check_intparams(j) < 0)
continue;
}
if (!(j->flags & JF_IPPARAMS) && (!JF_DO_STOP(j->flags) ||
j->intparams[IP_INTERFACE] != NULL)) {
j->flags |= JF_IPPARAMS;
if (ip_params(j) < 0)
if ((j->flags & (JF_START | JF_SET)) &&
import_params(j) < 0)
continue;
}
if (j->jp == NULL && (j->flags & (JF_START | JF_SET)) &&
import_params(j) < 0)
continue;
if (!j->jid)
running_jid(j,
(j->flags & (JF_SET | JF_DEPEND)) == JF_SET

View File

@ -57,15 +57,14 @@
#define JF_DEPEND 0x0008 /* Operation required by dependency */
#define JF_WILD 0x0010 /* Not specified on the command line */
#define JF_FAILED 0x0020 /* Operation failed */
#define JF_CHECKINT 0x0040 /* Checked internal parameters */
#define JF_IPPARAMS 0x0080 /* Looked up jail hostname for IP_HOSTNAME */
#define JF_RDTUN 0x0100 /* Create-only parameter check has been done */
#define JF_IFUP 0x0200 /* IP addresses have been configured */
#define JF_MOUNTED 0x0400 /* Filesystems have been mounted */
#define JF_PERSIST 0x0800 /* Jail is temporarily persistent */
#define JF_TIMEOUT 0x1000 /* A command (or process kill) timed out */
#define JF_RUNQ 0x2000 /* Jail was in the run qeueue */
#define JF_BACKGROUND 0x4000 /* Command was run in the background */
#define JF_PARAMS 0x0040 /* Parameters checked and imported */
#define JF_RDTUN 0x0080 /* Create-only parameter check has been done */
#define JF_IFUP 0x0100 /* IP addresses have been configured */
#define JF_MOUNTED 0x0200 /* Filesystems have been mounted */
#define JF_PERSIST 0x0400 /* Jail is temporarily persistent */
#define JF_TIMEOUT 0x0800 /* A command (or process kill) timed out */
#define JF_RUNQ 0x1000 /* Jail was in the run qeueue */
#define JF_BACKGROUND 0x2000 /* Command was run in the background */
#define JF_OP_MASK (JF_START | JF_SET | JF_STOP)
#define JF_RESTART (JF_START | JF_STOP)
@ -197,11 +196,10 @@ extern void load_config(void);
extern struct cfjail *add_jail(void);
extern void add_param(struct cfjail *j, const struct cfparam *p,
enum intparam ipnum, const char *value);
extern int check_intparams(struct cfjail *j);
extern int bool_param(const struct cfparam *p);
extern int int_param(const struct cfparam *p, int *ip);
extern const char *string_param(const struct cfparam *p);
extern int ip_params(struct cfjail *j);
extern int check_intparams(struct cfjail *j);
extern int import_params(struct cfjail *j);
extern int equalopts(const char *opt1, const char *opt2);
extern int wild_jail_name(const char *wname);