| 
									
										
										
										
											2008-12-14 21:03:00 -05:00
										 |  |  | ! Copyright (C) 2008 Doug Coleman. | 
					
						
							| 
									
										
										
										
											2007-09-20 18:09:08 -04:00
										 |  |  | ! See http://factorcode.org/license.txt for BSD license. | 
					
						
							| 
									
										
										
										
											2011-09-25 14:49:27 -04:00
										 |  |  | USING: accessors alien.c-types alien.data arrays calendar | 
					
						
							|  |  |  | calendar.unix classes.struct combinators | 
					
						
							| 
									
										
										
										
											2012-10-24 20:50:45 -04:00
										 |  |  | combinators.short-circuit io.backend io.files.info | 
					
						
							|  |  |  | io.files.types kernel libc literals math math.bitwise | 
					
						
							| 
									
										
										
										
											2011-09-25 14:49:27 -04:00
										 |  |  | sequences specialized-arrays strings system unix unix.ffi | 
					
						
							| 
									
										
										
										
											2011-11-02 14:23:41 -04:00
										 |  |  | unix.groups unix.stat unix.time unix.users vocabs ;
 | 
					
						
							| 
									
										
										
										
											2008-12-14 21:03:00 -05:00
										 |  |  | IN: io.files.info.unix | 
					
						
							| 
									
										
										
										
											2010-01-20 23:42:07 -05:00
										 |  |  | SPECIALIZED-ARRAY: timeval | 
					
						
							| 
									
										
										
										
											2008-02-29 00:46:27 -05:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-03-23 19:43:32 -04:00
										 |  |  | TUPLE: unix-file-system-info < file-system-info-tuple | 
					
						
							| 
									
										
										
										
											2008-12-01 15:04:55 -05:00
										 |  |  | block-size preferred-block-size | 
					
						
							|  |  |  | blocks blocks-free blocks-available | 
					
						
							|  |  |  | files files-free files-available | 
					
						
							| 
									
										
										
										
											2008-12-03 01:19:52 -05:00
										 |  |  | name-max flags id ;
 | 
					
						
							| 
									
										
										
										
											2008-02-29 00:46:27 -05:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2008-12-01 15:04:55 -05:00
										 |  |  | HOOK: new-file-system-info os ( --  file-system-info )
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-10-13 19:19:03 -04:00
										 |  |  | M: unix new-file-system-info unix-file-system-info new ;
 | 
					
						
							| 
									
										
										
										
											2008-12-01 15:04:55 -05:00
										 |  |  | 
 | 
					
						
							|  |  |  | HOOK: file-system-statfs os ( path -- statfs )
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | M: unix file-system-statfs drop f ;
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | HOOK: file-system-statvfs os ( path -- statvfs )
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | M: unix file-system-statvfs drop f ;
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | HOOK: statfs>file-system-info os ( file-system-info statfs -- file-system-info' )
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | M: unix statfs>file-system-info drop ;
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | HOOK: statvfs>file-system-info os ( file-system-info statvfs -- file-system-info' )
 | 
					
						
							| 
									
										
										
										
											2008-10-06 18:17:14 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2008-12-01 15:04:55 -05:00
										 |  |  | M: unix statvfs>file-system-info drop ;
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | : file-system-calculations ( file-system-info -- file-system-info' )
 | 
					
						
							| 
									
										
										
										
											2008-12-14 21:03:00 -05:00
										 |  |  |     dup [ blocks-available>> ] [ block-size>> ] bi * >>available-space | 
					
						
							|  |  |  |     dup [ blocks-free>> ] [ block-size>> ] bi * >>free-space | 
					
						
							|  |  |  |     dup [ blocks>> ] [ block-size>> ] bi * >>total-space | 
					
						
							|  |  |  |     dup [ total-space>> ] [ free-space>> ] bi - >>used-space ;
 | 
					
						
							| 
									
										
										
										
											2008-12-01 15:04:55 -05:00
										 |  |  | 
 | 
					
						
							|  |  |  | M: unix file-system-info | 
					
						
							|  |  |  |     normalize-path | 
					
						
							|  |  |  |     [ new-file-system-info ] dip
 | 
					
						
							|  |  |  |     [ file-system-statfs statfs>file-system-info ] | 
					
						
							|  |  |  |     [ file-system-statvfs statvfs>file-system-info ] bi
 | 
					
						
							|  |  |  |     file-system-calculations ;
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-03-23 19:43:32 -04:00
										 |  |  | TUPLE: unix-file-info < file-info-tuple uid gid dev ino | 
					
						
							| 
									
										
										
										
											2008-10-06 18:17:14 -04:00
										 |  |  | nlink rdev blocks blocksize ;
 | 
					
						
							| 
									
										
										
										
											2008-03-06 13:05:47 -05:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2008-12-01 15:04:55 -05:00
										 |  |  | HOOK: new-file-info os ( -- file-info )
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | HOOK: stat>file-info os ( stat -- file-info )
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | HOOK: stat>type os ( stat -- file-info )
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2008-04-02 21:09:56 -04:00
										 |  |  | M: unix file-info ( path -- info )
 | 
					
						
							| 
									
										
										
										
											2008-05-13 14:37:25 -04:00
										 |  |  |     normalize-path file-status stat>file-info ;
 | 
					
						
							| 
									
										
										
										
											2008-03-13 23:08:57 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2008-04-02 21:09:56 -04:00
										 |  |  | M: unix link-info ( path -- info )
 | 
					
						
							| 
									
										
										
										
											2008-05-13 14:37:25 -04:00
										 |  |  |     normalize-path link-status stat>file-info ;
 | 
					
						
							| 
									
										
										
										
											2008-03-30 02:13:29 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2008-10-06 18:17:14 -04:00
										 |  |  | M: unix new-file-info ( -- class ) unix-file-info new ;
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-04-20 18:44:12 -04:00
										 |  |  | CONSTANT: standard-unix-block-size 512
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2008-10-06 18:17:14 -04:00
										 |  |  | M: unix stat>file-info ( stat -- file-info )
 | 
					
						
							|  |  |  |     [ new-file-info ] dip
 | 
					
						
							|  |  |  |     { | 
					
						
							|  |  |  |         [ stat>type >>type ] | 
					
						
							| 
									
										
										
										
											2009-08-30 05:06:41 -04:00
										 |  |  |         [ st_size>> >>size ] | 
					
						
							|  |  |  |         [ st_mode>> >>permissions ] | 
					
						
							|  |  |  |         [ st_ctimespec>> timespec>unix-time >>created ] | 
					
						
							|  |  |  |         [ st_mtimespec>> timespec>unix-time >>modified ] | 
					
						
							|  |  |  |         [ st_atimespec>> timespec>unix-time >>accessed ] | 
					
						
							|  |  |  |         [ st_uid>> >>uid ] | 
					
						
							|  |  |  |         [ st_gid>> >>gid ] | 
					
						
							|  |  |  |         [ st_dev>> >>dev ] | 
					
						
							|  |  |  |         [ st_ino>> >>ino ] | 
					
						
							|  |  |  |         [ st_nlink>> >>nlink ] | 
					
						
							|  |  |  |         [ st_rdev>> >>rdev ] | 
					
						
							|  |  |  |         [ st_blocks>> >>blocks ] | 
					
						
							|  |  |  |         [ st_blksize>> >>blocksize ] | 
					
						
							| 
									
										
										
										
											2009-04-20 18:44:12 -04:00
										 |  |  |         [ drop dup blocks>> standard-unix-block-size * >>size-on-disk ] | 
					
						
							| 
									
										
										
										
											2008-10-06 18:17:14 -04:00
										 |  |  |     } cleave ;
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2008-11-19 17:22:42 -05:00
										 |  |  | : n>file-type ( n -- type )
 | 
					
						
							|  |  |  |     S_IFMT bitand { | 
					
						
							| 
									
										
										
										
											2008-10-06 18:17:14 -04:00
										 |  |  |         { S_IFREG [ +regular-file+ ] } | 
					
						
							|  |  |  |         { S_IFDIR [ +directory+ ] } | 
					
						
							|  |  |  |         { S_IFCHR [ +character-device+ ] } | 
					
						
							|  |  |  |         { S_IFBLK [ +block-device+ ] } | 
					
						
							|  |  |  |         { S_IFIFO [ +fifo+ ] } | 
					
						
							|  |  |  |         { S_IFLNK [ +symbolic-link+ ] } | 
					
						
							|  |  |  |         { S_IFSOCK [ +socket+ ] } | 
					
						
							|  |  |  |         [ drop +unknown+ ] | 
					
						
							|  |  |  |     } case ;
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2008-11-19 17:22:42 -05:00
										 |  |  | M: unix stat>type ( stat -- type )
 | 
					
						
							| 
									
										
										
										
											2009-08-30 05:06:41 -04:00
										 |  |  |     st_mode>> n>file-type ;
 | 
					
						
							| 
									
										
										
										
											2008-11-19 17:22:42 -05:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2008-10-07 20:25:22 -04:00
										 |  |  | <PRIVATE
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | : stat-mode ( path -- mode )
 | 
					
						
							| 
									
										
										
										
											2009-08-30 05:06:41 -04:00
										 |  |  |     normalize-path file-status st_mode>> ;
 | 
					
						
							| 
									
										
										
										
											2008-11-30 20:13:42 -05:00
										 |  |  | 
 | 
					
						
							|  |  |  | : chmod-set-bit ( path mask ? -- )
 | 
					
						
							|  |  |  |     [ dup stat-mode ] 2dip
 | 
					
						
							| 
									
										
										
										
											2010-01-23 10:07:35 -05:00
										 |  |  |     [ bitor ] [ unmask ] if [ chmod ] unix-system-call drop ;
 | 
					
						
							| 
									
										
										
										
											2008-10-07 20:25:22 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2008-11-30 20:13:42 -05:00
										 |  |  | GENERIC# file-mode? 1 ( obj mask -- ? )
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | M: integer file-mode? mask? ;
 | 
					
						
							|  |  |  | M: string file-mode? [ stat-mode ] dip mask? ;
 | 
					
						
							| 
									
										
										
										
											2013-03-23 19:43:32 -04:00
										 |  |  | M: file-info-tuple file-mode? [ permissions>> ] dip mask? ;
 | 
					
						
							| 
									
										
										
										
											2008-10-07 20:25:22 -04:00
										 |  |  | 
 | 
					
						
							|  |  |  | PRIVATE>
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-11-23 21:49:33 -05:00
										 |  |  | CONSTANT: UID           0o0004000
 | 
					
						
							|  |  |  | CONSTANT: GID           0o0002000
 | 
					
						
							|  |  |  | CONSTANT: STICKY        0o0001000
 | 
					
						
							|  |  |  | CONSTANT: USER-ALL      0o0000700
 | 
					
						
							|  |  |  | CONSTANT: USER-READ     0o0000400
 | 
					
						
							|  |  |  | CONSTANT: USER-WRITE    0o0000200
 | 
					
						
							|  |  |  | CONSTANT: USER-EXECUTE  0o0000100
 | 
					
						
							|  |  |  | CONSTANT: GROUP-ALL     0o0000070
 | 
					
						
							|  |  |  | CONSTANT: GROUP-READ    0o0000040
 | 
					
						
							|  |  |  | CONSTANT: GROUP-WRITE   0o0000020
 | 
					
						
							|  |  |  | CONSTANT: GROUP-EXECUTE 0o0000010
 | 
					
						
							|  |  |  | CONSTANT: OTHER-ALL     0o0000007
 | 
					
						
							|  |  |  | CONSTANT: OTHER-READ    0o0000004
 | 
					
						
							|  |  |  | CONSTANT: OTHER-WRITE   0o0000002
 | 
					
						
							|  |  |  | CONSTANT: OTHER-EXECUTE 0o0000001
 | 
					
						
							|  |  |  | CONSTANT: ALL-READ      0o0000444
 | 
					
						
							|  |  |  | CONSTANT: ALL-WRITE     0o0000222
 | 
					
						
							|  |  |  | CONSTANT: ALL-EXECUTE   0o0000111
 | 
					
						
							| 
									
										
										
										
											2008-11-30 20:13:42 -05:00
										 |  |  | 
 | 
					
						
							|  |  |  | : 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? ;
 | 
					
						
							| 
									
										
										
										
											2008-10-18 18:29:38 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2008-11-19 22:15:27 -05:00
										 |  |  | : any-read? ( obj -- ? )
 | 
					
						
							|  |  |  |     { [ user-read? ] [ group-read? ] [ other-read? ] } 1|| ;
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | : any-write? ( obj -- ? )
 | 
					
						
							|  |  |  |     { [ user-write? ] [ group-write? ] [ other-write? ] } 1|| ;
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | : any-execute? ( obj -- ? )
 | 
					
						
							|  |  |  |     { [ user-execute? ] [ group-execute? ] [ other-execute? ] } 1|| ;
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2008-10-07 20:25:22 -04:00
										 |  |  | : 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 ;
 | 
					
						
							| 
									
										
										
										
											2008-11-30 20:13:42 -05:00
										 |  |  | : set-user-write ( path ? -- ) USER-WRITE swap chmod-set-bit ;
 | 
					
						
							| 
									
										
										
										
											2008-10-07 20:25:22 -04:00
										 |  |  | : set-user-execute ( path ? -- ) USER-EXECUTE swap chmod-set-bit ;
 | 
					
						
							|  |  |  | : set-group-read ( path ? -- ) GROUP-READ swap chmod-set-bit ;
 | 
					
						
							| 
									
										
										
										
											2008-11-30 20:13:42 -05:00
										 |  |  | : set-group-write ( path ? -- ) GROUP-WRITE swap chmod-set-bit ;
 | 
					
						
							| 
									
										
										
										
											2008-10-07 20:25:22 -04:00
										 |  |  | : set-group-execute ( path ? -- ) GROUP-EXECUTE swap chmod-set-bit ;
 | 
					
						
							|  |  |  | : set-other-read ( path ? -- ) OTHER-READ swap chmod-set-bit ;
 | 
					
						
							| 
									
										
										
										
											2008-11-30 20:13:42 -05:00
										 |  |  | : set-other-write ( path ? -- ) OTHER-WRITE swap chmod-set-bit ;
 | 
					
						
							| 
									
										
										
										
											2008-10-07 20:25:22 -04:00
										 |  |  | : set-other-execute ( path ? -- ) OTHER-EXECUTE swap chmod-set-bit ;
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2008-10-08 14:03:55 -04:00
										 |  |  | : set-file-permissions ( path n -- )
 | 
					
						
							| 
									
										
										
										
											2010-01-23 10:07:35 -05:00
										 |  |  |     [ normalize-path ] dip [ chmod ] unix-system-call drop ;
 | 
					
						
							| 
									
										
										
										
											2008-10-07 20:25:22 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2008-10-08 14:03:55 -04:00
										 |  |  | : file-permissions ( path -- n )
 | 
					
						
							|  |  |  |     normalize-path file-info permissions>> ;
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-12-06 18:53:35 -05:00
										 |  |  | : add-file-permissions ( path n -- )
 | 
					
						
							|  |  |  |     over file-permissions bitor set-file-permissions ;
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | : remove-file-permissions ( path n -- )
 | 
					
						
							|  |  |  |     over file-permissions [ bitnot ] dip bitand set-file-permissions ;
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2008-10-07 20:25:22 -04:00
										 |  |  | <PRIVATE
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | : timestamp>timeval ( timestamp -- timeval )
 | 
					
						
							| 
									
										
										
										
											2008-11-19 02:50:05 -05:00
										 |  |  |     unix-1970 time- duration>microseconds make-timeval ;
 | 
					
						
							| 
									
										
										
										
											2008-10-07 20:25:22 -04:00
										 |  |  | 
 | 
					
						
							|  |  |  | : timestamps>byte-array ( timestamps -- byte-array )
 | 
					
						
							| 
									
										
										
										
											2009-08-30 05:06:41 -04:00
										 |  |  |     [ [ timestamp>timeval ] [ \ timeval <struct> ] if* ] map
 | 
					
						
							| 
									
										
										
										
											2011-09-25 14:49:27 -04:00
										 |  |  |     timeval >c-array ;
 | 
					
						
							| 
									
										
										
										
											2008-10-07 20:25:22 -04:00
										 |  |  | 
 | 
					
						
							|  |  |  | PRIVATE>
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | : set-file-times ( path timestamps -- )
 | 
					
						
							|  |  |  |     #! set access, write | 
					
						
							|  |  |  |     [ normalize-path ] dip
 | 
					
						
							| 
									
										
										
										
											2010-01-23 10:07:35 -05:00
										 |  |  |     timestamps>byte-array [ utimes ] unix-system-call drop ;
 | 
					
						
							| 
									
										
										
										
											2008-10-07 20:25:22 -04:00
										 |  |  | 
 | 
					
						
							|  |  |  | : set-file-access-time ( path timestamp -- )
 | 
					
						
							| 
									
										
										
										
											2012-06-01 19:02:07 -04:00
										 |  |  |     over file-info modified>> 2array set-file-times ;
 | 
					
						
							| 
									
										
										
										
											2008-10-07 20:25:22 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2008-10-08 15:18:50 -04:00
										 |  |  | : set-file-modified-time ( path timestamp -- )
 | 
					
						
							| 
									
										
										
										
											2012-06-01 19:02:07 -04:00
										 |  |  |     over file-info accessed>> swap 2array set-file-times ;
 | 
					
						
							| 
									
										
										
										
											2008-10-07 20:25:22 -04:00
										 |  |  | 
 | 
					
						
							|  |  |  | : set-file-ids ( path uid gid -- )
 | 
					
						
							| 
									
										
										
										
											2010-01-19 17:53:15 -05:00
										 |  |  |     [ normalize-path ] 2dip [ -1 or ] bi@
 | 
					
						
							| 
									
										
										
										
											2010-01-23 10:07:35 -05:00
										 |  |  |     [ chown ] unix-system-call drop ;
 | 
					
						
							| 
									
										
										
										
											2008-10-07 20:25:22 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2008-10-08 15:18:50 -04:00
										 |  |  | GENERIC: set-file-user ( path string/id -- )
 | 
					
						
							| 
									
										
										
										
											2008-10-07 20:25:22 -04:00
										 |  |  | 
 | 
					
						
							|  |  |  | GENERIC: set-file-group ( path string/id -- )
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2008-10-08 15:18:50 -04:00
										 |  |  | M: integer set-file-user ( path uid -- )
 | 
					
						
							| 
									
										
										
										
											2008-10-07 20:25:22 -04:00
										 |  |  |     f set-file-ids ;
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2008-10-08 15:18:50 -04:00
										 |  |  | M: string set-file-user ( path string -- )
 | 
					
						
							|  |  |  |     user-id f set-file-ids ;
 | 
					
						
							| 
									
										
										
										
											2008-11-30 20:13:42 -05:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2008-10-07 20:25:22 -04:00
										 |  |  | M: integer set-file-group ( path gid -- )
 | 
					
						
							|  |  |  |     f swap set-file-ids ;
 | 
					
						
							| 
									
										
										
										
											2008-11-30 20:13:42 -05:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2008-10-07 20:25:22 -04:00
										 |  |  | M: string set-file-group ( path string -- )
 | 
					
						
							|  |  |  |     group-id | 
					
						
							|  |  |  |     f swap set-file-ids ;
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2008-10-08 15:18:50 -04:00
										 |  |  | : file-user-id ( path -- uid )
 | 
					
						
							| 
									
										
										
										
											2008-10-08 14:03:55 -04:00
										 |  |  |     normalize-path file-info uid>> ;
 | 
					
						
							| 
									
										
										
										
											2008-10-07 20:25:22 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-01-08 18:56:03 -05:00
										 |  |  | : file-user-name ( path -- string )
 | 
					
						
							|  |  |  |     file-user-id user-name ;
 | 
					
						
							| 
									
										
										
										
											2008-10-07 20:25:22 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2008-10-08 14:03:55 -04:00
										 |  |  | : file-group-id ( path -- gid )
 | 
					
						
							|  |  |  |     normalize-path file-info gid>> ;
 | 
					
						
							| 
									
										
										
										
											2008-10-07 20:25:22 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2008-10-08 14:03:55 -04:00
										 |  |  | : file-group-name ( path -- string )
 | 
					
						
							|  |  |  |     file-group-id group-name ;
 | 
					
						
							| 
									
										
										
										
											2009-01-13 01:05:19 -05:00
										 |  |  | 
 | 
					
						
							|  |  |  | : ch>file-type ( ch -- type )
 | 
					
						
							|  |  |  |     { | 
					
						
							|  |  |  |         { CHAR: b [ +block-device+ ] } | 
					
						
							|  |  |  |         { CHAR: c [ +character-device+ ] } | 
					
						
							|  |  |  |         { CHAR: d [ +directory+ ] } | 
					
						
							|  |  |  |         { CHAR: l [ +symbolic-link+ ] } | 
					
						
							|  |  |  |         { CHAR: s [ +socket+ ] } | 
					
						
							|  |  |  |         { CHAR: p [ +fifo+ ] } | 
					
						
							|  |  |  |         { CHAR: - [ +regular-file+ ] } | 
					
						
							|  |  |  |         [ drop +unknown+ ] | 
					
						
							|  |  |  |     } case ;
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | : file-type>ch ( type -- ch )
 | 
					
						
							|  |  |  |     { | 
					
						
							|  |  |  |         { +block-device+ [ CHAR: b ] } | 
					
						
							|  |  |  |         { +character-device+ [ CHAR: c ] } | 
					
						
							|  |  |  |         { +directory+ [ CHAR: d ] } | 
					
						
							|  |  |  |         { +symbolic-link+ [ CHAR: l ] } | 
					
						
							|  |  |  |         { +socket+ [ CHAR: s ] } | 
					
						
							|  |  |  |         { +fifo+ [ CHAR: p ] } | 
					
						
							|  |  |  |         { +regular-file+ [ CHAR: - ] } | 
					
						
							|  |  |  |         [ drop CHAR: - ] | 
					
						
							|  |  |  |     } case ;
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | <PRIVATE
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | : file-type>executable ( directory-entry -- string )
 | 
					
						
							|  |  |  |     name>> any-execute? "*" "" ? ;
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | PRIVATE>
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | : file-type>trailing ( directory-entry -- string )
 | 
					
						
							|  |  |  |     dup type>> | 
					
						
							|  |  |  |     { | 
					
						
							|  |  |  |         { +directory+ [ drop "/" ] } | 
					
						
							|  |  |  |         { +symbolic-link+ [ drop "@" ] } | 
					
						
							|  |  |  |         { +fifo+ [ drop "|" ] } | 
					
						
							|  |  |  |         { +socket+ [ drop "=" ] } | 
					
						
							|  |  |  |         { +whiteout+ [ drop "%" ] } | 
					
						
							|  |  |  |         { +unknown+ [ file-type>executable ] } | 
					
						
							|  |  |  |         { +regular-file+ [ file-type>executable ] } | 
					
						
							|  |  |  |         [ drop file-type>executable ] | 
					
						
							|  |  |  |     } case ;
 | 
					
						
							| 
									
										
										
										
											2010-01-20 23:42:07 -05:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2012-10-24 20:50:45 -04:00
										 |  |  | <PRIVATE
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | : access? ( path mode -- ? )
 | 
					
						
							|  |  |  |     [ normalize-path ] [ access ] bi* 0 < [ | 
					
						
							|  |  |  |         errno EACCES = [ f ] [ (io-error) ] if
 | 
					
						
							|  |  |  |     ] [ t ] if ;
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | PRIVATE>
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | M: unix file-readable? R_OK access? ;
 | 
					
						
							|  |  |  | M: unix file-writable? W_OK access? ;
 | 
					
						
							|  |  |  | M: unix file-executable? X_OK access? ;
 | 
					
						
							| 
									
										
										
										
											2012-10-24 19:44:12 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-01-20 23:42:07 -05:00
										 |  |  | "io.files.info.unix." os name>> append require |