Drewes
Drewes

Reputation: 2697

How to set iolib timeout

I'm using IOLIB with this code to resolve a hostname:

(sockets:address-to-string (sockets:lookup-hostname name))

I works, but the functions does not take any timeout paramenter, and i cannot figure out how to set these using socket options.

Upvotes: 3

Views: 69

Answers (1)

coredump
coredump

Reputation: 38809

Unfortunately this is not easy to find (in particular, this is not documented), but following the chain of calls from lookup-hostname (M-. in Emacs), you can see your code eventually calls dns-query:

(defun dns-query (name &key (type :a) (search *dns-search-domain*)
                  (nameservers *dns-nameservers*) decode
                  (repeat *dns-repeat*) (timeout *dns-timeout*))
  ...)

The timeout argument defaults to a special variable iolib/sockets::*dns-timeout*, which is globally bound to 10. You then only need to bind it around your code to set a different timeout:

(let ((iolib/sockets::*dns-timeout* 1))
  ...)

The variable is not exported, but dns-query is, maybe it is better to call that function directly.

CL-USER> (iolib:dns-query "http://example.com" :timeout 0.0001)
NIL
CL-USER> (iolib:dns-query "http://example.com" :timeout 1)

#<DNS RESPONSE Id: 61273, Question: #(#<"http://example.com." A IN>) Flags: :OP/S :RD :RA :NAME-ERROR, Sections: QD(1) AN(0) NS(1) AD(0)>

Upvotes: 4

Related Questions