Changeset 16650
- Timestamp:
- Dec 4, 2015, 12:31:10 AM (5 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/source/library/sockets.lisp
r16626 r16650 1466 1466 1467 1467 (defun resolve-address (&key 1468 1469 1470 1471 1472 1473 1474 1475 1476 1468 host 1469 port 1470 (socket-type :stream) 1471 (connect :active) 1472 address-family 1473 numeric-host-p 1474 #-windows-target numeric-service-p 1475 (singlep t) 1476 (errorp t)) 1477 1477 "Resolve a host and/or port string to one or more socket-address 1478 instances. Either host or port may be unspecified. Calls1479 getaddrinfo() underneath.1480 1481 singlep may be passed as NIL to make the function return a list of1482 host addresses matching the specified query terms. The default is to1483 return the first matching address.1484 1485 errorp may be passed as NIL to return NIL if no match was found."1486 1478 instances. Either host or port may be unspecified. Calls 1479 getaddrinfo() underneath. 1480 1481 singlep may be passed as NIL to make the function return a list of 1482 host addresses matching the specified query terms. The default is to 1483 return the first matching address. 1484 1485 errorp may be passed as NIL to return NIL if no match was found." 1486 1487 1487 ;; We have historically supported the use of an (unsigned-byte 32) 1488 1488 ;; value to represent an IPv4 address. If existing code does that to … … 1500 1500 (string port)) proto))))) 1501 1501 (if (null inet-port) 1502 1503 1504 1505 1506 1507 1508 1509 1510 1511 1512 1513 1502 (when errorp 1503 (error "can't resolve port ~s with getservbyname" port)) 1504 (let* ((socket-address (make-instance 'socket-address)) 1505 (sin (sockaddr socket-address))) 1506 (setf (pref sin :sockaddr_in.sin_family) #$AF_INET) 1507 (setf (pref sin 1508 #+(or windows-target solaris-target) #>sockaddr_in.sin_addr.S_un.S_addr 1509 #-(or windows-target solaris-target) :sockaddr_in.sin_addr.s_addr) (htonl host)) 1510 (setf (pref sin :sockaddr_in.sin_port) inet-port) 1511 (upgrade-socket-address-from-sockaddr #$AF_INET socket-address) 1512 (return-from resolve-address socket-address))))) 1513 1514 1514 (with-cstrs ((host-buf (or host "")) 1515 1515 (port-buf (string-downcase (or (ensure-string port) "")))) … … 1538 1538 (if (eql 0 err) 1539 1539 (prog1 1540 1541 1542 1543 1544 1545 1546 1547 1548 1549 1550 1551 1552 1553 1554 1555 1540 (or (loop for info = (pref results :address) then (pref info #>addrinfo.ai_next) 1541 until (%null-ptr-p info) 1542 for sockaddr = (pref info #>addrinfo.ai_addr) 1543 for socket-address = (make-instance 'socket-address) 1544 do (loop for i below (pref info #>addrinfo.ai_addrlen) 1545 do (setf (paref (sockaddr socket-address) :uint8_t i) 1546 (paref sockaddr :uint8_t i))) 1547 (upgrade-socket-address-from-sockaddr (pref (sockaddr socket-address) :sockaddr_storage.ss_family) 1548 socket-address) 1549 if singlep 1550 do (return socket-address) 1551 else 1552 collect socket-address) 1553 (when errorp 1554 (error "cannot resolve local service host ~A port ~A connect ~S type ~S" 1555 host port connect socket-type))) 1556 1556 (#_freeaddrinfo (pref results :address))) 1557 (values nil err)))))) 1557 (if errorp 1558 (socket-error nil "getaddrinfo" err t) 1559 (values nil err))))))) 1558 1560 1559 1561 (defclass ip4-socket-address (ip-socket-address) … … 1711 1713 (:udp :datagram) 1712 1714 (:tcp :stream)) 1713 proto)))) 1715 proto) 1716 :errorp nil))) 1714 1717 (when socket-address 1715 1718 (port socket-address))))) … … 1720 1723 (if (typep host 'integer) 1721 1724 host 1722 (let ((socket-address (resolve-address :host host :address-family :internet )))1725 (let ((socket-address (resolve-address :host host :address-family :internet :errorp nil))) 1723 1726 (when socket-address 1724 1727 (host socket-address)))))
Note: See TracChangeset
for help on using the changeset viewer.