/cjail

A chroot jail for TIOJ infor online judge

Primary LanguageCMIT LicenseMIT

cjail


Introduction

cjail is a application jail for competitive programming and online judge

Dependencies

You should check your system meets the dependencies before building it.

  • Linux kernel 3.17+ (4.8+ is recommended)
  • glibc 2.27+
  • libseccomp 1.0.1+ (2.0+ is recommended)
  • CMake 3.0.2+
  • Criterion 2.3.3 (For running tests only)

Build

cjail use CMake as build system. Install CMake first if you don't have it on your computer.
We suggest you do an out-of-source build

mkdir build
cd build
cmake ..
make

Notes

cjail is currently under development, the library API is unstable. So you should rebuild your application when you update the libcjail. Besides, there might be many bugs unfixed.

Here is a list of the features that are not stable enough:

  • Under testing:
    • Seccomp trace mode
    • In-box init process name concealing
    • In-box custom devfs mounting
  • Not tested:
    • Seccomp for 32bits programs
    • Running on non-x86 machines
  • Future changing:
    • Taskstats sockets
    • Mounting

Command line

Usage: cjail [OPTIONS...] [--] PROGRAM... [ARG...]
       cjail --help

  -c, --chroot=PATH             set the root path of the jail
  -d, --working-dir=PATH        change the working directory of the program
                                if -c is set, this is the path inside chroot
  -u, --uid=UID                 set the user of the program
  -g, --gid=GID                 set the group of the program
  -s, --cpuset=SET              set cpu affinity of the program with a list separated by ','
                                each entry should be <CPU> or <CPU>-<CPU>
      --share-net               not to unshare the net namespace while creating the jail
      --cgroup-root=PATH        change cgroup filesystem root path (default: /sys/fs/cgroup)
      --allow-root              allow uid or gid to be 0 (root)
  -q, --quiet                   not to print any message
  -v  --verbose                 print more details
  -h, --help                    show this help

 Resource Limit Options:
  -V, --limit-vss=SIZE          limit the memory space size can be allocated per process (KB)
  -C, --limit-core=SIZE         limit the core file size can be generated (KB)
  -Z, --limit-fsize=SIZE        limit the max file size can be created (KB)
  -P, --limit-proc=NUM          limit the process number in the jail
  -S, --limit-stack=SIZE        limit the stack size of one process (KB)
  -T, --limit-time=SEC          limit the total running time of the jail (sec)
  -M, --limit-rss=SIZE          limit the memory size can be used of the jail (KB)
      --limit-swap=SIZE         limit the swap size can be used of the jail (KB)
      --limit-cpu=SEC           limit the total CPU time of the jail (KB)
      --poll-ms=MSEC            set the polling interval of checking CPU timeout (msec)

 I/O Options:
  -i, --file-input=FILE         redirect stdin of the program to the file
  -o, --file-output=FILE        redirect stdout of the program to the file
  -r, --file-err=FILE           redirect stderr of the program to the file
  -I, --fd-input=FD             redirect stdin of the program to the file descriptor
  -O, --fd-output=FD            redirect stdout of the program to the file descriptor
  -R, --fd-err=FD               redirect stderr of the program to the file descriptor
      --preserve-fd             do not close file descriptors greater than 2

 Environment Variables Options:
  -e, --environ=ENV             set the environment variables of the program with a list separated by ';'
                                each entry should be <name>, !<name>, <name>=<value>
                                <name>        : try to inherit the environment variable from the parent process
                                !<name>       : unset the environment variable inheriting from the parent process
                                <name>=<value>: set the environment variable using giving name and value
  -E, --inherit-env             inherit all environment variables from the parent process

 Mount Options:
  -b, --bind=PATH[:TARG[:rw]]   set up bind mount before running the program (once for each mount)
  -t, --tmpfs=TARG[:SIZE]       set up tmpfs before running the program (once for each mount)

 Seccomp Options:
      --seccomp-cfg=FILE        specify seccomp rules to load

Library call

cjail provide a interface to use the jail directly, without the need to call from command line interface. For details, please view the documents generated by Doxygen

doxygen Doxyfile