File: asyncresolver.tcl

package info (click to toggle)
amsn 0.98.3-2
  • links: PTS
  • area: main
  • in suites: squeeze
  • size: 33,876 kB
  • ctags: 10,292
  • sloc: tcl: 117,923; ansic: 32,173; cpp: 17,387; xml: 6,643; objc: 1,251; sh: 667; makefile: 544; perl: 215; python: 126
file content (65 lines) | stat: -rw-r--r-- 1,545 bytes parent folder | download | duplicates (2)
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

load [file join $dir libasyncresolver[info sharedlibextension]]

namespace eval ::asyncresolver {
	
	variable request_number 0

	proc resolve { original arguments } {
		variable request_number

		if { [ lsearch $arguments -server ] == -1} {
			incr request_number
		
			set varname ::asyncresolver::_wait_$request_number
			::asyncresolver::asyncresolve [list ::asyncresolver::_resolve_callback $varname] [lindex $arguments end-1]
	
			if {![info exists $varname]} {tkwait variable $varname}
		
			if { [set $varname] == "" } {
				error "couldn't open socket: host is unreachable (Name or service not known)"
			}
			set cmd [linsert [lreplace $arguments end-1 end-1  [set $varname]] 0 $original ]

			unset $varname

			return [eval $cmd]
		
		} else {
			return [eval [linsert $arguments 0 $original ] ]
		}
	
	}

	proc _resolve_callback { var {ip ""} } {
		set $var $ip
	}

}

rename fconfigure _fconfigure
proc fconfigure { channel args } {
	if { [llength $args] == 1 && [lindex $args 0] == "-sockname" } {
		set sockname [::asyncresolver::sockname $channel]
		foreach {ip port} $sockname break
		return [list $ip [info hostname] $port]
	} else {
		return [eval [linsert $args 0 _fconfigure $channel] ]
	}
}


# rename socket _socket
# proc socket { args } {
# 	return [::asyncresolver::resolve _socket $args]	
# }


# package require tls
# if {[info commands ::tls::socket] == "::tls::socket"} {
# 	rename ::tls::socket ::tls::_socket
# 	proc ::tls::socket { args } {
# 		return [::asyncresolver::resolve ::tls::_socket $args]	
# 	}

# }