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 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181
|
set srcdir [file dirname [file normalize [file join [pwd] [info script]]]]
set moddir [file dirname $srcdir]
set version 0.5.2
set tclversion 8.5
set module [file tail $moddir]
proc ::ladd {varname args} {
upvar 1 $varname var
if ![info exists var] {
set var {}
}
foreach item $args {
if {$item in $var} continue
lappend var $item
}
return $var
}
dict set map %module% $module
dict set map %version% $version
dict set map %tclversion% $tclversion
dict set map { } {}
dict set map "\t" { }
###
# Rebuild the available ports file
###
###
# topic: 65dfea29d424543cdfc0e1cbf9f90295ef6214cb
# description:
# This script digests the raw data from
# http://www.iana.org/assignments/service-names-port-numbers/service-names-port-numbers.csv
# And produces a summary
###
proc ::record {service port type usage} {
if { $port eq {} } return
if {$service eq {} && $type in {tcp udp {}} && $usage != "Reserved"} {
ladd ::available_port($port) {*}$type
return
}
unset -nocomplain ::available_port($port)
lappend ::busy_port($port) $type $usage
#puts [list busy $service $port $type $usage]
}
for {set x 0} {$x < 65536} {incr x} {
set ::available_port($x) {}
}
package require dicttool
package require csv
set fin [open [file join $srcdir service-names-port-numbers.csv] r]
set headers [gets $fin]
set thisline {}
while {[gets $fin line]>=0} {
append thisline \n$line
if {![csv::iscomplete $line]} continue
set lline [csv::split $line]
if [catch {
set service [lindex $lline 0]
set port [lindex $lline 1]
set type [lindex $lline 2]
set usage [lindex $lline 3]
}] continue
##nagelfar ignore
if {![string is integer -strict $port]} {
set startport [lindex [split $port -] 0]
set endport [lindex [split $port -] 1]
##nagelfar ignore
if {[string is integer -strict $startport] && [string is integer -strict $endport]} {
for {set i $startport} {$i<=$endport} {incr i} {
record $service $i $type $usage
}
continue
}
}
record $service $port $type $usage
}
close $fin
set fout [open [file join $moddir available_ports.tcl] w]
puts $fout {
namespace eval ::nettool {
set blocks {}
}
}
set startport 0
set endport 0
foreach port [lsort -integer [array names available_port]] {
set avail $available_port($port)
# Don't bother with ports below 1024
# Most operating systems won't let us access them anyway
if {$port < 1024 } continue
if { $endport == ($port-1) } {
set endport $port
continue
}
if {$startport} {
puts $fout [list lappend ::nettool::blocks $startport $endport]
}
set startport $port
set endport $port
}
if { $startport } {
puts $fout [list lappend ::nettool::blocks $startport $endport]
}
close $fout
set fout [open [file join $moddir [file tail $module].tcl] w]
puts $fout [string map $map {###
# Amalgamated package for %module%
# Do not edit directly, tweak the source in src/ and rerun
# build.tcl
###
package require Tcl %tclversion%
package provide %module% %version%
namespace eval ::%module% {}
set ::%module%::version %version%
}]
# Track what files we have included so far
set loaded {}
lappend loaded build.tcl
# These files must be loaded in a particular order
foreach file {
core.tcl
generic.tcl
available_ports.tcl
locateport.tcl
platform_unix.tcl
platform_unix_linux.tcl
platform_unix_macosx.tcl
platform_windows.tcl
platform_windows_twapi.tcl
} {
lappend loaded $file
set fin [open [file join $srcdir $file] r]
puts $fout "###\n# START: [file tail $file]\n###"
puts $fout [read $fin]
close $fin
puts $fout "###\n# END: [file tail $file]\n###"
}
# These files can be loaded in any order
##nagelfar ignore
foreach file [glob [file join $srcdir *.tcl]] {
if {[file tail $file] in $loaded} continue
lappend loaded $file
set fin [open [file join $srcdir $file] r]
puts $fout "###\n# START: [file tail $file]\n###"
puts $fout [read $fin]
close $fin
puts $fout "###\n# END: [file tail $file]\n###"
}
# Provide some cleanup and our final package provide
puts $fout [string map $map {
namespace eval ::%module% {
namespace export *
}
###
# Perform any one-time discovery we might need
###
::nettool::discover
::nettool::init
}]
close $fout
###
# Build our pkgIndex.tcl file
###
set fout [open [file join $moddir pkgIndex.tcl] w]
puts $fout [string map $map {
if {![package vsatisfies [package provide Tcl] %tclversion%]} {return}
# Backward compatible alias
package ifneeded nettool::available_ports 0.1 {package require %module% ; package provide nettool::available_ports 0.1}
package ifneeded %module% %version% [list source [file join $dir %module%.tcl]]
}]
close $fout
|