(NNTP): Fix description of nntp-open-connection-function.
[gnus] / lisp / password.el
index b0d96a4..a9aa10a 100644 (file)
@@ -1,6 +1,6 @@
 ;;; password.el --- Read passwords from user, possibly using a password cache.
 
-;; Copyright (C) 1999, 2000, 2003 Free Software Foundation, Inc.
+;; Copyright (C) 1999, 2000, 2003, 2004 Free Software Foundation, Inc.
 
 ;; Author: Simon Josefsson <simon@josefsson.org>
 ;; Created: 2003-12-21
@@ -20,8 +20,8 @@
 
 ;; You should have received a copy of the GNU General Public License
 ;; along with GNU Emacs; see the file COPYING.  If not, write to the
-;; Free Software Foundation, Inc., 59 Temple Place - Suite 330,
-;; Boston, MA 02111-1307, USA.
+;; Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+;; Boston, MA 02110-1301, USA.
 
 ;;; Commentary:
 
 ;;
 ;; (password-cache-add "test" "foo")
 ;;  => nil
-;;
+
+;; Note the previous two can be replaced with:
+;; (password-read-and-add "Password? " "test")
+;; ;; Minibuffer prompt for password.
+;; => "foo"
+;; ;; "foo" is now cached with key "test"
+
+
 ;; (password-read "Password? " "test")
 ;; ;; No minibuffer prompt
 ;;  => "foo"
@@ -52,7 +59,8 @@
 
 ;;; Code:
 
-(autoload 'run-at-time "timer")
+(when (featurep 'xemacs)
+  (require 'timer-funcs))
 
 (eval-when-compile
   (require 'cl))
@@ -82,83 +90,14 @@ The variable `password-cache' control whether the cache is used."
           (symbol-value (intern-soft key password-data)))
       (read-passwd prompt)))
 
-(eval-when-compile
-  (defvar itimer-process)
-  (defvar itimer-timer)
-  (autoload 'delete-itimer "itimer")
-  (autoload 'itimer-driver-start "itimer")
-  (autoload 'itimer-value "itimer")
-  (autoload 'set-itimer-function "itimer")
-  (autoload 'set-itimer-function-arguments "itimer")
-  (autoload 'set-itimer-restart "itimer")
-  (autoload 'start-itimer "itimer"))
-
-(eval-and-compile
-  (defalias
-    'password-run-at-time
-    (if (featurep 'xemacs)
-       (if (condition-case nil
-               (progn
-                 (unless (or itimer-process itimer-timer)
-                   (itimer-driver-start))
-                 ;; Check whether there is a bug to which the difference of
-                 ;; the present time and the time when the itimer driver was
-                 ;; woken up is subtracted from the initial itimer value.
-                 (let* ((inhibit-quit t)
-                        (ctime (current-time))
-                        (itimer-timer-last-wakeup
-                         (prog1
-                             ctime
-                           (setcar ctime (1- (car ctime)))))
-                        (itimer-list nil)
-                        (itimer (start-itimer "password-run-at-time" 'ignore 5)))
-                   (sleep-for 0.1) ;; Accept the timeout interrupt.
-                   (prog1
-                       (> (itimer-value itimer) 0)
-                     (delete-itimer itimer))))
-             (error nil))
-           (lambda (time repeat function &rest args)
-             "Emulating function run as `run-at-time'.
-TIME should be nil meaning now, or a number of seconds from now.
-Return an itimer object which can be used in either `delete-itimer'
-or `cancel-timer'."
-             (apply #'start-itimer "password-run-at-time"
-                    function (if time (max time 1e-9) 1e-9)
-                    repeat nil t args))
-         (lambda (time repeat function &rest args)
-           "Emulating function run as `run-at-time' in the right way.
-TIME should be nil meaning now, or a number of seconds from now.
-Return an itimer object which can be used in either `delete-itimer'
-or `cancel-timer'."
-           (let ((itimers (list nil)))
-             (setcar
-              itimers
-              (apply #'start-itimer "password-run-at-time"
-                     (lambda (itimers repeat function &rest args)
-                       (let ((itimer (car itimers)))
-                         (if repeat
-                             (progn
-                               (set-itimer-function
-                                itimer
-                                (lambda (itimer repeat function &rest args)
-                                  (set-itimer-restart itimer repeat)
-                                  (set-itimer-function itimer function)
-                                  (set-itimer-function-arguments itimer args)
-                                  (apply function args)))
-                               (set-itimer-function-arguments
-                                itimer
-                                (append (list itimer repeat function) args)))
-                           (set-itimer-function
-                            itimer
-                            (lambda (itimer function &rest args)
-                              (delete-itimer itimer)
-                              (apply function args)))
-                           (set-itimer-function-arguments
-                            itimer
-                            (append (list itimer function) args)))))
-                     1e-9 (if time (max time 1e-9) 1e-9)
-                     nil t itimers repeat function args)))))
-      'run-at-time)))
+(defun password-read-and-add (prompt &optional key)
+  "Read password, for use with KEY, from user, or from cache if wanted.
+Then store the password in the cache.  Uses `password-read' and
+`password-cache-add'."
+  (let ((password (password-read prompt key)))
+    (when (and password key)
+      (password-cache-add key password))
+    password))
 
 (defun password-cache-remove (key)
   "Remove password indexed by KEY from password cache.
@@ -176,13 +115,14 @@ user again."
   "Add password to cache.
 The password is removed by a timer after `password-cache-expiry'
 seconds."
+  (when (and password-cache-expiry (null (intern-soft key password-data)))
+    (run-at-time password-cache-expiry nil
+                #'password-cache-remove
+                key))
   (set (intern key password-data) password)
-  (when password-cache-expiry
-    (password-run-at-time password-cache-expiry nil
-                         #'password-cache-remove
-                         key))
   nil)
 
 (provide 'password)
 
+;;; arch-tag: ab160494-16c8-4c68-a4a1-73eebf6686e5
 ;;; password.el ends here