diff options
Diffstat (limited to 'modules/language/python/module/pwd.scm')
-rw-r--r-- | modules/language/python/module/pwd.scm | 72 |
1 files changed, 72 insertions, 0 deletions
diff --git a/modules/language/python/module/pwd.scm b/modules/language/python/module/pwd.scm new file mode 100644 index 0000000..0996db3 --- /dev/null +++ b/modules/language/python/module/pwd.scm @@ -0,0 +1,72 @@ +(define-module (language python module pwd) + #:use-module (oop pf-objects) + #:use-module (language python module collections abc) + #:use-module (language python exceptions) + #:use-module (language python yield) + #:export (getpwuid getpwname getpwall)) + +(define-python-class PWD (Sequence) + (define __init__ + (lambda (self a0 a1 a2 a3 a4 a5 a6) + (set self 'pw_name a0) + (set self 'pw_passwd a1) + (set self 'pw_uid a2) + (set self 'pw_gid a3) + (set self 'pw_gecos a4) + (set self 'pw_dir a5) + (set self 'pw_shell a6))) + + (define __len__ + (lambda (self) 7)) + + (define __getitem__ + (lambda (self n) + (case n + ((0) (ref self 'pw_name)) + ((1) (ref self 'pw_passwd)) + ((2) (ref self 'pw_uid)) + ((3) (ref self 'pw_gid)) + ((4) (ref self 'pw_gecos)) + ((5) (ref self 'pw_dir)) + ((6) (ref self 'pw_shell)) + (else + (raise KeyError "only ref 0-6")))))) + +(define-syntax-rule (ca code) + (catch #t + (lambda () code) + (lambda x (raise OSError x)))) + +(define (getpwuid uid) + (ca (apply PWD (vector->list ((@ (guile) getpwuid) uid))))) + +(define (getpwname nm) + (ca (apply PWD (vector->list ((@ (guile) getpwnam) nm))))) + +(define (getpwall) + (define l + (let lp ((l (vector->list ((@ (guile) getgroups)))) (r '())) + (if (pair? l) + (let* ((v (getgrgid (car l))) + (u (vector-ref v 0)) + (w (vector-ref v 3))) + (let lp2 ((w w) (r (if (member u r) r (cons u r)))) + (if (pair? w) + (if (member (car w) r) + (lp2 (cdr w) r) + (lp2 (cdr w) (cons (car w) r))) + (lp (cdr l) r)))) + r))) + ((make-generator () + (lambda (yield) + (let lp ((l l)) + (if (pair? l) + (begin + (catch #t + (lambda () (yield (getpwname (car l)))) + (lambda x #f)) + (lp (cdr l))))))))) + + + + |