Revision 24428,
1.4 KB
checked in by broder, 15 years ago
(diff) |
athinfo: Apply the timeout to the entire query, not just the connection.
An athinfo query could run for an arbitrary amount of time, which is
really just as bad as taking an arbitrary time trying to establish a
connection.
Instead of timing out on the connect() itself, set an alarm before we
connect and exit if the alarm goes off.
|
-
Property svn:executable set to
*
|
Rev | Line | |
---|
[24423] | 1 | #!/usr/bin/python |
---|
| 2 | |
---|
| 3 | import optparse |
---|
| 4 | import os |
---|
[24428] | 5 | import signal |
---|
[24423] | 6 | import socket |
---|
| 7 | import sys |
---|
| 8 | |
---|
| 9 | ATHINFO_FALLBACK_PORT = 49155 |
---|
| 10 | |
---|
[24428] | 11 | def alarm(signum, frame): |
---|
| 12 | print >>sys.stderr, 'athinfo: timed out' |
---|
| 13 | sys.exit(1) |
---|
| 14 | |
---|
[24423] | 15 | def main(): |
---|
| 16 | parser = optparse.OptionParser( |
---|
| 17 | usage='%prog [options] host query' |
---|
| 18 | ) |
---|
| 19 | parser.add_option( |
---|
| 20 | '-t', '--timeout', |
---|
[24428] | 21 | type='int', |
---|
[24423] | 22 | dest='timeout', |
---|
| 23 | help='timeout after SECONDS', |
---|
| 24 | metavar='SECONDS', |
---|
| 25 | ) |
---|
| 26 | |
---|
| 27 | (options, args) = parser.parse_args() |
---|
| 28 | if len(args) != 2: |
---|
| 29 | parser.print_usage() |
---|
| 30 | return 1 |
---|
| 31 | host = args[0] |
---|
| 32 | query = args[1] |
---|
| 33 | |
---|
| 34 | try: |
---|
| 35 | port = socket.getservbyname('athinfo', 'tcp') |
---|
| 36 | except socket.error: |
---|
| 37 | port = ATHINFO_FALLBACK_PORT |
---|
| 38 | |
---|
| 39 | try: |
---|
| 40 | host_addr = socket.gethostbyname(host) |
---|
| 41 | except socket.error: |
---|
| 42 | print >>sys.stderr, 'athinfo: host %s not found' % host |
---|
| 43 | return 1 |
---|
| 44 | |
---|
| 45 | try: |
---|
| 46 | s = socket.socket() |
---|
[24426] | 47 | |
---|
[24428] | 48 | if options.timeout: |
---|
| 49 | signal.signal(signal.SIGALRM, alarm) |
---|
| 50 | signal.alarm(options.timeout) |
---|
| 51 | |
---|
[24423] | 52 | s.connect((host_addr, port)) |
---|
| 53 | s.sendall('%s\n' % query) |
---|
| 54 | sys.stdout.write(s.makefile().read()) |
---|
| 55 | except socket.error, e: |
---|
| 56 | print >>sys.stderr, 'athinfo: %s' % e.args[-1] |
---|
| 57 | return 1 |
---|
| 58 | except KeyboardInterrupt: |
---|
| 59 | return 1 |
---|
| 60 | |
---|
| 61 | |
---|
| 62 | if __name__ == '__main__': |
---|
| 63 | sys.exit(main()) |
---|
Note: See
TracBrowser
for help on using the repository browser.