;;; -*- hen -*- ;;; $Revision: 1.5 $ ;;; ;;; Tools to make unix programmers happy. (require-extension srfi-1) (define-macro (dirname filename) `(pathname-directory ,filename)) (define-macro (basename filename) (let ((fn filename)) ; avoid multiple evaluations of filename `(let ((extension (pathname-extension ,fn))) (if extension (format "~a.~a" (pathname-file ,fn) extension) (pathname-file ,fn))))) ;;; Remove dot files from a directory list: (undotfile (directory ".")) (define (undotfile files) (define (dotfile? f) (char=? #\. (string-ref f 0))) (remove dotfile? files)) ;;; Reads passwords in from an open input port and performing some task ;;; on each entry. (define (passwd-map op port) (let loop ((entry (read-line port))) (unless (eof-object? entry) (op (string-split entry ":" #t)) ; #t - keep empty fields (loop (read-line port))))) ;;; same behavior, just fewer entries (define group-map passwd-map) ;(define (test-passwd-map) ; (let ((pwd (open-input-file "/etc/passwd"))) ; (passwd-map ; (lambda (e) ; (print (length e) " " e)) ; pwd) ; (close-input-port pwd))) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;; yank apart grent and pwent structs: user-information (define getpwent user-information) (define pw-name first) (define pw-passwd second) (define pw-uid third) (define pw-gid fourth) (define pw-gecos fifth) (define pw-dir sixth) (define pw-shell seventh) ;;; Something a bit more like user-information's output (define (getgrent gr) (let ((grent (receive (group-information gr)))) (if (car grent) ; (#f) returned if named group does not exist grent (error "no such group" gr)))) (define gr-name first) (define gr-passwd second) (define gr-gid third) (define gr-mem fourth)