Function: socks-open-connection
socks-open-connection is a byte-compiled function defined in
socks.el.gz.
Signature
(socks-open-connection SERVER-INFO)
Source Code
;; Defined in /usr/src/emacs/lisp/net/socks.el.gz
(defun socks-open-connection (server-info)
(save-excursion
(let ((proc
(let ((socks-override-functions nil))
(open-network-stream "socks"
nil
(nth 1 server-info)
(nth 2 server-info))))
(authtype nil)
version)
;; Initialize process and info about the process
(set-process-filter proc #'socks-filter)
(set-process-query-on-exit-flag proc nil)
(process-put proc 'socks t)
(process-put proc 'socks-state socks-state-waiting-for-auth)
(process-put proc 'socks-authtype socks-authentication-failure)
(process-put proc 'socks-server-protocol (nth 3 server-info))
(process-put proc 'socks-server-name (nth 1 server-info))
(setq version (nth 3 server-info))
(cond
((equal version 'http)
;; Don't really have to do any connection setup under http
nil)
((equal version 4)
;; Don't really have to do any connection setup under v4
nil)
((equal version 5)
;; Need to handle all the authentication crap under v5
;; Send what we think we can handle for authentication types
(process-send-string proc (format "%c%s" socks-version
(socks-build-auth-list)))
;; Basically just do a select() until we change states.
(socks-wait-for-state-change proc socks-state-waiting-for-auth)
(setq authtype (process-get proc 'socks-authtype))
(cond
((= authtype socks-authentication-null)
(and socks-debug (message "No authentication necessary")))
((= authtype socks-authentication-failure)
(error "No acceptable authentication methods found"))
(t
(let* ((auth-type (process-get proc 'socks-authtype))
(auth-handler (assoc auth-type socks-authentication-methods))
(auth-func (and auth-handler (cdr (cdr auth-handler))))
(auth-desc (and auth-handler (car (cdr auth-handler)))))
(set-process-filter proc nil)
(if (and auth-func (fboundp auth-func)
(funcall auth-func proc))
nil ; We succeeded!
(delete-process proc)
(error "Failed to use auth method: %s (%d)"
(or auth-desc "Unknown") auth-type))
)
)
)
(process-put proc 'socks-state socks-state-authenticated)
(process-put proc 'socks-scratch "")
(set-process-filter proc #'socks-filter)))
proc)))