aboutsummaryrefslogtreecommitdiff
path: root/old/Cpp.run
blob: 6c6d7eadcbac57b8313835547b1e2f555f046aa5 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
#!/bin/bash
#//////////////////////////////////////////////////////////////////////////////////////////
#//BOCA Online Contest Administrator. Copyright (c) 2003- Cassio Polpo de Campos.
#//It may be distributed under the terms of the Q Public License version 1.0. A copy of the
#//license can be found with this software or at http://www.opensource.org/licenses/qtpl.php
#//
#//THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED,
#//INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR
#//PURPOSE AND NONINFRINGEMENT OF THIRD PARTY RIGHTS. IN NO EVENT SHALL THE COPYRIGHT HOLDER
#//OR HOLDERS INCLUDED IN THIS NOTICE BE LIABLE FOR ANY CLAIM, OR ANY SPECIAL INDIRECT OR
#//CONSEQUENTIAL DAMAGES, OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR
#//PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING
#//OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
#///////////////////////////////////////////////////////////////////////////////////////////
#Last modified: 17/oct/2011 by cassio@ime.usp.br
#
# parameters are:
# $1 base_filename
# $2 source_file
# $3 input_file
# $4 languagename
# $5 problemname
# $6 timelimit
#
# the output of the submission should be directed to the standard output
#
# the return code show what happened:
# 0 ok
# 1 compile error
# 2 runtime error
# 3 timelimit exceeded
# 4 internal error
# 5 parameter error
# 6 internal error
# 7 memory limit exceeded
# 8 security threat
# 9 runtime error
# other_codes are unknown to boca: in this case BOCA will present the
#                                  last line of standard output to the judge

umask 0022
id -u bocajail >/dev/null 2>/dev/null
if [ $? == 0 ]; then
	bocau=`id -u bocajail`
	bocag=`id -g bocajail`
	chown bocajail.nogroup .
else
	bocau=`id -u nobody`
	bocag=`id -g nobody`
	chown nobody.nogroup .
fi
if [ "$bocau" == "" -o "$bocag" == "" ]; then
	echo "error finding user to run script"
	exit 43
fi

# this script makes use of safeexec to execute the code with less privilegies
# make sure that directories below are correct.
sf=`which safeexec`
[ -x "$sf" ] || sf=/usr/bin/safeexec
gpp=`which g++`
[ -x "$gpp" ] || gcc=/usr/bin/g++

if [ "$1" == "" -o "$2" == "" -o "$3" == "" ]; then
    echo "parameter problem"
    exit 43
fi
if [ ! -r $2 ]; then
    echo "$2 not found or it's not readable"
    exit 44
fi
if [ ! -r $3 ]; then
    echo "$3 not found or it's not readable"
    exit 45
fi
if [ ! -x $sf ]; then
    echo "$sf not found or it's not executable"
    exit 46
fi
if [ ! -x $gpp ]; then
    echo "$gpp not found or it's not executable"
    exit 47
fi

prefix=$1
name=$2
input=$3

# setting up the timelimit according to the problem
# note that problems should spelling the same as inside BOCA
if [ "$6" == "" ]; then
time=5
else
time=$6
fi
let ttime=$time+30

$gpp -O2 -lm -o $prefix "$name"
ret=$?
if [ "$ret" != "0" ]; then
	echo "Compiling Error: $ret"
	exit 1
else
    cdir=`pwd`
	echo "Current directory is $cdir" >&2
	echo $cdir | grep -q "/bocajail"
	if [ $? == 0 ]; then
       cdir=`echo $cdir | sed "s/.*\/bocajail//"`
       cat <<EOF > runit.sh
#!/bin/bash
[ -f /proc/cpuinfo ] || /bin/mount -t proc proc /proc
#/bin/mount --bind /dev /dev
[ -d /sys/kernel ] || /bin/mount -t sysfs sysfs /sys
cd $cdir
$sf -F10 -t$time -T$ttime -i$input -ostdout0 -estderr0 -U$bocau -G$bocag -n0 -C. -f20000 -d512000 -m512000 ./$prefix
echo \$? > runit.retcode
/bin/umount /proc 2>/dev/null
#/bin/umount /dev
/bin/umount /sys 2>/dev/null
EOF
       chmod 755 runit.sh
       chroot /bocajail $cdir/runit.sh
  	   ret=`cat runit.retcode`
	   if [ "$ret" == "" ]; then
		   echo "Execution error - check autojudging"
		   exit 49
	   fi
    else
       echo "CODE NOT BEING CHROOTED. DO NOT RUN THIS ON THE MAIN SERVER" >&2
       echo "CODE NOT BEING CHROOTED. DO NOT RUN THIS ON THE MAIN SERVER" >&2
       echo "CODE NOT BEING CHROOTED. DO NOT RUN THIS ON THE MAIN SERVER" >&2
       $sf -F10 -n0 -C. -U$bocau -G$bocag -ostdout0 -estderr0 -d512000000 -m512000000 -t$time -T$ttime -i$input ./$prefix
	   ret=$?
    fi
	if [ $ret -gt 10 ]; then
        ret=0
	fi
fi
if [ -f stdout0 ]; then
  cat stdout0
fi
exit $ret