;;; erc-identd.el --- RFC1413 (identd authentication protocol) server
-;; Copyright (C) 2003, 2006 Free Software Foundation, Inc.
+;; Copyright (C) 2003, 2006, 2007 Free Software Foundation, Inc.
;; Author: John Wiegley <johnw@gnu.org>
;; Keywords: comm, processes
;; GNU Emacs is free software; you can redistribute it and/or modify
;; it under the terms of the GNU General Public License as published by
-;; the Free Software Foundation; either version 2, or (at your option)
+;; the Free Software Foundation; either version 3, or (at your option)
;; any later version.
;; GNU Emacs is distributed in the hope that it will be useful,
;;; Commentary:
-;; You can have a local identd server (running on port 8113; I use DNAT
-;; to bind 113->8113) if you add this to .emacs.el:
+;; This module allows you to run a local identd server on port 8113.
+;; You will need to set up DNAT to bind 113->8113, or use a proxy.
-;; (add-hook 'erc-connect-pre-hook 'erc-identd-start)
-;; (add-hook 'erc-disconnected-hook 'erc-identd-stop)
+;; To use this module, add identd to `erc-modules' and run
+;; `erc-update-modules'.
+
+;; Here is an example /etc/inetd.conf rule that forwards identd
+;; traffic to port 8113. You will need simpleproxy installed for it
+;; to work.
+
+;; 113 stream tcp nowait nobody /usr/sbin/tcpd /usr/bin/simpleproxy simpleproxy -i -R 127.0.0.1:8113
;;; Code:
+(require 'erc)
+
(defvar erc-identd-process nil)
+(defgroup erc-identd nil
+ "Run a local identd server."
+ :group 'erc)
+
+(defcustom erc-identd-port 8113
+ "Port to run the identd server on if not specified in the argument for
+`erc-identd-start'.
+
+This can be either a string or a number."
+ :group 'erc-identd
+ :type '(choice (const :tag "None" nil)
+ (integer :tag "Port number")
+ (string :tag "Port string")))
+
+;;;###autoload (autoload 'erc-identd-mode "erc-identd")
+(define-erc-module identd nil
+ "This mode launches an identd server on port 8113."
+ ((add-hook 'erc-connect-pre-hook 'erc-identd-quickstart)
+ (add-hook 'erc-disconnected-hook 'erc-identd-stop))
+ ((remove-hook 'erc-connect-pre-hook 'erc-identd-quickstart)
+ (remove-hook 'erc-disconnected-hook 'erc-identd-stop)))
+
(defun erc-identd-filter (proc string)
"This filter implements RFC1413 (identd authentication protocol)."
(let ((erc-identd-process proc))
(format "%s, %s : USERID : %s : %s\n"
port-on-server port-on-client
system-type (user-login-name)))
- (process-send-eof erc-identd-process)))))
+ (stop-process erc-identd-process)
+ (delete-process proc)))))
+;;;###autoload
(defun erc-identd-start (&optional port)
"Start an identd server listening to port 8113.
Port 113 (auth) will need to be redirected to port 8113 on your
when you need one, without having to install one globally on your
system."
(interactive (list (read-string "Serve identd requests on port: " "8113")))
- (if (null port)
- (setq port 8113)
- (if (stringp port)
- (setq port (string-to-number port))))
- (if erc-identd-process
- (delete-process erc-identd-process))
- (if (fboundp 'make-network-process)
- (setq erc-identd-process
- (make-network-process :name "identd"
- :buffer (generate-new-buffer "identd")
- :service port :server t :noquery t
- :filter 'erc-identd-filter))
- (open-network-stream-server "identd" (generate-new-buffer "identd")
- port nil 'erc-identd-filter)))
-
+ (unless port (setq port erc-identd-port))
+ (when (stringp port)
+ (setq port (string-to-number port)))
+ (when erc-identd-process
+ (delete-process erc-identd-process))
+ (setq erc-identd-process
+ (make-network-process :name "identd"
+ :buffer nil
+ :host 'local :service port
+ :server t :noquery t :nowait t
+ :filter 'erc-identd-filter))
+ (set-process-query-on-exit-flag erc-identd-process nil))
+
+(defun erc-identd-quickstart (&rest ignored)
+ "Start the identd server with the default port.
+The default port is specified by `erc-identd-port'."
+ (erc-identd-start))
+
+;;;###autoload
(defun erc-identd-stop (&rest ignore)
(interactive)
(when erc-identd-process