summaryrefslogtreecommitdiff
path: root/srcx/jstart.c
diff options
context:
space:
mode:
Diffstat (limited to 'srcx/jstart.c')
-rw-r--r--srcx/jstart.c70
1 files changed, 64 insertions, 6 deletions
diff --git a/srcx/jstart.c b/srcx/jstart.c
index aa119f8..6360f06 100644
--- a/srcx/jstart.c
+++ b/srcx/jstart.c
@@ -53,6 +53,7 @@
#include <err.h>
#include <unistd.h>
#include <limits.h>
+#include <string.h>
#include "util.h"
@@ -65,12 +66,66 @@ static char* START_ARGS[] = { _PATH_BSHELL, START_SCRIPT, NULL };
static void usage();
+#ifdef JAIL_MULTIPATCH
+
+static void allocate_address(char* arg, struct jail* j)
+{
+ struct in_addr in;
+ char *ip;
+ int i = 0;
+
+ /* Count number of ips */
+ for(i = 1, ip = arg; *ip; ip++)
+ {
+ if(*ip == ',')
+ i++;
+ }
+
+ /* Allocate memory */
+ if((j->ips = (u_int32_t*)malloc(sizeof(u_int32_t) * i)) == NULL)
+ errx(1, "out of memory");
+
+ for(i = 0, ip = strtok(arg, ","); ip; i++, ip = strtok(NULL, ","))
+ {
+ if(inet_aton(ip, &in) == 0)
+ errx(1, "invalid ip address: %s", ip);
+ j->ips[i] = ntohl(in.s_addr);
+ }
+
+ j->nips = i;
+ j->version = 1;
+}
+
+static void free_address(struct jail* j)
+{
+ free(j->ips);
+}
+
+#else /* !JAIL_MULTIPATCH */
+
+static void allocate_address(char* arg, struct jail* j)
+{
+ struct in_addr in;
+
+ if(inet_aton(arg, &in) != 1)
+ errx(1, "invalid ip address: %s", arg);
+ j->ip_number = ntohl(in.s_addr);
+ j->version = 0;
+}
+
+static void free_address(struct jail* j)
+{
+ /* Nothing to do */
+}
+
+#endif /* !JAIL_MULTIPATCH */
+
+
int main(int argc, char* argv[])
{
int ch, jid;
struct jail j;
int printjid = 0;
- struct in_addr in;
while((ch = getopt(argc, argv, "i")) != -1)
{
@@ -98,20 +153,19 @@ int main(int argc, char* argv[])
if(chdir(argv[0]) != 0)
err(1, "couldn't change to jail directory: %s", argv[0]);
- if(inet_aton(argv[2], &in) != 1)
- errx(1, "invalid ip address: %s", argv[2]);
-
memset(&j, 0, sizeof(j));
- j.version = 0;
j.path = argv[0];
j.hostname = argv[1];
- j.ip_number = ntohl(in.s_addr);
+
+ allocate_address(argv[2], &j);
/* Here's where we actually go into the jail */
jid = jail(&j);
if(jid == -1)
err(1, "couldn't create jail");
+ free_address(&j);
+
if(printjid)
{
printf("%d\n", jid);
@@ -144,7 +198,11 @@ int main(int argc, char* argv[])
static void usage()
{
+#ifdef JAIL_MULTIPATCH
+ fprintf(stderr, "usage: jstart [-i] path hostname ip[,ip...] [command ...]\n");
+#else
fprintf(stderr, "usage: jstart [-i] path hostname ip-number [command ...]\n");
+#endif
exit(2);
}