Added interface to the fs command from AFS
This commit is contained in:
		
							parent
							
								
									55ad3044ef
								
							
						
					
					
						commit
						6268cc4f49
					
				|  | @ -0,0 +1,101 @@ | |||
| ;;; This file is part of the Scheme Untergrund Library. | ||||
| 
 | ||||
| ;;; Copyright (c) 2002-2003 by Martin Gasbichler. | ||||
| ;;; For copyright information, see the file COPYING which comes with | ||||
| ;;; the distribution. | ||||
| 
 | ||||
| (define-enumerated-type afs-permission :afs-permission | ||||
|   afs-permission? | ||||
|   the-afs-permissions | ||||
|   afs-permission-name | ||||
|   afs-permission-index | ||||
|   (read | ||||
|    list | ||||
|    insert | ||||
|    delete | ||||
|    write | ||||
|    lock | ||||
|    administer)) | ||||
| 
 | ||||
| (define-enum-set-type afs-permissions :afs-permissions | ||||
|   afs-permissions? | ||||
|   make-afs-permissions | ||||
|   afs-permission afs-permission? the-afs-permissions afs-permission-index) | ||||
| 
 | ||||
| (define (char->afs-permission c) | ||||
|   (case c | ||||
|     ((#\r) (afs-permission read)) | ||||
|     ((#\l) (afs-permission list)) | ||||
|     ((#\i) (afs-permission insert)) | ||||
|     ((#\d) (afs-permission delete)) | ||||
|     ((#\w) (afs-permission write)) | ||||
|     ((#\k) (afs-permission lock)) | ||||
|     ((#\a) (afs-permission administer)) | ||||
|     (else (error "wrong char in char->afs-permission" c)))) | ||||
| 
 | ||||
| (define (afs-permission->char afs-perm) | ||||
|   (cond ((eq? afs-perm (afs-permission read)) #\r) | ||||
| 	((eq? afs-perm (afs-permission list)) #\l) | ||||
| 	((eq? afs-perm (afs-permission insert)) #\i) | ||||
| 	((eq? afs-perm (afs-permission delete)) #\d) | ||||
| 	((eq? afs-perm (afs-permission write)) #\w) | ||||
| 	((eq? afs-perm (afs-permission lock)) #\k) | ||||
| 	((eq? afs-perm (afs-permission administer)) #\a) | ||||
| 	(else (error "unknown permission" afs-perm)))) | ||||
| 
 | ||||
| (define (string->afs-permissions s) | ||||
|   (string-fold (lambda (e accu) | ||||
| 		 (enum-set-union accu (make-afs-permissions (list (char->afs-permission e))))) | ||||
| 	       (make-afs-permissions '()) | ||||
| 	       s)) | ||||
| 
 | ||||
| (define (afs-permissions->string afs-perms) | ||||
|   (fold (lambda (perm s) | ||||
| 	  (if (enum-set-member? afs-perms perm) | ||||
| 	      (string-append s (string (afs-permission->char perm))) | ||||
| 	      s)) | ||||
| 	"" | ||||
| 	(vector->list the-afs-permissions))) | ||||
| 
 | ||||
| (define all-afs-permissions | ||||
|   (make-afs-permissions (map char->afs-permission (string->list "rlidwka")))) | ||||
| 
 | ||||
| ;; access control lists: lists of pairs of user name and | ||||
| ;; afs-permissions | ||||
| 
 | ||||
| (define (get-acl dir) | ||||
|   (let* ((output (run/strings (,fs la ,dir)))) | ||||
|     (map (lambda (s) | ||||
| 	   (apply (lambda (user al) | ||||
| 		    (cons user (string->afs-permissions al))) | ||||
| 		  ((field-splitter) s))) | ||||
| 	 (cddr output)))) ; TODO add sanity check | ||||
| 
 | ||||
| (define (acl-users acl) | ||||
|   (map car acl)) | ||||
| 
 | ||||
| (define (acl->strings acl) | ||||
|   (apply append | ||||
| 	 (map (lambda (user.afs-perms) | ||||
| 		(list (car user.afs-perms)  | ||||
| 		      (afs-permissions->string (cdr user.afs-perms)))) | ||||
| 	      acl))) | ||||
| 
 | ||||
| (define (arla-set-access-control-list-for-user! dir user afs-perms) | ||||
|   (run (,fs sa ,dir ,user ,(afs-permissions->string afs-perms)))) | ||||
| 
 | ||||
| (define (arla-set-access-control-list! dir acl) | ||||
|   (for-each (lambda (user.afs-perms) | ||||
| 	      (arla-set-access-control-list-for-user! dir (car user.afs-perms) (cdr user.afs-perms))) | ||||
| 	    acl)) | ||||
| 
 | ||||
| (define (set-acl! dir acl) | ||||
|   (run (,fs setacl ,dir -acl ,@(acl->strings acl) -clear))) | ||||
| 
 | ||||
| (define (add-acl! dir acl) | ||||
|   (run (,fs setacl ,dir -acl ,@(acl->strings acl)))) | ||||
| 
 | ||||
| (define fs "fs") | ||||
| 
 | ||||
| (define (set-fs-command! the-fs) | ||||
|   (set! fs the-fs)) | ||||
|  | @ -0,0 +1,8 @@ | |||
| (define-interface afs-fs-interface | ||||
|   (export | ||||
|    ((afs-permission afs-permissions) :syntax) | ||||
|    all-afs-permissions | ||||
|    get-acl | ||||
|    set-acl! | ||||
|    add-acl! | ||||
|    set-fs-command!)) | ||||
|  | @ -0,0 +1,7 @@ | |||
| (define-structure afs-fs afs-fs-interface | ||||
|   (open scheme-with-scsh | ||||
| 	enum-sets  | ||||
| 	finite-types  | ||||
| 	srfi-1 | ||||
| 	srfi-13) | ||||
|   (files afs-fs)) | ||||
		Loading…
	
		Reference in New Issue
	
	 Martin Gasbichler
						Martin Gasbichler