[comp.emacs] Who's on this machine?

trost@reed.UUCP (Trost [no first name]) (03/08/88)

I put together the following little package a while ago.  It goes
through /etc/utmp and produces output similar to the program "who" in
a temp buffer.  While nothing terribly spectacular, the program was a
good exercise in using Lisp to mung a file with fixed-length fields.

So, without further ado,

-------------------------------- cut here --------------------------------
;;;
;;; users.el
;;; Bill Trost (trost@reed.UUCP)
;;; MCMLXXXVIII
;;;
;;; Emacs lisp code to look up who is on the system.
;;;

(defvar user-list nil "Who was on the system last we looked?")

(defun users (prefix-arg)
  "Show who's on and where"
  (interactive "P")
  (let ((u (snarf-users prefix-arg)))
    (with-output-to-temp-buffer "*users*"
      (save-excursion
	(set-buffer standard-output)
	(while u
	  (insert (car (car u)))
	  (indent-to 10)
	  (insert (car (cdr (car u))))
	  (indent-to 20)
	  (if (equal (car (cdr (cdr (car u)))) "")
	      nil
	    (insert ?( (car (cdr (cdr (car u)))) ?)))
	  (insert ?\n)
	  (setq u (cdr u))))))
  user-list)

(defun snarf-users (with-sort-p)
  "Get list of who's on"
  (setq user-list nil)
  (let ((buf (generate-new-buffer " users"))
	(cursor-in-echo-area t)
	tty user host)
    (message "Scrounging utmp...")
    (set-buffer buf)
    (insert-file-contents "/etc/utmp")
    (while (not (eobp))
      (if (looking-at "\0")
	  (forward-char 36)		; null entry -- skip
	(let ((start (point)))
	  (search-forward "\0")
	  (setq tty (buffer-substring start (1- (point))))
	  (goto-char (+ 8 start))
	  (let ((i 8) (begin (point)))
	    (while (and (> i 0) (not (looking-at "\0")))
	      (setq i (1- i))
	      (forward-char 1))
	    (setq name (buffer-substring begin (point)))
	    (goto-char (+ 8 begin))
	    (setq begin (point))
	    (search-forward "\0")
	    (setq host (if (equal (point) begin)
			   nil
			 (buffer-substring begin (1- (point))))))
	  (goto-char (+ start 36))
	  (if (equal name "")
	      nil
	    (setq user-list (cons (list name tty host) user-list))))))
    (kill-buffer buf))
  (message "")
  (if with-sort-p
      (sort user-list
	    (function (lambda (l m) (string< (car l) (car m)))))
    (reverse user-list)))

-------------------------------- cut here --------------------------------
-- 
...!(ogcvax|tektronix)!reed!trost (UUCP)

"...the VAX is a big computer that allows you to do many different things...."
	-- 1987 Reed College Student Computing Handbook