#include <sys/param.h>
#include <sys/types.h>
#include <sys/jail.h>
#include <sys/queue.h>
#include <sys/time.h>
#include <jail.h>
#include <stdio.h>
#define CONF_FILE "/etc/jail.conf"
#define DEP_FROM 0
#define DEP_TO 1
#define DF_SEEN 0x01
#define DF_LIGHT 0x02
#define DF_NOFAIL 0x04
#define PF_VAR 0x0001
#define PF_APPEND 0x0002
#define PF_BAD 0x0004
#define PF_INTERNAL 0x0008
#define PF_BOOL 0x0010
#define PF_INT 0x0020
#define PF_CONV 0x0040
#define PF_REV 0x0080
#define PF_IMMUTABLE 0x0100
#define PF_NAMEVAL 0x0200
#define JF_START 0x0001
#define JF_SET 0x0002
#define JF_STOP 0x0004
#define JF_DEPEND 0x0008
#define JF_WILD 0x0010
#define JF_FAILED 0x0020
#define JF_PARAMS 0x0040
#define JF_RDTUN 0x0080
#define JF_PERSIST 0x0100
#define JF_TIMEOUT 0x0200
#define JF_SLEEPQ 0x0400
#define JF_FROM_RUNQ 0x0800
#define JF_CLEANUP 0x1000
#define JF_OP_MASK (JF_START | JF_SET | JF_STOP)
#define JF_RESTART (JF_START | JF_STOP)
#define JF_START_SET (JF_START | JF_SET)
#define JF_SET_RESTART (JF_SET | JF_STOP)
#define JF_START_SET_RESTART (JF_START | JF_SET | JF_STOP)
#define JF_DO_STOP(js) (((js) & (JF_SET | JF_STOP)) == JF_STOP)
enum intparam {
IP__NULL = 0,
IP_ALLOW_DYING,
IP_COMMAND,
IP_DEPEND,
IP_EXEC_CLEAN,
IP_EXEC_CONSOLELOG,
IP_EXEC_FIB,
IP_EXEC_JAIL_USER,
IP_EXEC_POSTSTART,
IP_EXEC_POSTSTOP,
IP_EXEC_PREPARE,
IP_EXEC_PRESTART,
IP_EXEC_PRESTOP,
IP_EXEC_RELEASE,
IP_EXEC_CREATED,
IP_EXEC_START,
IP_EXEC_STOP,
IP_EXEC_SYSTEM_JAIL_USER,
IP_EXEC_SYSTEM_USER,
IP_EXEC_TIMEOUT,
#if defined(INET) || defined(INET6)
IP_INTERFACE,
IP_IP_HOSTNAME,
#endif
IP_MOUNT,
IP_MOUNT_DEVFS,
IP_MOUNT_FDESCFS,
IP_MOUNT_PROCFS,
IP_MOUNT_FSTAB,
IP_STOP_TIMEOUT,
IP_VNET_INTERFACE,
IP_ZFS_DATASET,
#ifdef INET
IP__IP4_IFADDR,
#endif
#ifdef INET6
IP__IP6_IFADDR,
#endif
IP__MOUNT_FROM_FSTAB,
IP__OP,
KP_ALLOW_CHFLAGS,
KP_ALLOW_MOUNT,
KP_ALLOW_RAW_SOCKETS,
KP_ALLOW_SET_HOSTNAME,
KP_ALLOW_SOCKET_AF,
KP_ALLOW_SYSVIPC,
KP_DEVFS_RULESET,
KP_HOST_HOSTNAME,
#ifdef INET
KP_IP4_ADDR,
#endif
#ifdef INET6
KP_IP6_ADDR,
#endif
KP_JID,
KP_NAME,
KP_PATH,
KP_PERSIST,
KP_SECURELEVEL,
KP_VNET,
IP_NPARAM
};
STAILQ_HEAD(cfvars, cfvar);
struct cfvar {
STAILQ_ENTRY(cfvar) tq;
char *name;
size_t pos;
};
TAILQ_HEAD(cfstrings, cfstring);
struct cfstring {
TAILQ_ENTRY(cfstring) tq;
char *s;
size_t len;
struct cfvars vars;
};
TAILQ_HEAD(cfparams, cfparam);
struct cfparam {
TAILQ_ENTRY(cfparam) tq;
char *name;
struct cfstrings val;
unsigned flags;
int gen;
};
TAILQ_HEAD(cfjails, cfjail);
STAILQ_HEAD(cfdepends, cfdepend);
struct cfjail {
TAILQ_ENTRY(cfjail) tq;
char *name;
char *comline;
struct cfparams params;
struct cfdepends dep[2];
struct cfjails *queue;
struct cfjail *cfparent;
struct cfparam *intparams[IP_NPARAM];
struct cfstring *comstring;
struct jailparam *jp;
struct timespec timeout;
const enum intparam *comparam;
unsigned flags;
int jid;
int seq;
int pstatus;
int ndeps;
int njp;
int nprocs;
};
struct cfdepend {
STAILQ_ENTRY(cfdepend) tq[2];
struct cfjail *j[2];
unsigned flags;
};
struct cflex {
const char *cfname;
int error;
};
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, ...);
extern int next_command(struct cfjail *j);
extern int finish_command(struct cfjail *j);
extern struct cfjail *next_proc(int nonblock);
extern void load_config(const char *cfname);
extern void include_config(void *scanner, const char *cfname);
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 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 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);
extern int wild_jail_match(const char *jname, const char *wname);
extern void free_param_strings(struct cfparam *p);
extern void dep_setup(int docf);
extern int dep_check(struct cfjail *j);
extern void dep_done(struct cfjail *j, unsigned flags);
extern void dep_reset(struct cfjail *j);
extern struct cfjail *next_jail(void);
extern int start_state(const char *target, int docf, unsigned state,
int running);
extern void requeue(struct cfjail *j, struct cfjails *queue);
extern void requeue_head(struct cfjail *j, struct cfjails *queue);
extern struct cflex *yyget_extra(void *scanner);
extern FILE *yyget_in(void *scanner);
extern int yyget_lineno(void *scanner);
extern char *yyget_text(void *scanner);
extern struct cfjails cfjails;
extern struct cfjails ready;
extern struct cfjails depend;
extern int iflag;
extern int note_remove;
extern int paralimit;
extern int verbose;