From dad57eae093dc2bf9510a0a050c71dfffdbebb45 Mon Sep 17 00:00:00 2001 From: Mrunal Patel Date: Thu, 5 May 2016 16:43:32 -0700 Subject: [PATCH] Add support for mounting mqueue Signed-off-by: Mrunal Patel Closes: #45 Approved by: cgwalters --- bubblewrap.c | 26 +++++++++++++++++++++++++- 1 file changed, 25 insertions(+), 1 deletion(-) diff --git a/bubblewrap.c b/bubblewrap.c index e74136a..07986e0 100644 --- a/bubblewrap.c +++ b/bubblewrap.c @@ -53,6 +53,7 @@ typedef enum { SETUP_MOUNT_PROC, SETUP_MOUNT_DEV, SETUP_MOUNT_TMPFS, + SETUP_MOUNT_MQUEUE, SETUP_MAKE_DIR, SETUP_MAKE_FILE, SETUP_MAKE_BIND_FILE, @@ -87,6 +88,7 @@ enum { PRIV_SEP_OP_PROC_MOUNT, PRIV_SEP_OP_TMPFS_MOUNT, PRIV_SEP_OP_DEVPTS_MOUNT, + PRIV_SEP_OP_MQUEUE_MOUNT, }; typedef struct { @@ -157,6 +159,7 @@ usage (int ecode) " --proc DEST Mount procfs on DEST\n" " --dev DEST Mount new dev on DEST\n" " --tmpfs DEST Mount new tmpfs on DEST\n" + " --mqueue DEST Mount new mqueue on DEST\n" " --dir DEST Create dir at DEST\n" " --file FD DEST Copy from FD to dest DEST\n" " --bind-data FD DEST Copy from FD to file which is bind-mounted on DEST\n" @@ -515,6 +518,10 @@ privileged_op (int privileged_op_socket, "newinstance,ptmxmode=0666,mode=620") != 0) die_with_error ("Can't mount devpts on %s", arg1); break; + case PRIV_SEP_OP_MQUEUE_MOUNT: + if (mount ("mqueue", arg1, "mqueue", 0, NULL) != 0) + die_with_error ("Can't mount mqueue on %s", arg1); + break; default: die ("Unexpected privileged op %d", op); } @@ -679,9 +686,15 @@ setup_newroot (bool unshare_pid, privileged_op (privileged_op_socket, PRIV_SEP_OP_TMPFS_MOUNT, 0, dest, NULL); - break; + case SETUP_MOUNT_MQUEUE: + if (mkdir (dest, 0755) != 0 && errno != EEXIST) + die_with_error ("Can't mkdir %s", op->dest); + privileged_op (privileged_op_socket, + PRIV_SEP_OP_MQUEUE_MOUNT, 0, + dest, NULL); + break; case SETUP_MAKE_DIR: if (mkdir (dest, 0755) != 0 && errno != EEXIST) die_with_error ("Can't mkdir %s", op->dest); @@ -1007,6 +1020,17 @@ parse_args_recurse (int *argcp, op = setup_op_new (SETUP_MOUNT_TMPFS); op->dest = argv[1]; + argv += 1; + argc -= 1; + } + else if (strcmp (arg, "--mqueue") == 0) + { + if (argc < 2) + die ("--mqueue takes an argument"); + + op = setup_op_new (SETUP_MOUNT_MQUEUE); + op->dest = argv[1]; + argv += 1; argc -= 1; }