16 $slicename = $ARGV[0];
17 $xid = int(`id -u $slicename`) || die("Could not determine xid of $slicename\n");
18 $portnumber = <STDIN>;
21 if ($portnumber!~/^\d+$/) {
22 die("$portnumber is not a port number");
25 if ($portnumber<61001 || $portnumber>65535) {
26 die("$portnumber lies in the local port-rover range\n");
29 $fuser_cmd = "ncontext --nid $xid --migrate -- vcontext --xid $xid --migrate fuser -n tcp $portnumber 2>/dev/null";
30 $pid = `$fuser_cmd` || die("Please bind to port $portnumber, e.g. run nc -l $portnumber.");
35 $cat_cmd = "chcontext --ctx 1 cat /proc/$pid/vinfo";
38 ($#vinfo>0) || die("Port reservation failed. Please try again.\n");
42 ($foo,$real_xid) = split;
44 if (int($real_xid)!=$xid) {
45 die("Port $portnumber belongs to user $real_xid, not to you.\n");
49 # Only, slices are allowed only 1 port reservation/session
51 if ( -f "/dev/shm/$slicename-port" ) {
52 print "You have already reserved the following port:\n";
53 system("cat /dev/shm/$slicename-port");
57 open FIL,">/dev/shm/$slicename-port";
58 print FIL "$portnumber";
61 system("iptables -t mangle -A INPUT -m tcp -p tcp --dport $portnumber -j MARK --set-mark $xid");