[cl-irc-cvs] r203 - trunk

ehuelsmann at common-lisp.net ehuelsmann at common-lisp.net
Sun Apr 29 18:08:23 UTC 2007


Author: ehuelsmann
Date: Sun Apr 29 14:08:22 2007
New Revision: 203

Modified:
   trunk/command.lisp
   trunk/utility.lisp
   trunk/variable.lisp
Log:
Add SSL support for IRC connections, only if CL+SSL is available when calling
connect.

Modified: trunk/command.lisp
==============================================================================
--- trunk/command.lisp	(original)
+++ trunk/command.lisp	Sun Apr 29 14:08:22 2007
@@ -247,13 +247,29 @@
                      (password nil)
                      (mode 0)
                      (server *default-irc-server*)
-                     (port *default-irc-server-port*)
+                     (port :default)
                      (connection-type 'connection)
+                     (connection-security :none)
                      (logging-stream t))
-  "Connect to server and return a connection object."
-  (let* ((socket (usocket:socket-connect server port
+  "Connect to server and return a connection object.
+
+`port' and `connection-security' have a relation: when `port' equals
+`:default' `*default-irc-server-port*' is used to find which port to
+connect to.  `connection-security' determines which port number is found.
+
+`connection-security' can be either `:none' or `:ssl'.  When passing
+`:ssl', the cl+ssl library must have been loaded by the caller.
+"
+  (let* ((port (if (eq port :default)
+                   ;; get the default port for this type of connection
+                   (getf *default-irc-server-port* connection-security)
+                 port))
+         (socket (usocket:socket-connect server port
                                          :element-type 'flexi-streams:octet))
-         (stream (usocket:socket-stream socket))
+         (stream (if (eq connection-security :ssl)
+                     (dynfound-funcall (make-ssl-client-stream :cl+ssl)
+                                       (usocket:socket-stream socket))
+                   (usocket:socket-stream socket)))
          (connection (make-connection :connection-type connection-type
                                       :socket socket
                                       :network-stream stream

Modified: trunk/utility.lisp
==============================================================================
--- trunk/utility.lisp	(original)
+++ trunk/utility.lisp	Sun Apr 29 14:08:22 2007
@@ -181,6 +181,30 @@
                 buf-len))
       (try-decode-line buf *default-incoming-external-formats*))))
 
+(defmacro dynfound-funcall ((symbol-name &optional package) &rest parameters)
+  (let ((package-sym (gensym))
+        (symbol-sym (gensym))
+        (fun-sym (gensym)))
+    `(let* ((,package-sym ,(if package package *package*))
+            (,symbol-sym ,(if (symbolp symbol-name)
+                              `',symbol-name
+                            symbol-name))
+            (,symbol-sym (find-symbol
+                          ,(if (symbolp symbol-name)
+                               `(symbol-name ,symbol-sym)
+                             `(if (symbolp ,symbol-sym)
+                                  (symbol-name ,symbol-sym)
+                                ,symbol-sym))
+                          ,package-sym))
+            (,fun-sym (when (and ,symbol-sym (fboundp ,symbol-sym))
+                        (symbol-function ,symbol-sym))))
+       (unless ,symbol-sym
+         (error "Can't resolve symbol ~A in package ~A"
+                ,symbol-sym ,package-sym))
+       (if ,fun-sym
+           (funcall ,fun-sym , at parameters)
+         (error "Symbol ~A in package ~A isn't fbound"
+                ,symbol-sym ,package-sym)))))
 
 (defun substring (string start &optional end)
   (let* ((end-index (if end end (length string)))

Modified: trunk/variable.lisp
==============================================================================
--- trunk/variable.lisp	(original)
+++ trunk/variable.lisp	Sun Apr 29 14:08:22 2007
@@ -22,7 +22,9 @@
 
 (defvar *default-nickname* "cl-irc")
 (defvar *default-irc-server* "irc.freenode.net")
-(defvar *default-irc-server-port* 6667)
+(defvar *default-irc-server-port* '(:none 6667  ;; most used for normal IRC
+                                    :ssl  6679  ;; most used for SSL IRC
+                                    ))
 (defvar *default-quit-message*
   "Common Lisp IRC library - http://common-lisp.net/project/cl-irc")
 



More information about the cl-irc-cvs mailing list