From becae5915aeb55a67067e3a33ae4970a5401c5d7 Mon Sep 17 00:00:00 2001 From: Sapan Bhatia Date: Tue, 4 Aug 2009 03:12:30 +0000 Subject: [PATCH] Debugged version of reserve_tcp_port --- exec/reserve_tcp_port | 27 +++++++++++++++++++++++---- 1 file changed, 23 insertions(+), 4 deletions(-) diff --git a/exec/reserve_tcp_port b/exec/reserve_tcp_port index 30ca1e2..a9043ea 100755 --- a/exec/reserve_tcp_port +++ b/exec/reserve_tcp_port @@ -12,7 +12,6 @@ my $pid; my @vinfo; my $foo; my $real_xid; -my $cat_cmd; $slicename = $ARGV[0]; $xid = int(`id -u $slicename`) || die("Could not determine xid of $slicename\n"); @@ -23,10 +22,17 @@ if ($portnumber!~/^\d+$/) { die("$portnumber is not a port number"); } -$fuser_cmd = "ncontext --nid $xid --migrate -- vcontext --xid $xid --migrate fuser -n tcp $portnumber"; +if ($portnumber<61001 || $portnumber>65535) { + die("$portnumber lies in the local port-rover range\n"); +} + +$fuser_cmd = "ncontext --nid $xid --migrate -- vcontext --xid $xid --migrate fuser -n tcp $portnumber 2>/dev/null"; $pid = `$fuser_cmd` || die("Please bind to port $portnumber, e.g. run nc -l $portnumber."); +$pid=~s/\s+//g; + +my $cat_cmd; -$cat_cmd = "cat /proc/$pid/vinfo"; +$cat_cmd = "chcontext --ctx 1 cat /proc/$pid/vinfo"; $_ = `$cat_cmd`; @vinfo = split /\n/; ($#vinfo>0) || die("Port reservation failed. Please try again.\n"); @@ -39,4 +45,17 @@ if (int($real_xid)!=$xid) { die("Port $portnumber belongs to user $real_xid, not to you.\n"); } -close CMD; +# OK. We're good +# Only, slices are allowed only 1 port reservation/session + +if ( -f "/dev/shm/$slicename-port" ) { + print "You have already reserved the following port:\n"; + system("cat /dev/shm/$slicename-port"); + exit(1); +} + +open FIL,">/dev/shm/$slicename-port"; +print FIL "$portnumber"; +close FIL; + +system("iptables -t mangle -A INPUT -m tcp -p tcp --dport $portnumber -j MARK --set-mark $xid"); -- 2.43.0