 : STICKY        OCT: 0001000 ; inline
 : USER-ALL      OCT: 0000700 ; inline
 : USER-READ     OCT: 0000400 ; inline
-: USER-WRITE    OCT: 0000200 ; inline 
-: USER-EXECUTE  OCT: 0000100 ; inline   
+: USER-WRITE    OCT: 0000200 ; inline
+: USER-EXECUTE  OCT: 0000100 ; inline
 : GROUP-ALL     OCT: 0000070 ; inline
-: GROUP-READ    OCT: 0000040 ; inline 
-: GROUP-WRITE   OCT: 0000020 ; inline  
-: GROUP-EXECUTE OCT: 0000010 ; inline    
+: GROUP-READ    OCT: 0000040 ; inline
+: GROUP-WRITE   OCT: 0000020 ; inline
+: GROUP-EXECUTE OCT: 0000010 ; inline
 : OTHER-ALL     OCT: 0000007 ; inline
 : OTHER-READ    OCT: 0000004 ; inline
-: OTHER-WRITE   OCT: 0000002 ; inline  
-: OTHER-EXECUTE OCT: 0000001 ; inline    
-
-GENERIC: uid? ( obj -- ? )
-GENERIC: gid? ( obj -- ? )
-GENERIC: sticky? ( obj -- ? )
-GENERIC: user-read? ( obj -- ? )
-GENERIC: user-write? ( obj -- ? )
-GENERIC: user-execute? ( obj -- ? )
-GENERIC: group-read? ( obj -- ? )
-GENERIC: group-write? ( obj -- ? )
-GENERIC: group-execute? ( obj -- ? )
-GENERIC: other-read? ( obj -- ? )
-GENERIC: other-write? ( obj -- ? )
-GENERIC: other-execute? ( obj -- ? )
+: OTHER-WRITE   OCT: 0000002 ; inline
+: OTHER-EXECUTE OCT: 0000001 ; inline
+
+: uid? ( obj -- ? ) UID file-mode? ;
+: gid? ( obj -- ? ) GID file-mode? ;
+: sticky? ( obj -- ? ) STICKY file-mode? ;
+: user-read? ( obj -- ? ) USER-READ file-mode? ;
+: user-write? ( obj -- ? ) USER-WRITE file-mode? ;
+: user-execute? ( obj -- ? ) USER-EXECUTE file-mode? ;
+: group-read? ( obj -- ? ) GROUP-READ file-mode? ;
+: group-write? ( obj -- ? ) GROUP-WRITE file-mode? ;
+: group-execute? ( obj -- ? ) GROUP-EXECUTE file-mode? ;
+: other-read? ( obj -- ? ) OTHER-READ file-mode? ;
+: other-write? ( obj -- ? ) OTHER-WRITE file-mode? ;
+: other-execute? ( obj -- ? ) OTHER-EXECUTE file-mode? ;
 
 : any-read? ( obj -- ? )
     { [ user-read? ] [ group-read? ] [ other-read? ] } 1|| ;


M: string set-file-user ( path string -- )
    user-id f set-file-ids ;
    
M: integer set-file-group ( path gid -- )
    f swap set-file-ids ;
    
M: string set-file-group ( path string -- )
    group-id
    f swap set-file-ids ;


: any-execute? ( obj -- ? )
    { [ user-execute? ] [ group-execute? ] [ other-execute? ] } 1|| ;

: set-uid ( path ? -- ) UID swap chmod-set-bit ;
: set-gid ( path ? -- ) GID swap chmod-set-bit ;
: set-sticky ( path ? -- ) STICKY swap chmod-set-bit ;
: set-user-read ( path ? -- ) USER-READ swap chmod-set-bit ;
: set-user-write ( path ? -- ) USER-WRITE swap chmod-set-bit ;
: set-user-execute ( path ? -- ) USER-EXECUTE swap chmod-set-bit ;
: set-group-read ( path ? -- ) GROUP-READ swap chmod-set-bit ;
: set-group-write ( path ? -- ) GROUP-WRITE swap chmod-set-bit ;
: set-group-execute ( path ? -- ) GROUP-EXECUTE swap chmod-set-bit ;
: set-other-read ( path ? -- ) OTHER-READ swap chmod-set-bit ;
: set-other-write ( path ? -- ) OTHER-WRITE swap chmod-set-bit ;
: set-other-execute ( path ? -- ) OTHER-EXECUTE swap chmod-set-bit ;

: set-file-permissions ( path n -- )
