summaryrefslogtreecommitdiff
path: root/modules/language/python/module/pwd.scm
diff options
context:
space:
mode:
Diffstat (limited to 'modules/language/python/module/pwd.scm')
-rw-r--r--modules/language/python/module/pwd.scm72
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)))))))))
+
+
+
+