; My my, but we've not traveled here in while (as of 18feb10).  Anyway, I don't know wtf I had in mind with the "until we can get" business, but now we're here for something new.  Namely, make a non-null prefix are mean "don't save places", which entails 
(defun my-kill-emacs ()
"Old-style prompting version of kill-emacs, in use until we can get
kill-emacs-query-functions to work as advertised.  Non-null prefix arg means
dont't save places, which can be used, for example, when running on some emacs
remotely while a version is currently running on the remote host."
  (interactive)
  (if current-prefix-arg (setq kill-emacs-hook nil))
  (if (string= major-mode "mh-letter-mode")
      (message "Use ^C-^C to send the message.")
      (if (kq)
	  (kill-emacs 0)) ;Arg here means no prompting in v18, benign in v19.
  )
)

(defun kq ()
  (interactive)
  (let ( (n (n-buffers-modified)) )
    (if (= n 0)
      (kq1 "Are you sure you want to exit (yes or no)? ")
      (if (= n 1)
	(kq1 "1 buffer is modified, do you really want to exit (yes or no)? ")
	(if (> n 1)
	    (kq1 (concat (int-to-string n)
	      " buffers are modified, do you really want to exit (yes or no)? "
	    ))
	    t
	)
      )
    )
  )
)

(defun kq1 (message)
  (let ()
    (setq r (read-from-minibuffer message))
    (if (string= r "yes")
	t
        (if (string= r "no")
	    nil
	    (kq1 "Please answer yes or no. ")
	)
    )
  )
)

(defun n-buffers-modified ()
  (interactive)
  (let ( (rtn (n-buffers-modified1 (buffer-list))) )
    (if (interactive-p) (message (int-to-string rtn)))
    rtn
  )
)

(defun n-buffers-modified1 (l)
  (if (null l)
      0
      (if (and (buffer-modified-p (car l)) (buffer-file-name (car l)))
	  (+ 1 (n-buffers-modified1 (cdr l)))
	  (n-buffers-modified1 (cdr l))
      )
  )
)