| 
									
										
										
										
											2013-04-25 12:12:42 -04:00
										 |  |  | ! Copyright (C) 2013 John Benediktsson | 
					
						
							|  |  |  | ! See http://factorcode.org/license.txt for BSD license | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | USING: accessors alien.c-types alien.data alien.syntax arrays | 
					
						
							|  |  |  | assocs byte-arrays classes.struct continuations fry grouping | 
					
						
							| 
									
										
										
										
											2014-04-16 10:55:06 -04:00
										 |  |  | kernel libc literals math sequences splitting strings system | 
					
						
							| 
									
										
										
										
											2013-04-25 12:12:42 -04:00
										 |  |  | system-info.macosx tools.ps unix unix.time unix.types ;
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | QUALIFIED-WITH: alien.c-types c | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | IN: tools.ps.macosx | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | <PRIVATE
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | : system-type ( -- str ) { 1 1 } sysctl-query-string ;
 | 
					
						
							|  |  |  | : system-release ( -- str ) { 1 2 } sysctl-query-string ;
 | 
					
						
							|  |  |  | : system-revision ( -- str ) { 1 3 } sysctl-query-string ;
 | 
					
						
							|  |  |  | : system-version ( -- str ) { 1 4 } sysctl-query-string ;
 | 
					
						
							|  |  |  | : max-vnodes ( -- n ) { 1 5 } sysctl-query-uint ;
 | 
					
						
							|  |  |  | : max-processes ( -- n ) { 1 6 } sysctl-query-uint ;
 | 
					
						
							|  |  |  | : max-open-files ( -- n ) { 1 7 } sysctl-query-uint ;
 | 
					
						
							|  |  |  | : max-arguments ( -- args ) { 1 8 } sysctl-query-uint ;
 | 
					
						
							|  |  |  | : system-security-level ( -- n ) { 1 9 } sysctl-query-uint ;
 | 
					
						
							|  |  |  | : hostname ( -- str ) { 1 10 } sysctl-query-string ;
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | : sysctl-query-bytes ( seq -- n )
 | 
					
						
							| 
									
										
										
										
											2014-06-06 00:01:30 -04:00
										 |  |  |     [ int >c-array ] [ length ] bi f 0 uint <ref> | 
					
						
							| 
									
										
										
										
											2013-04-25 12:12:42 -04:00
										 |  |  |     [ f 0 sysctl io-error ] keep uint deref ;
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | STRUCT: _pcred | 
					
						
							|  |  |  |     { pc_lock char[72] } | 
					
						
							|  |  |  |     { pc_ucred void* } | 
					
						
							|  |  |  |     { p_ruid uid_t } | 
					
						
							|  |  |  |     { p_svuid uid_t } | 
					
						
							|  |  |  |     { p_rgid gid_t } | 
					
						
							|  |  |  |     { p_svgid gid_t } | 
					
						
							|  |  |  |     { p_refcnt int } ;
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | STRUCT: _ucred | 
					
						
							|  |  |  |     { cr_ref int32_t } | 
					
						
							|  |  |  |     { cr_uid uid_t } | 
					
						
							|  |  |  |     { cr_ngroups c:short } | 
					
						
							|  |  |  |     { cr_groups gid_t[16] } ;
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | STRUCT: vmspace | 
					
						
							|  |  |  |     { dummy int32_t } | 
					
						
							|  |  |  |     { dummy2 caddr_t } | 
					
						
							|  |  |  |     { dummy3 int32_t[5] } | 
					
						
							|  |  |  |     { dummy4 caddr_t[3] } ;
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | TYPEDEF: int32_t segsz_t | 
					
						
							|  |  |  | TYPEDEF: uint32_t fixpt_t | 
					
						
							|  |  |  | TYPEDEF: uint64_t u_quad_t | 
					
						
							|  |  |  | TYPEDEF: uint32_t sigset_t | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | STRUCT: itimerval | 
					
						
							|  |  |  |     { it_interval timeval } | 
					
						
							|  |  |  |     { it_value timeval } ;
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | STRUCT: extern_proc | 
					
						
							|  |  |  |     { __p_starttime timeval } | 
					
						
							|  |  |  |     { p_vmspace void* } | 
					
						
							|  |  |  |     { p_sigacts void* } | 
					
						
							|  |  |  |     { p_flag int } | 
					
						
							|  |  |  |     { p_stat char } | 
					
						
							|  |  |  |     { p_pid pid_t } | 
					
						
							|  |  |  |     { p_oppid pid_t } | 
					
						
							|  |  |  |     { p_dupfd int } | 
					
						
							|  |  |  |     { user_stack caddr_t } | 
					
						
							|  |  |  |     { exit_thread void* } | 
					
						
							|  |  |  |     { p_debugger int } | 
					
						
							|  |  |  |     { sigwait boolean_t } | 
					
						
							|  |  |  |     { p_estcpu uint } | 
					
						
							|  |  |  |     { p_cpticks int } | 
					
						
							|  |  |  |     { p_pctcpu fixpt_t } | 
					
						
							|  |  |  |     { p_wchan void* } | 
					
						
							|  |  |  |     { p_wmesg void* } | 
					
						
							|  |  |  |     { p_swtime uint } | 
					
						
							|  |  |  |     { p_slptime uint } | 
					
						
							|  |  |  |     { p_realtimer itimerval } | 
					
						
							|  |  |  |     { p_rtime timeval } | 
					
						
							|  |  |  |     { p_uticks u_quad_t } | 
					
						
							|  |  |  |     { p_sticks u_quad_t } | 
					
						
							|  |  |  |     { p_iticks u_quad_t } | 
					
						
							|  |  |  |     { p_traceflag int } | 
					
						
							|  |  |  |     { p_tracep void* } | 
					
						
							|  |  |  |     { p_siglist int } | 
					
						
							|  |  |  |     { p_textvp void* } | 
					
						
							|  |  |  |     { p_holdcnt int } | 
					
						
							|  |  |  |     { p_sigmask sigset_t } | 
					
						
							|  |  |  |     { p_sigignore sigset_t } | 
					
						
							|  |  |  |     { p_sigcatch sigset_t } | 
					
						
							|  |  |  |     { p_priority uchar } | 
					
						
							|  |  |  |     { p_usrpri uchar } | 
					
						
							|  |  |  |     { p_nice char } | 
					
						
							|  |  |  |     { p_comm char[16] } | 
					
						
							|  |  |  |     { p_pgrp void* } | 
					
						
							|  |  |  |     { p_addr void* } | 
					
						
							|  |  |  |     { p_xstat ushort } | 
					
						
							|  |  |  |     { p_acflag ushort } | 
					
						
							|  |  |  |     { p_ru void* } ;
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | STRUCT: kinfo_proc | 
					
						
							|  |  |  |     { kp_proc extern_proc } | 
					
						
							|  |  |  |     { e_paddr void* } | 
					
						
							|  |  |  |     { e_sess void* } | 
					
						
							|  |  |  |     { e_pcred _pcred } | 
					
						
							|  |  |  |     { e_ucred _ucred } | 
					
						
							|  |  |  |     { e_vm vmspace } | 
					
						
							|  |  |  |     { e_ppid pid_t } | 
					
						
							|  |  |  |     { e_pgid pid_t } | 
					
						
							|  |  |  |     { e_joc c:short } | 
					
						
							|  |  |  |     { e_tdev dev_t } | 
					
						
							|  |  |  |     { e_tpgid pid_t } | 
					
						
							|  |  |  |     { e_tsess void* } | 
					
						
							|  |  |  |     { e_mesg char[8] } | 
					
						
							|  |  |  |     { e_xsize segsz_t } | 
					
						
							|  |  |  |     { e_xrssize c:short } | 
					
						
							|  |  |  |     { e_xccount c:short } | 
					
						
							|  |  |  |     { e_xswrss c:short } | 
					
						
							|  |  |  |     { e_flag int32_t } | 
					
						
							|  |  |  |     { e_login char[12] } | 
					
						
							|  |  |  |     { e_spare int32_t[4] } ;
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | : head-split-skip ( seq n quot: ( elt -- ? ) -- pieces )
 | 
					
						
							|  |  |  |     [ dup 0 >= ] swap '[ | 
					
						
							| 
									
										
										
										
											2013-04-26 19:23:32 -04:00
										 |  |  |         [ _ [ trim-head-slice ] [ split1-when-slice ] bi ] | 
					
						
							|  |  |  |         [ 1 - rot ] bi*
 | 
					
						
							| 
									
										
										
										
											2013-04-25 12:12:42 -04:00
										 |  |  |     ] produce 2nip ; inline
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | : args ( pid -- args )
 | 
					
						
							|  |  |  |     [ 1 49 ] dip 0 4array max-arguments sysctl-query | 
					
						
							|  |  |  |     4 cut-slice swap >byte-array uint deref | 
					
						
							|  |  |  |     [ zero? ] head-split-skip [ >string ] map ;
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | : procs ( -- seq )
 | 
					
						
							|  |  |  |     { 1 14 0 0 } dup sysctl-query-bytes sysctl-query | 
					
						
							|  |  |  |     kinfo_proc struct-size group | 
					
						
							|  |  |  |     [ kinfo_proc memory>struct ] map ;
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | : ps-arg ( kp_proc -- arg )
 | 
					
						
							|  |  |  |     [ p_pid>> args rest " " join ] [ | 
					
						
							|  |  |  |         drop p_comm>> 0 over index [ head ] when* >string
 | 
					
						
							|  |  |  |     ] recover ;
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | PRIVATE>
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | M: macosx ps ( -- assoc )
 | 
					
						
							|  |  |  |     procs [ kp_proc>> p_pid>> 0 > ] filter
 | 
					
						
							| 
									
										
										
										
											2013-04-25 13:05:57 -04:00
										 |  |  |     [ kp_proc>> [ p_pid>> ] [ ps-arg ] bi ] { } map>assoc ;
 |