umerin@photon.stars.flab.Fujitsu.JUNET (Masanobu UMEDA) (06/28/88)
This is an official patch to GNUS recently posted to comp.emacs. The changes are as follows: (1) Bug fixes of post news (in gnus.el and nnspool.el) (2) Variable gnus-use-generic-from is introduced. (3) Variable gnus-force-nntp is introduced. GNUS won't look up local news spool if the variable is set to T. (4) Variable gnus-auto-select-next is introduced. You can go to next unread news group directly without returning to group selection mode if the variable is set to T. Masanobu UMEDA --------------------------------------------------------------------------- *** /tmp/,RCSt1a00811 Tue Jun 28 13:42:38 1988 --- gnus.el Tue Jun 28 13:38:51 1988 *************** *** 1,7 **** ;;; GNUS: NNTP-based News Reader for GNU Emacs ;; Copyright (C) 1987, 1988 Fujitsu Laboratoris LTD. ;; Copyright (C) 1987, 1988 Masanobu UMEDA (umerin@flab.flab.Fujitsu.JUNET) ! ;; $Header: gnus.el,v 3.3 88/06/16 09:58:09 umerin Exp $ ;; This file is part of GNU Emacs. --- 1,7 ---- ;;; GNUS: NNTP-based News Reader for GNU Emacs ;; Copyright (C) 1987, 1988 Fujitsu Laboratoris LTD. ;; Copyright (C) 1987, 1988 Masanobu UMEDA (umerin@flab.flab.Fujitsu.JUNET) ! ;; $Header: gnus.el,v 3.5 88/06/28 13:36:38 umerin Exp $ ;; This file is part of GNU Emacs. *************** *** 63,68 **** --- 63,75 ---- "*A little bit verbose in posting mode if T. Ask you news group name, subject, and distribution.") + (defvar gnus-auto-select-next t + "*Select next news group automagically if T. + Experimental feature. Send me your comments.") + + (defvar gnus-force-nntp nil + "*Use NNTP even if local news spool is available if T.") + (defvar gnus-Group-mode-hook nil "*Hooks for GNUS Group mode.") *************** *** 87,94 **** "*Your organization. If environment variable `ORGANIZATION' is defined, it's instead used.") ! (defvar gnus-your-time-zone -9 ! "*Difference between GMT and your time zone.") ;; Internal variables. --- 94,101 ---- "*Your organization. If environment variable `ORGANIZATION' is defined, it's instead used.") ! (defvar gnus-use-generic-from nil ! "*Don't insert local host name to From: field value if T.") ;; Internal variables. *************** *** 244,252 **** and distribution when posting a new news if the value is set to non-NIL (defalut). ! If news server is your local host, GNUS won't use NNTP but go to local ! news spool directly after loading `nnspool' by itself. Entry to this mode calls the value of gnus-Group-mode-hook with no arguments, if that value is non-nil." (interactive) --- 251,264 ---- and distribution when posting a new news if the value is set to non-NIL (defalut). ! If your local host has a news spool, GNUS won't use NNTP but go to the ! spool directly after loading `nnspool' by itself. You can disable this ! feature by setting `gnus-force-nntp' to T. + Select next news group automagically in subject selection mode if + variable `gnus-auto-select-next' is T (default). You don't have to + exit subject selection mode explicitly. + Entry to this mode calls the value of gnus-Group-mode-hook with no arguments, if that value is non-nil." (interactive) *************** *** 276,290 **** (defun gnus-Group-startup-message () (insert "\n\n\n\n ! GNUS Version 3.3 NNTP-based News Reader for GNU Emacs ! If you have any troubles with this software, please let me ! know. I would fix your problems in the next release. ! Any comment, suggestion, and bug fix are welcome. Masanobu UMEDA umerin@flab.Fujitsu.JUNET")) --- 288,302 ---- (defun gnus-Group-startup-message () (insert "\n\n\n\n ! GNUS Version 3.5 NNTP-based News Reader for GNU Emacs ! If you have any trouble with this software, please let me ! know. I will fix your problems in the next release. ! Comments, suggestions, and bug fixes are welcome. Masanobu UMEDA umerin@flab.Fujitsu.JUNET")) *************** *** 936,953 **** ) )) (defun gnus-Subject-next-article (unread &optional subject) "Select article after current one. If argument UNREAD is non-nil, only unread article is selected." (interactive "P") ! (cond ((gnus-Subject-display-article ! (gnus-Subject-search-forward unread subject))) ! (unread ! (message "No more unread articles.")) ! (t ! (message "No more articles.")) ! )) (defun gnus-Subject-next-unread-article () "Select unread article after current one." (interactive) --- 948,1023 ---- ) )) + ;;(defun gnus-Subject-next-article (unread &optional subject) + ;; "Select article after current one. + ;;If argument UNREAD is non-nil, only unread article is selected." + ;; (interactive "P") + ;; (cond ((gnus-Subject-display-article + ;; (gnus-Subject-search-forward unread subject))) + ;; (unread + ;; (message "No more unread articles.")) + ;; (t + ;; (message "No more articles.")) + ;; )) + (defun gnus-Subject-next-article (unread &optional subject) "Select article after current one. If argument UNREAD is non-nil, only unread article is selected." (interactive "P") ! (if (gnus-Subject-display-article ! (gnus-Subject-search-forward unread subject)) ! nil ! (let* ((keyseq (this-command-keys)) ! (cmd (string-to-char keyseq)) ! (group (gnus-Subject-next-group-name)) ! (auto-select ! (and gnus-auto-select-next ! (or (null subject) ! (null gnus-current-group-unread-articles)) ! (memq (key-binding keyseq) ! '(gnus-Subject-next-unread-article ! gnus-Subject-next-article ! gnus-Subject-next-page)) ! ))) ! (message "No more%s articles%s" ! (if unread " unread" "") ! (if auto-select ! (if group ! (format " (Type %s to %s [%d])" ! (if (string-equal keyseq " ") ! "SPACE" keyseq) ! group ! (nth 1 (assoc group gnus-unread-assoc))) ! (format " (Type %s to exit %s)" ! (if (string-equal keyseq " ") ! "SPACE" keyseq) ! gnus-current-news-group ! )) ! ".")) ! ;; Select next unread news group automagically. ! (if auto-select ! (let ((char nil)) ! (setq char (read-char)) ! (message "") ! (if (eq char cmd) ! (if (null group) ! (call-interactively 'gnus-Subject-exit) ! (gnus-Subject-exit) ! (gnus-Subject-read-group group nil nil)) ! (setq unread-command-char char)) ! )) ! ))) + (defun gnus-Subject-next-group-name () + "Return next unread news group name." + (save-excursion + (set-buffer gnus-Group-display-buffer) + (save-excursion + ;; We don't want to alter current point of group selection buffer. + (if (gnus-Group-search-forward nil nil) + (gnus-Group-group-name)) + ))) + (defun gnus-Subject-next-unread-article () "Select unread article after current one." (interactive) *************** *** 1091,1112 **** "Mark articles which has the same subject as read. If argument NO-SELECT is non-nil, next unread article is not selected." (interactive "P") ! (let* ((article (gnus-Subject-article-number)) ! (cntl (format "^.[ \t]+%d:" article)) ! (subject nil) (count 0)) (save-excursion ! (goto-char (point-min)) ! (if (re-search-forward cntl nil t) ! (progn ! (setq subject (gnus-Subject-subject-string)) ! (gnus-Subject-mark-read article) ! (setq count (1+ count)) ! (while (and subject ! (gnus-Subject-search-forward t subject)) ! (gnus-Subject-mark-read (gnus-Subject-article-number)) ! (setq count (1+ count))) ! )) ) (if no-select (gnus-Subject-next-subject t) --- 1161,1175 ---- "Mark articles which has the same subject as read. If argument NO-SELECT is non-nil, next unread article is not selected." (interactive "P") ! (let* ((subject (gnus-Subject-subject-string)) (count 0)) (save-excursion ! (gnus-Subject-mark-read) ! (setq count (1+ count)) ! (while (and subject ! (gnus-Subject-search-forward t subject)) ! (gnus-Subject-mark-read) ! (setq count (1+ count))) ) (if no-select (gnus-Subject-next-subject t) *************** *** 1120,1154 **** (interactive) (gnus-Subject-kill-same-subject t)) ! (defun gnus-Subject-mark-unread-forward (&optional article) ! "Mark current subject as unread, and then go forward. ! If optional argument ARTICLE is non-nil, the ARTICLE rather than ! current is marked as unread." (interactive) ! (gnus-Subject-mark-unread (or article ! (gnus-Subject-article-number))) (gnus-Subject-next-subject nil)) ! (defun gnus-Subject-mark-unread-backward (&optional article) ! "Mark current subject as unread, and then go backward. ! If optional argument ARTICLE is non-nil, the ARTICLE rather than ! current is marked as unread." (interactive) ! (gnus-Subject-mark-unread (or article ! (gnus-Subject-article-number))) (gnus-Subject-prev-subject nil)) ! (defun gnus-Subject-mark-unread (article) "Mark ARTICLE's subject as unread." (save-excursion (set-buffer gnus-Subject-display-buffer) ! (let ((buffer-read-only nil)) (if (not (memq article gnus-current-group-unread-articles)) (progn ;; Add to list. (setq gnus-current-group-unread-articles (cons article gnus-current-group-unread-articles)) ! (if (gnus-Subject-goto-subject article) (progn (beginning-of-line) (delete-region (point) (1+ (point))) --- 1183,1214 ---- (interactive) (gnus-Subject-kill-same-subject t)) ! (defun gnus-Subject-mark-unread-forward () ! "Mark current subject as unread, and then go forward." (interactive) ! (gnus-Subject-mark-unread) (gnus-Subject-next-subject nil)) ! (defun gnus-Subject-mark-unread-backward () ! "Mark current subject as unread, and then go backward." (interactive) ! (gnus-Subject-mark-unread) (gnus-Subject-prev-subject nil)) ! (defun gnus-Subject-mark-unread (&optional article) "Mark ARTICLE's subject as unread." (save-excursion (set-buffer gnus-Subject-display-buffer) ! (let* ((buffer-read-only nil) ! (current (gnus-Subject-article-number)) ! (article (or article current))) (if (not (memq article gnus-current-group-unread-articles)) (progn ;; Add to list. (setq gnus-current-group-unread-articles (cons article gnus-current-group-unread-articles)) ! (if (or (= article current) ! (gnus-Subject-goto-subject article)) (progn (beginning-of-line) (delete-region (point) (1+ (point))) *************** *** 1156,1190 **** )) ))) ! (defun gnus-Subject-mark-read-forward (&optional article) ! "Mark current subject as read, and then go forward. ! If optional argument ARTICLE is non-nil, the ARTICLE rather than ! current is marked as read." (interactive) ! (gnus-Subject-mark-read (or article ! (gnus-Subject-article-number))) (gnus-Subject-next-subject t)) ! (defun gnus-Subject-mark-read-backward (&optional article) ! "Mark current subject as read, and then go backward. ! If optional argument ARTICLE is non-nil, the ARTICLE rather than ! current is marked as read." (interactive) ! (gnus-Subject-mark-read (or article ! (gnus-Subject-article-number))) (gnus-Subject-prev-subject t)) ! (defun gnus-Subject-mark-read (article) "Mark ARTICLE's subject as read." (save-excursion (set-buffer gnus-Subject-display-buffer) ! (let ((buffer-read-only nil)) (if (memq article gnus-current-group-unread-articles) (progn ;; Remove from list. (setq gnus-current-group-unread-articles (delq article gnus-current-group-unread-articles)) ! (if (gnus-Subject-goto-subject article) (progn (beginning-of-line) (delete-region (point) (1+ (point))) --- 1216,1247 ---- )) ))) ! (defun gnus-Subject-mark-read-forward () ! "Mark current subject as read, and then go forward." (interactive) ! (gnus-Subject-mark-read) (gnus-Subject-next-subject t)) ! (defun gnus-Subject-mark-read-backward () ! "Mark current subject as read, and then go backward." (interactive) ! (gnus-Subject-mark-read) (gnus-Subject-prev-subject t)) ! (defun gnus-Subject-mark-read (&optional article) "Mark ARTICLE's subject as read." (save-excursion (set-buffer gnus-Subject-display-buffer) ! (let* ((buffer-read-only nil) ! (current (gnus-Subject-article-number)) ! (article (or article current))) (if (memq article gnus-current-group-unread-articles) (progn ;; Remove from list. (setq gnus-current-group-unread-articles (delq article gnus-current-group-unread-articles)) ! (if (or (= article current) ! (gnus-Subject-goto-subject article)) (progn (beginning-of-line) (delete-region (point) (1+ (point))) *************** *** 1307,1314 **** (bury-buffer gnus-Subject-display-buffer)) (if (get-buffer gnus-Article-display-buffer) (bury-buffer gnus-Article-display-buffer)) ! (switch-to-buffer gnus-Group-display-buffer) ! (delete-other-windows) ;; Update cross referenced group info. (while updated (gnus-Group-update-group (car updated) t) ;Ignore non-visible group. --- 1364,1375 ---- (bury-buffer gnus-Subject-display-buffer)) (if (get-buffer gnus-Article-display-buffer) (bury-buffer gnus-Article-display-buffer)) ! (if (interactive-p) ! (progn ! (switch-to-buffer gnus-Group-display-buffer) ! (delete-other-windows)) ! ;; Do not update windows but change buffer to work. ! (set-buffer gnus-Group-display-buffer)) ;; Update cross referenced group info. (while updated (gnus-Group-update-group (car updated) t) ;Ignore non-visible group. *************** *** 1548,1554 **** (null gnus-server-host)) (setq gnus-server-host (read-string "News Server host: " gnus-server-host))) ! (if (string-equal gnus-server-host (system-name)) (progn ;; Use local news spool. (require 'nnspool) --- 1609,1616 ---- (null gnus-server-host)) (setq gnus-server-host (read-string "News Server host: " gnus-server-host))) ! (if (and (not gnus-force-nntp) ! (string-equal gnus-server-host (system-name))) (progn ;; Use local news spool. (require 'nnspool) *************** *** 2040,2048 **** (condition-case nil (eval-current-buffer) (error ! (error "Too complicated, or erroneous lines included in %s" ! newsrc-file)) ! ) (kill-buffer (current-buffer)) (message "Reading %s... Done." newsrc-file)) )))) --- 2102,2108 ---- (condition-case nil (eval-current-buffer) (error ! (error "Too long or invalid lines in %s" newsrc-file))) (kill-buffer (current-buffer)) (message "Reading %s... Done." newsrc-file)) )))) *************** *** 2107,2113 **** (message "Saving %s..." gnus-current-startup-file) (set-buffer (find-file-noselect gnus-current-startup-file)) (let ((make-backup-files t) ! (version-control nil)) ;; Make backup file of master newsrc. ;; You can stop or change version control of backup file. ;; Suggested by jason@violet.berkeley.edu. --- 2167,2174 ---- (message "Saving %s..." gnus-current-startup-file) (set-buffer (find-file-noselect gnus-current-startup-file)) (let ((make-backup-files t) ! (version-control nil) ! (require-final-newline t)) ;Don't ask even if requested. ;; Make backup file of master newsrc. ;; You can stop or change version control of backup file. ;; Suggested by jason@violet.berkeley.edu. *************** *** 2117,2123 **** (set-buffer (get-buffer-create " *GNUS-newsrc*")) (erase-buffer) (gnus-gnus-to-quick-newsrc-format) ! (write-file (concat gnus-current-startup-file ".el")) (kill-buffer (current-buffer)) (message "Saving %s... Done." gnus-current-startup-file) ) --- 2178,2187 ---- (set-buffer (get-buffer-create " *GNUS-newsrc*")) (erase-buffer) (gnus-gnus-to-quick-newsrc-format) ! (let ((make-backup-files nil) ! (version-control nil) ! (require-final-newline t)) ;Don't ask even if requested. ! (write-file (concat gnus-current-startup-file ".el"))) (kill-buffer (current-buffer)) (message "Saving %s... Done." gnus-current-startup-file) ) *************** *** 2392,2399 **** (defun gnus-inews () "NNTP inews interface." (let ((signature (expand-file-name "~/.signature" nil)) ! (distribution nil) ! (lines nil)) (save-excursion (copy-to-buffer " *GNUS-posting*" (point-min) (point-max)) (set-buffer " *GNUS-posting*") --- 2456,2462 ---- (defun gnus-inews () "NNTP inews interface." (let ((signature (expand-file-name "~/.signature" nil)) ! (distribution nil)) (save-excursion (copy-to-buffer " *GNUS-posting*" (point-min) (point-max)) (set-buffer " *GNUS-posting*") *************** *** 2414,2429 **** (goto-char (point-max)) (insert "--\n") (insert-file-contents signature))) - ;; Count lines of article body. - (goto-char (point-min)) - (search-forward "\n\n") - (setq lines (count-lines (point) (point-max))) ;; Prepare article headers. (save-restriction (goto-char (point-min)) (search-forward "\n\n") (narrow-to-region (point-min) (point)) ! (gnus-inews-insert-headers lines)) (widen) ;; Save author copy of posted article. The article must be ;; copied before being posted because `nntp-request-post' --- 2477,2488 ---- (goto-char (point-max)) (insert "--\n") (insert-file-contents signature))) ;; Prepare article headers. (save-restriction (goto-char (point-min)) (search-forward "\n\n") (narrow-to-region (point-min) (point)) ! (gnus-inews-insert-headers)) (widen) ;; Save author copy of posted article. The article must be ;; copied before being posted because `nntp-request-post' *************** *** 2489,2495 **** "Distribution: " (or distribution "") "\n" ) ;; Prepare article headers. ! (gnus-inews-insert-headers 0) (goto-char (point-max)) ;; Insert empty line. (insert "\n") --- 2548,2554 ---- "Distribution: " (or distribution "") "\n" ) ;; Prepare article headers. ! (gnus-inews-insert-headers) (goto-char (point-max)) ;; Insert empty line. (insert "\n") *************** *** 2502,2512 **** )) )) ! (defun gnus-inews-insert-headers (lines) ! "Prepare article headers." (save-excursion (let* ((login-name (gnus-inews-login-name)) (domain-name (gnus-inews-domain-name)) (full-name (or (getenv "NAME") (user-full-name))) ;; Message-ID should not contain slash `/' and should be --- 2561,2574 ---- )) )) ! (defun gnus-inews-insert-headers () ! "Prepare article headers. ! Path:, From:, Subject:, Message-ID: and Distribution: are generated. ! Organization: is optional." (save-excursion (let* ((login-name (gnus-inews-login-name)) (domain-name (gnus-inews-domain-name)) + (generic-name (gnus-inews-domain-name gnus-use-generic-from)) (full-name (or (getenv "NAME") (user-full-name))) ;; Message-ID should not contain slash `/' and should be *************** *** 2518,2524 **** ;; Insert from top of headers. (goto-char (point-min)) (insert "Path: " gnus-server-host "!" login-name "\n" ! "From: " login-name "@" domain-name (if (or (string-equal full-name "") (string-equal full-name "&")) "\n" --- 2580,2586 ---- ;; Insert from top of headers. (goto-char (point-min)) (insert "Path: " gnus-server-host "!" login-name "\n" ! "From: " login-name "@" generic-name (if (or (string-equal full-name "") (string-equal full-name "&")) "\n" *************** *** 2528,2538 **** (or (mail-fetch-field "subject") (insert "Subject: \n")) ;; Insert random headers. ! (insert "Message-ID: <" id "@" domain-name ">\n" ! "Date: " (gnus-inews-date) "\n" ! "Organization: " organization "\n" ! "Lines: " (int-to-string lines) "\n" ! ) (or (mail-fetch-field "distribution") (insert "Distribution: \n")) ))) --- 2590,2598 ---- (or (mail-fetch-field "subject") (insert "Subject: \n")) ;; Insert random headers. ! (insert "Message-ID: <" id "@" domain-name ">\n") ! (if organization ! (insert "Organization: " organization "\n")) (or (mail-fetch-field "distribution") (insert "Distribution: \n")) ))) *************** *** 2543,2550 **** (getenv "LOGNAME") (user-login-name))) ! (defun gnus-inews-domain-name () ! "Return user's domain name" (let ((domain (or (getenv "DOMAINNAME") gnus-your-domain))) (if (or (null domain) --- 2603,2612 ---- (getenv "LOGNAME") (user-login-name))) ! (defun gnus-inews-domain-name (&optional genericfrom) ! "Return user's domain name. ! If optional argument GENERICFROM is non-nil, don't insert local host ! name to the domain name." (let ((domain (or (getenv "DOMAINNAME") gnus-your-domain))) (if (or (null domain) *************** *** 2552,2564 **** (progn (setq domain (read-string "Your domain name (no host): ")) (setq gnus-your-domain domain))) ! (concat (system-name) ! ;; Host name and domain name must be separated by ! ;; one period `.'. ! (if (string-equal "." (substring domain 0 1)) "" ".") ! domain ! ) ! )) (defun gnus-inews-message-id (name) "Generate unique message-ID for NAMEd user." --- 2614,2631 ---- (progn (setq domain (read-string "Your domain name (no host): ")) (setq gnus-your-domain domain))) ! (if genericfrom ! ;; Support GENERICFROM as same as standard Bnews system. ! ;; Suggested by ohm@kaba.junet. ! (if (string-equal "." (substring domain 0 1)) ! (substring domain 1) domain) ! (concat (system-name) ! ;; Host name and domain name must be separated by ! ;; one period `.'. ! (if (string-equal "." (substring domain 0 1)) "" ".") ! domain ! ) ! ))) (defun gnus-inews-message-id (name) "Generate unique message-ID for NAMEd user." *************** *** 2574,2612 **** (substring date (match-beginning 5) (match-end 5)) ;Second ) (error "GNUS: cannot understand current-time-string: %s." date)) - )) - - (defun gnus-inews-date () - "News format date string of today." - (let ((date (current-time-string))) - (if (string-match "^[^ ]+ \\([^ ]+\\)[ ]+\\([0-9]+\\) \\([0-9:]+\\) [0-9][0-9]\\([0-9][0-9]\\)" - date) - (concat (substring date (match-beginning 2) (match-end 2)) ;Day - " " - (substring date (match-beginning 1) (match-end 1)) ;Month - " " - (substring date (match-beginning 4) (match-end 4)) ;Year - " " - (gnus-unix-time-to-gmtime - gnus-your-time-zone - (substring date (match-beginning 3) (match-end 3))) ;Time - " GMT") - (error "GNUS: cannot understand current-time-string: %s." date)) - )) - - (defun gnus-unix-time-to-gmtime (time-zone time) - "Convert unix time to GM time." - (if (string-match "^\\([0-9]+\\):\\(.*\\)$" time) - (concat - (format "%02d" - (+ time-zone (string-to-int (substring time - (match-beginning 1) - (match-end 1))))) - ":" - (substring time - (match-beginning 2) - (match-end 2))) - (error "GNUS: cannot understand `%s' as unix time format." time) )) --- 2641,2646 ---- *** /tmp/,RCSt1a00823 Tue Jun 28 13:44:00 1988 --- nnspool.el Tue Jun 28 13:38:47 1988 *************** *** 1,7 **** ;;; Spool patches to NNTP package for GNU Emacs ;; Copyright (C) 1988 Fujitsu Laboratoris LTD. ;; Copyright (C) 1988 Masanobu UMEDA (umerin@flab.flab.Fujitsu.JUNET) ! ;; $Header: nnspool.el,v 1.3 88/06/16 09:58:46 umerin Exp $ ;; This file is part of GNU Emacs. --- 1,7 ---- ;;; Spool patches to NNTP package for GNU Emacs ;; Copyright (C) 1988 Fujitsu Laboratoris LTD. ;; Copyright (C) 1988 Masanobu UMEDA (umerin@flab.flab.Fujitsu.JUNET) ! ;; $Header: nnspool.el,v 1.4 88/06/28 13:38:07 umerin Exp $ ;; This file is part of GNU Emacs. *************** *** 215,222 **** nnspool-inews-program 'delete t nil "-h") (prog1 ! ;; If inews returns some strings, it must be error message. ! (zerop (buffer-size)) ;; Make status message by unfolding lines. (subst-char-in-region (point-min) (point-max) ?\n ?\\ 'noundo) (setq nntp-status-message-string --- 215,228 ---- nnspool-inews-program 'delete t nil "-h") (prog1 ! (or (zerop (buffer-size)) ! ;; If inews returns strings, it must be error message ! ;; unless SPOOLNEWS is defined. ! ;; This condition is very week, but there is no good rule ! ;; identifying errors when SPOOLNEWS is defined. ! ;; Suggested by ohm@kaba.junet. ! (string-match "spooled" ! (buffer-substring (point-min) (point-max)))) ;; Make status message by unfolding lines. (subst-char-in-region (point-min) (point-max) ?\n ?\\ 'noundo) (setq nntp-status-message-string -- Masanobu UMEDA umerin@flab.flab.Fujitsu.JUNET umerin%flab.flab.Fujitsu.JUNET@uunet.uu.NET