Commit 3d4af110 authored by Daniel Kochmański's avatar Daniel Kochmański
Browse files

Merge branch 'develop' into 'develop'

Fix GET-PROTOCOL-BY-NAME with unknown protocols

See merge request embeddable-common-lisp/ecl!233
parents 1effa6a1 bb40da9f
......@@ -17,6 +17,7 @@
"SOCKET-PEERNAME" "SOCKET-NAME" "SOCKET-LISTEN"
"SOCKET-RECEIVE" "SOCKET-CLOSE" "SOCKET-MAKE-STREAM"
"GET-PROTOCOL-BY-NAME" "MAKE-INET-ADDRESS" "LOCAL-SOCKET"
"UNKNOWN-PROTOCOL" "UNKNOWN-PROTOCOL-NAME"
"SOCKET" "INET-SOCKET" "SOCKET-FILE-DESCRIPTOR" #+:win32 "NAMED-PIPE-SOCKET"
"SOCKET-FAMILY" "SOCKET-PROTOCOL" "SOCKET-TYPE"
"SOCKET-ERROR" "NAME-SERVICE-ERROR" "NON-BLOCKING-MODE"
......
......@@ -571,17 +571,27 @@ safe_buffer_pointer(cl_object x, cl_index size)
;; We could refactor a lot here, if we pass sockaddr_foo structs around in Lisp. But
;; I do not feel comfortable with that.
(define-condition unknown-protocol (error)
((name :initarg :name
:reader unknown-protocol-name))
(:report (lambda (condition stream)
(format stream "Protocol not found: ~A"
(prin1-to-string (unknown-protocol-name condition))))))
(defun get-protocol-by-name (string-or-symbol)
"Calls getprotobyname"
#-:android
(let ((string (string string-or-symbol)))
(c-inline (string) (:cstring) :int
"{
struct protoent *pe;
pe = getprotobyname(#0);
@(return 0) = pe ? pe->p_proto : -1;
}
"))
(let* ((string (string string-or-symbol))
(proto-num (c-inline (string) (:cstring) :int
"{
struct protoent *pe;
pe = getprotobyname(#0);
@(return 0) = pe ? pe->p_proto : -1;
}
")))
(if (= proto-num -1)
(error 'unknown-protocol :name string)
proto-num))
;; getprotobyname is not yet implemented on bionic
#+:android
(let ((proto (string-downcase (if (symbolp string-or-symbol)
......
......@@ -27,6 +27,13 @@
(equalp (make-inet-address "242.1.211.3") #(242 1 211 3))
t)
(deftest get-protocol-by-name-unknown-protocol
(let ((protocol-name "totally-unknown-protocol"))
(handler-case (get-protocol-by-name protocol-name)
(unknown-protocol (c) (string= protocol-name (unknown-protocol-name c)))
(:no-error (&rest args) (declare (ignore args)) nil)))
t)
(deftest make-inet-socket
;; make a socket
(let ((s (make-instance 'inet-socket :type :stream :protocol (get-protocol-by-name "tcp"))))
......@@ -46,7 +53,7 @@
(make-instance 'inet-socket :type :stream :protocol (get-protocol-by-name "udp"))
((or socket-type-not-supported-error protocol-not-supported-error) (c)
(declare (ignorable c)) t)
(:no-error nil))
(:no-error (&rest args) (declare (ignore args)) nil))
t)
(deftest make-inet-socket-keyword-wrong
......@@ -55,7 +62,7 @@
(make-instance 'inet-socket :type :stream :protocol :udp)
((or protocol-not-supported-error socket-type-not-supported-error) (c)
(declare (ignorable c)) t)
(:no-error nil))
(:no-error (&rest args) (declare (ignore args)) nil))
t)
......@@ -194,7 +201,7 @@
(handler-case
(get-host-by-name "foo.tninkpad.telent.net")
(NAME-SERVICE-ERROR () t)
(:no-error nil))
(:no-error (&rest args) (declare (ignore args)) nil))
t)
(defun http-stream (host port request)
......
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment