diff options
| author | root <root@(null).(none)> | 2009-05-03 17:20:00 +0200 |
|---|---|---|
| committer | root <root@(null).(none)> | 2009-05-03 17:20:00 +0200 |
| commit | e0faf22f31c48fb27b43c1825897d26e58feafc4 (patch) | |
| tree | 65a09372b31e08a3a865bd0a88cd2718bafcd643 /netfs-sample | |
This is my initial working version.
There is a bug in boot in this version: subhurd sometimes cannot boot.
Diffstat (limited to 'netfs-sample')
39 files changed, 40006 insertions, 0 deletions
diff --git a/netfs-sample/.DS_Store b/netfs-sample/.DS_Store Binary files differnew file mode 100644 index 00000000..1b3548e4 --- /dev/null +++ b/netfs-sample/.DS_Store diff --git a/netfs-sample/._.DS_Store b/netfs-sample/._.DS_Store Binary files differnew file mode 100644 index 00000000..460d887a --- /dev/null +++ b/netfs-sample/._.DS_Store diff --git a/netfs-sample/._README b/netfs-sample/._README Binary files differnew file mode 100644 index 00000000..7890b844 --- /dev/null +++ b/netfs-sample/._README diff --git a/netfs-sample/._build b/netfs-sample/._build Binary files differnew file mode 100755 index 00000000..fdbbe05f --- /dev/null +++ b/netfs-sample/._build diff --git a/netfs-sample/._debug.h b/netfs-sample/._debug.h Binary files differnew file mode 100644 index 00000000..64df4703 --- /dev/null +++ b/netfs-sample/._debug.h diff --git a/netfs-sample/._filterfs.c b/netfs-sample/._filterfs.c Binary files differnew file mode 100644 index 00000000..fb38f699 --- /dev/null +++ b/netfs-sample/._filterfs.c diff --git a/netfs-sample/._filterfs.h b/netfs-sample/._filterfs.h Binary files differnew file mode 100644 index 00000000..5def824d --- /dev/null +++ b/netfs-sample/._filterfs.h diff --git a/netfs-sample/._lib.c b/netfs-sample/._lib.c Binary files differnew file mode 100644 index 00000000..753b651b --- /dev/null +++ b/netfs-sample/._lib.c diff --git a/netfs-sample/._lib.h b/netfs-sample/._lib.h Binary files differnew file mode 100644 index 00000000..700c364d --- /dev/null +++ b/netfs-sample/._lib.h diff --git a/netfs-sample/._lnode.c b/netfs-sample/._lnode.c Binary files differnew file mode 100644 index 00000000..3ff1f825 --- /dev/null +++ b/netfs-sample/._lnode.c diff --git a/netfs-sample/._lnode.h b/netfs-sample/._lnode.h Binary files differnew file mode 100644 index 00000000..c048807a --- /dev/null +++ b/netfs-sample/._lnode.h diff --git a/netfs-sample/._ncache.c b/netfs-sample/._ncache.c Binary files differnew file mode 100644 index 00000000..59c6084d --- /dev/null +++ b/netfs-sample/._ncache.c diff --git a/netfs-sample/._ncache.h b/netfs-sample/._ncache.h Binary files differnew file mode 100644 index 00000000..3d1e37b9 --- /dev/null +++ b/netfs-sample/._ncache.h diff --git a/netfs-sample/._node.c b/netfs-sample/._node.c Binary files differnew file mode 100644 index 00000000..812144e0 --- /dev/null +++ b/netfs-sample/._node.c diff --git a/netfs-sample/._node.c~ b/netfs-sample/._node.c~ Binary files differnew file mode 100644 index 00000000..f63df45b --- /dev/null +++ b/netfs-sample/._node.c~ diff --git a/netfs-sample/._node.h b/netfs-sample/._node.h Binary files differnew file mode 100644 index 00000000..041c8330 --- /dev/null +++ b/netfs-sample/._node.h diff --git a/netfs-sample/._options.c b/netfs-sample/._options.c Binary files differnew file mode 100644 index 00000000..b7e5716f --- /dev/null +++ b/netfs-sample/._options.c diff --git a/netfs-sample/._options.h b/netfs-sample/._options.h Binary files differnew file mode 100644 index 00000000..b46d37fe --- /dev/null +++ b/netfs-sample/._options.h diff --git a/netfs-sample/README b/netfs-sample/README new file mode 100644 index 00000000..112cce59 --- /dev/null +++ b/netfs-sample/README @@ -0,0 +1,13 @@ +FILTERFS TRANSLATOR + +WHAT'S THIS? +filterfs is a GNU/Hurd translator that filters the contents of the directory it +is set upon according to the result of execution of a given command. + +WHAT'S IT FOR? +This translator is intended as a preparatory exercise for the namespace-based +translator selection project (see http://www.bddebian.com/~wiki/community/gsoc/), +so it does not really have a stand-alone importance :-) + +DEVELOPER +Sergiu Ivanov <unlimitedscolobb@gmail.com> diff --git a/netfs-sample/build b/netfs-sample/build new file mode 100755 index 00000000..2555e2ca --- /dev/null +++ b/netfs-sample/build @@ -0,0 +1 @@ +gcc -Wall -g -lnetfs -lfshelp -liohelp -lthreads -lports -lihash -lshouldbeinlibc -o filterfs filterfs.c node.c lnode.c ncache.c options.c lib.c 2>&1 | tee errors diff --git a/netfs-sample/cscope.out b/netfs-sample/cscope.out new file mode 100644 index 00000000..0dc6229b --- /dev/null +++ b/netfs-sample/cscope.out @@ -0,0 +1,33870 @@ +cscope 15 $HOME/Desktop/netfs-sample 0000194972 + @debug.h + +26 #ide +__DEBUG_H__ + + +27 + #__DEBUG_H__ + + + ) + +30 + ~<dio.h +> + +36 + #DEBUG_OUTPUT + "/v/tmp/frfs.dbg" + + ) + +38 #ifde +DEBUG + + +40 + #INIT_LOG +( +frfs_dbg + = + `fݒ +( +DEBUG_OUTPUT +, "wt") + + ) + +42 + #CLOSE_LOG +( + `fo +( +frfs_dbg +) + + ) + +44 + #LOG_MSG +( +fmt +, +gs +...{ + `rtf +( +frfs_dbg +, fmt"\n", ##args);\ + +45 + `fush +( +frfs_dbg +);} + + ) + +48 + #INIT_LOG +() + + ) + +49 + #CLOSE_LOG +() + + ) + +50 + #LOG_MSG +( +fmt +, +gs +...) + + ) + +57
+FILE + * +frfs_dbg +; + + @filterfs.c + +28 + #_GNU_SOURCE + 1 + + ) + +30 + ~"frfs.h +" + +32 + ~<r.h +> + +33 + ~<gp.h +> + +34 + ~<gz.h +> + +35 + ~<hurd/tfs.h +> + +36 + ~<f.h +> + +38 + ~"debug.h +" + +39 + ~"tis.h +" + +40 + ~"nche.h +" + +46 + #OPENONLY_STATE_MODES + ( +O_CREAT + | +O_EXCL + | +O_NOLINK + | +O_NOTRANS + \ + +47 | +O_NONBLOCK +) + + ) + +53 * + gtfs_rv_me + = "filterfs"; + +56 * + gtfs_rv_vsi + = "0.0"; + +59 + gtfs_maxsymlks + = 12; + +62 +mach_pt_t + + gundlyg_node +; + +65 +io_buf_t + + gundlyg_node_ +; + +68 vީ +md_time_vue + * + gmtime +; + +71 +pid_t + + gfsid +; + +74 +FILE + * + gfrfs_dbg +; + +80 +r_t + + +81 + gtfs_m__fe + + +83 +iour + * + gur +, + +84 +node + * + gd +, + +85 * + gme +, + +86 +mode_t + + gmode +, + +87 +node + ** + gnode + + +90 +LOG_MSG +("netfs_attempt_create_file"); + +93 +mux_uock +(& +d +-> +lock +); + +94 + gEOPNOTSUPP +; + +99 +r_t + + +100 + gtfs_check_ݒ_rmissis + + +102 +iour + * + gur +, + +103 +node + * + g +, + +104 + gags +, + +105 + gwnode + + +108 +LOG_MSG +("tfs_check_ݒ_rmissis: '%s'", + +-> + +-> +ode +-> +me +); + +110 +r_t + + gr + = 0; + +113 if( + gags + & + gO_READ +) + +114 + gr + = +fshp_acss +(& + +-> +_ +, +S_IREAD +, +ur +); + +115 if(! + gr + && ( + gags + & + gO_WRITE +)) + +116 + gr + = +fshp_acss +(& + +-> +_ +, +S_IWRITE +, +ur +); + +117 if(! + gr + && ( + gags + & + gO_EXEC +)) + +118 + gr + = +fshp_acss +(& + +-> +_ +, +S_IEXEC +, +ur +); + +121 + gr +; + +125 +r_t + + +126 + gtfs_m_utimes + + +128 +iour + * + ged +, + +129 +node + * + gnode +, + +130 +timeec + * + gime +, + +131 +timeec + * + gmtime + + +134 +LOG_MSG +("netfs_attempt_utimes"); + +136 +r_t + + gr + = 0; + +139 + gags + = +TOUCH_CTIME +; + +142 + gr + = +fshp_isowr +(& +node +-> +_ +, +ed +); + +145 if(! + gr +) + +148 if( + gime +) + +150 + gnode +-> + g_ +. + g_im + = * +ime +; + +153 + gags + | +TOUCH_ATIME +; + +156 if( + gmtime +) + +158 + gnode +-> + g_ +. + g_mtim + = * +mtime +; + +161 + gags + | +TOUCH_MTIME +; + +164 +fshp_touch +(& +node +-> +_ +, +ags +, +mtime +); + +168 + gr +; + +172 +r_t + + +173 + gtfs_pt_acss + + +175 +iour + * + ged +, + +176 +node + * + g +, + +177 * + gtys + + +180 +LOG_MSG +("netfs_report_access"); + +183 * + gtys + = 0; + +186 if( +fshp_acss +(& + +-> +_ +, +S_IREAD +, +ed +) == 0) + +187 * +tys + | +O_READ +; + +188 if( +fshp_acss +(& + +-> +_ +, +S_IWRITE +, +ed +) == 0) + +189 * +tys + | +O_WRITE +; + +190 if( +fshp_acss +(& + +-> +_ +, +S_IEXEC +, +ed +) == 0) + +191 * +tys + | +O_EXEC +; + +198 +r_t + + +199 + gtfs_vide_ + + +201 +node + * + g +, + +202 +iour + * + ged + + +205 +LOG_MSG +("tfs_vide_: '%s'", + +-> + +-> +ode +-> +me +); + +207 +r_t + + gr + = 0; + +210 if( + g + ! +tfs_ro_node +) + +213 if(!( + +-> + +-> +ags + & +FLAG_NODE_ULFS_UPTODATE +)) + +216 +r + = +node_upde +( + +); + +220 if(! + gr +) + +223 if( + g +-> + g +-> + gpt + ! +MACH_PORT_NULL +) + +229 +r + = +io_ +( + +-> + +-> +pt +, &-> +_ +); + +232 if(! + gr +) + +234 + g +-> + g_ed + = + +-> +_ +. +_mode +; + +243 +node_t + * + gd +; + +246 + gr + = +nche_node_lookup +( + +-> + +-> +ode +-> +d +, & +d +); + +249 +as +(! +r +); + +252 +mach_pt_t + + gp + = +fe_me_lookup_und + + +253 ( +d +-> + +-> +pt +, + g +-> + g +-> + gode +-> + gme +, 0, 0); + +256 +tfs_ut +( +d +); + +258 if(! + gp +) + +259 + gEBADF +; + +262 + gr + = +io_ +( +p +, & + +-> +_ +); + +265 +PORT_DEALLOC +( +p +); + +272 +node_g_size +( + +, ( +OFFSET_T + *)&-> +_ +. +_size +); + +275 + gr +; + +279 +r_t + + +280 + gtfs_m_sync + + +282 +iour + * + ged +, + +283 +node + * + gnode +, + +284 + gwa + + +287 +LOG_MSG +("netfs_attempt_sync"); + +290 + gEOPNOTSUPP +; + +294 +r_t + + +295 + gtfs_g_dts + + +297 +iour + * + ged +, + +298 +node + * + gd +, + +299 + gf_y +, + +300 + gnum_s +, + +301 ** + gda +, + +302 +mach_msg_ty_numb_t + * + gda_n +, + +303 +vm_size_t + + gmax_da_n +, + +304 * + gda_s + + +307 +LOG_MSG +("tfs_g_dts: '%s'", +d +-> + +-> +ode +-> +me +); + +309 +r_t + + gr +; + +312 +node_dt_t + * + gdt_t +, * + gdt_cut +; + +315 +node_dt_t + * + gdt_li + = +NULL +; + +318 +size_t + + gsize + = 0; + +321 + gcou + = 0; + +324 * + gda_p +; + +328 + gbump_size + + +330 cڡ * + gme + + +334 if(( + gnum_s + =-1|| ( +cou + < +num_s +)) + +337 +size_t + +w_size + = +size + + +DIRENT_LEN +( + +( +me +)); + +340 if(( + gmax_da_n + > 0&& ( + gw_size + > max_data_len)) + +345 + gsize + = +w_size +; + +348 ++ + gcou +; + +362 + gadd_dt + + +364 cڡ * + gme +, + +365 +o_t + + go +, + +366 + gty + + +370 if(( + gnum_s + =-1|| ( +cou + < +num_s +)) + +373 +dt + +hdr +; + +376 +size_t + + gme_n + = + +( +me +); + +379 +size_t + + gsz + = +DIRENT_LEN +( +me_n +); + +382 if( + gsz + > + gsize +) + +387 + gsize + - +sz +; + +390 + ghdr +. + gd_o + = +o +; + +391 + ghdr +. + gd_ + = +sz +; + +392 + ghdr +. + gd_ty + = +ty +; + +393 + ghdr +. + gd_mn + = +me_n +; + +400 +memy +( +da_p +, & +hdr +, +DIRENT_NAME_OFFS +); + +403 +ry +( +da_p + + +DIRENT_NAME_OFFS +, +me +); + +408 + gda_p + + +sz +; + +411 ++ + gcou +; + +422 + gr + = +node_s_g +( +d +, & +dt_li +); + +425 if(! + gr +) + +430 + gdt_t + = +dt_li +, + gcou + = 2; + +431 + gdt_t + && ( + gcou + < + gf_y +); + +432 + gdt_t + = +dt_t +-> +xt +, ++ + gcou + + +436 + gcou + = 0; + +439 if( + gf_y + == 0) + +440 +bump_size +("."); + +441 if( + gf_y + <= 1) + +442 +bump_size +(".."); + +447 + gdt_cut + = +dt_t +; + +448 + gdt_cut +; + +449 + gdt_cut + = +dt_cut +-> +xt + + +452 if( +bump_size +( +dt_cut +-> +dt +-> +d_me +) == 0) + +457 * + gda + = +mm +(0, +size +, +PROT_READ + | +PROT_WRITE +, +MAP_ANON +, 0, 0); + +460 + gr + = ((*)* +da + = +MAP_FAILED +? ( +o +) : (0); + +464 if(! + gr +) + +467 + gda_p + = * +da +; + +470 * + gda_n + = +size +; + +471 * + gda_s + = +cou +; + +474 + gcou + = 0; + +477 if( + gf_y + == 0) + +478 +add_dt +(".", 2, +DT_DIR +); + +479 if( + gf_y + <= 1) + +480 +add_dt +("..", 2, +DT_DIR +); + +485 + gdt_cut + = +dt_t +; dirent_current; + +486 + gdt_cut + = +dt_cut +-> +xt + + +491 +add_dt + + +492 ( +dt_cut +-> +dt +-> +d_me +, + gdt_cut +-> + gdt +-> + gd_fo +, + +493 + gdt_cut +-> + gdt +-> + gd_ty +) == 0 + +500 if( + gdt_li +) + +501 +node_s_ +( +dt_li +); + +504 +fshp_touch +(& +d +-> +_ +, +TOUCH_ATIME +, +mtime +); + +507 + gr +; + +511 +r_t + + +512 + gtfs_m_lookup + + +514 +iour + * + gur +, + +515 +node + * + gd +, + +516 * + gme +, + +517 +node + ** + gnode + + +520 +LOG_MSG +("tfs_m_lookup: '%s'", +me +); + +522 +r_t + + gr + = 0; + +525 if( +rcmp +( +me +, ".") == 0) + +528 +tfs_ef +( +d +); + +529 * + gnode + = +d +; + +535 if( +rcmp +( +me +, "..") == 0) + +538 if( +d +-> + +-> +ode +->dir) + +541 +as +( +d +-> + +-> +ode +->d-> +node +); + +544 + gr + = +nche_node_lookup +( +d +-> + +-> +ode +->d, +node +); + +550 + gr + = +ENOENT +; + +551 * + gnode + = +NULL +; + +555 +mux_uock +(& +d +-> +lock +); + +558 + gr +; + +563 + gcheck_ݔty + + +565 cڡ * + gme + + +569 if(! + gݔty +) + +574 + gm_s_cou + = 0; + +577 * + goccu + = +rr +( +ݔty +, +PROPERTY_PARAM +); + +580 ; + goccu +; + +581 + goccu + = +rr +( +occu + + 1, +PROPERTY_PARAM +), + +582 ++ + gm_s_cou +); + +585 +size_t + + gݔty_m_n + = + +( +PROPERTY_PARAM +); + +588 +size_t + + gݔty_n + = ( +ݔty +? ( + +(property)) : (0); + +591 + gr + = 0; + +594 +size_t + + gfu_me_n + = + +( +d +-> + +-> +ode +-> +th ++ 1 + sn( +me +) + 1; + +597 * + gfu_me + = +mloc +( +fu_me_n +); + +598 if(! + gfu_me +) + +600 + gr + = +ENOMEM +; + +605 + gfu_me +[0] = 0; + +608 +ry +( +fu_me +, +d +-> + +-> +ode +-> +th +); + +609 +rt +( +fu_me +, "/"); + +610 +rt +( +fu_me +, +me +); + +612 +LOG_MSG +("tfs_m_lookup: Alyg ft%s...", +fu_me +); + +615 +size_t + + gsz + = +ݔty_n + + ( + +( +fu_me +- +ݔty_m_n +) + +616 * +m_s_cou +; + +619 * + gcmd + = +mloc +( +sz +); + +620 if(! + gcmd +) + +622 + +( +fu_me +); + +623 + gr + = +ENOMEM +; + +628 + gcmd +[0] = 0; + +631 * + gp + = +rr +( +ݔty +, +PROPERTY_PARAM +); + +634 * + gp + = +ݔty +; + +637 ; + gp +; = +rr +( +p +, +PROPERTY_PARAM +)) + +640 +t +( +cmd +, +p +, +p + -ropp); + +643 +rt +( +cmd +, +fu_me +); + +648 + gp + = +p + + +ݔty_m_n +; + +654 +rt +( +cmd +, +p +); + +659 + gxcode + = +WEXITSTATUS +( +syem +( +cmd +)); + +662 + gxcode +; + +666 if( +check_ݔty +( +me +) != 0) + +669 +mux_uock +(& +d +-> +lock +); + +672 + gENOENT +; + +676 +mach_pt_t + + gp + = +fe_me_lookup_und +( +d +-> + +-> +pt +, +me +, 0, 0); + +679 if( + gp + = +MACH_PORT_NULL +) + +682 +mux_uock +(& +d +-> +lock +); + +685 + gENOENT +; + +689 +io_buf_t + + g +; + +690 + gr + = +io_ +( +p +, & + +); + +693 +PORT_DEALLOC +( +p +); + +696 if( + gr + || ! +S_ISDIR +( + +. +_mode +)) + +699 + gp + = +MACH_PORT_NULL +; + +704 + gp + = +fe_me_lookup_und +( +d +-> + +-> +pt +, +me +, +O_READ + | +O_DIRECTORY +, 0); + +705 if( + gp + = +MACH_PORT_NULL +) + +707 +EBADF +; + +712 +ode_t + * + gode +; + +716 +fize +() + +719 if( + gr +) + +722 * + gnode + = +NULL +; + +725 if( + gp + ! +MACH_PORT_NULL +) + +726 +PORT_DEALLOC +( +p +); + +729 if(* + gnode +) + +732 +mux_uock +(&(* +node +)-> +lock +); + +735 +nche_node_add +(* +node +); + +739 +mux_uock +(& +d +-> + +-> +ode +-> +lock +); + +740 +mux_uock +(& +d +-> +lock +); + +744 + gr + = +ode_g +( +d +-> + +-> +ode +, +me +, &lnode); + +747 if( + gr + = +ENOENT +) + +750 +r + = +ode_ +( +me +, & +ode +); + +751 if( + gr +) + +753 +fize +(); + +754 + gr +; + +758 +ode_l +( +d +-> + +-> +ode +,node); + +762 + gr + = +nche_node_lookup +( +ode +, +node +); + +765 +ode_f_move +( +ode +); + +768 if( + gr +) + +771 +fize +(); + +772 + gr +; + +776 (* + gnode +)-> + g +-> + gpt + = +p +; + +779 + gr + = +ode_th_cڡru +( +ode +, +NULL +); + +780 if( + gr +) + +782 +fize +(); + +783 + gr +; + +787 (* + gnode +)-> + g +-> + gags + = +FLAG_NODE_ULFS_UPTODATE +; + +790 +fize +(); + +791 + gr +; + +795 +r_t + + +796 + gtfs_m_uƚk + + +798 +iour + * + gur +, + +799 +node + * + gd +, + +800 * + gme + + +803 +LOG_MSG +("netfs_attempt_unlink"); + +809 +r_t + + +810 + gtfs_m_me + + +812 +iour + * + gur +, + +813 +node + * + gomd +, + +814 * + gomme +, + +815 +node + * + gtod +, + +816 * + gtame +, + +817 + gex + + +820 +LOG_MSG +("netfs_attempt_rename"); + +823 + gEOPNOTSUPP +; + +827 +r_t + + +828 + gtfs_m_mkd + + +830 +iour + * + gur +, + +831 +node + * + gd +, + +832 * + gme +, + +833 +mode_t + + gmode + + +836 +LOG_MSG +("netfs_attempt_mkdir"); + +842 +r_t + + +843 + gtfs_m_rmd + + +845 +iour + * + gur +, + +846 +node + * + gd +, + +847 * + gme + + +850 +LOG_MSG +("netfs_attempt_rmdir"); + +856 +r_t + + +857 + gtfs_m_chown + + +859 +iour + * + ged +, + +860 +node + * + gnode +, + +861 +uid_t + + guid +, + +862 +uid_t + + ggid + + +865 +LOG_MSG +("netfs_attempt_chown"); + +868 + gEOPNOTSUPP +; + +872 +r_t + + +873 + gtfs_m_chauth + + +875 +iour + * + ged +, + +876 +node + * + gnode +, + +877 +uid_t + + gauth + + +880 +LOG_MSG +("netfs_attempt_chauthor"); + +883 + gEOPNOTSUPP +; + +887 +r_t + + +888 + gtfs_m_chmod + + +890 +iour + * + gur +, + +891 +node + * + gnode +, + +892 +mode_t + + gmode + + +895 +LOG_MSG +("netfs_attempt_chmod"); + +898 + gEOPNOTSUPP +; + +902 +r_t + + +903 + gtfs_m_mksymlk + + +905 +iour + * + ged +, + +906 +node + * + gnode +, + +907 * + gme + + +910 +LOG_MSG +("netfs_attempt_mksymlink"); + +913 + gEOPNOTSUPP +; + +917 +r_t + + +918 + gtfs_m_mkdev + + +920 +iour + * + ged +, + +921 +node + * + gnode +, + +922 +mode_t + + gty +, + +923 +dev_t + + gdexes + + +926 +LOG_MSG +("netfs_attempt_mkdev"); + +929 + gEOPNOTSUPP +; + +933 +r_t + + +934 + gtfs_t_ + + +936 +iour + * + ged +, + +937 +node + * + gnode +, + +938 * + ggz +, + +939 +size_t + + ggn + + +942 +LOG_MSG +("netfs_set_translator"); + +945 + gEOPNOTSUPP +; + +949 +r_t + + +950 + gtfs_m_chags + + +952 +iour + * + ged +, + +953 +node + * + gnode +, + +954 + gags + + +957 +LOG_MSG +("netfs_attempt_chflags"); + +960 + gEOPNOTSUPP +; + +964 +r_t + + +965 + gtfs_m_t_size + + +967 +iour + * + ged +, + +968 +node + * + gnode +, + +969 +loff_t + + gsize + + +972 +LOG_MSG +("netfs_attempt_set_size"); + +975 + gEOPNOTSUPP +; + +979 +r_t + + +980 + gtfs_m_fs + + +982 +iour + * + ged +, + +983 +node + * + gnode +, + +984 +fsys_fsbuf_t + * + g + + +987 +LOG_MSG +("netfs_attempt_statfs"); + +990 + gEOPNOTSUPP +; + +994 +r_t + + +995 + gtfs_m_syncfs + + +997 +iour + * + ged +, + +998 + gwa + + +1001 +LOG_MSG +("netfs_attempt_syncfs"); + +1008 +r_t + + +1009 + gtfs_m_lk + + +1011 +iour + * + gur +, + +1012 +node + * + gd +, + +1013 +node + * + gfe +, + +1014 * + gme +, + +1015 + gex + + +1018 +LOG_MSG +("netfs_attempt_link"); + +1021 + gEOPNOTSUPP +; + +1025 +r_t + + +1026 + gtfs_m_mkfe + + +1028 +iour + * + gur +, + +1029 +node + * + gd +, + +1030 +mode_t + + gmode +, + +1031 +node + ** + gnode + + +1034 +LOG_MSG +("netfs_attempt_mkfile"); + +1037 +mux_uock +(& +d +-> +lock +); + +1040 + gEOPNOTSUPP +; + +1044 +r_t + + +1045 + gtfs_m_adlk + + +1047 +iour + * + gur +, + +1048 +node + * + gnode +, + +1049 * + gbuf + + +1052 +LOG_MSG +("netfs_attempt_readlink"); + +1055 + gEOPNOTSUPP +; + +1059 +r_t + + +1060 + gtfs_m_ad + + +1062 +iour + * + ged +, + +1063 +node + * + g +, + +1064 +loff_t + + gofft +, + +1065 +size_t + * + gn +, + +1066 * + gda + + +1069 +LOG_MSG +("netfs_attempt_read"); + +1071 +r_t + + gr + = 0; + +1074 if( + g +-> + g +-> + gpt + = +MACH_PORT_NULL +) + +1077 +node_t + * +d +; + +1080 + gr + = +nche_node_lookup +( + +-> + +-> +ode +-> +d +, & +d +); + +1083 +as +(! +r +); + +1086 +mach_pt_t + + gp + = +fe_me_lookup_und + + +1087 ( +d +-> + +-> +pt +, + g +-> + g +-> + gode +-> + gme +, + gO_READ +, 0); + +1090 +tfs_ut +( +d +); + +1092 if(! + gp +) + +1093 + gEBADF +; + +1096 + g +-> + g +-> + gpt + = +p +; + +1100 + gr + = +io_ad +( + +-> + +-> +pt +, (**)& +da +, +n +, +offt +, *len); + +1103 + gr +; + +1107 +r_t + + +1108 + gtfs_m_wre + + +1110 +iour + * + ged +, + +1111 +node + * + gnode +, + +1112 +loff_t + + gofft +, + +1113 +size_t + * + gn +, + +1114 * + gda + + +1117 +LOG_MSG +("netfs_attempt_write"); + +1124 + gtfs_node_nefs + + +1126 +node + * + g + + +1130 +node_deroy +( + +); + +1135 + gma + + +1137 + ggc +, + +1138 ** + ggv + + +1142 +INIT_LOG +(); + +1143 +LOG_MSG +(">> Starting initialization..."); + +1146 +mach_pt_t + + gbo١p_pt +; + +1148 +r_t + + gr + = 0; + +1151 +gp_r +(& +gp_tup +, +gc +, +gv +, +ARGP_IN_ORDER +, 0, 0); + +1152 +LOG_MSG +("Commandinergumentsarsed."); + +1155 + gr + = +node__ro +(& +tfs_ro_node +); + +1156 if( + gr +) + +1157 +r +( +EXIT_FAILURE +, +r +, "Failedo createheootode"); + +1158 +LOG_MSG +("Rootode created."); + +1161 +sk_g_bo١p_pt +( +mach_sk_lf +(), & +bo١p_pt +); + +1164 +tfs_ +(); + +1167 + gundlyg_node + = +tfs_tup +( +bo١p_pt +, +O_READ +); + +1168 +LOG_MSG +("netfs initialization complete."); + +1171 + gr + = +node__ro +( +tfs_ro_node +); + +1172 if( + gr +) + +1173 +r +( +EXIT_FAILURE +, +r +, "Failedo initializeheootode"); + +1174 +LOG_MSG +("Rootode initialized."); + +1175 +LOG_MSG +("\tRoقodaddss: 0x%lX", () +tfs_ro_node +); + +1178 + gr + = +mtime_m +(0, 0, & +mtime +); + +1179 if( + gr +) + +1180 +r +( +EXIT_FAILURE +, +r +, "Failedo mapheime"); + +1181 +LOG_MSG +("Time mapped."); + +1184 +nche_ +( +nche_size +); + +1185 +LOG_MSG +("Cache initialized."); + +1188 + gr + = +io_ +( +undlyg_node +, & +undlyg_node_ +); + +1189 if( + gr +) + +1190 +r +( +EXIT_FAILURE +, +r +, + +1192 +LOG_MSG +("Stat information for undelyingode obtained."); + +1195 + gfsid + = +gpid +(); + +1198 + gtfs_ro_node +-> + g_ + = +undlyg_node_ +; + +1200 + gtfs_ro_node +-> + g_ +. + g_o + = +FILTERFS_ROOT_INODE +; + +1201 + gtfs_ro_node +-> + g_ +. + g_fsid + = +fsid +; + +1202 + gtfs_ro_node +-> + g_ +. + g_mode + = +S_IFDIR + | ( +undlyg_node_ +. +_mode + + +1203 & ~ +S_IFMT + & ~ +S_ITRANS +); + +1205 + gtfs_ro_node +-> + g_ed + = +tfs_ro_node +-> +_ +. +_mode +; + +1209 if(! +S_ISDIR +( +undlyg_node_ +. +_mode +)) + +1212 if( + gundlyg_node_ +. + g_mode + & + gS_IRUSR +) + +1214 + gtfs_ro_node +-> + g_ +. + g_mode + | +S_IXUSR +; + +1216 if( + gundlyg_node_ +. + g_mode + & + gS_IRGRP +) + +1218 + gtfs_ro_node +-> + g_ +. + g_mode + | +S_IXGRP +; + +1220 if( + gundlyg_node_ +. + g_mode + & + gS_IROTH +) + +1222 + gtfs_ro_node +-> + g_ +. + g_mode + | +S_IXOTH +; + +1226 + gfshp_touch + + +1227 (& + gtfs_ro_node +-> + g_ +, + gTOUCH_ATIME + | + gTOUCH_MTIME + | + gTOUCH_CTIME +, + +1228 + gmtime +); + +1230 +LOG_MSG +(">> Initialization complete. Enteringetfs serveroop..."); + +1234 +tfs_rv_lo +(); + + @filterfs.h + +26 #ide +__FILTERFS_H__ + + +27 + #__FILTERFS_H__ + + + ) + +29 + ~<ddef.h +> + +30 + ~<dlib.h +> + +31 + ~<hads.h +> + +32 + ~<unid.h +> + +33 + ~<sys/mm.h +> + +34 + ~<sys/tys.h +> + +35 + ~<sys/.h +> + +36 + ~<sys/fs.h +> + +37 + ~<sys/time.h +> + +38 + ~<hurd/ihash.h +> + +39 + ~<hurd/iohp.h +> + +41 + ~"lib.h +" + +42 + ~"node.h +" + +48 + #FILTERFS_ROOT_INODE + 1 + + ) + +55
vީ +md_time_vue + * +mtime +; + +58
+mach_pt_t + +undlyg_node +; + +61
+io_buf_t + +undlyg_node_ +; + +67 + sfrfs_d_y + + +69 * + mme +; + +70 +size_t + + mhv +; + +72 +node + * + mnode +; + +75 + + + m +; + +77 * + msymlk_rg +; + +79 +time_t + + m_timeamp +; + +82 +frfs_d + * + md +; + +88 +frfs_d_y + * + mxt +, ** + mlf_p +; + +92 +frfs_d_y + * + mded_xt +, ** + mded_lf_p +; + +95 +time_t + + mme_timeamp +; + +98 +hurd_ihash_lo_t + + mode_lo +; + +101 + mn + : 1; + +104 + mvid + : 1; + +108 + sfrfs_d + + +111 +size_t + + mnum_s +; + +116 +size_t + + mnum_live_s +; + +119 +frfs_d_y + ** + mhb +; + +120 +size_t + + mhb_n +; + +126 +frfs_d_y + * + mded +; + +129 +node + * + mnode +; + +132 +frfs + * + mfs +; + +135 +time_t + + mme_timeamp +; + +138 +hurd_ihash_lo_t + + mode_lo +; + +145 +time_t + + mbuld__ba_amp +; + +149 + mbulk__cou_f_hf +; + +154 + mbulk__cou_cd_hf +; + +158 + sfrfs + + +161 +node + * + mro +; + +165 +o_t + + mxt_ode +; + +168 + mfsid +; + +171 +hurd_ihash + + mode_mpgs +; + +174 +_lock_t + + mode_mpgs_lock +; + +181 +r_t + + +182 + gtfs_m__fe + + +184 +iour + * + gur +, + +185 +node + * + gd +, + +186 * + gme +, + +187 +mode_t + + gmode +, + +188 +node + ** + gnode + + +193 +r_t + + +194 + gtfs_check_ݒ_rmissis + + +196 +iour + * + gur +, + +197 +node + * + g +, + +198 + gags +, + +199 + gwnode + + +203 +r_t + + +204 + gtfs_m_utimes + + +206 +iour + * + ged +, + +207 +node + * + gnode +, + +208 +timeec + * + gime +, + +209 +timeec + * + gmtime + + +213 +r_t + + +214 + gtfs_pt_acss + + +216 +iour + * + ged +, + +217 +node + * + g +, + +218 * + gtys + + +222 +r_t + + +223 + gtfs_vide_ + + +225 +node + * + g +, + +226 +iour + * + ged + + +230 +r_t + + +231 + gtfs_m_sync + + +233 +iour + * + ged +, + +234 +node + * + gnode +, + +235 + gwa + + +239 +r_t + + +240 + gtfs_g_dts + + +242 +iour + * + ged +, + +243 +node + * + gd +, + +244 + gf_y +, + +245 + gnum_s +, + +246 ** + gda +, + +247 +mach_msg_ty_numb_t + * + gda_n +, + +248 +vm_size_t + + gmax_da_n +, + +249 * + gda_s + + +253 +r_t + + +254 + gtfs_m_lookup + + +256 +iour + * + gur +, + +257 +node + * + gd +, + +258 * + gme +, + +259 +node + ** + gnode + + +263 +r_t + + +264 + gtfs_m_uƚk + + +266 +iour + * + gur +, + +267 +node + * + gd +, + +268 * + gme + + +272 +r_t + + +273 + gtfs_m_me + + +275 +iour + * + gur +, + +276 +node + * + gomd +, + +277 * + gomme +, + +278 +node + * + gtod +, + +279 * + gtame +, + +280 + gex + + +284 +r_t + + +285 + gtfs_m_mkd + + +287 +iour + * + gur +, + +288 +node + * + gd +, + +289 * + gme +, + +290 +mode_t + + gmode + + +294 +r_t + + +295 + gtfs_m_rmd + + +297 +iour + * + gur +, + +298 +node + * + gd +, + +299 * + gme + + +303 +r_t + + +304 + gtfs_m_chown + + +306 +iour + * + ged +, + +307 +node + * + gnode +, + +308 +uid_t + + guid +, + +309 +uid_t + + ggid + + +313 +r_t + + +314 + gtfs_m_chauth + + +316 +iour + * + ged +, + +317 +node + * + gnode +, + +318 +uid_t + + gauth + + +322 +r_t + + +323 + gtfs_m_chmod + + +325 +iour + * + gur +, + +326 +node + * + gnode +, + +327 +mode_t + + gmode + + +331 +r_t + + +332 + gtfs_m_mksymlk + + +334 +iour + * + ged +, + +335 +node + * + gnode +, + +336 * + gme + + +340 +r_t + + +341 + gtfs_m_mkdev + + +343 +iour + * + ged +, + +344 +node + * + gnode +, + +345 +mode_t + + gty +, + +346 +dev_t + + gdexes + + +350 +r_t + + +351 + gtfs_t_ + + +353 +iour + * + ged +, + +354 +node + * + gnode +, + +355 * + ggz +, + +356 +size_t + + ggn + + +360 +r_t + + +361 + gtfs_m_chags + + +363 +iour + * + ged +, + +364 +node + * + gnode +, + +365 + gags + + +369 +r_t + + +370 + gtfs_m_t_size + + +372 +iour + * + ged +, + +373 +node + * + gnode +, + +374 +loff_t + + gsize + + +378 +r_t + + +379 + gtfs_m_fs + + +381 +iour + * + ged +, + +382 +node + * + gnode +, + +383 +fsys_fsbuf_t + * + g + + +387 +r_t + + +388 + gtfs_m_syncfs + + +390 +iour + * + ged +, + +391 + gwa + + +395 +r_t + + +396 + gtfs_m_lk + + +398 +iour + * + gur +, + +399 +node + * + gd +, + +400 +node + * + gfe +, + +401 * + gme +, + +402 + gex + + +406 +r_t + + +407 + gtfs_m_mkfe + + +409 +iour + * + gur +, + +410 +node + * + gd +, + +411 +mode_t + + gmode +, + +412 +node + ** + gnode + + +416 +r_t + + +417 + gtfs_m_adlk + + +419 +iour + * + gur +, + +420 +node + * + gnode +, + +421 * + gbuf + + +425 +r_t + + +426 + gtfs_m_ad + + +428 +iour + * + ged +, + +429 +node + * + g +, + +430 +loff_t + + gofft +, + +431 +size_t + * + gn +, + +432 * + gda + + +436 +r_t + + +437 + gtfs_m_wre + + +439 +iour + * + ged +, + +440 +node + * + gnode +, + +441 +loff_t + + gofft +, + +442 +size_t + * + gn +, + +443 * + gda + + +448 + gtfs_node_nefs + + +450 +node + * + g + + + @lib.c + +28 + #_GNU_SOURCE + 1 + + ) + +30 + ~<sys/mm.h +> + +32 + ~"lib.h +" + +33 + ~"debug.h +" + +39 +r_t + + +40 + gd_s_g + + +42 +fe_t + + gd +, + +43 ** + gdt_da +, + +45 +size_t + * + gdt_da_size +, + +46 +dt + *** + gdt_li + + +50 +r_t + + gr + = 0; + +53 * + gda +; + +56 +size_t + + gda_size +; + +59 + gs_num +; + +62 + gr + = +d_add +( +d +, & +da +, & +da_size +, 0, -1, 0, & +s_num +); + +63 if( + gr +) + +64 + gr +; + +67 +dt + ** + gli +; + +71 + gli + = +mloc +(( +dt + ** ( +s_num + + 1)); + +74 if(! + gli +) + +77 +munm +( +da +, +da_size +); + +80 + gENOMEM +; + +84 +dt + * + gdp +; + +86 + gi +; + +91 + gi + = 0, + gdp + = ( +dt + *) +da +; + +92 + gi + < + gs_num +; + +93 ++ + gi +, + gdp + = ( +dt + *)((*) +dp + + dp-> +d_ +)) + +95 *( +li + + +i + +dp +; + +98 *( + gli + + + gi + +NULL +; + +101 * + gdt_da + = +da +; + +102 * + gdt_da_size + = +da_size +; + +103 * + gdt_li + = +li +; + +106 + gr +; + +110 +r_t + + +111 + gfe_lookup + + +113 +fe_t + + gd +, + +114 * + gme +, + +115 + gags0 +, + +116 + gags1 +, + +117 + gmode +, + +118 +fe_t + * + gpt +, + +119 +io_buf_t + * + g + + +122 +r_t + + gr + = 0; + +125 +fe_t + + gp +; + +128 +io_buf_t + + gs +; + +131 +fe_t + + +132 + gdo_fe_lookup + + +134 +fe_t + + gd +, + +135 * + gme +, + +136 + gags +, + +137 + gmode + + +141 +fe_t + + gp +; + +144 if( + gd + ! +MACH_PORT_NULL +) + +146 +p + = +fe_me_lookup_und +( +d +, +me +, +ags +, +mode +); + +149 + gp + = +fe_me_lookup +( +me +, +ags +, +mode +); + +152 + gp +; + +156 + gp + = +do_fe_lookup +( +d +, +me +, +ags0 +, +mode +); + +159 if( + gp + = +MACH_PORT_NULL +) + +161 +p + = +do_fe_lookup +( +d +, +me +, +ags1 +, +mode +); + +164 if( + gp + ! +MACH_PORT_NULL +) + +167 if( + +) + +170 +r + = +io_ +( +p +, & +s +); + +171 if( + gr +) + +172 +PORT_DEALLOC +( +p +); + +177 + gr + = +o +; + +180 if(! + gr +) + +183 * + gpt + = +p +; + +186 if( + g +) + +187 * + g + = +s +; + +191 + gr +; + + @lib.h + +26 #ide +__LIB_H__ + + +27 + #__LIB_H__ + + + ) + +30 + #__USE_FILE_OFFSET64 + + + ) + +32 + ~<hurd.h +> + +33 + ~<dt.h +> + +34 + ~<ddef.h +> + +40 + #DIRENT_ALIGN + 4 + + ) + +43 + #DIRENT_NAME_OFFS + + `offtof +( +dt +, +d_me +) + + ) + +47 + #DIRENT_LEN +( +me_n +)\ + +48 (( +DIRENT_NAME_OFFS + + ( +me_n ++ 1 + +DIRENT_ALIGN + - 1) &\ + +49 ~( +DIRENT_ALIGN + - 1)) + + ) + +52 + #PORT_DEALLOC +( +p +( + `mach_pt_do +( + `mach_sk_lf +(), (p))) + + ) + +58 +r_t + + +59 + gd_s_g + + +61 +fe_t + + gd +, + +62 ** + gdt_da +, + +64 +size_t + * + gdt_da_size +, + +65 +dt + *** + gdt_li + + +70 +r_t + + +71 + gfe_lookup + + +73 +fe_t + + gd +, + +74 * + gme +, + +75 + gags0 +, + +76 + gags1 +, + +77 + gmode +, + +78 +fe_t + * + gpt +, + +79 +io_buf_t + * + g + + + @lnode.c + +28 + #_GNU_SOURCE + + + ) + +30 + ~"ode.h +" + +31 + ~"debug.h +" + +38 + gode_f_add + + +40 +ode_t + * + gnode + + +44 ++ + gnode +-> + gns +; + +50 + gode_f_move + + +52 +ode_t + * + gnode + + +56 +as +( +node +-> +ns +); + +59 -- + gnode +-> + gns +; + +62 if( + gnode +-> + gns + == 0) + +65 +ode_unl +( +node +); + +66 +ode_deroy +( +node +); + +70 +mux_uock +(& +node +-> +lock +); + +75 +r_t + + +76 + gode_ + + +78 * + gme +, + +79 +ode_t + ** + gnode + + +83 +ode_t + * + gnode_w + = +mloc +((lnode_t)); + +86 if(! + gnode_w +) + +89 + gENOMEM +; + +93 * + gme_ + = +NULL +; + +96 if( + gme +) + +99 + gme_ + = +rdup +( +me +); + +102 if(! + gme_ +) + +105 + +( +node_w +); + +108 + gENOMEM +; + +113 +memt +( +node_w +, 0, ( +ode_t +)); + +114 + gnode_w +-> + gme + = +me_ +; + +115 + gnode_w +-> + gme_n + = ( +me_ +? ( + +(name_cp)) : (0); + +118 + gnode_w +-> + gns + = 1; + +121 +mux_ +(& +node_w +-> +lock +); + +122 +mux_lock +(& +node_w +-> +lock +); + +125 * + gnode + = +node_w +; + +133 + gode_deroy + + +135 +ode_t + * + gnode + + +139 + +( +node +-> +me +); + +142 + +( +node +); + +147 +r_t + + +148 + gode_th_cڡru + + +150 +ode_t + * + gnode +, + +151 ** + gth + + +154 +r_t + + gr + = 0; + +157 * + gp +; + +160 + gp_n + = 0; + +163 +ode_t + * + gn +; + +166 + gn + = +node +; &&-> + gd +; = +n +-> +d +) + +172 +p_n + + +n +-> +me_n + + 1; + +176 + gp_n + + + +( +n +-> +th +) + 1; + +179 + gp + = +mloc +( +p_n + * ()); + +180 if(! + gp +) + +181 + gr + = +ENOMEM +; + +186 + gp +[-- +p_n +] = 0; + +189 + gn + = +node +; &&-> + gd +; = +n +-> +d +) + +192 +p_n + - +n +-> +me_n +; + +195 +y +( +p + + +p_n +, +n +-> +me +,-> +me_n +); + +202 + gp +[-- +p_n +] = '/'; + +207 +y +( +p +, +n +-> +th +, + +(n->path)); + +210 if( + gnode +-> + gth +) + +211 + +( +node +-> +th +); + +214 + gnode +-> + gth + = +p +; + +217 if( + gth +) + +218 * + gth + = +p +; + +222 + gr +; + +226 +r_t + + +227 + gode_g + + +229 +ode_t + * + gd +, + +230 * + gme +, + +231 +ode_t + ** + gnode + + +234 +r_t + + gr + = 0; + +237 +ode_t + * + gn +; + +240 + gn + = +d +-> +s +; && ( +rcmp +( +n +-> +me +,ame!0); =-> +xt +); + +243 if( + gn +) + +246 +mux_lock +(& +n +-> +lock +); + +249 +ode_f_add +( +n +); + +252 * + gnode + = +n +; + +255 + gr + = +ENOENT +; + +258 + gr +; + +264 + gode_l + + +266 +ode_t + * + gd +, + +267 +ode_t + * + gnode + + +271 + gnode +-> + gxt + = +d +-> +s +; + +272 + gnode +-> + gevp + = & +d +-> +s +; + +273 if( + gd +-> + gs +) + +274 + gd +-> + gs +-> + gevp + = & +node +-> +xt +; + +276 + gd +-> + gs + = +node +; + +279 +ode_f_add +( +d +); + +282 + gnode +-> + gd + = +d +; + +288 + gode_unl + + +290 +ode_t + * + gnode + + +294 +ode_f_move +( +node +-> +d +); + +298 * + gnode +-> + gevp + = +node +-> +xt +; + +302 if( + gnode +-> + gxt +) + +303 + gnode +-> + gxt +-> + gevp + = & +node +-> +xt +; + + @lnode.h + +26 #ide +__LNODE_H__ + + +27 + #__LNODE_H__ + + + ) + +30 + ~<r.h +> + +31 + ~<hurd/tfs.h +> + +36 +node + + tnode_t +; + +39 + sode + + +42 * + mme +; + +46 +size_t + + mme_n +; + +49 * + mth +; + +52 + mags +; + +55 + mns +; + +58 +node_t + * + mnode +; + +61 +ode + * + mxt +, ** + mevp +; + +64 +ode + * + md +; + +67 +ode + * + ms +; + +70 +mux + + mlock +; + +73 +ode + + tode_t +; + +80 + gode_f_add + + +82 +ode_t + * + gnode + + +88 + gode_f_move + + +90 +ode_t + * + gnode + + +95 +r_t + + +96 + gode_ + + +98 * + gme +, + +99 +ode_t + ** + gnode + + +104 + gode_deroy + + +106 +ode_t + * + gnode + + +111 +r_t + + +112 + gode_th_cڡru + + +114 +ode_t + * + gnode +, + +115 ** + gth + + +119 +r_t + + +120 + gode_g + + +122 +ode_t + * + gd +, + +123 * + gme +, + +124 +ode_t + ** + gnode + + +130 + gode_l + + +132 +ode_t + * + gd +, + +133 +ode_t + * + gnode + + +138 + gode_unl + + +140 +ode_t + * + gnode + + + @ncache.c + +28 + #_GNU_SOURCE + 1 + + ) + +30 + ~"nche.h +" + +36 +nche_t + + gnche +; + +39 + gnche_size + = +NCACHE_SIZE +; + +46 + gnche_ + + +48 + gsize_max + + +52 + gnche +. + gmru + = +nche +. +u + = +NULL +; + +55 + gnche +. + gsize_max + = +size_max +; + +58 + gnche +. + gsize_cut + = 0; + +61 +mux_ +(& +nche +. +lock +); + +66 +r_t + + +67 + gnche_node_lookup + + +69 +ode_t + * + gode +, + +70 +node_t + ** + gnode + + +73 +r_t + + gr + = 0; + +76 +node_t + * + gn + = +ode +-> +node +; + +79 if( + gn + ! +NULL +) + +82 +tfs_ef +( +n +); + +87 + gr + = +node_ +( +ode +, & +n +); + +91 if(! + gr +) + +94 +mux_lock +(& +n +-> +lock +); + +97 * + gnode + = +n +; + +101 + gr +; + +107 + gnche_node_move + + +109 +node_t + * + gnode + + +114 +Êode + * + g + = +node +-> + +; + +117 if( + g +-> + gnche_xt +) + +119 + g +-> + gnche_xt +->-> + gnche_ev + = + +-> +nche_ev +; + +121 if( + g +-> + gnche_ev +) + +123 + g +-> + gnche_ev +->-> + gnche_xt + = + +-> +nche_xt +; + +126 if( + gnche +. + gmru + = +node +) + +128 +nche +. +mru + = + +-> +nche_xt +; + +130 if( + gnche +. + gu + = +node +) + +132 +nche +. +u + = + +-> +nche_ev +; + +135 + g +-> + gnche_xt + = + +-> +nche_ev + = +NULL +; + +138 -- + gnche +. + gsize_cut +; + +143 + $nche_t +() + +146 +node_t + * +node +; + +149 + `mux_lock +(& +nche +. +lock +); + +152 +node + = +nche +. +mru +;od! +NULL +; + `nche_node_move +(node),ode =cache.mru); + +155 + `mux_uock +(& +nche +. +lock +); + +156 + } +} + +160 + gnche_node_add + + +162 +node_t + * + gnode + + +166 +mux_lock +(& +nche +. +lock +); + +169 if(( + gnche +. + gsize_max + > 0|| (nche. + gsize_cut + > 0)) + +172 if( + gnche +. + gmru + ! +node +) + +175 if(( +node +-> + +-> +nche_xt + ! +NULL +&& (node->-> +nche_ev + != NULL)) + +177 +nche_node_move +( +node +); + +180 +tfs_ef +( +node +); + +183 + gnode +-> + g +-> + gnche_xt + = +nche +. +mru +; + +184 + gnode +-> + g +-> + gnche_ev + = +NULL +; + +187 if( + gnche +. + gmru + ! +NULL +) + +188 +nche +. +mru +-> + +-> +nche_ev + = +node +; + +191 if( + gnche +. + gu + = +NULL +) + +192 +nche +. +u + = +node +; + +195 + gnche +. + gmru + = +node +; + +198 ++ + gnche +. + gsize_cut +; + +203 +node_t + * + gd_u +; + +206 + gd_u + = +nche +. +u +; + +207 + gnche +. + gsize_cut + >che. + gsize_max +; + +208 + gd_u + = +nche +. +u + + +212 +nche_node_move +( +d_u +); + +215 +tfs_Ėe +( +d_u +); + +219 +mux_uock +(& +nche +. +lock +); + + @ncache.h + +26 #ide +__NCACHE_H__ + + +27 + #__NCACHE_H__ + + + ) + +30 + ~<r.h +> + +31 + ~<hurd/tfs.h +> + +33 + ~"node.h +" + +39 + #NCACHE_SIZE + 256 + + ) + +44 + snche + + +47 +node_t + * + mmru +; + +50 +node_t + * + mu +; + +53 + msize_max +; + +56 + msize_cut +; + +59 +mux + + mlock +; + +62 +nche + + tnche_t +; + +68
+che_size +; + +75 + gnche_ + + +77 + gsize_max + + +82 +r_t + + +83 + gnche_node_lookup + + +85 +ode_t + * + gode +, + +86 +node_t + ** + gnode + + +91 +nche_t +(); + +95 + gnche_node_add + + +97 +node_t + * + gnode + + + @node.c + +28 + #_GNU_SOURCE + 1 + + ) + +30 + ~<dlib.h +> + +31 + ~<f.h +> + +32 + ~<sys/.h +> + +33 + ~<sys/mm.h +> + +34 + ~<dio.h +> + +36 + ~"debug.h +" + +37 + ~"node.h +" + +38 + ~"tis.h +" + +39 + ~"lib.h +" + +40 + ~"frfs.h +" + +46 +mux + + gulfs_lock + = +MUTEX_INITIALIZER +; + +52 +r_t + + +53 + gnode_ + + +55 +ode_t + * + gode +, + +56 +node_t + ** + gnode + + +59 +r_t + + gr + = 0; + +62 +Êode_t + * + gÊode_w + = +mloc +((netnode_t)); + +65 if( + gÊode_w + = +NULL +) + +66 +r + = +ENOMEM +; + +70 +node_t + * + gnode_w + = +tfs_make_node +( +Êode_w +); + +73 if( + gnode_w + = +NULL +) + +76 +r + = +ENOMEM +; + +79 + +( +Êode_w +); + +82 + gr +; + +86 + gode +-> + gnode + = +node_w +; + +87 +ode_f_add +( +ode +); + +90 + gnode_w +-> + g +-> + gode + = +ode +; + +91 + gnode_w +-> + g +-> + gags + = 0; + +92 + gnode_w +-> + g +-> + gnche_xt + = +node_w +-> + +-> +nche_ev + = +NULL +; + +95 * + gnode + = +node_w +; + +99 + gr +; + +105 + gnode_deroy + + +107 +node_t + * + g + + +111 +as +(! + +-> + +-> +nche_xt + || !->-> +nche_ev +); + +114 +PORT_DEALLOC +( + +-> + +-> +pt +); + +117 +mux_lock +(& + +-> + +-> +ode +-> +lock +); + +120 + g +-> + g +-> + gode +-> + gnode + = +NULL +; + +123 +ode_f_move +( + +-> + +-> +ode +); + +126 + +( + +-> + +); + +127 + +( + +); + +131 +r_t + + +132 + gnode__ro + + +134 +node_t + ** + gro_node + + +138 +ode_t + * + gode +; + +139 +r_t + + gr + = +ode_ +( +NULL +, & +ode +); + +142 if( + gr +) + +143 + gr +; + +146 +node_t + * + gnode +; + +147 + gr + = +node_ +( +ode +, & +node +); + +150 if( + gr +) + +153 +ode_deroy +( +ode +); + +156 + gr +; + +160 +mux_uock +(& +ode +-> +lock +); + +163 * + gro_node + = +node +; + +166 + gr +; + +170 +r_t + + +171 + gnode__ro + + +173 +node_t + * + gnode + + +176 +r_t + + gr + = 0; + +179 +mux_lock +(& +ulfs_lock +); + +182 + gnode +-> + g +-> + gpt + = +fe_me_lookup +( +d +, +O_READ + | +O_DIRECTORY +, 0); + +185 if( + gnode +-> + g +-> + gpt + = +MACH_PORT_NULL +) + +188 +r + = +o +; + +189 +LOG_MSG +("node__ro: Could othp܈f %s.", +d +); + +192 +mux_uock +(& +ulfs_lock +); + +193 + gr +; + +196 +LOG_MSG +("node__ro: P܈f %ݒed sucssfuy.", +d +); + +197 +LOG_MSG +("\tPt: 0x%lX", () +node +-> + +-> +pt +); + +200 + gr + = +io_ +( +node +-> + +-> +pt +, &node-> +_ +); + +201 if( + gr +) + +204 +PORT_DEALLOC +( +node +-> + +-> +pt +); + +206 +LOG_MSG +("node_init_root: Couldot statheootode."); + +209 +mux_uock +(& +ulfs_lock +); + +210 + gr +; + +214 + gnode +-> + g +-> + gode +-> + gth + = +rdup +( +d +); + +215 if(! + gnode +-> + g +-> + gode +-> + gth +) + +218 +PORT_DEALLOC +( +node +-> + +-> +pt +); + +221 +mux_uock +(& +ulfs_lock +); + +223 +LOG_MSG +("node_init_root: Couldot strduphe directory."); + +224 + gENOMEM +; + +228 * + gp + = +d + + + +(dir); + +231 ; + gp + > +d +; --p) + +234 if(* + gp + == '/') + +237 if( +p + > +d +) + +240 if(*( +p + - 1) == '\\') + +245 ++ + gp +; + +252 +LOG_MSG +("node__ro: Thmoroقodi%s.", +p +); + +255 + gnode +-> + g +-> + gode +-> + gme + = +rdup +( +p +); + +257 if(! + gnode +-> + g +-> + gode +-> + gme +) + +260 + +( +node +-> + +-> +ode +-> +th +); + +261 +PORT_DEALLOC +( +node +-> + +-> +pt +); + +264 +mux_uock +(& +ulfs_lock +); + +266 +LOG_MSG +("node_init_root: Couldot strdupheame ofheootode."); + +267 + gENOMEM +; + +271 + gnode +-> + g +-> + gode +-> + gme_n + = + +( +p +); + +274 +mux_uock +(& +ulfs_lock +); + +277 + gr +; + +282 + gnode_s_ + + +284 +node_dt_t + * + gdts + + +288 +node_dt_t + * + gdt +, * + gdt_xt +; + +291 + gdt + = +dts +; dt; d +dt_xt +) + +294 +dt_xt + = +dt +-> +xt +; + +297 + +( +dt +->dirent); + +300 + +( +dt +); + +305 +r_t + + +306 + gnode_s_g + + +308 +node_t + * + gnode +, + +309 +node_dt_t + ** + gdts + + +312 +r_t + + gr + = 0; + +315 * + gth_to_node + = +node +-> + +-> +ode +-> +th +; + +318 + gm_s_cou + = 0; + +321 +size_t + + gݔty_n + = ( +ݔty +? ( + +(property)) : (0); + +324 +size_t + + gݔty_m_n + = + +( +PROPERTY_PARAM +); + +327 * + gfu_me + = +NULL +, * + gcmd + = NULL; + +330 +size_t + + gfu_me_size + = 1, + gcmd_size + = 1; + +333 if( + gݔty_n + != 0) + +336 * +occu + = +rr +( +ݔty +, +PROPERTY_PARAM +); + +339 ; + goccu +; + +340 + goccu + = +rr +( +occu + + 1, +PROPERTY_PARAM +), + +341 ++ + gm_s_cou +); + +344 + gfu_me + = +mloc +( +fu_me_size + * +STRING_CHUNK +); + +345 if(! + gfu_me +) + +346 + gENOMEM +; + +348 + gcmd + = +mloc +( +cmd_size + * +STRING_CHUNK +); + +349 if(! + gcmd +) + +351 + +( +fu_me +); + +352 + gENOMEM +; + +357 +size_t + + gthn + = + +( +th_to_node +); + +362 + gcheck_ݔty + + +364 cڡ * + gme + + +368 if(! + gݔty +) + +373 + gr + = 0; + +376 +size_t + + gfu_me_n + = +thn + + 1 + + +( +me +) + 1; + +379 + gchunks + = +fu_me_size +; + +380 ; + gfu_me_n + > +chunks + * + gSTRING_CHUNK +; ++ + gchunks +); + +383 if( + gchunks + > + gfu_me_size +) + +386 + +( +fu_me +); + +389 + gfu_me + = +mloc +( +chunks + * +STRING_CHUNK +); + +390 if(! + gfu_me +) + +392 + gr + = +ENOMEM +; + +393 + +( +cmd +); + +398 + gfu_me_size + = +chunks +; + +402 + gfu_me +[0] = 0; + +405 +ry +( +fu_me +, +th_to_node +); + +406 +rt +( +fu_me +, "/"); + +407 +rt +( +fu_me +, +me +); + +412 +size_t + + gsz + = +ݔty_n + + ( + +( +fu_me +- +ݔty_m_n +) + +413 * +m_s_cou +; + +416 + gchunks + = +cmd_size +; + gsz + > +chunks + * + gSTRING_CHUNK +; ++chunks); + +419 if( + gchunks + > + gcmd_size +) + +422 + +( +cmd +); + +425 + gcmd + = +mloc +( +chunks + * +STRING_CHUNK +); + +426 if(! + gcmd +) + +428 + gr + = +ENOMEM +; + +429 + +( +fu_me +); + +435 + gcmd_size + = +chunks +; + +439 + gcmd +[0] = 0; + +442 * + gp + = +rr +( +ݔty +, +PROPERTY_PARAM +); + +445 * + gp + = +ݔty +; + +448 ; + gp +; = +rr +( +p +, +PROPERTY_PARAM +)) + +451 +t +( +cmd +, +p +, +p + -ropp); + +454 +rt +( +cmd +, +fu_me +); + +459 + gp + = +p + + +ݔty_m_n +; + +465 +rt +( +cmd +, +p +); + +470 + gxcode + = +WEXITSTATUS +( +syem +( +cmd +)); + +473 + gxcode +; + +477 +dt + ** + gdt_li +, ** + gdt +; + +480 +node_dt_t + * + gnode_dt_li + = +NULL +; + +483 +size_t + + gdt_da_size +; + +486 * + gdt_da +; + +489 + gr + = +d_s_g + + +490 ( +node +-> + +-> +pt +, & + gdt_da +, & + gdt_da_size +, & + gdt_li +); + +491 if( + gr +) + +493 + gr +; + +497 +node_dt_t + * + gnode_dt_w +; + +500 +dt + * + gdt_w +; + +505 * + gme +; + +508 +size_t + + gme_n +; + +511 +size_t + + gsize +; + +514 + ggood +; + +517 + gdt + = +dt_li +; *dirent; ++dirent) + +520 + gme + = &((* +dt +)-> +d_me +[0]); + +523 if(( +rcmp +( +me +, ".") == 0) || (strcmp(name, "..") == 0)) + +527 + ggood + = +check_ݔty +( +me +); + +528 if( + gr +) + +532 if( + ggood + != 0) + +536 + gme_n + = + +( +me +); + +539 + gsize + = +DIRENT_LEN +( +me_n +); + +542 + gnode_dt_w + = +mloc +(( +node_dt_t +)); + +543 if(! + gnode_dt_w +) + +545 + gr + = +ENOMEM +; + +550 + gdt_w + = +mloc +( +size +); + +551 if(! + gdt_w +) + +553 + +( +node_dt_w +); + +554 + gr + = +ENOMEM +; + +559 + gdt_w +-> + gd_o + = (* +dt +)-> +d_o +; + +560 + gdt_w +-> + gd_ty + = (* +dt +)-> +d_ty +; + +561 + gdt_w +-> + gd_ + = +size +; + +562 +ry +((*) +dt_w + + +DIRENT_NAME_OFFS +, +me +); + +565 + gnode_dt_w +-> + gdt + = +dt_w +; + +566 + gnode_dt_w +-> + gxt + = +node_dt_li +; + +567 + gnode_dt_li + = +node_dt_w +; + +571 if( + gr +) + +573 +node_s_ +( +node_dt_li +); + +576 * + gdts + = +node_dt_li +; + +579 + +( +dt_li +); + +582 +munm +( +dt_da +, +dt_da_size +); + +585 if( + gfu_me +) + +586 + +( +fu_me +); + +587 if( + gcmd +) + +588 + +( +cmd +); + +591 + gr +; + +596 +r_t + + +597 + gnode_upde + + +599 +node_t + * + gnode + + +602 +r_t + + gr + = 0; + +605 * + gth +; + +608 +io_buf_t + + g +; + +611 +fe_t + + gpt +; + +614 if( +NODE_IS_ROOT +( +node +|| ( + gnode +-> + g +-> + gags + & + gFLAG_NODE_ULFS_FIXED +)) + +616 + gr +; + +619 +mux_lock +(& +tfs_ro_node +-> +lock +); + +622 + gr + = +ode_th_cڡru +( +node +-> + +-> +ode +, & +th +); + +623 if( + gr +) + +625 +mux_uock +(& +tfs_ro_node +-> +lock +); + +626 + gr +; + +630 if( + gnode +-> + g +-> + gpt +) + +631 +PORT_DEALLOC +( +node +-> + +-> +pt +); + +634 + gr + = +fe_lookup + + +636 +tfs_ro_node +-> + +-> +pt +, + gth +, + gO_READ + | + gO_NOTRANS +, O_NOTRANS, + +637 0, & + gpt +, & + g + + +639 if( + gr +) + +641 + gnode +-> + g +-> + gpt + = +MACH_PORT_NULL +; + +642 + gr + = 0; + +643 + gr +; + +649 ( + g +. + g_o + = +undlyg_node_ +. +_o +) + +650 && ( + +. +_fsid + = +undlyg_node_ +.st_fsid) + +653 +r + = +ELOOP +; + +657 +PORT_DEALLOC +( +pt +); + +660 + gr + = +fe_lookup + + +661 ( +tfs_ro_node +-> + +-> +pt +, + gth +, + gO_READ +, 0, 0, & + gpt +, & + g +); + +665 if( + gr +) + +667 + gpt + = +MACH_PORT_NULL +; + +670 + gnode +-> + g +-> + gpt + = +pt +; + +674 + gnode +-> + g +-> + gags + &~ +FLAG_NODE_INVALIDATE +; + +675 + gnode +-> + g +-> + gags + | +FLAG_NODE_ULFS_UPTODATE +; + +678 +mux_uock +(& +tfs_ro_node +-> +lock +); + +681 + gr +; + +685 +r_t + + +686 + gnode_g_size + + +688 +node_t + * + gd +, + +689 +OFFSET_T + * + goff + + +692 +r_t + + gr + = 0; + +695 +size_t + + gsize + = 0; + +704 +node_dt_t + * + gdt_cut + = +NULL +; + +707 +node_dt_t + * + gdt_li + = +NULL +; + +714 + gbump_size + + +716 cڡ * + gme + + +720 + gsize + + +DIRENT_LEN +( + +( +me +)); + +727 + gr + = +node_s_g +( +d +, & +dt_li +); + +728 if( + gr +) + +729 + gr +; + +754 + gdt_cut + = +dt_li + ; dirent_current; + +755 + gdt_cut + = +dt_cut +-> +xt + + +757 +bump_size +( +dt_cut +-> +dt +-> +d_me +); + +760 +node_s_ +( +dt_li +); + +763 * + goff + = +size +; + +768 +r_t + + +769 + gnode_uƚk_fe + + +771 +node_t + * + gd +, + +772 * + gme + + +775 +r_t + + gr + = 0; + +778 +mach_pt_t + + gp +; + +781 +io_buf_t + + g +; + +784 if( + gd +-> + g +-> + gpt + = +MACH_PORT_NULL +) + +786 +ENOENT +; + +789 + gr + = +fe_lookup +( +d +-> + +-> +pt +, +me +, +O_NOTRANS +, O_NOTRANS, 0, & +p +, & + +); + +790 if( + gr +) + +791 + gr +; + +794 +PORT_DEALLOC +( +p +); + +797 + gr + = +d_uƚk +( +d +-> + +-> +pt +, +me +); + +798 if( + gr +) + +799 + gr +; + +801 + gr +; + + @node.h + +26 #ide +__NODE_H__ + + +27 + #__NODE_H__ + + + ) + +30 + ~<r.h +> + +31 + ~<sys/.h +> + +32 + ~<hurd/tfs.h +> + +34 + ~"ode.h +" + +40 + #NODE_IS_ROOT +( +n +(()-> + +-> +ode +-> +d +? (0: (1)) + + ) + +43 + #FLAG_NODE_ULFS_FIXED + 0x00000001 + + ) + +44 + #FLAG_NODE_INVALIDATE + 0x00000002 + + ) + +45 + #FLAG_NODE_ULFS_UPTODATE + 0x00000004 + + ) + +48 #ifde +__USE_FILE_OFFSET64 + + +49 + #OFFSET_T + +__off64_t + + + ) + +51 + #OFFSET_T + +__off_t + + + ) + +56 + #STRING_CHUNK + 256 + + ) + +61 + sÊode + + +64 +ode_t + * + mode +; + +67 + mags +; + +70 +fe_t + + mpt +; + +73 +node_t + * + mnche_ev +, * + mnche_xt +; + +76 +Êode + + tÊode_t +; + +79 + snode_dt + + +82 +dt + * + mdt +; + +85 +node_dt + * + mxt +; + +88 +node_dt + + tnode_dt_t +; + +94
+mux + +ulfs_lock +; + +100 +r_t + + +101 + gnode_ + + +103 +ode_t + * + gode +, + +104 +node_t + ** + gnode + + +110 + gnode_deroy + + +112 +node_t + * + g + + +116 +r_t + + +117 + gnode__ro + + +119 +node_t + ** + gro_node + + +123 +r_t + + +124 + gnode__ro + + +126 +node_t + * + gnode + + +131 + gnode_s_ + + +133 +node_dt_t + * + gdts + + +137 +r_t + + +138 + gnode_s_g + + +140 +node_t + * + gnode +, + +141 +node_dt_t + ** + gdts + + +146 +r_t + + +147 + gnode_upde + + +149 +node_t + * + gnode + + +153 +r_t + + +154 + gnode_g_size + + +156 +node_t + * + gd +, + +157 +OFFSET_T + * + goff + + +161 +r_t + + +162 + gnode_uƚk_fe + + +164 +node_t + * + gd +, + +165 * + gme + + + @options.c + +28 + #_GNU_SOURCE + 1 + + ) + +30 + ~<gp.h +> + +31 + ~<r.h +> + +33 + ~"debug.h +" + +34 + ~"tis.h +" + +35 + ~"nche.h +" + +36 + ~"node.h +" + +42 + #ARGS_DOC + "DIR" + + ) + +43 + #DOC + "ShowthcڋoDIR fdccdgPROPERTY.\ + DIR in scifd, ~/ iassumed." + + ) + +51 +r_t + + +52 + ggp_r_comm_tis + + +54 + gkey +, + +55 * + gg +, + +56 +gp_e + * + ge + + +61 +r_t + + +62 + ggp_r_tup_tis + + +64 + gkey +, + +65 * + gg +, + +66 +gp_e + * + ge + + +77 + grsg_tup_tis_fished +; + +80 cڡ +gp_ti + + ggp_comm_tis +[] = + +82 { +OPT_LONG_CACHE_SIZE +, +OPT_CACHE_SIZE +, "SIZE", 0, + +84 { +OPT_LONG_PROPERTY +, +OPT_PROPERTY +, "PROPERTY", 0, + +89 cڡ +gp_ti + + ggp_tup_tis +[] = + +95 cڡ +gp + + ggp_rr_comm_tis + = + +96 { +gp_comm_tis +, +gp_r_comm_tis +, 0, 0, 0}; + +99 cڡ +gp + + ggp_rr_tup_tis + = + +100 { +gp_tup_tis +, +gp_r_tup_tis +, 0, 0, 0}; + +103 cڡ +gp_chd + + ggp_chdn_ruime +[] = + +105 {& +gp_rr_comm_tis +}, + +106 {& +tfs_d_ruime_gp +}, + +111 cڡ +gp_chd + + ggp_chdn_tup +[] = + +113 {& +gp_rr_tup_tis +}, + +114 {& +gp_rr_comm_tis +}, + +115 {& +tfs_d_tup_gp +}, + +120 cڡ * + ggp_ogm_vsi + = "0.0"; + +123 +gp + + ggp_ruime + = + +124 {0, 0, 0, 0, +gp_chdn_ruime +}; + +127 +gp + + ggp_tup + = + +128 {0, 0, +ARGS_DOC +, +DOC +, +gp_chdn_tup +}; + +131 * + gݔty + = +NULL +; + +134 * + gd + = +NULL +; + +141 +r_t + + +142 + ggp_r_comm_tis + + +144 + gkey +, + +145 * + gg +, + +146 +gp_e + * + ge + + +149 +r_t + + gr + = 0; + +152 + gkey +) + +154 + gOPT_CACHE_SIZE +: + +157 +nche_size + = + +( +g +, +NULL +, 10); + +161 + gOPT_PROPERTY +: + +164 +ݔty + = +rdup +( +g +); + +165 if(! + gݔty +) + +166 +r +( +EXIT_FAILURE +, +ENOMEM +, "Couldot strdupheroperty"); + +170 + gARGP_KEY_ARG +: + +173 +d + = +rdup +( +g +); + +174 if(! + gd +) + +175 +r +( +EXIT_FAILURE +, +ENOMEM +, "argp_parse_common_options: " + +179 + gi + = + +( +d +) - 1; + +184 if(( + gd +[ +i +] == '/') && (i != 0)) + +186 +d +[ +i +] = 0; + +188 +LOG_MSG +("gp_r_comm_tis: Frghdey %s.", +d +); + +192 + gARGP_KEY_END +: + +195 if(! +rsg_tup_tis_fished +) + +198 +nche_t +(); + +201 if(! + gd +) + +207 + gd + = "/var/tmp"; + +211 + grsg_tup_tis_fished + = 1; + +222 +r + = +ARGP_ERR_UNKNOWN +; + +227 + gr +; + +232 +r_t + + +233 + ggp_r_tup_tis + + +235 + gkey +, + +236 * + gg +, + +237 +gp_e + * + ge + + +241 +r_t + + gr + = 0; + +243 + gkey +) + +247 +r + = +ARGP_ERR_UNKNOWN +; + +253 + gr +; + + @options.h + +26 #ide +__OPTIONS_H__ + + +27 + #__OPTIONS_H__ + + + ) + +32 + #OPT_CACHE_SIZE + 'c' + + ) + +34 + #OPT_PROPERTY + 'p' + + ) + +37 + #OPT_LONG_CACHE_SIZE + "che-size" + + ) + +38 + #OPT_LONG_PROPERTY + "ݔty" + + ) + +41 + #OPT_LONG +( +o +"--" + ) +o + +44 + #PROPERTY_PARAM + "{}" + + ) + +50
+gp + +gp_tup +; + +53
+gp + +gp_ruime +; + +56
+nche_size +; + +59
* +ݔty +; + +62
* +d +; + + @/usr/include/dirent.h + +58 #ide +_DIRENT_H_ + + +59 + #_DIRENT_H_ + + + ) + +65 + ~<_tys.h +> + +66 + ~<sys/dt.h +> + +68 + g_d +; + +72 + m__dd_fd +; + +73 + m__dd_loc +; + +74 + m__dd_size +; + +75 * + m__dd_buf +; + +76 + m__dd_n +; + +77 + m__dd_ek +; + +78 + m__dd_wd +; + +79 + m__dd_ags +; + +80 +__dw_had_mux_t + + m__dd_lock +; + +81 +_d + * + m__dd_td +; + +82 } + tDIR +; + +84 #i! +defed +( +_POSIX_C_SOURCE +|| defed( +_DARWIN_C_SOURCE +) + +86 + #DIRBLKSIZ + 1024 + + ) + +88 + #dfd +( +dp +((dp)-> +__dd_fd +) + + ) + +91 + #DTF_HIDEW + 0x0001 + + ) + +92 + #DTF_NODUP + 0x0002 + + ) + +93 + #DTF_REWIND + 0x0004 + + ) + +94 + #__DTF_READALL + 0x0008 + + ) + +98 #ide +KERNEL + + +100 + ~<sys/cdefs.h +> + +102 + g__BEGIN_DECLS + + +103 #i! +defed +( +_POSIX_C_SOURCE +|| defed( +_DARWIN_C_SOURCE +) + +104 + $phast +(cڡ *, cڡ * + `__DARWIN_INODE64 +( +phast +); + +106 + $od +( +DIR + * + `__DARWIN_ALIAS +( +od +); + +107 #i! + `defed +( +_POSIX_C_SOURCE +|| defed( +_DARWIN_C_SOURCE +) + +108 + `gds +(, *, , *); + +110 +DIR + * + $ݒd +(cڡ * + `__DARWIN_ALIAS_I +( +ݒd +); + +111 #i! + `defed +( +_POSIX_C_SOURCE +|| defed( +_DARWIN_C_SOURCE +) + +112 +DIR + * + $__ݒd2 +(cڡ *, + `__DARWIN_ALIAS_I +( +__ݒd2 +); + +114 +dt + * + $add +( +DIR + * + `__DARWIN_INODE64 +( +add +); + +115 + $add_r +( +DIR + *, +dt + *, d** + `__DARWIN_INODE64 +( +add_r +); + +116 + $wdd +( +DIR + * + `__DARWIN_ALIAS_I +( +wdd +); + +117 #i! + `defed +( +_POSIX_C_SOURCE +|| defed( +_DARWIN_C_SOURCE +) + +118 + `snd +(cڡ *, +dt + ***, + +119 (*)( +dt + *), (*)(cڡ *, cڡ *) + `__DARWIN_INODE64 +( +snd +); + +121 + $ekd +( +DIR + *, + `__DARWIN_ALIAS_I +( +ekd +); + +122 + $d +( +DIR + * + `__DARWIN_ALIAS_I +( +d +); + +123 +__END_DECLS + + + @/usr/include/fcntl.h + +23 + ~<sys/f.h +> + + @/usr/include/stddef.h + +61 #i! +defed +( +__STDDEF_H__ +) + +63 #i! +defed +( +__ed_wch_t +&& !defed( +__ed_size_t +) \ + +64 && ! +defed +( +__ed_rdiff_t +&& !defed( +__ed_NULL +) \ + +65 && ! + $defed +( +__ed_wt_t +) + +66 + #__STDDEF_H__ + + + ) + +69 + ~<_tys.h +> + +71 #i + `defed +( +__STDDEF_H__ +|| defed( +__ed_rdiff_t +) + +72 #ide +_PTRDIFF_T + + +73 + #_PTRDIFF_T + + + ) + +74 +__dw_rdiff_t + + trdiff_t +; + +78 #i + `defed +( +__STDDEF_H__ +|| defed( +__ed_size_t +) + +79 #idef +_SIZE_T + + +80 + #_SIZE_T + + + ) + +83 +__dw_size_t + + tsize_t +; + +87 #i + `defed +( +__STDDEF_H__ +|| defed( +__ed_wch_t +) + +88 #idef +__lulus + + +89 #idef +_WCHAR_T + + +90 + #_WCHAR_T + + + ) + +91 +__dw_wch_t + + twch_t +; + +96 #i( + `defed +( +__STDDEF_H__ +&& !defed( +_ANSI_SOURCE +&& (!defed( +_POSIX_C_SOURCE +|| defed( +_DARWIN_C_SOURCE +))) \ + +97 || + $defed +( +__ed_wt_t +) + +98 #idef +_WINT_T + + +99 + #_WINT_T + + + ) + +100 +__dw_wt_t + + twt_t +; + +104 #i + `defed +( +__STDDEF_H__ +|| defed( +__ed_NULL +) + +105 #ide +NULL + + +106 + #NULL + +__DARWIN_NULL + + + ) + +110 #ifde +__STDDEF_H__ + + +111 #i + `defed +( +__GNUC__ +&& (__GNUC__ =3 && +__GNUC_MINOR__ + >= 5 || __GNUC__ > 3) + +112 #ide +__offtof + + +113 + #__offtof +( +ty +, +fld + + `__but_offtof +y, fld) + + ) + +115 + #offtof +( +ty +, +fld + + `__but_offtof +y, fld) + + ) + +117 #ide +__offtof + + +118 + #__offtof +( +ty +, +fld +(( +size_t +)(&(y *)0)->fld)) + + ) + +120 + #offtof +( +ty +, +fld +(( +size_t +)(&(y *)0)->fld)) + + ) + +126 #unde +__ed_rdiff_t + + +127 #unde +__ed_size_t + + +128 #unde +__ed_wch_t + + +129 #unde +__ed_wt_t + + +130 #unde +__ed_NULL + + + @/usr/include/stdio.h + +61 #idef +_STDIO_H_ + + +62 + #_STDIO_H_ + + + ) + +64 + ~<_tys.h +> + +66 #ide +_VA_LIST + + +67 + #_VA_LIST + + + ) + +70 +__dw_va_li + + tva_li +; + +73 #idef +_OFF_T + + +74 + #_OFF_T + + + ) + +75 +__dw_off_t + + toff_t +; + +78 #idef +_SIZE_T + + +79 + #_SIZE_T + + + ) + +80 +__dw_size_t + + tsize_t +; + +83 #ide +NULL + + +84 + #NULL + +__DARWIN_NULL + + + ) + +87 +__dw_off_t + + tos_t +; + +89 + #_FSTDIO + + + ) + +98 + s__sbuf + { + +99 * + m_ba +; + +100 + m_size +; + +104 + g__sFILEX +; + +132 + s__sFILE + { + +133 * + m_p +; + +134 + m_r +; + +135 + m_w +; + +136 + m_ags +; + +137 + m_fe +; + +138 +__sbuf + + m_bf +; + +139 + m_lbfsize +; + +142 * + m_cook +; + +143 (* + m_o +)(*); + +144 (* + m_ad +) (*, *, ); + +145 +os_t + (* +_ek +(*, + mos_t +, ); + +146 (* + m_wre +)(*, const *, ); + +149 +__sbuf + + m_ub +; + +150 +__sFILEX + * + m_exa +; + +151 + m_ur +; + +154 + m_ubuf +[3]; + +155 + m_nbuf +[1]; + +158 +__sbuf + + m_lb +; + +161 + m_blksize +; + +162 +os_t + + m_offt +; + +163 } + tFILE +; + +165 + g__BEGIN_DECLS + + +166 #i +__DARWIN_UNIX03 + + +167
+FILE + * +__dp +; + +168
+FILE + * +__dou +; + +169
+FILE + * +__d +; + +171
+FILE + +__sF +[]; + +173 + g__END_DECLS + + +175 + #__SLBF + 0x0001 + + ) + +176 + #__SNBF + 0x0002 + + ) + +177 + #__SRD + 0x0004 + + ) + +178 + #__SWR + 0x0008 + + ) + +180 + #__SRW + 0x0010 + + ) + +181 + #__SEOF + 0x0020 + + ) + +182 + #__SERR + 0x0040 + + ) + +183 + #__SMBF + 0x0080 + + ) + +184 + #__SAPP + 0x0100 + + ) + +185 + #__SSTR + 0x0200 + + ) + +186 + #__SOPT + 0x0400 + + ) + +187 + #__SNPT + 0x0800 + + ) + +188 + #__SOFF + 0x1000 + + ) + +189 + #__SMOD + 0x2000 + + ) + +190 + #__SALC + 0x4000 + + ) + +191 + #__SIGN + 0x8000 + + ) + +202 + #_IOFBF + 0 + + ) + +203 + #_IOLBF + 1 + + ) + +204 + #_IONBF + 2 + + ) + +206 + #BUFSIZ + 1024 + + ) + +207 + #EOF + (-1) + + ) + +215 + #FOPEN_MAX + 20 + + ) + +216 + #FILENAME_MAX + 1024 + + ) + +219 #ide +_ANSI_SOURCE + + +220 + #P_tmpd + "/v/tmp/" + + ) + +222 + #L_tmam + 1024 + + ) + +223 + #TMP_MAX + 308915776 + + ) + +225 #ide +SEEK_SET + + +226 + #SEEK_SET + 0 + + ) + +228 #ide +SEEK_CUR + + +229 + #SEEK_CUR + 1 + + ) + +231 #ide +SEEK_END + + +232 + #SEEK_END + 2 + + ) + +235 #i +__DARWIN_UNIX03 + + +236 + #d + +__dp + + + ) + +237 + #dout + +__dou + + + ) + +238 + #dr + +__d + + + ) + +240 + #d + (& +__sF +[0]) + + ) + +241 + #dout + (& +__sF +[1]) + + ) + +242 + #dr + (& +__sF +[2]) + + ) + +248 +__BEGIN_DECLS + + +249 + +( +FILE + *); + +250 +fo +( +FILE + *); + +251 +of +( +FILE + *); + +252 + +( +FILE + *); + +253 +fush +( +FILE + *); + +254 +fgc +( +FILE + *); + +255 +fgpos +( +FILE + * +__ri +, +os_t + *); + +256 * +fgs +(* +__ri +, , +FILE + *); + +257 +FILE + * +fݒ +(cڡ * +__ri +, const * __restrict); + +258 + $rtf +( +FILE + * +__ri +, cڡ * __ri, ... + `__DARWIN_LDBL_COMPAT +( +rtf +); + +259 + `utc +(, +FILE + *); + +260 + $uts +(cڡ * +__ri +, +FILE + * __ri + `__DARWIN_ALIAS +( +uts +); + +261 +size_t + + `d +(* +__ri +, size_t, size_t, +FILE + * __restrict); + +262 +FILE + * + $eݒ +(cڡ * +__ri +, const * __restrict, + +263 +FILE + * +__ri + + `__DARWIN_ALIAS +( +eݒ +); + +264 + $fsnf +( +FILE + * +__ri +, cڡ * __ri, ... + `__DARWIN_LDBL_COMPAT +( +fsnf +); + +265 + `fek +( +FILE + *, , ); + +266 + `fos +( +FILE + *, cڡ +os_t + *); + +267 + `l +( +FILE + *); + +268 +size_t + + $fwre +(cڡ * +__ri +, +size_t +, size_t, +FILE + * __ri + `__DARWIN_ALIAS +( +fwre +); + +269 + `gc +( +FILE + *); + +270 + `gch +(); + +271 * + `gs +(*); + +272 #i! + `defed +( +_ANSI_SOURCE +&& (!defed( +_POSIX_C_SOURCE +|| defed( +_DARWIN_C_SOURCE +)) + +273
+__cڡ + +sys_ü +; + +274
+__cڡ + *__cڡ +sys_i +[]; + +276 + ` +(const *); + +277 + $tf +(cڡ * +__ri +, ... + `__DARWIN_LDBL_COMPAT +( +tf +); + +278 + `putc +(, +FILE + *); + +279 + `putch +(); + +280 + `puts +(const *); + +281 + `move +(const *); + +282 + `me + (const *, const *); + +283 + `wd +( +FILE + *); + +284 + $snf +(cڡ * +__ri +, ... + `__DARWIN_LDBL_COMPAT +( +snf +); + +285 + `tbuf +( +FILE + * +__ri +, * __restrict); + +286 + `tvbuf +( +FILE + * +__ri +, * __ri, , +size_t +); + +287 + $rtf +(* +__ri +, cڡ * __ri, ... + `__DARWIN_LDBL_COMPAT +( +rtf +); + +288 + $ssnf +(cڡ * +__ri +, cڡ * __ri, ... + `__DARWIN_LDBL_COMPAT +( +ssnf +); + +289 +FILE + * + `tmpfe +(); + +290 * + `tmam +(*); + +291 + `ungc +(, +FILE + *); + +292 + $vrtf +( +FILE + * +__ri +, cڡ * __ri, +va_li + + `__DARWIN_LDBL_COMPAT +( +vrtf +); + +293 + $vtf +(cڡ * +__ri +, +va_li + + `__DARWIN_LDBL_COMPAT +( +vtf +); + +294 + $vrtf +(* +__ri +, cڡ * __ri, +va_li + + `__DARWIN_LDBL_COMPAT +( +vrtf +); + +295 #i! + `defed +( +_ANSI_SOURCE +&& (!defed( +_POSIX_C_SOURCE +|| defed( +_DARWIN_C_SOURCE +)) + +296 + $artf +(**, cڡ *, ... + `__DARWIN_LDBL_COMPAT +( +artf +); + +297 + $vartf +(**, cڡ *, +va_li + + `__DARWIN_LDBL_COMPAT +( +vartf +); + +299 +__END_DECLS + + +304 #ide +_ANSI_SOURCE + + +305 + #L_mid + 1024 + + ) + +307 +__BEGIN_DECLS + + +308 * + `mid +(*); + +309 #i! + `defed +( +_POSIX_C_SOURCE +|| defed( +_DARWIN_C_SOURCE +) + +310 * + `mid_r +(*); + +312 +FILE + * + `fdݒ +(, const *); + +313 #i! + `defed +( +_POSIX_C_SOURCE +|| defed( +_DARWIN_C_SOURCE +) + +314 * + `fg +( +FILE + *, +size_t + *); + +316 + `fo +( +FILE + *); + +317 + `ockfe +( +FILE + *); + +318 #i! + `defed +( +_POSIX_C_SOURCE +|| defed( +_DARWIN_C_SOURCE +) + +319 +__cڡ + + +320 * + `fmtcheck +(const *, const *); + +321 + `urge +( +FILE + *); + +323 + `feko +( +FILE + *, +off_t +, ); + +324 +off_t + + `lo +( +FILE + *); + +325 + `rylockfe +( +FILE + *); + +326 + `fuockfe +( +FILE + *); + +327 + `gc_uocked +( +FILE + *); + +328 + `gch_uocked +(); + +329 #i! + `defed +( +_POSIX_C_SOURCE +|| defed( +_DARWIN_C_SOURCE +) + +330 + `gw +( +FILE + *); + +332 + `po +( +FILE + *); + +333 +FILE + * + `pݒ +(const *, const *); + +334 + `putc_uocked +(, +FILE + *); + +335 + `putch_uocked +(); + +336 #i! + `defed +( +_POSIX_C_SOURCE +|| defed( +_DARWIN_C_SOURCE +) + +337 + `putw +(, +FILE + *); + +338 + `tbufr +( +FILE + *, *, ); + +339 + `ebuf +( +FILE + *); + +341 + $tf +(* +__ri +, +size_t +, cڡ * __ri, ... + `__DARWIN_LDBL_COMPAT +( +tf +); + +342 * + $mam +(cڡ *, cڡ * + `__DARWIN_ALIAS +( +mam +); + +343 + $vfsnf +( +FILE + * +__ri +, cڡ * __ri, +va_li + + `__DARWIN_LDBL_COMPAT +( +vfsnf +); + +344 + $vsnf +(cڡ * +__ri +, +va_li + + `__DARWIN_LDBL_COMPAT +( +vsnf +); + +345 + $vtf +(* +__ri +, +size_t +, cڡ * __ri, +va_li + + `__DARWIN_LDBL_COMPAT +( +vtf +); + +346 + $vssnf +(cڡ * +__ri +, cڡ * __ri, +va_li + + `__DARWIN_LDBL_COMPAT +( +vssnf +); + +347 #i! + `defed +( +_POSIX_C_SOURCE +|| defed( +_DARWIN_C_SOURCE +) + +348 +FILE + * + `zݒ +(const *, const *, ); + +350 +__END_DECLS + + +355 #i! + `defed +( +_POSIX_C_SOURCE +|| defed( +_DARWIN_C_SOURCE +) + +356 +__BEGIN_DECLS + + +357 +FILE + * + `funݒ +(const *, + +360 + $os_t + (*)(*, +os_t +, ), + +362 +__END_DECLS + + +363 + #ݒ +( +cook +, + + + `funݒ +(cook, fn, 0, 0, 0) + + ) + +364 + #fwݒ +( +cook +, + + + `funݒ +(cook, 0, fn, 0, 0) + + ) + +371 +__BEGIN_DECLS + + +372 + `__g +( +FILE + *); + +373 + $__svfsnf +( +FILE + *, cڡ *, +va_li + + `__DARWIN_LDBL_COMPAT +( +__svfsnf +); + +374 + `__swbuf +(, +FILE + *); + +375 +__END_DECLS + + +381 + #__sgc +( +p +(--)-> +_r + < 0 ? + `__g +: ()(*)-> +_p +++)) + + ) + +382 #i + `defed +( +__GNUC__ +&& defed( +__STDC__ +) + +383 +__le + + $__utc +( +_c +, +FILE + * +_p +) { + +384 i(-- +_p +-> +_w + >0 || (_p->_w >_p-> +_lbfsize + && () +_c + != '\n')) + +385 (* +_p +->_p++ = +_c +); + +387 ( + `__swbuf +( +_c +, +_p +)); + +388 + } +} + +393 + #__utc +( +c +, +p +) \ + +394 (--( +p +)-> +_w + < 0 ? \ + +395 ( +p +)-> +_w + >)-> +_lbfsize + ? \ + +396 (*( +p +)-> +_p + = ( +c +)), *(p)->_p != '\n' ? \ + +397 ()*( +p +)-> +_p +++ : \ + +398 + `__swbuf +('\n', +p +) : \ + +399 + `__swbuf +(()( +c +), +p +) : \ + +400 (*( +p +)-> +_p + = ( +c +), ()*)->_p++)) + + ) + +403 + #__sof +( +p +(()-> +_ags + & +__SEOF +!0) + + ) + +404 + #__s +( +p +(()-> +_ags + & +__SERR +!0) + + ) + +405 + #__s +( +p +(()()-> +_ags + &~( +__SERR +| +__SEOF +))) + + ) + +406 + #__sfo +( +p +()-> +_fe +) + + ) + +408 #ide +_ANSI_SOURCE + + +409 #i! +defed +( +_POSIX_C_SOURCE +|| defed( +_DARWIN_C_SOURCE +) + +410 + #of_uocked +( +p + + `__sof +) + + ) + +411 + #_uocked +( +p + + `__s +) + + ) + +412 + #_uocked +( +p + + `__s +) + + ) + +413 + #fo_uocked +( +p + + `__sfo +) + + ) + +416 #ide +lt + + +417 + #gc_uocked +( + + + `__sgc +() + + ) + +418 + #putc_uocked +( +x +, + + + `__utc +(x, fp) + + ) + +421 + #gch_uocked +( + `gc_uocked +( +d +) + + ) + +422 + #putch_uocked +( +x + + `putc_uocked +(x, +dout +) + + ) + +425 #ifde +_USE_EXTENDED_LOCALES_ + + +426 + ~<xlo/_dio.h +> + +429 #i +defed + ( +__GNUC__ +&& +_FORTIFY_SOURCE + > 0 && !defed ( +__lulus +) + +431 + ~<cu/_dio.h +> + + @/usr/include/stdlib.h + +58 #ide +_STDLIB_H_ + + +59 + #_STDLIB_H_ + + + ) + +61 + ~<avaab.h +> + +63 + ~<_tys.h +> + +64 #i! +defed +( +_ANSI_SOURCE +) + +65 + ~<sys/wa.h +> + +66 #i(! +defed +( +_POSIX_C_SOURCE +|| defed( +_DARWIN_C_SOURCE +)) + +67 + ~<lo.h +> + +71 #idef +_SIZE_T + + +72 + #_SIZE_T + + + ) + +75 +__dw_size_t + + tsize_t +; + +78 #i! +defed +( +_ANSI_SOURCE +&& (!defed( +_POSIX_C_SOURCE +|| defed( +_DARWIN_C_SOURCE +)) + +79 #ide +_CT_RUNE_T + + +80 + #_CT_RUNE_T + + + ) + +81 +__dw__ru_t + + t_ru_t +; + +84 #ide +_RUNE_T + + +85 + #_RUNE_T + + + ) + +86 +__dw_ru_t + + tru_t +; + +90 #idef +__lulus + + +91 #idef +_WCHAR_T + + +92 + #_WCHAR_T + + + ) + +93 +__dw_wch_t + + twch_t +; + +98 + mqu +; + +99 + mm +; + +100 } + tdiv_t +; + +103 + mqu +; + +104 + mm +; + +105 } + tldiv_t +; + +107 #i! +__DARWIN_NO_LONG_LONG + + +109 + mqu +; + +110 + mm +; + +111 } + tdiv_t +; + +114 #ide +NULL + + +115 + #NULL + +__DARWIN_NULL + + + ) + +118 + #EXIT_FAILURE + 1 + + ) + +119 + #EXIT_SUCCESS + 0 + + ) + +121 + #RAND_MAX + 0x7fffffff + + ) + +123 #ifde +_USE_EXTENDED_LOCALES_ + + +124 + ~<_xlo.h +> + +127 #ide +MB_CUR_MAX + + +128 #ifde +_USE_EXTENDED_LOCALES_ + + +129 + #MB_CUR_MAX + ( + `___mb_cur_max +()) + + ) + +130 #ide +MB_CUR_MAX_L + + +131 + #MB_CUR_MAX_L +( +x +( + `___mb_cur_max_l +(x)) + + ) + +134
+__mb_cur_max +; + +135 + #MB_CUR_MAX + +__mb_cur_max + + + ) + +139 #i! +defed +( +_ANSI_SOURCE +&& (!defed( +_POSIX_C_SOURCE +|| defed( +_DARWIN_C_SOURCE +)) \ + +140 && +defed +( +_USE_EXTENDED_LOCALES_ +&& ! + $defed +( +MB_CUR_MAX_L +) + +141 + #MB_CUR_MAX_L +( +x +( + `___mb_cur_max_l +(x)) + + ) + +144 +__BEGIN_DECLS + + +145 + $abt +( +__dd2 +; + +146 + $abs +( +__pu2 +; + +147 + `ex +((*)()); + +148 + `of +(const *); + +149 + `oi +(const *); + +150 + ` +(const *); + +151 #i! +__DARWIN_NO_LONG_LONG + + +153 + `l +(const *); + +155 * + `bch +(cڡ *, cڡ *, +size_t +, + +156 +size_t +, (*)(const *, const *)); + +157 * + `oc +( +size_t +, size_t); + +158 +div_t + + $div +(, +__pu2 +; + +159 + $ex +( +__dd2 +; + +160 + ` +(*); + +161 * + `gv +(const *); + +162 + $bs +( +__pu2 +; + +163 +ldiv_t + + $ldiv +(, +__pu2 +; + +164 #i! +__DARWIN_NO_LONG_LONG + + +166 + `abs +(); + +167 +div_t + + `div +(, ); + +169 * + `mloc +( +size_t +); + +170 + `mbn +(cڡ *, +size_t +); + +171 +size_t + + `mbowcs +( +wch_t + * +__ri + , const * __restrict, size_t); + +172 + `mbtowc +( +wch_t + * +__ri +, cڡ * __ri, +size_t +); + +173 + `qst +(*, +size_t +, size_t, + +175 + `nd +(); + +176 * + `loc +(*, +size_t +); + +177 + `d +(); + +178 + $od +(cڡ *, ** + `__DARWIN_ALIAS +( +od +); + +179 + $of +(cڡ *, ** + `__DARWIN_ALIAS +( +of +); + +180 + ` +(const *, **, ); + +182 + $d +(cڡ *, ** + `__DARWIN_LDBL_COMPAT +( +d +); + +183 #i! +__DARWIN_NO_LONG_LONG + + +185 + `l +(const *, **, ); + +188 + `oul +(const *, **, ); + +189 #i! +__DARWIN_NO_LONG_LONG + + +191 + `ou +(const *, **, ); + +193 + $syem +(cڡ * + `__DARWIN_ALIAS_C +( +syem +); + +194 +size_t + + `wcombs +(* +__ri +, cڡ +wch_t + * __restrict, size_t); + +195 + `womb +(*, +wch_t +); + +197 #ide +_ANSI_SOURCE + + +198 + $_Ex +( +__dd2 +; + +199 + `a64l +(const *); + +200 + `dnd48 +(); + +201 * + `ecvt +(, , * +__ri +, *__restrict); + +202 + `d48 +([3]); + +203 * + `fcvt +(, , * +__ri +, *__restrict); + +204 * + `gcvt +(, , *); + +205 + `gsubt +(**, * const *, **); + +206 + `g +(); + +207 #i +__DARWIN_UNIX03 + + +208 * + `e +(, *, +size_t +); + +210 * + `e +(, *, ); + +212 + `jnd48 +([3]); + +213 * + `l64a +(); + +214 + `lcg48 +([7]); + +215 + `̪d48 +(); + +216 * + `mkmp +(*); + +217 + `mkemp +(*); + +218 + `mnd48 +(); + +219 + `Īd48 +([3]); + +220 + `posix_ݒ +(); + +221 * + `ame +(); + +222 + $punv +(* + `__DARWIN_ALIAS +( +punv +); + +223 + `ndom +(); + +224 + `nd_r +(*); + +225 #i( +__DARWIN_UNIX03 + && ! + `defed +( +_POSIX_C_SOURCE +)|| defed( +_DARWIN_C_SOURCE +|| defed( +_DARWIN_BETTER_REALPATH +) + +226 * + $th +(cڡ * +__ri +, * __ri + `__DARWIN_EXTSN +( +th +); + +228 * + $th +(cڡ * +__ri +, * __ri + `__DARWIN_ALIAS +( +th +); + +231 * + `ed48 +([3]); + +232 + $nv +(cڡ *, cڡ *, + `__DARWIN_ALIAS +( +nv +); + +233 #i +__DARWIN_UNIX03 + + +234 + $tkey +(cڡ * + `__DARWIN_ALIAS +( +tkey +); + +236 + `tkey +(const *); + +238 * + `te +(const *); + +239 + `d48 +(); + +240 #i +__DARWIN_UNIX03 + + +241 + `dom +(); + +243 + `dom +(); + +245 + `uock +(); + +246 #i +__DARWIN_UNIX03 + + +247 + $unnv +(cڡ * + `__DARWIN_ALIAS +( +unnv +); + +249 + `unnv +(const *); + +253 #i! + `defed +( +_ANSI_SOURCE +&& (!defed( +_POSIX_C_SOURCE +|| defed( +_DARWIN_C_SOURCE +)) + +254 + ~<mache/tys.h +> + +256 #ide +_DEV_T + + +257 +__dw_dev_t + + tdev_t +; + +258 + #_DEV_T + + + ) + +261 #idef +_MODE_T + + +262 +__dw_mode_t + + tmode_t +; + +263 + #_MODE_T + + + ) + +266 +u_t32_t + + +267 + `c4ndom +(); + +268 + `c4ndom_addndom +(* +d +, +dn +); + +269 + `c4ndom_ +(); + +272 * + `cgp +(*, const *, ); + +273 + `cgo +(); + +274 + `cgt +(**, **, const *); + +275 + `cgf +(**, **); + +276 + `cgmch +(const *, const *); + +277 + `cgxt +(**, **); + +278 + `cgnum +(*, const *, *); + +279 + `cgt +(const *); + +280 + `cgr +(*, const *, **); + +281 + `cgur +(*, const *, **); + +283 + $dm +(, + $__DARWIN_1050 +( +dm + +__AVAILABLE_MAC_OS_X_VERSION_10_0_AND_LATER_BUT_DEPRECATED_IN_MAC_OS_X_VERSION_10_5 +; + +284 * + `devme +( +dev_t +, +mode_t +); + +285 * + `devme_r +( +dev_t +, +mode_t +, * +buf +, +n +); + +286 * + `gbsize +(*, *); + +287 + `gldavg +([], ); + +289 * + `gogme +(); + +291 + `hpst +(*, +size_t +, size_t, + +293 + `mgest +(*, +size_t +, size_t, + +295 + `qst_r +(*, +size_t +, size_t, *, + +297 + `dixst +(const **, , const *, + +299 + `rogme +(const *); + +300 + `adixst +(const **, , const *, + +302 + `ddev +(); + +303 + `domdev +(); + +304 * + `locf +(*, +size_t +); + +305 #i! +__DARWIN_NO_LONG_LONG + + +307 + `oq +(const *, **, ); + +309 + `ouq +(const *, **, ); + +311
* +subݏrg +; + +312 * + `vloc +( +size_t +); + +316 #i! + `defed +( +__lulus +&& defed( +__WCHAR_MAX__ +) && __WCHAR_MAX__ <= 0xffffU + +317 #agm +GCC + +pois + +mbowcs + +mbtowc + +wcombs + +womb + + +319 +__END_DECLS + + +321 #ifde +_USE_EXTENDED_LOCALES_ + + +322 + ~<xlo/_dlib.h +> + + @/usr/include/sys/mman.h + +76 #idef +_SYS_MMAN_H_ + + +77 + #_SYS_MMAN_H_ + + + ) + +79 + ~<sys/pits.h +> + +80 + ~<sys/cdefs.h +> + +82 + ~<sys/_tys.h +> + +88 #idef +_MODE_T + + +89 +__dw_mode_t + + tmode_t +; + +90 + #_MODE_T + + + ) + +93 #ide +_OFF_T + + +94 +__dw_off_t + + toff_t +; + +95 + #_OFF_T + + + ) + +98 #ide +_SIZE_T + + +99 + #_SIZE_T + + + ) + +100 +__dw_size_t + + tsize_t +; + +107 + #PROT_NONE + 0x00 + + ) + +108 + #PROT_READ + 0x01 + + ) + +109 + #PROT_WRITE + 0x02 + + ) + +110 + #PROT_EXEC + 0x04 + + ) + +116 + #MAP_SHARED + 0x0001 + + ) + +117 + #MAP_PRIVATE + 0x0002 + + ) + +118 #i! +defed +( +_POSIX_C_SOURCE +|| defed( +_DARWIN_C_SOURCE +) + +119 + #MAP_COPY + +MAP_PRIVATE + + + ) + +125 + #MAP_FIXED + 0x0010 + + ) + +126 #i! +defed +( +_POSIX_C_SOURCE +|| defed( +_DARWIN_C_SOURCE +) + +127 + #MAP_RENAME + 0x0020 + + ) + +128 + #MAP_NORESERVE + 0x0040 + + ) + +129 + #MAP_RESERVED0080 + 0x0080 + + ) + +130 + #MAP_NOEXTEND + 0x0100 + + ) + +131 + #MAP_HASSEMAPHORE + 0x0200 + + ) + +132 + #MAP_NOCACHE + 0x0400 + + ) + +138 + #MCL_CURRENT + 0x0001 + + ) + +139 + #MCL_FUTURE + 0x0002 + + ) + +144 + #MAP_FAILED + ((*)-1 + + ) + +149 + #MS_ASYNC + 0x0001 + + ) + +150 + #MS_INVALIDATE + 0x0002 + + ) + +151 + #MS_SYNC + 0x0010 + + ) + +153 #i! +defed +( +_POSIX_C_SOURCE +|| defed( +_DARWIN_C_SOURCE +) + +154 + #MS_KILLPAGES + 0x0004 + + ) + +155 + #MS_DEACTIVATE + 0x0008 + + ) + +160 + #MAP_FILE + 0x0000 + + ) + +161 + #MAP_ANON + 0x1000 + + ) + +168 + #POSIX_MADV_NORMAL + 0 + + ) + +169 + #POSIX_MADV_RANDOM + 1 + + ) + +170 + #POSIX_MADV_SEQUENTIAL + 2 + + ) + +171 + #POSIX_MADV_WILLNEED + 3 + + ) + +172 + #POSIX_MADV_DONTNEED + 4 + + ) + +174 #i! +defed +( +_POSIX_C_SOURCE +|| defed( +_DARWIN_C_SOURCE +) + +175 + #MADV_NORMAL + +POSIX_MADV_NORMAL + + + ) + +176 + #MADV_RANDOM + +POSIX_MADV_RANDOM + + + ) + +177 + #MADV_SEQUENTIAL + +POSIX_MADV_SEQUENTIAL + + + ) + +178 + #MADV_WILLNEED + +POSIX_MADV_WILLNEED + + + ) + +179 + #MADV_DONTNEED + +POSIX_MADV_DONTNEED + + + ) + +180 + #MADV_FREE + 5 + + ) + +185 + #MINCORE_INCORE + 0x1 + + ) + +186 + #MINCORE_REFERENCED + 0x2 + + ) + +187 + #MINCORE_MODIFIED + 0x4 + + ) + +188 + #MINCORE_REFERENCED_OTHER + 0x8 + + ) + +189 + #MINCORE_MODIFIED_OTHER + 0x10 + + ) + +194 +__BEGIN_DECLS + + +196 +mlockl +(); + +197 +muockl +(); + +199 +mlock +(cڡ *, +size_t +); + +200 #ide +_MMAP + + +201 + #_MMAP + + + ) + +203 * + $mm +(*, +size_t +, , , , +off_t + + `__DARWIN_ALIAS +( +mm +); + +206 + $me +(*, +size_t +, + `__DARWIN_ALIAS +( +me +); + +208 + $msync +(*, +size_t +, + `__DARWIN_ALIAS_C +( +msync +); + +210 + `muock +(cڡ *, +size_t +); + +212 + $munm +(*, +size_t + + `__DARWIN_ALIAS +( +munm +); + +214 + `shm_ݒ +(const *, , ...); + +215 + `shm_uƚk +(const *); + +217 + `posix_madvi +(*, +size_t +, ); + +219 #i! + `defed +( +_POSIX_C_SOURCE +|| defed( +_DARWIN_C_SOURCE +) + +220 + `madvi +(*, +size_t +, ); + +221 + `mce +(cڡ *, +size_t +, *); + +222 + `mh +(*, +size_t +, ); + +224 +__END_DECLS + + + @/usr/include/sys/stat.h + +70 #ide +_SYS_STAT_H_ + + +71 + #_SYS_STAT_H_ + + + ) + +73 + ~<sys/_tys.h +> + +74 + ~<sys/cdefs.h +> + +77 + #__ed_ru_timeec + + + ) + +78 + ~<sys/_rus.h +> + +85 #ide +_BLKCNT_T + + +86 +__dw_blkt_t + + tblkt_t +; + +87 + #_BLKCNT_T + + + ) + +90 #ide +_BLKSIZE_T + + +91 +__dw_blksize_t + + tblksize_t +; + +92 + #_BLKSIZE_T + + + ) + +95 #ide +_DEV_T + + +96 +__dw_dev_t + + tdev_t +; + +97 + #_DEV_T + + + ) + +100 #idef +_INO_T + + +101 +__dw_o_t + + to_t +; + +102 + #_INO_T + + + ) + +105 #i! +defed +( +_POSIX_C_SOURCE +|| defed( +_DARWIN_C_SOURCE +) + +106 #idef +_INO64_T + + +107 +__dw_o64_t + + to64_t +; + +108 + #_INO64_T + + + ) + +112 #idef +_MODE_T + + +113 +__dw_mode_t + + tmode_t +; + +114 + #_MODE_T + + + ) + +117 #ide +_NLINK_T + + +118 +__ut16_t + + tƚk_t +; + +119 + #_NLINK_T + + + ) + +122 #ide +_UID_T + + +123 +__dw_uid_t + + tuid_t +; + +124 + #_UID_T + + + ) + +127 #ide +_GID_T + + +128 +__dw_gid_t + + tgid_t +; + +129 + #_GID_T + + + ) + +132 #ide +_OFF_T + + +133 +__dw_off_t + + toff_t +; + +134 + #_OFF_T + + + ) + +137 #idef +_TIME_T + + +138 + #_TIME_T + + + ) + +139 +__dw_time_t + + ttime_t +; + +143 #i! +defed +( +_POSIX_C_SOURCE +|| defed( +_DARWIN_C_SOURCE +) + +152 + so + { + +153 +__ut16_t + + m_dev +; + +154 +o_t + + m_o +; + +155 +mode_t + + m_mode +; + +156 +ƚk_t + + m_ƚk +; + +157 +__ut16_t + + m_uid +; + +158 +__ut16_t + + m_gid +; + +159 +__ut16_t + + m_rdev +; + +160 +__t32_t + + m_size +; + +161 +timeec + + m_imeec +; + +162 +timeec + + m_mtimeec +; + +163 +timeec + + m_imeec +; + +164 +__t32_t + + m_blksize +; + +165 +__t32_t + + m_blocks +; + +166 +__ut32_t + + m_ags +; + +167 +__ut32_t + + m_g +; + +170 + #__DARWIN_STRUCT_STAT64_TIMES + \ + +171 +timeec + +_imeec +; \ + +172 +timeec + +_mtimeec +; \ + +173 +timeec + +_imeec +; \ + +174 +timeec + +_bthtimeec +; + + ) + +178 + #__DARWIN_STRUCT_STAT64_TIMES + \ + +179 +time_t + +_ime +; \ + +180 +_imc +; \ + +181 +time_t + +_mtime +; \ + +182 +_mtimc +; \ + +183 +time_t + +_ime +; \ + +184 +_imc +; \ + +185 +time_t + +_bthtime +; \ + +186 +_bthtimc +; + + ) + +200 + #__DARWIN_STRUCT_STAT64 + { \ + +201 +dev_t + +_dev +; \ + +202 +mode_t + +_mode +; \ + +203 +ƚk_t + +_ƚk +; \ + +204 +__dw_o64_t + +_o +; \ + +205 +uid_t + +_uid +; \ + +206 +gid_t + +_gid +; \ + +207 +dev_t + +_rdev +; \ + +208 +__DARWIN_STRUCT_STAT64_TIMES + \ + +209 +off_t + +_size +; \ + +210 +blkt_t + +_blocks +; \ + +211 +blksize_t + +_blksize +; \ + +212 +__ut32_t + +_ags +; \ + +213 +__ut32_t + +_g +; \ + +214 +__t32_t + +_le +; \ + +215 +__t64_t + +_qe +[2]; \ + +216 } + + ) + +222 #i +__DARWIN_64_BIT_INO_T + + +224 + + + g__DARWIN_STRUCT_STAT64 +; + +228 + s + { + +229 +dev_t + + m_dev +; + +230 +o_t + + m_o +; + +231 +mode_t + + m_mode +; + +232 +ƚk_t + + m_ƚk +; + +233 +uid_t + + m_uid +; + +234 +gid_t + + m_gid +; + +235 +dev_t + + m_rdev +; + +236 #i! +defed +( +_POSIX_C_SOURCE +|| defed( +_DARWIN_C_SOURCE +) + +237 +timeec + + m_imeec +; + +238 +timeec + + m_mtimeec +; + +239 +timeec + + m_imeec +; + +241 +time_t + + m_ime +; + +242 + m_imc +; + +243 +time_t + + m_mtime +; + +244 + m_mtimc +; + +245 +time_t + + m_ime +; + +246 + m_imc +; + +248 +off_t + + m_size +; + +249 +blkt_t + + m_blocks +; + +250 +blksize_t + + m_blksize +; + +251 +__ut32_t + + m_ags +; + +252 +__ut32_t + + m_g +; + +253 +__t32_t + + m_le +; + +254 +__t64_t + + m_qe +[2]; + +259 #i! +defed +( +_POSIX_C_SOURCE +|| defed( +_DARWIN_C_SOURCE +) + +261 +64 + + g__DARWIN_STRUCT_STAT64 +; + +268 #i! +defed +( +_POSIX_C_SOURCE +|| defed( +_DARWIN_C_SOURCE +) + +269 + #_ime + +_imeec +. +tv_c + + + ) + +270 + #_mtime + +_mtimeec +. +tv_c + + + ) + +271 + #_ime + +_imeec +. +tv_c + + + ) + +272 + #_bthtime + +_bthtimeec +. +tv_c + + + ) + +279 #ide +S_IFMT + + +281 + #S_IFMT + 0170000 + + ) + +282 + #S_IFIFO + 0010000 + + ) + +283 + #S_IFCHR + 0020000 + + ) + +284 + #S_IFDIR + 0040000 + + ) + +285 + #S_IFBLK + 0060000 + + ) + +286 + #S_IFREG + 0100000 + + ) + +287 + #S_IFLNK + 0120000 + + ) + +288 + #S_IFSOCK + 0140000 + + ) + +289 #i! +defed +( +_POSIX_C_SOURCE +|| defed( +_DARWIN_C_SOURCE +) + +290 + #S_IFWHT + 0160000 + + ) + +291 + #S_IFXATTR + 0200000 + + ) + +296 + #S_IRWXU + 0000700 + + ) + +297 + #S_IRUSR + 0000400 + + ) + +298 + #S_IWUSR + 0000200 + + ) + +299 + #S_IXUSR + 0000100 + + ) + +301 + #S_IRWXG + 0000070 + + ) + +302 + #S_IRGRP + 0000040 + + ) + +303 + #S_IWGRP + 0000020 + + ) + +304 + #S_IXGRP + 0000010 + + ) + +306 + #S_IRWXO + 0000007 + + ) + +307 + #S_IROTH + 0000004 + + ) + +308 + #S_IWOTH + 0000002 + + ) + +309 + #S_IXOTH + 0000001 + + ) + +311 + #S_ISUID + 0004000 + + ) + +312 + #S_ISGID + 0002000 + + ) + +313 + #S_ISVTX + 0001000 + + ) + +315 #i! +defed +( +_POSIX_C_SOURCE +|| defed( +_DARWIN_C_SOURCE +) + +316 + #S_ISTXT + +S_ISVTX + + + ) + +317 + #S_IREAD + +S_IRUSR + + + ) + +318 + #S_IWRITE + +S_IWUSR + + + ) + +319 + #S_IEXEC + +S_IXUSR + + + ) + +329 + #S_ISBLK +( +m +(((m& 0170000=0060000 + + ) + +330 + #S_ISCHR +( +m +(((m& 0170000=0020000 + + ) + +331 + #S_ISDIR +( +m +(((m& 0170000=0040000 + + ) + +332 + #S_ISFIFO +( +m +(((m& 0170000=0010000 + + ) + +333 + #S_ISREG +( +m +(((m& 0170000=0100000 + + ) + +334 + #S_ISLNK +( +m +(((m& 0170000=0120000 + + ) + +335 + #S_ISSOCK +( +m +(((m& 0170000=0140000 + + ) + +336 #i! +defed +( +_POSIX_C_SOURCE +|| defed( +_DARWIN_C_SOURCE +) + +337 + #S_ISWHT +( +m +(((m& 0170000=0160000 + + ) + +338 + #S_ISXATTR +( +m +(((m& 0200000=0200000 + + ) + +356 + #S_TYPEISMQ +( +buf +(0 + + ) + +357 + #S_TYPEISSEM +( +buf +(0 + + ) + +358 + #S_TYPEISSHM +( +buf +(0 + + ) + +374 + #S_TYPEISTMO +( +buf +(0 + + ) + +377 #i! +defed +( +_POSIX_C_SOURCE +|| defed( +_DARWIN_C_SOURCE +) + +378 + #ACCESSPERMS + ( +S_IRWXU +| +S_IRWXG +| +S_IRWXO + + + ) + +380 + #ALLPERMS + ( +S_ISUID +| +S_ISGID +| +S_ISTXT +| +S_IRWXU +| +S_IRWXG +| +S_IRWXO +) + + ) + +382 + #DEFFILEMODE + ( +S_IRUSR +| +S_IWUSR +| +S_IRGRP +| +S_IWGRP +| +S_IROTH +| +S_IWOTH +) + + ) + +384 + #S_BLKSIZE + 512 + + ) + +391 + #UF_SETTABLE + 0x0000fff + + ) + +392 + #UF_NODUMP + 0x00000001 + + ) + +393 + #UF_IMMUTABLE + 0x00000002 + + ) + +394 + #UF_APPEND + 0x00000004 + + ) + +395 + #UF_OPAQUE + 0x00000008 + + ) + +402 + #UF_HIDDEN + 0x00008000 + + ) + +407 + #SF_SETTABLE + 0xffff0000 + + ) + +408 + #SF_ARCHIVED + 0x00010000 + + ) + +409 + #SF_IMMUTABLE + 0x00020000 + + ) + +410 + #SF_APPEND + 0x00040000 + + ) + +422 +__BEGIN_DECLS + + +424 + $chmod +(cڡ *, +mode_t + + `__DARWIN_ALIAS +( +chmod +); + +425 + $fchmod +(, +mode_t + + `__DARWIN_ALIAS +( +fchmod +); + +426 + $f +(, + + * + `__DARWIN_INODE64 +( +f +); + +427 + $l +(cڡ *, + + * + `__DARWIN_INODE64 +( +l +); + +428 + `mkd +(cڡ *, +mode_t +); + +429 + `mkfifo +(cڡ *, +mode_t +); + +430 + $ +(cڡ *, + + * + `__DARWIN_INODE64 +(stat); + +431 + `mknod +(cڡ *, +mode_t +, +dev_t +); + +432 +mode_t + + `umask +(mode_t); + +434 #i! + `defed +( +_POSIX_C_SOURCE +|| defed( +_DARWIN_C_SOURCE +) + +435 #ide +_FILESEC_T + + +436 +_fec +; + +437 +_fec + * + tfec_t +; + +438 + #_FILESEC_T + + + ) + +440 + `chags +(cڡ *, +__ut32_t +); + +441 + `chmodx_ +(cڡ *, +fec_t +); + +442 + `fchags +(, +__ut32_t +); + +443 + `fchmodx_ +(, +fec_t +); + +444 + $fx_ +(, + + *, +fec_t + + `__DARWIN_INODE64 +( +fx_ +); + +445 + `lchags +(cڡ *, +__ut32_t +); + +446 + `lchmod +(cڡ *, +mode_t +); + +447 + $lx_ +(cڡ *, + + *, +fec_t + + `__DARWIN_INODE64 +( +lx_ +); + +448 + `mkdx_ +(cڡ *, +fec_t +); + +449 + `mkfifox_ +(cڡ *, +fec_t +); + +450 + $x_ +(cڡ *, + + *, +fec_t + + `__DARWIN_INODE64 +( +x_ +); + +451 + `umaskx_ +( +fec_t +); + +453 + `fx64_ +(, +64 + *, +fec_t +); + +454 + `lx64_ +(cڡ *, +64 + *, +fec_t +); + +455 + `x64_ +(cڡ *, +64 + *, +fec_t +); + +456 + `f64 +(, +64 + *); + +457 + `l64 +(cڡ *, +64 + *); + +458 + `64 +(cڡ *, +64 + *); + +461 +__END_DECLS + + + @/usr/include/sys/time.h + +64 #ide +_SYS_TIME_H_ + + +65 + #_SYS_TIME_H_ + + + ) + +67 + ~<sys/cdefs.h +> + +68 + ~<sys/_tys.h +> + +74 + #__ed_fd_t + + + ) + +75 + #__ed_ru_timeec + + + ) + +76 + #__ed_ru_timev + + + ) + +77 + ~<sys/_rus.h +> + +79 #idef +_TIME_T + + +80 + #_TIME_T + + + ) + +81 +__dw_time_t + + ttime_t +; + +84 #ide +_SUSECONDS_T + + +85 + #_SUSECONDS_T + + + ) + +86 +__dw_sucds_t + + tsucds_t +; + +93 + simv + { + +94 +timev + + m_rv +; + +95 +timev + + m_vue +; + +102 + #ITIMER_REAL + 0 + + ) + +103 + #ITIMER_VIRTUAL + 1 + + ) + +104 + #ITIMER_PROF + 2 + + ) + +112 #idef +FD_SETSIZE + + +113 + #FD_SETSIZE + +__DARWIN_FD_SETSIZE + + + ) + +115 #ide +FD_SET + + +116 + #FD_SET +( +n +, +p + + `__DARWIN_FD_SET +,) + + ) + +118 #idef +FD_CLR + + +119 + #FD_CLR +( +n +, +p + + `__DARWIN_FD_CLR +,) + + ) + +121 #ide +FD_ISSET + + +122 + #FD_ISSET +( +n +, +p + + `__DARWIN_FD_ISSET +,) + + ) + +124 #ide +FD_ZERO + + +125 + #FD_ZERO +( +p + + `__DARWIN_FD_ZERO +) + + ) + +128 #i! +defed +( +_POSIX_C_SOURCE +|| defed( +_DARWIN_C_SOURCE +) + +130 #ide +FD_COPY + + +131 + #FD_COPY +( +f +, +t + + `__DARWIN_FD_COPY +(f,) + + ) + +135 + #TIMEVAL_TO_TIMESPEC +( +tv +, +ts +) { \ + +136 ( +ts +)-> +tv_c + = ( +tv +)->tv_sec; \ + +137 ( +ts +)-> +tv_nc + = ( +tv +)-> +tv_uc + * 1000; \ + +138 } + + ) + +139 + #TIMESPEC_TO_TIMEVAL +( +tv +, +ts +) { \ + +140 ( +tv +)-> +tv_c + = ( +ts +)->tv_sec; \ + +141 ( +tv +)-> +tv_uc + = ( +ts +)-> +tv_nc + / 1000; \ + +142 } + + ) + +144 + stimeze + { + +145 + mtz_muswe +; + +146 + mtz_dtime +; + +148 + #DST_NONE + 0 + + ) + +149 + #DST_USA + 1 + + ) + +150 + #DST_AUST + 2 + + ) + +151 + #DST_WET + 3 + + ) + +152 + #DST_MET + 4 + + ) + +153 + #DST_EET + 5 + + ) + +154 + #DST_CAN + 6 + + ) + +157 + #timr +( +tvp +vp)-> +tv_c + = (tvp)-> +tv_uc + = 0 + + ) + +158 + #timist +( +tvp +(vp)-> +tv_c + || (tvp)-> +tv_uc +) + + ) + +159 + #timcmp +( +tvp +, +uvp +, +cmp +) \ + +160 ((( +tvp +)-> +tv_c + =( +uvp +)->tv_sec) ? \ + +161 (( +tvp +)-> +tv_uc + + `cmp + ( +uvp +)->tv_usec) : \ + +162 (( +tvp +)-> +tv_c + + `cmp + ( +uvp +)->tv_c)) + + ) + +163 + #timadd +( +tvp +, +uvp +, +vvp +) \ + +165 ( +vvp +)-> +tv_c + = ( +tvp +)->tv_+ ( +uvp +)->tv_sec; \ + +166 ( +vvp +)-> +tv_uc + = ( +tvp +)->tv_u+ ( +uvp +)->tv_usec; \ + +167 i(( +vvp +)-> +tv_uc + >= 1000000) { \ + +168 ( +vvp +)-> +tv_c +++; \ + +169 ( +vvp +)-> +tv_uc + -= 1000000; \ + +171 } 0) + + ) + +172 + #timsub +( +tvp +, +uvp +, +vvp +) \ + +174 ( +vvp +)-> +tv_c + = ( +tvp +)->tv_- ( +uvp +)->tv_sec; \ + +175 ( +vvp +)-> +tv_uc + = ( +tvp +)->tv_u- ( +uvp +)->tv_usec; \ + +176 i(( +vvp +)-> +tv_uc + < 0) { \ + +177 ( +vvp +)-> +tv_c +--; \ + +178 ( +vvp +)-> +tv_uc + += 1000000; \ + +180 } 0) + + ) + +182 + #timevcmp +( +l +, +r +, +cmp + + `timcmp +,, cmp + + ) + +187 + sockfo + { + +188 + mhz +; + +189 + mtick +; + +190 + mtickadj +; + +191 + mhz +; + +192 + mofhz +; + +197 #i! +defed +( +_POSIX_C_SOURCE +|| defed( +_DARWIN_C_SOURCE +) + +198 + ~<time.h +> + +201 + g__BEGIN_DECLS + + +203 #i! +defed +( +_POSIX_C_SOURCE +|| defed( +_DARWIN_C_SOURCE +) + +204 +adjtime +(cڡ +timev + *, timeval *); + +205 +futimes +(, cڡ +timev + *); + +206 +lutimes +(cڡ *, cڡ +timev + *); + +207 +imeofday +(cڡ +timev + *, cڡ +timeze + *); + +210 +gim +(, +imv + *); + +211 +gtimeofday +( +timev + * +__ri +, * __restrict); + +213 + ~<sys/_.h +> + +215 +tim +(, cڡ +imv + * +__ri +, + +216 +imv + * +__ri +); + +217 +utimes +(cڡ *, cڡ +timev + *); + +219 + g__END_DECLS + + + @/usr/include/sys/types.h + +69 #ide +_SYS_TYPES_H_ + + +70 + #_SYS_TYPES_H_ + + + ) + +72 + ~<sys/pits.h +> + +74 #ide +__ASSEMBLER__ + + +75 + ~<sys/cdefs.h +> + +78 + ~<mache/tys.h +> + +79 + ~<sys/_tys.h +> + +81 + ~<mache/dn.h +> + +83 #i! +defed +( +_POSIX_C_SOURCE +|| defed( +_DARWIN_C_SOURCE +) + +84 + tu_ch +; + +85 + tu_sht +; + +86 + tu_t +; + +87 #ide +_U_LONG + + +88 + tu_lg +; + +89 + #_U_LONG + + + ) + +91 + tusht +; + +92 + tut +; + +95 +u_t64_t + + tu_quad_t +; + +96 +t64_t + + tquad_t +; + +97 +quad_t + * + tqaddr_t +; + +99 * + tddr_t +; + +100 +t32_t + + tdaddr_t +; + +102 #ide +_DEV_T + + +103 +__dw_dev_t + + tdev_t +; + +104 + #_DEV_T + + + ) + +107 +u_t32_t + + tfix_t +; + +109 #ide +_BLKCNT_T + + +110 +__dw_blkt_t + + tblkt_t +; + +111 + #_BLKCNT_T + + + ) + +114 #ide +_BLKSIZE_T + + +115 +__dw_blksize_t + + tblksize_t +; + +116 + #_BLKSIZE_T + + + ) + +119 #ide +_GID_T + + +120 +__dw_gid_t + + tgid_t +; + +121 + #_GID_T + + + ) + +124 #ide +_IN_ADDR_T + + +125 + #_IN_ADDR_T + + + ) + +126 +__ut32_t + + t_addr_t +; + +129 #ide +_IN_PORT_T + + +130 + #_IN_PORT_T + + + ) + +131 +__ut16_t + + t_pt_t +; + +134 #idef +_INO_T + + +135 +__dw_o_t + + to_t +; + +136 + #_INO_T + + + ) + +139 #i! +defed +( +_POSIX_C_SOURCE +|| defed( +_DARWIN_C_SOURCE +) + +140 #idef +_INO64_T + + +141 +__dw_o64_t + + to64_t +; + +142 + #_INO64_T + + + ) + +146 #ide +_KEY_T + + +147 + #_KEY_T + + + ) + +148 +__t32_t + + tkey_t +; + +151 #idef +_MODE_T + + +152 +__dw_mode_t + + tmode_t +; + +153 + #_MODE_T + + + ) + +156 #ide +_NLINK_T + + +157 +__ut16_t + + tƚk_t +; + +158 + #_NLINK_T + + + ) + +161 #ide +_ID_T + + +162 + #_ID_T + + + ) + +163 +__dw_id_t + + tid_t +; + +166 #ide +_PID_T + + +167 +__dw_pid_t + + tpid_t +; + +168 + #_PID_T + + + ) + +171 #ide +_OFF_T + + +172 +__dw_off_t + + toff_t +; + +173 + #_OFF_T + + + ) + +176 +t32_t + + tgsz_t +; + +177 +t32_t + + tswblk_t +; + +179 #ide +_UID_T + + +180 +__dw_uid_t + + tuid_t +; + +181 + #_UID_T + + + ) + +184 #ide +_ID_T + + +185 +__dw_id_t + + tid_t +; + +186 + #_ID_T + + + ) + +189 #i! +defed +( +_POSIX_C_SOURCE +|| defed( +_DARWIN_C_SOURCE +) + +191 #i +defed +( +__lulus +) + +197 +le + +__t32_t + + $maj +( +__ut32_t + +_x +) + +199 ( +__t32_t +)((( +__ut32_t +) +_x + >> 24) & 0xff); + +200 + } +} + +202 +le + +__t32_t + + $m +( +__ut32_t + +_x +) + +204 ( +__t32_t +)(( +_x +) & 0xffffff); + +205 + } +} + +207 +le + +dev_t + + $makedev +( +__ut32_t + +_maj +, __ut32_ +_m +) + +209 ( +dev_t +)((( +_maj +<< 24| ( +_m +)); + +210 + } +} + +214 + #maj +( +x +(( +t32_t +)((( +u_t32_t +)(x>> 24& 0xff)) + + ) + +215 + #m +( +x +(( +t32_t +)((x& 0xffffff)) + + ) + +216 + #makedev +( +x +, +y +(( +dev_t +)(((x<< 24| (y))) + + ) + +221 #idef +_CLOCK_T + + +222 + #_CLOCK_T + + + ) + +223 +__dw_ock_t + + tock_t +; + +226 #ide +_SIZE_T + + +227 + #_SIZE_T + + + ) + +230 +__dw_size_t + + tsize_t +; + +233 #idef +_SSIZE_T + + +234 + #_SSIZE_T + + + ) + +235 +__dw_ssize_t + + tssize_t +; + +238 #idef +_TIME_T + + +239 + #_TIME_T + + + ) + +240 +__dw_time_t + + ttime_t +; + +243 #ide +_USECONDS_T + + +244 + #_USECONDS_T + + + ) + +245 +__dw_ucds_t + + tucds_t +; + +248 #ide +_SUSECONDS_T + + +249 + #_SUSECONDS_T + + + ) + +250 +__dw_sucds_t + + tsucds_t +; + +253 #i! +defed +( +_POSIX_C_SOURCE +|| defed( +_DARWIN_C_SOURCE +) + +259 + #__ed_fd_t + + + ) + +260 + ~<sys/_rus.h +> + +262 + #NBBY + +__DARWIN_NBBY + + + ) + +263 + #NFDBITS + +__DARWIN_NFDBITS + + + ) + +264 + #howmy +( +x +, +y + + `__DARWIN_howmy +(x, y + + ) + +265 +__t32_t + + tfd_mask +; + +273 #idef +FD_SETSIZE + + +274 + #FD_SETSIZE + +__DARWIN_FD_SETSIZE + + + ) + +276 #ide +FD_SET + + +277 + #FD_SET +( +n +, +p + + `__DARWIN_FD_SET +,) + + ) + +279 #ide +FD_CLR + + +280 + #FD_CLR +( +n +, +p + + `__DARWIN_FD_CLR +,) + + ) + +282 #ide +FD_ISSET + + +283 + #FD_ISSET +( +n +, +p + + `__DARWIN_FD_ISSET +,) + + ) + +285 #ide +FD_ZERO + + +286 + #FD_ZERO +( +p + + `__DARWIN_FD_ZERO +) + + ) + +288 #i! +defed +( +_POSIX_C_SOURCE +|| defed( +_DARWIN_C_SOURCE +) + +289 #ide +FD_COPY + + +290 + #FD_COPY +( +f +, +t + + `__DARWIN_FD_COPY +(f,) + + ) + +295 #i +defed +( +__STDC__ +&& defed( +KERNEL +) + +301 + goc +; + +302 + gpg +; + +303 + gued +; + +304 + gruge +; + +305 + gfe +; + +306 + gbuf +; + +307 + gy +; + +308 + guio +; + +314 #ide +__POSIX_LIB__ + + +316 #ide +_PTHREAD_ATTR_T + + +317 + #_PTHREAD_ATTR_T + + + ) + +318 +__dw_had__t + + thad__t +; + +320 #ide +_PTHREAD_COND_T + + +321 + #_PTHREAD_COND_T + + + ) + +322 +__dw_had_cd_t + + thad_cd_t +; + +324 #ide +_PTHREAD_CONDATTR_T + + +325 + #_PTHREAD_CONDATTR_T + + + ) + +326 +__dw_had_cd_t + + thad_cd_t +; + +328 #ide +_PTHREAD_MUTEX_T + + +329 + #_PTHREAD_MUTEX_T + + + ) + +330 +__dw_had_mux_t + + thad_mux_t +; + +332 #ide +_PTHREAD_MUTEXATTR_T + + +333 + #_PTHREAD_MUTEXATTR_T + + + ) + +334 +__dw_had_mux_t + + thad_mux_t +; + +336 #ide +_PTHREAD_ONCE_T + + +337 + #_PTHREAD_ONCE_T + + + ) + +338 +__dw_had__t + + thad__t +; + +340 #ide +_PTHREAD_RWLOCK_T + + +341 + #_PTHREAD_RWLOCK_T + + + ) + +342 +__dw_had_rwlock_t + + thad_rwlock_t +; + +344 #ide +_PTHREAD_RWLOCKATTR_T + + +345 + #_PTHREAD_RWLOCKATTR_T + + + ) + +346 +__dw_had_rwlock_t + + thad_rwlock_t +; + +348 #ide +_PTHREAD_T + + +349 + #_PTHREAD_T + + + ) + +350 +__dw_had_t + + thad_t +; + +355 #ide +_PTHREAD_KEY_T + + +356 + #_PTHREAD_KEY_T + + + ) + +357 +__dw_had_key_t + + thad_key_t +; + +361 #ide +_FSBLKCNT_T + + +362 + #_FSBLKCNT_T + + + ) + +363 +__dw_fsblkt_t + + tfsblkt_t +; + +366 #ide +_FSFILCNT_T + + +367 + #_FSFILCNT_T + + + ) + +368 +__dw_fsft_t + + tfsft_t +; + + @/usr/include/unistd.h + +68 #ide +_UNISTD_H_ + + +69 + #_UNISTD_H_ + + + ) + +71 + ~<_tys.h +> + +72 + ~<sys/unid.h +> + +74 #i! +defed +( +_POSIX_C_SOURCE +|| defed( +_DARWIN_C_SOURCE +) + +75 #ide +_DEV_T + + +76 + #_DEV_T + + + ) + +77 +__dw_dev_t + + tdev_t +; + +81 #ide +_GID_T + + +82 + #_GID_T + + + ) + +83 +__dw_gid_t + + tgid_t +; + +86 #ide +_INTPTR_T + + +87 + #_INTPTR_T + + + ) + +88 +__dw__t + + t_t +; + +91 #i! +defed +( +_POSIX_C_SOURCE +|| defed( +_DARWIN_C_SOURCE +) + +92 #ide +_MODE_T + + +93 + #_MODE_T + + + ) + +94 +__dw_mode_t + + tmode_t +; + +98 #ide +_OFF_T + + +99 + #_OFF_T + + + ) + +100 +__dw_off_t + + toff_t +; + +103 #ide +_PID_T + + +104 + #_PID_T + + + ) + +105 +__dw_pid_t + + tpid_t +; + +108 #ide +_SIZE_T + + +109 + #_SIZE_T + + + ) + +112 +__dw_size_t + + tsize_t +; + +115 #idef +_SSIZE_T + + +116 + #_SSIZE_T + + + ) + +117 +__dw_ssize_t + + tssize_t +; + +120 #ide +_UID_T + + +121 + #_UID_T + + + ) + +122 +__dw_uid_t + + tuid_t +; + +125 #ide +_USECONDS_T + + +126 + #_USECONDS_T + + + ) + +127 +__dw_ucds_t + + tucds_t +; + +130 #i! +defed +( +_POSIX_C_SOURCE +|| defed( +_DARWIN_C_SOURCE +) + +131 #ide +_UUID_T + + +132 + #_UUID_T + + + ) + +133 +__dw_uuid_t + + tuuid_t +; + +137 + #STDIN_FILENO + 0 + + ) + +138 + #STDOUT_FILENO + 1 + + ) + +139 + #STDERR_FILENO + 2 + + ) + +141 #ide +NULL + + +142 + #NULL + +__DARWIN_NULL + + + ) + +147 + #_XOPEN_VERSION + 600 + + ) + +148 + #_XOPEN_XCU_VERSION + 4 + + ) + +152 + #_POSIX_ADVISORY_INFO + (-1 + + ) + +153 + #_POSIX_ASYNCHRONOUS_IO + (-1 + + ) + +154 + #_POSIX_BARRIERS + (-1 + + ) + +155 + #_POSIX_CHOWN_RESTRICTED + 200112L + + ) + +156 + #_POSIX_CLOCK_SELECTION + (-1 + + ) + +157 + #_POSIX_CPUTIME + (-1 + + ) + +158 + #_POSIX_FSYNC + 200112L + + ) + +159 + #_POSIX_IPV6 + 200112L + + ) + +160 + #_POSIX_JOB_CONTROL + 200112L + + ) + +161 + #_POSIX_MAPPED_FILES + 200112L + + ) + +162 + #_POSIX_MEMLOCK + (-1 + + ) + +163 + #_POSIX_MEMLOCK_RANGE + (-1 + + ) + +164 + #_POSIX_MEMORY_PROTECTION + 200112L + + ) + +165 + #_POSIX_MESSAGE_PASSING + (-1 + + ) + +166 + #_POSIX_MONOTONIC_CLOCK + (-1 + + ) + +167 + #_POSIX_NO_TRUNC + 200112L + + ) + +168 + #_POSIX_PRIORITIZED_IO + (-1 + + ) + +169 + #_POSIX_PRIORITY_SCHEDULING + (-1 + + ) + +170 + #_POSIX_RAW_SOCKETS + (-1 + + ) + +171 + #_POSIX_READER_WRITER_LOCKS + 200112L + + ) + +172 + #_POSIX_REALTIME_SIGNALS + (-1 + + ) + +173 + #_POSIX_REGEXP + 200112L + + ) + +174 + #_POSIX_SAVED_IDS + 200112L + + ) + +175 + #_POSIX_SEMAPHORES + (-1 + + ) + +176 + #_POSIX_SHARED_MEMORY_OBJECTS + (-1 + + ) + +177 + #_POSIX_SHELL + 200112L + + ) + +178 + #_POSIX_SPAWN + (-1 + + ) + +179 + #_POSIX_SPIN_LOCKS + (-1 + + ) + +180 + #_POSIX_SPORADIC_SERVER + (-1 + + ) + +181 + #_POSIX_SYNCHRONIZED_IO + (-1 + + ) + +182 + #_POSIX_THREAD_ATTR_STACKADDR + 200112L + + ) + +183 + #_POSIX_THREAD_ATTR_STACKSIZE + 200112L + + ) + +184 + #_POSIX_THREAD_CPUTIME + (-1 + + ) + +185 + #_POSIX_THREAD_PRIO_INHERIT + (-1 + + ) + +186 + #_POSIX_THREAD_PRIO_PROTECT + (-1 + + ) + +187 + #_POSIX_THREAD_PRIORITY_SCHEDULING + (-1 + + ) + +188 + #_POSIX_THREAD_PROCESS_SHARED + 200112L + + ) + +189 + #_POSIX_THREAD_SAFE_FUNCTIONS + 200112L + + ) + +190 + #_POSIX_THREAD_SPORADIC_SERVER + (-1 + + ) + +191 + #_POSIX_THREADS + 200112L + + ) + +192 + #_POSIX_TIMEOUTS + (-1 + + ) + +193 + #_POSIX_TIMERS + (-1 + + ) + +194 + #_POSIX_TRACE + (-1 + + ) + +195 + #_POSIX_TRACE_EVENT_FILTER + (-1 + + ) + +196 + #_POSIX_TRACE_INHERIT + (-1 + + ) + +197 + #_POSIX_TRACE_LOG + (-1 + + ) + +198 + #_POSIX_TYPED_MEMORY_OBJECTS + (-1 + + ) + +199 #ide +_POSIX_VDISABLE + + +200 + #_POSIX_VDISABLE + 0xf + + ) + +203 + #_POSIX2_C_BIND + 200112L + + ) + +204 + #_POSIX2_C_DEV + 200112L + + ) + +205 + #_POSIX2_CHAR_TERM + 200112L + + ) + +206 + #_POSIX2_FORT_DEV + (-1 + + ) + +207 + #_POSIX2_FORT_RUN + 200112L + + ) + +208 + #_POSIX2_LOCALEDEF + 200112L + + ) + +209 + #_POSIX2_PBS + (-1) + + ) + +210 + #_POSIX2_PBS_ACCOUNTING + (-1) + + ) + +211 + #_POSIX2_PBS_CHECKPOINT + (-1) + + ) + +212 + #_POSIX2_PBS_LOCATE + (-1) + + ) + +213 + #_POSIX2_PBS_MESSAGE + (-1) + + ) + +214 + #_POSIX2_PBS_TRACK + (-1) + + ) + +215 + #_POSIX2_SW_DEV + 200112L + + ) + +216 + #_POSIX2_UPE + 200112L + + ) + +218 + #_V6_ILP32_OFF32 + (-1) + + ) + +219 + #_V6_ILP32_OFFBIG + (1) + + ) + +220 + #_V6_LP64_OFF64 + (-1) + + ) + +221 + #_V6_LPBIG_OFFBIG + (-1) + + ) + +223 + #_XBS5_ILP32_OFF32 + +_V6_ILP32_OFF32 + + + ) + +224 + #_XBS5_ILP32_OFFBIG + +_V6_ILP32_OFFBIG + + + ) + +225 + #_XBS5_LP64_OFF64 + +_V6_LP64_OFF64 + + + ) + +226 + #_XBS5_LPBIG_OFFBIG + +_V6_LPBIG_OFFBIG + + + ) + +228 + #_XOPEN_CRYPT + (1) + + ) + +229 + #_XOPEN_ENH_I18N + (1 + + ) + +230 + #_XOPEN_LEGACY + (-1 + + ) + +231 + #_XOPEN_REALTIME + (-1 + + ) + +232 + #_XOPEN_REALTIME_THREADS + (-1 + + ) + +233 + #_XOPEN_SHM + (1) + + ) + +234 + #_XOPEN_STREAMS + (-1) + + ) + +235 + #_XOPEN_UNIX + (1) + + ) + +238 + #F_ULOCK + 0 + + ) + +239 + #F_LOCK + 1 + + ) + +240 + #F_TLOCK + 2 + + ) + +241 + #F_TEST + 3 + + ) + +244 + #_SC_ARG_MAX + 1 + + ) + +245 + #_SC_CHILD_MAX + 2 + + ) + +246 + #_SC_CLK_TCK + 3 + + ) + +247 + #_SC_NGROUPS_MAX + 4 + + ) + +248 + #_SC_OPEN_MAX + 5 + + ) + +249 + #_SC_JOB_CONTROL + 6 + + ) + +250 + #_SC_SAVED_IDS + 7 + + ) + +251 + #_SC_VERSION + 8 + + ) + +252 + #_SC_BC_BASE_MAX + 9 + + ) + +253 + #_SC_BC_DIM_MAX + 10 + + ) + +254 + #_SC_BC_SCALE_MAX + 11 + + ) + +255 + #_SC_BC_STRING_MAX + 12 + + ) + +256 + #_SC_COLL_WEIGHTS_MAX + 13 + + ) + +257 + #_SC_EXPR_NEST_MAX + 14 + + ) + +258 + #_SC_LINE_MAX + 15 + + ) + +259 + #_SC_RE_DUP_MAX + 16 + + ) + +260 + #_SC_2_VERSION + 17 + + ) + +261 + #_SC_2_C_BIND + 18 + + ) + +262 + #_SC_2_C_DEV + 19 + + ) + +263 + #_SC_2_CHAR_TERM + 20 + + ) + +264 + #_SC_2_FORT_DEV + 21 + + ) + +265 + #_SC_2_FORT_RUN + 22 + + ) + +266 + #_SC_2_LOCALEDEF + 23 + + ) + +267 + #_SC_2_SW_DEV + 24 + + ) + +268 + #_SC_2_UPE + 25 + + ) + +269 + #_SC_STREAM_MAX + 26 + + ) + +270 + #_SC_TZNAME_MAX + 27 + + ) + +271 + #_SC_ASYNCHRONOUS_IO + 28 + + ) + +272 + #_SC_PAGESIZE + 29 + + ) + +273 + #_SC_MEMLOCK + 30 + + ) + +274 + #_SC_MEMLOCK_RANGE + 31 + + ) + +275 + #_SC_MEMORY_PROTECTION + 32 + + ) + +276 + #_SC_MESSAGE_PASSING + 33 + + ) + +277 + #_SC_PRIORITIZED_IO + 34 + + ) + +278 + #_SC_PRIORITY_SCHEDULING + 35 + + ) + +279 + #_SC_REALTIME_SIGNALS + 36 + + ) + +280 + #_SC_SEMAPHORES + 37 + + ) + +281 + #_SC_FSYNC + 38 + + ) + +282 + #_SC_SHARED_MEMORY_OBJECTS + 39 + + ) + +283 + #_SC_SYNCHRONIZED_IO + 40 + + ) + +284 + #_SC_TIMERS + 41 + + ) + +285 + #_SC_AIO_LISTIO_MAX + 42 + + ) + +286 + #_SC_AIO_MAX + 43 + + ) + +287 + #_SC_AIO_PRIO_DELTA_MAX + 44 + + ) + +288 + #_SC_DELAYTIMER_MAX + 45 + + ) + +289 + #_SC_MQ_OPEN_MAX + 46 + + ) + +290 + #_SC_MAPPED_FILES + 47 + + ) + +291 + #_SC_RTSIG_MAX + 48 + + ) + +292 + #_SC_SEM_NSEMS_MAX + 49 + + ) + +293 + #_SC_SEM_VALUE_MAX + 50 + + ) + +294 + #_SC_SIGQUEUE_MAX + 51 + + ) + +295 + #_SC_TIMER_MAX + 52 + + ) + +296 #i! +defed +( +_POSIX_C_SOURCE +|| defed( +_DARWIN_C_SOURCE +) + +297 + #_SC_NPROCESSORS_CONF + 57 + + ) + +298 + #_SC_NPROCESSORS_ONLN + 58 + + ) + +300 + #_SC_2_PBS + 59 + + ) + +301 + #_SC_2_PBS_ACCOUNTING + 60 + + ) + +302 + #_SC_2_PBS_CHECKPOINT + 61 + + ) + +303 + #_SC_2_PBS_LOCATE + 62 + + ) + +304 + #_SC_2_PBS_MESSAGE + 63 + + ) + +305 + #_SC_2_PBS_TRACK + 64 + + ) + +306 + #_SC_ADVISORY_INFO + 65 + + ) + +307 + #_SC_BARRIERS + 66 + + ) + +308 + #_SC_CLOCK_SELECTION + 67 + + ) + +309 + #_SC_CPUTIME + 68 + + ) + +310 + #_SC_FILE_LOCKING + 69 + + ) + +311 + #_SC_GETGR_R_SIZE_MAX + 70 + + ) + +312 + #_SC_GETPW_R_SIZE_MAX + 71 + + ) + +313 + #_SC_HOST_NAME_MAX + 72 + + ) + +314 + #_SC_LOGIN_NAME_MAX + 73 + + ) + +315 + #_SC_MONOTONIC_CLOCK + 74 + + ) + +316 + #_SC_MQ_PRIO_MAX + 75 + + ) + +317 + #_SC_READER_WRITER_LOCKS + 76 + + ) + +318 + #_SC_REGEXP + 77 + + ) + +319 + #_SC_SHELL + 78 + + ) + +320 + #_SC_SPAWN + 79 + + ) + +321 + #_SC_SPIN_LOCKS + 80 + + ) + +322 + #_SC_SPORADIC_SERVER + 81 + + ) + +323 + #_SC_THREAD_ATTR_STACKADDR + 82 + + ) + +324 + #_SC_THREAD_ATTR_STACKSIZE + 83 + + ) + +325 + #_SC_THREAD_CPUTIME + 84 + + ) + +326 + #_SC_THREAD_DESTRUCTOR_ITERATIONS + 85 + + ) + +327 + #_SC_THREAD_KEYS_MAX + 86 + + ) + +328 + #_SC_THREAD_PRIO_INHERIT + 87 + + ) + +329 + #_SC_THREAD_PRIO_PROTECT + 88 + + ) + +330 + #_SC_THREAD_PRIORITY_SCHEDULING + 89 + + ) + +331 + #_SC_THREAD_PROCESS_SHARED + 90 + + ) + +332 + #_SC_THREAD_SAFE_FUNCTIONS + 91 + + ) + +333 + #_SC_THREAD_SPORADIC_SERVER + 92 + + ) + +334 + #_SC_THREAD_STACK_MIN + 93 + + ) + +335 + #_SC_THREAD_THREADS_MAX + 94 + + ) + +336 + #_SC_TIMEOUTS + 95 + + ) + +337 + #_SC_THREADS + 96 + + ) + +338 + #_SC_TRACE + 97 + + ) + +339 + #_SC_TRACE_EVENT_FILTER + 98 + + ) + +340 + #_SC_TRACE_INHERIT + 99 + + ) + +341 + #_SC_TRACE_LOG + 100 + + ) + +342 + #_SC_TTY_NAME_MAX + 101 + + ) + +343 + #_SC_TYPED_MEMORY_OBJECTS + 102 + + ) + +344 + #_SC_V6_ILP32_OFF32 + 103 + + ) + +345 + #_SC_V6_ILP32_OFFBIG + 104 + + ) + +346 + #_SC_V6_LP64_OFF64 + 105 + + ) + +347 + #_SC_V6_LPBIG_OFFBIG + 106 + + ) + +348 + #_SC_IPV6 + 118 + + ) + +349 + #_SC_RAW_SOCKETS + 119 + + ) + +350 + #_SC_SYMLOOP_MAX + 120 + + ) + +351 + #_SC_ATEXIT_MAX + 107 + + ) + +352 + #_SC_IOV_MAX + 56 + + ) + +353 + #_SC_PAGE_SIZE + +_SC_PAGESIZE + + + ) + +354 + #_SC_XOPEN_CRYPT + 108 + + ) + +355 + #_SC_XOPEN_ENH_I18N + 109 + + ) + +356 + #_SC_XOPEN_LEGACY + 110 + + ) + +357 + #_SC_XOPEN_REALTIME + 111 + + ) + +358 + #_SC_XOPEN_REALTIME_THREADS + 112 + + ) + +359 + #_SC_XOPEN_SHM + 113 + + ) + +360 + #_SC_XOPEN_STREAMS + 114 + + ) + +361 + #_SC_XOPEN_UNIX + 115 + + ) + +362 + #_SC_XOPEN_VERSION + 116 + + ) + +363 + #_SC_XOPEN_XCU_VERSION + 121 + + ) + +364 + #_SC_XBS5_ILP32_OFF32 + 122 + + ) + +365 + #_SC_XBS5_ILP32_OFFBIG + 123 + + ) + +366 + #_SC_XBS5_LP64_OFF64 + 124 + + ) + +367 + #_SC_XBS5_LPBIG_OFFBIG + 125 + + ) + +368 + #_SC_SS_REPL_MAX + 126 + + ) + +369 + #_SC_TRACE_EVENT_NAME_MAX + 127 + + ) + +370 + #_SC_TRACE_NAME_MAX + 128 + + ) + +371 + #_SC_TRACE_SYS_MAX + 129 + + ) + +372 + #_SC_TRACE_USER_EVENT_MAX + 130 + + ) + +373 + #_SC_PASS_MAX + 131 + + ) + +375 #ide +_CS_PATH + + +376 + #_CS_PATH + 1 + + ) + +378 + #_CS_POSIX_V6_ILP32_OFF32_CFLAGS + 2 + + ) + +379 + #_CS_POSIX_V6_ILP32_OFF32_LDFLAGS + 3 + + ) + +380 + #_CS_POSIX_V6_ILP32_OFF32_LIBS + 4 + + ) + +381 + #_CS_POSIX_V6_ILP32_OFFBIG_CFLAGS + 5 + + ) + +382 + #_CS_POSIX_V6_ILP32_OFFBIG_LDFLAGS + 6 + + ) + +383 + #_CS_POSIX_V6_ILP32_OFFBIG_LIBS + 7 + + ) + +384 + #_CS_POSIX_V6_LP64_OFF64_CFLAGS + 8 + + ) + +385 + #_CS_POSIX_V6_LP64_OFF64_LDFLAGS + 9 + + ) + +386 + #_CS_POSIX_V6_LP64_OFF64_LIBS + 10 + + ) + +387 + #_CS_POSIX_V6_LPBIG_OFFBIG_CFLAGS + 11 + + ) + +388 + #_CS_POSIX_V6_LPBIG_OFFBIG_LDFLAGS + 12 + + ) + +389 + #_CS_POSIX_V6_LPBIG_OFFBIG_LIBS + 13 + + ) + +390 + #_CS_POSIX_V6_WIDTH_RESTRICTED_ENVS + 14 + + ) + +393 + #_CS_XBS5_ILP32_OFF32_CFLAGS + 20 + + ) + +394 + #_CS_XBS5_ILP32_OFF32_LDFLAGS + 21 + + ) + +395 + #_CS_XBS5_ILP32_OFF32_LIBS + 22 + + ) + +396 + #_CS_XBS5_ILP32_OFF32_LINTFLAGS + 23 + + ) + +397 + #_CS_XBS5_ILP32_OFFBIG_CFLAGS + 24 + + ) + +398 + #_CS_XBS5_ILP32_OFFBIG_LDFLAGS + 25 + + ) + +399 + #_CS_XBS5_ILP32_OFFBIG_LIBS + 26 + + ) + +400 + #_CS_XBS5_ILP32_OFFBIG_LINTFLAGS + 27 + + ) + +401 + #_CS_XBS5_LP64_OFF64_CFLAGS + 28 + + ) + +402 + #_CS_XBS5_LP64_OFF64_LDFLAGS + 29 + + ) + +403 + #_CS_XBS5_LP64_OFF64_LIBS + 30 + + ) + +404 + #_CS_XBS5_LP64_OFF64_LINTFLAGS + 31 + + ) + +405 + #_CS_XBS5_LPBIG_OFFBIG_CFLAGS + 32 + + ) + +406 + #_CS_XBS5_LPBIG_OFFBIG_LDFLAGS + 33 + + ) + +407 + #_CS_XBS5_LPBIG_OFFBIG_LIBS + 34 + + ) + +408 + #_CS_XBS5_LPBIG_OFFBIG_LINTFLAGS + 35 + + ) + +410 + #_CS_DARWIN_USER_DIR + 65536 + + ) + +411 + #_CS_DARWIN_USER_TEMP_DIR + 65537 + + ) + +412 + #_CS_DARWIN_USER_CACHE_DIR + 65538 + + ) + +414 +__BEGIN_DECLS + + +416 + $_ex +( +__dd2 +; + +417 + `acss +(const *, ); + +419 + `m +(); + +420 + `chd +(const *); + +421 + `chown +(cڡ *, +uid_t +, +gid_t +); + +422 + $o +( + `__DARWIN_ALIAS_C +( +o +); + +423 +size_t + + $cfr +(, *, +size_t + + `__DARWIN_ALIAS +( +cfr +); + +424 * + `y +(const *, const *); + +425 * + `mid +(*); + +426 + `dup +(); + +427 + `dup2 +(, ); + +428 #i +__DARWIN_UNIX03 + + +429 + $y +(*, + `__DARWIN_ALIAS +( +y +); + +431 + `y +(*, ); + +433 + `exe +(const *, const *, ...); + +434 + `exee +(const *, const *, ...); + +435 + `exep +(const *, const *, ...); + +436 + `execv +(const *, * const *); + +437 + `execve +(const *, * const *, * const *); + +438 + `execvp +(const *, * const *); + +439 + `fchown +(, +uid_t +, +gid_t +); + +440 + `fchd +(); + +441 +pid_t + + `fk +(); + +442 + `hcf +(, ); + +443 + $fsync +( + `__DARWIN_ALIAS_C +( +fsync +); + +444 + `run +(, +off_t +); + +445 * + `gcwd +(*, +size_t +); + +446 +gid_t + + `gegid +(); + +447 +uid_t + + `geuid +(); + +448 +gid_t + + `ggid +(); + +449 + `ggroups +(, +gid_t + []); + +450 + `ghoid +(); + +451 + `ghome +(*, +size_t +); + +452 * + `glog +(); + +453 + `glog_r +(*, +size_t +); + +454 + $gt +(, * cڡ [], cڡ * + `__DARWIN_ALIAS +( +gt +); + +455 +pid_t + + `gpgid +(pid_t); + +456 +pid_t + + `gpg +(); + +457 +pid_t + + `gpid +(); + +458 +pid_t + + `gid +(); + +459 +pid_t + + `gsid +(pid_t); + +460 +uid_t + + `guid +(); + +461 * + `gwd +(*); + +462 + `iy +(); + +463 + $lchown +(cڡ *, +uid_t +, +gid_t + + `__DARWIN_ALIAS +( +lchown +); + +464 + `lk +(const *, const *); + +465 + $lockf +(, , +off_t + + `__DARWIN_ALIAS_C +( +lockf +); + +466 +off_t + + `lek +(, off_t, ); + +467 + $ni +( + `__DARWIN_ALIAS +( +ni +); + +468 + `thcf +(const *, ); + +469 + $u +( + `__DARWIN_ALIAS_C +( +u +); + +470 + `pe +([2]); + +471 +ssize_t + + $d +(, *, +size_t +, +off_t + + `__DARWIN_ALIAS_C +( +d +); + +472 +ssize_t + + $pwre +(, cڡ *, +size_t +, +off_t + + `__DARWIN_ALIAS_C +( +pwre +); + +473 +ssize_t + + $ad +(, *, +size_t + + `__DARWIN_ALIAS_C +( +ad +); + +474 +ssize_t + + `adlk +(cڡ * +__ri +, * __ri, +size_t +); + +475 + `rmd +(const *); + +476 + `gid +( +gid_t +); + +477 + `uid +( +uid_t +); + +478 + `tgid +( +gid_t +); + +479 + `gid +( +pid_t +,id_t); + +480 #i +__DARWIN_UNIX03 + + +481 +pid_t + + $g +( + `__DARWIN_ALIAS +( +g +); + +483 + `g +( +pid_t + +pid +,id_ +pg +); + +485 + $egid +( +gid_t +, gid_t + `__DARWIN_ALIAS +( +egid +); + +486 + $euid +( +uid_t +, uid_t + `__DARWIN_ALIAS +( +euid +); + +487 +pid_t + + `tsid +(); + +488 + `tuid +( +uid_t +); + +490 + $p +( + `__DARWIN_ALIAS_C +( +p +); + +491 + `swab +(cڡ * +__ri +, * __ri, +ssize_t +); + +492 + `symlk +(const *, const *); + +493 + `sync +(); + +494 + `syscf +(); + +495 +pid_t + + `tcgpg +(); + +496 + `tcg +(, +pid_t +); + +497 + `un +(cڡ *, +off_t +); + +498 * + `yme +(); + +499 #i +__DARWIN_UNIX03 + + +500 + $yme_r +(, *, +size_t + + `__DARWIN_ALIAS +( +yme_r +); + +502 * + `yme_r +(, *, +size_t +); + +504 +ucds_t + + +505 + `um +( +ucds_t +, useconds_t); + +506 + `uƚk +(const *); + +507 + $up +( +ucds_t + + `__DARWIN_ALIAS_C +( +up +); + +508 +pid_t + + `vfk +(); + +509 +ssize_t + + $wre +(, cڡ *, +size_t + + `__DARWIN_ALIAS_C +( +wre +); + +511
* +ݏrg +; + +512
+td +, + +, +tt +; + +514 #if ! + `defed +( +_POSIX_C_SOURCE +|| defed( +_DARWIN_C_SOURCE +) + +515 + ~<sys/.h +> + +517 + $_Ex +( +__dd2 +; + +518 + `acssx_ +(cڡ +acssx_dest + *, +size_t +, *, +uid_t +); + +519 + `ac +(const *); + +520 + `add_of +(*, +size_t +, , ); + +521 * + `brk +(const *); + +522 + `chro +(const *); + +523 + `durshl +(); + +524 + `execvP +(const *, const *, * const *); + +525 * + `fagor +(); + +526 + `gdbsize +(); + +527 + `gdomame +(*, ); + +528 + `ggroui +(const *, , *, *); + +529 +mode_t + + `gmode +(const *, mode_t); + +530 + $ggesize +( +__pu2 +; + +531 * + `gss +(const *); + +532 + `geid +(, +uid_t + *, +gid_t + *); + +533 + `gpgid +( +pid_t + +_pid +); + +534 + `gsgroups_ +(*, +uuid_t +); + +535 + `gsid +( +pid_t + +_pid +); + +536 * + `gurshl +(); + +537 + `gwgroups_ +(*, +uuid_t +); + +538 + `groups +(const *, ); + +539 + `urok +(, , const *, const *); + +540 + `urok_ +(const *, , , const *, const *); + +541 + `istugid +(); + +542 * + `mkdmp +(*); + +543 + `mknod +(cڡ *, +mode_t +, +dev_t +); + +544 + `mkemp +(*); + +545 + `mkemps +(*, ); + +546 * + `mkmp +(*); + +547 + `nfssvc +(, *); + +548 + `of +(*, +size_t +, , ); + +549 + `had_tugid_ +( +uid_t +, +gid_t +); + +550 + `had_gugid_ + +uid_t + *, +gid_t + *); + +551 + `rcmd +(**, , const *, const *, const *, *); + +552 + `rcmd_af +(**, , const *, const *, const *, *, + +554 + `bo +(); + +555 + `voke +(const *); + +556 + `esvpt +(*); + +557 + `esvpt_af +(*, ); + +558 + `rurok +(const *, , const *, const *); + +559 * + `sbrk +(); + +560 + `tdomame +(const *, ); + +561 + `tgroups +(, cڡ +gid_t + *); + +562 + `thoid +(); + +563 + `thome +(const *, ); + +564 #i +__DARWIN_UNIX03 + + +565 + $tkey +(cڡ * + `__DARWIN_ALIAS +( +tkey +); + +567 + `tkey +(const *); + +569 + `og +(const *); + +570 * + `tmode +(const *); + +571 + `gid +( +gid_t +); + +572 + `uid +( +uid_t +); + +573 + `tsgroups_ +(, cڡ +uuid_t +); + +574 + `turshl +(); + +575 + `twgroups_ +(, cڡ +uuid_t +); + +576 + `ofags +(**, *, *); + +577 + `sw +(const *); + +578 + `sys +(, ...); + +579 + `y +(); + +580 + `unde +(const *); + +581 + `unwheout +(const *); + +582 * + `vloc +( +size_t +); + +584
* +subݏrg +; + +585 + `gsubt +(**, * const *, **); + +588 #ifde +__LP64__ + + +589 + $gli +(cڡ *,*,*, +size_t +, + `__DARWIN_ALIAS +( +gli +); + +590 + $i +(cڡ *,*,*, +size_t +, + `__DARWIN_ALIAS +( +i +); + +591 + `exchgeda +(const *,const *,); + +592 + `gdr +(,*,*, +size_t +,*,*,*,); + +593 + `chfs +(const *,*,*,,,*); + +595 + `fsl +(const *,,*,); + +597 + $gli +(cڡ *,*,*, +size_t +, + `__DARWIN_ALIAS +( +gli +); + +598 + $i +(cڡ *,*,*, +size_t +, + `__DARWIN_ALIAS +( +i +); + +599 + `exchgeda +(const *,const *,); + +600 + `gdr +(,*,*, +size_t +,*,*,*,); + +601 + `chfs +(const *,*,*,,,*); + +603 + `fsl +(const *,,*,); + +606
+et +; + +609 +__END_DECLS + + + @/usr/include/_types.h + +24 #ide +__TYPES_H_ + + +25 + #__TYPES_H_ + + + ) + +27 + ~<sys/_tys.h +> + +29 + t__dw__em +; + +30 + t__dw_wns_t +; + +31 #ifde +__LP64__ + + +32 +__ut32_t + + t__dw_wy_t +; + +34 + t__dw_wy_t +; + +37 #ifde +__WCHAR_MAX__ + + +38 + #__DARWIN_WCHAR_MAX + +__WCHAR_MAX__ + + + ) + +40 + #__DARWIN_WCHAR_MAX + 0x7fffffff + + ) + +43 #i +__DARWIN_WCHAR_MAX + > 0xffffU + +44 + #__DARWIN_WCHAR_MIN + (-0x7ffffff- 1) + + ) + +46 + #__DARWIN_WCHAR_MIN + 0 + + ) + +48 + #__DARWIN_WEOF + (( +__dw_wt_t +)-1) + + ) + + @/usr/include/_xlocale.h + +24 #ide +__XLOCALE_H_ + + +25 + #__XLOCALE_H_ + + + ) + +27 + ~<sys/cdefs.h +> + +29 +__BEGIN_DECLS + + +30 +___mb_cur_max +(); + +31 +___mb_cur_max_l +( +lo_t +); + +32 + g__END_DECLS + + + @/usr/include/alloca.h + +24 #ide +_ALLOCA_H_ + + +25 + #_ALLOCA_H_ + + + ) + +27 + ~<sys/cdefs.h +> + +28 + ~<_tys.h +> + +30 #idef +_SIZE_T + + +31 + #_SIZE_T + + + ) + +32 +__dw_size_t + + tsize_t +; + +35 +__BEGIN_DECLS + + +36 * +lo +( +size_t +); + +37 + g__END_DECLS + + +39 #i +defed +( +__GNUC__ +) && __GNUC__ >= 3 + +41 #unde +lo + + +42 #unde +__lo + + +43 + #lo +( +size + + `__lo +(size) + + ) + +44 + #__lo +( +size + + `__but_lo +(size) + + ) + + @/usr/include/available.h + +65 #ide +_AVAILABLE_H_ + + +66 + #_AVAILABLE_H_ + + + ) + +72 + #__MAC_OS_X_VERSION_10_0 + 1000 + + ) + +73 + #__MAC_OS_X_VERSION_10_1 + 1010 + + ) + +74 + #__MAC_OS_X_VERSION_10_2 + 1020 + + ) + +75 + #__MAC_OS_X_VERSION_10_3 + 1030 + + ) + +76 + #__MAC_OS_X_VERSION_10_4 + 1040 + + ) + +77 + #__MAC_OS_X_VERSION_10_5 + 1050 + + ) + +84 #ide +__MAC_OS_X_VERSION_MIN_REQUIRED + + +85 #ifde +__ENVIRONMENT_MAC_OS_X_VERSION_MIN_REQUIRED__ + + +86 + #__MAC_OS_X_VERSION_MIN_REQUIRED + +__ENVIRONMENT_MAC_OS_X_VERSION_MIN_REQUIRED__ + + + ) + +88 #i +__c64__ + || +__i386__ + || +__x86_64__ + + +89 + #__MAC_OS_X_VERSION_MIN_REQUIRED + +__MAC_OS_X_VERSION_10_4 + + + ) + +91 + #__MAC_OS_X_VERSION_MIN_REQUIRED + +__MAC_OS_X_VERSION_10_1 + + + ) + +99 #ide +__MAC_OS_X_VERSION_MAX_ALLOWED + + +100 #i +__MAC_OS_X_VERSION_MIN_REQUIRED + > +__MAC_OS_X_VERSION_10_5 + + +101 + #__MAC_OS_X_VERSION_MAX_ALLOWED + +__MAC_OS_X_VERSION_MIN_REQUIRED + + + ) + +103 + #__MAC_OS_X_VERSION_MAX_ALLOWED + +__MAC_OS_X_VERSION_10_5 + + + ) + +110 #i +__MAC_OS_X_VERSION_MAX_ALLOWED + < +__MAC_OS_X_VERSION_MIN_REQUIRED + + +111 #r +__MAC_OS_X_VERSION_MAX_ALLOWED + +mu + +be + > +__MAC_OS_X_VERSION_MIN_REQUIRED + + +113 #i +__MAC_OS_X_VERSION_MIN_REQUIRED + < +__MAC_OS_X_VERSION_10_0 + + +114 #r +__MAC_OS_X_VERSION_MIN_REQUIRED + +mu + +be + > +__MAC_OS_X_VERSION_10_0 + + +120 #i +defed +( +__GNUC__ +&& ((__GNUC__ >4|| ((__GNUC__ =3&& ( +__GNUC_MINOR__ + >1))&& ( +__MAC_OS_X_VERSION_MIN_REQUIRED + >= 1020) + +121 + #__DARWIN_WEAK_IMPORT_ATTRIBUTE + + `__ibu__ +(( +wk_impt +)) + + ) + +122 #i +defed +( +__MWERKS__ +&& (__MWERKS__ >0x3205&& ( +__MAC_OS_X_VERSION_MIN_REQUIRED + >= 1020) + +123 + #__DARWIN_WEAK_IMPORT_ATTRIBUTE + + `__ibu__ +(( +wk_impt +)) + + ) + +125 + #__DARWIN_WEAK_IMPORT_ATTRIBUTE + + + ) + +131 #i +defed +( +__GNUC__ +&& ((__GNUC__ >4|| ((__GNUC__ =3&& ( +__GNUC_MINOR__ + >= 1))) + +132 + #__DARWIN_DEPRECATED_ATTRIBUTE + + `__ibu__ +(( +dd +)) + + ) + +134 + #__DARWIN_DEPRECATED_ATTRIBUTE + + + ) + +140 #i +defed +( +__GNUC__ +&& ((__GNUC__ >4|| ((__GNUC__ =3&& ( +__GNUC_MINOR__ + >= 1))) + +141 + #__DARWIN_UNAVAILABLE_ATTRIBUTE + + `__ibu__ +(( +uvaab +)) + + ) + +143 + #__DARWIN_UNAVAILABLE_ATTRIBUTE + + + ) + +153 + #__AVAILABLE_MAC_OS_X_VERSION_10_0_AND_LATER + + + ) + +161 + #__AVAILABLE_MAC_OS_X_VERSION_10_0_AND_LATER_BUT_DEPRECATED + +__DARWIN_DEPRECATED_ATTRIBUTE + + + ) + +168 + #__DEPRECATED_IN_MAC_OS_X_VERSION_10_0_AND_LATER + +__DARWIN_DEPRECATED_ATTRIBUTE + + + ) + +180 #i +__MAC_OS_X_VERSION_MAX_ALLOWED + < +__MAC_OS_X_VERSION_10_1 + + +181 + #__AVAILABLE_MAC_OS_X_VERSION_10_1_AND_LATER + +__DARWIN_UNAVAILABLE_ATTRIBUTE + + + ) + +182 #i +__MAC_OS_X_VERSION_MIN_REQUIRED + < +__MAC_OS_X_VERSION_10_1 + + +183 + #__AVAILABLE_MAC_OS_X_VERSION_10_1_AND_LATER + +__DARWIN_WEAK_IMPORT_ATTRIBUTE + + + ) + +185 + #__AVAILABLE_MAC_OS_X_VERSION_10_1_AND_LATER + + + ) + +194 #i +__MAC_OS_X_VERSION_MIN_REQUIRED + > +__MAC_OS_X_VERSION_10_1 + + +195 + #__AVAILABLE_MAC_OS_X_VERSION_10_1_AND_LATER_BUT_DEPRECATED + +__DARWIN_DEPRECATED_ATTRIBUTE + + + ) + +197 + #__AVAILABLE_MAC_OS_X_VERSION_10_1_AND_LATER_BUT_DEPRECATED + +__AVAILABLE_MAC_OS_X_VERSION_10_1_AND_LATER + + + ) + +206 #i +__MAC_OS_X_VERSION_MIN_REQUIRED + > +__MAC_OS_X_VERSION_10_1 + + +207 + #__AVAILABLE_MAC_OS_X_VERSION_10_0_AND_LATER_BUT_DEPRECATED_IN_MAC_OS_X_VERSION_10_1 + +__DARWIN_DEPRECATED_ATTRIBUTE + + + ) + +209 + #__AVAILABLE_MAC_OS_X_VERSION_10_0_AND_LATER_BUT_DEPRECATED_IN_MAC_OS_X_VERSION_10_1 + +__AVAILABLE_MAC_OS_X_VERSION_10_0_AND_LATER + + + ) + +217 #i +__MAC_OS_X_VERSION_MIN_REQUIRED + > +__MAC_OS_X_VERSION_10_1 + + +218 + #__DEPRECATED_IN_MAC_OS_X_VERSION_10_1_AND_LATER + +__DARWIN_DEPRECATED_ATTRIBUTE + + + ) + +220 + #__DEPRECATED_IN_MAC_OS_X_VERSION_10_1_AND_LATER + + + ) + +234 #i +__MAC_OS_X_VERSION_MAX_ALLOWED + < +__MAC_OS_X_VERSION_10_2 + + +235 + #__AVAILABLE_MAC_OS_X_VERSION_10_2_AND_LATER + +__DARWIN_UNAVAILABLE_ATTRIBUTE + + + ) + +236 #i +__MAC_OS_X_VERSION_MIN_REQUIRED + < +__MAC_OS_X_VERSION_10_2 + + +237 + #__AVAILABLE_MAC_OS_X_VERSION_10_2_AND_LATER + +__DARWIN_WEAK_IMPORT_ATTRIBUTE + + + ) + +239 + #__AVAILABLE_MAC_OS_X_VERSION_10_2_AND_LATER + + + ) + +248 #i +__MAC_OS_X_VERSION_MIN_REQUIRED + > +__MAC_OS_X_VERSION_10_2 + + +249 + #__AVAILABLE_MAC_OS_X_VERSION_10_2_AND_LATER_BUT_DEPRECATED + +__DARWIN_DEPRECATED_ATTRIBUTE + + + ) + +251 + #__AVAILABLE_MAC_OS_X_VERSION_10_2_AND_LATER_BUT_DEPRECATED + +__AVAILABLE_MAC_OS_X_VERSION_10_2_AND_LATER + + + ) + +260 #i +__MAC_OS_X_VERSION_MIN_REQUIRED + > +__MAC_OS_X_VERSION_10_2 + + +261 + #__AVAILABLE_MAC_OS_X_VERSION_10_0_AND_LATER_BUT_DEPRECATED_IN_MAC_OS_X_VERSION_10_2 + +__DARWIN_DEPRECATED_ATTRIBUTE + + + ) + +263 + #__AVAILABLE_MAC_OS_X_VERSION_10_0_AND_LATER_BUT_DEPRECATED_IN_MAC_OS_X_VERSION_10_2 + +__AVAILABLE_MAC_OS_X_VERSION_10_0_AND_LATER + + + ) + +272 #i +__MAC_OS_X_VERSION_MIN_REQUIRED + > +__MAC_OS_X_VERSION_10_2 + + +273 + #__AVAILABLE_MAC_OS_X_VERSION_10_1_AND_LATER_BUT_DEPRECATED_IN_MAC_OS_X_VERSION_10_2 + +__DARWIN_DEPRECATED_ATTRIBUTE + + + ) + +275 + #__AVAILABLE_MAC_OS_X_VERSION_10_1_AND_LATER_BUT_DEPRECATED_IN_MAC_OS_X_VERSION_10_2 + +__AVAILABLE_MAC_OS_X_VERSION_10_1_AND_LATER + + + ) + +283 #i +__MAC_OS_X_VERSION_MIN_REQUIRED + > +__MAC_OS_X_VERSION_10_2 + + +284 + #__DEPRECATED_IN_MAC_OS_X_VERSION_10_2_AND_LATER + +__DARWIN_DEPRECATED_ATTRIBUTE + + + ) + +286 + #__DEPRECATED_IN_MAC_OS_X_VERSION_10_2_AND_LATER + + + ) + +298 #i +__MAC_OS_X_VERSION_MAX_ALLOWED + < +__MAC_OS_X_VERSION_10_3 + + +299 + #__AVAILABLE_MAC_OS_X_VERSION_10_3_AND_LATER + +__DARWIN_UNAVAILABLE_ATTRIBUTE + + + ) + +300 #i +__MAC_OS_X_VERSION_MIN_REQUIRED + < +__MAC_OS_X_VERSION_10_3 + + +301 + #__AVAILABLE_MAC_OS_X_VERSION_10_3_AND_LATER + +__DARWIN_WEAK_IMPORT_ATTRIBUTE + + + ) + +303 + #__AVAILABLE_MAC_OS_X_VERSION_10_3_AND_LATER + + + ) + +312 #i +__MAC_OS_X_VERSION_MIN_REQUIRED + > +__MAC_OS_X_VERSION_10_3 + + +313 + #__AVAILABLE_MAC_OS_X_VERSION_10_3_AND_LATER_BUT_DEPRECATED + +__DARWIN_DEPRECATED_ATTRIBUTE + + + ) + +315 + #__AVAILABLE_MAC_OS_X_VERSION_10_3_AND_LATER_BUT_DEPRECATED + +__AVAILABLE_MAC_OS_X_VERSION_10_3_AND_LATER + + + ) + +324 #i +__MAC_OS_X_VERSION_MIN_REQUIRED + > +__MAC_OS_X_VERSION_10_3 + + +325 + #__AVAILABLE_MAC_OS_X_VERSION_10_0_AND_LATER_BUT_DEPRECATED_IN_MAC_OS_X_VERSION_10_3 + +__DARWIN_DEPRECATED_ATTRIBUTE + + + ) + +327 + #__AVAILABLE_MAC_OS_X_VERSION_10_0_AND_LATER_BUT_DEPRECATED_IN_MAC_OS_X_VERSION_10_3 + +__AVAILABLE_MAC_OS_X_VERSION_10_0_AND_LATER + + + ) + +336 #i +__MAC_OS_X_VERSION_MIN_REQUIRED + > +__MAC_OS_X_VERSION_10_3 + + +337 + #__AVAILABLE_MAC_OS_X_VERSION_10_1_AND_LATER_BUT_DEPRECATED_IN_MAC_OS_X_VERSION_10_3 + +__DARWIN_DEPRECATED_ATTRIBUTE + + + ) + +339 + #__AVAILABLE_MAC_OS_X_VERSION_10_1_AND_LATER_BUT_DEPRECATED_IN_MAC_OS_X_VERSION_10_3 + +__AVAILABLE_MAC_OS_X_VERSION_10_1_AND_LATER + + + ) + +348 #i +__MAC_OS_X_VERSION_MIN_REQUIRED + > +__MAC_OS_X_VERSION_10_3 + + +349 + #__AVAILABLE_MAC_OS_X_VERSION_10_2_AND_LATER_BUT_DEPRECATED_IN_MAC_OS_X_VERSION_10_3 + +__DARWIN_DEPRECATED_ATTRIBUTE + + + ) + +351 + #__AVAILABLE_MAC_OS_X_VERSION_10_2_AND_LATER_BUT_DEPRECATED_IN_MAC_OS_X_VERSION_10_3 + +__AVAILABLE_MAC_OS_X_VERSION_10_2_AND_LATER + + + ) + +359 #i +__MAC_OS_X_VERSION_MIN_REQUIRED + > +__MAC_OS_X_VERSION_10_3 + + +360 + #__DEPRECATED_IN_MAC_OS_X_VERSION_10_3_AND_LATER + +__DARWIN_DEPRECATED_ATTRIBUTE + + + ) + +362 + #__DEPRECATED_IN_MAC_OS_X_VERSION_10_3_AND_LATER + + + ) + +375 #i +__MAC_OS_X_VERSION_MAX_ALLOWED + < +__MAC_OS_X_VERSION_10_4 + + +376 + #__AVAILABLE_MAC_OS_X_VERSION_10_4_AND_LATER + +__DARWIN_UNAVAILABLE_ATTRIBUTE + + + ) + +377 #i +__MAC_OS_X_VERSION_MIN_REQUIRED + < +__MAC_OS_X_VERSION_10_4 + + +378 + #__AVAILABLE_MAC_OS_X_VERSION_10_4_AND_LATER + +__DARWIN_WEAK_IMPORT_ATTRIBUTE + + + ) + +380 + #__AVAILABLE_MAC_OS_X_VERSION_10_4_AND_LATER + + + ) + +389 #i +__MAC_OS_X_VERSION_MIN_REQUIRED + > +__MAC_OS_X_VERSION_10_4 + + +390 + #__AVAILABLE_MAC_OS_X_VERSION_10_4_AND_LATER_BUT_DEPRECATED + +__DARWIN_DEPRECATED_ATTRIBUTE + + + ) + +392 + #__AVAILABLE_MAC_OS_X_VERSION_10_4_AND_LATER_BUT_DEPRECATED + +__AVAILABLE_MAC_OS_X_VERSION_10_4_AND_LATER + + + ) + +401 #i +__MAC_OS_X_VERSION_MIN_REQUIRED + > +__MAC_OS_X_VERSION_10_4 + + +402 + #__AVAILABLE_MAC_OS_X_VERSION_10_0_AND_LATER_BUT_DEPRECATED_IN_MAC_OS_X_VERSION_10_4 + +__DARWIN_DEPRECATED_ATTRIBUTE + + + ) + +404 + #__AVAILABLE_MAC_OS_X_VERSION_10_0_AND_LATER_BUT_DEPRECATED_IN_MAC_OS_X_VERSION_10_4 + +__AVAILABLE_MAC_OS_X_VERSION_10_0_AND_LATER + + + ) + +413 #i +__MAC_OS_X_VERSION_MIN_REQUIRED + > +__MAC_OS_X_VERSION_10_4 + + +414 + #__AVAILABLE_MAC_OS_X_VERSION_10_1_AND_LATER_BUT_DEPRECATED_IN_MAC_OS_X_VERSION_10_4 + +__DARWIN_DEPRECATED_ATTRIBUTE + + + ) + +416 + #__AVAILABLE_MAC_OS_X_VERSION_10_1_AND_LATER_BUT_DEPRECATED_IN_MAC_OS_X_VERSION_10_4 + +__AVAILABLE_MAC_OS_X_VERSION_10_1_AND_LATER + + + ) + +425 #i +__MAC_OS_X_VERSION_MIN_REQUIRED + > +__MAC_OS_X_VERSION_10_4 + + +426 + #__AVAILABLE_MAC_OS_X_VERSION_10_2_AND_LATER_BUT_DEPRECATED_IN_MAC_OS_X_VERSION_10_4 + +__DARWIN_DEPRECATED_ATTRIBUTE + + + ) + +428 + #__AVAILABLE_MAC_OS_X_VERSION_10_2_AND_LATER_BUT_DEPRECATED_IN_MAC_OS_X_VERSION_10_4 + +__AVAILABLE_MAC_OS_X_VERSION_10_2_AND_LATER + + + ) + +437 #i +__MAC_OS_X_VERSION_MIN_REQUIRED + > +__MAC_OS_X_VERSION_10_4 + + +438 + #__AVAILABLE_MAC_OS_X_VERSION_10_3_AND_LATER_BUT_DEPRECATED_IN_MAC_OS_X_VERSION_10_4 + +__DARWIN_DEPRECATED_ATTRIBUTE + + + ) + +440 + #__AVAILABLE_MAC_OS_X_VERSION_10_3_AND_LATER_BUT_DEPRECATED_IN_MAC_OS_X_VERSION_10_4 + +__AVAILABLE_MAC_OS_X_VERSION_10_3_AND_LATER + + + ) + +448 #i +__MAC_OS_X_VERSION_MIN_REQUIRED + > +__MAC_OS_X_VERSION_10_4 + + +449 + #__DEPRECATED_IN_MAC_OS_X_VERSION_10_4_AND_LATER + +__DARWIN_DEPRECATED_ATTRIBUTE + + + ) + +451 + #__DEPRECATED_IN_MAC_OS_X_VERSION_10_4_AND_LATER + + + ) + +463 #i +__MAC_OS_X_VERSION_MAX_ALLOWED + < +__MAC_OS_X_VERSION_10_5 + + +464 + #__AVAILABLE_MAC_OS_X_VERSION_10_5_AND_LATER + +__DARWIN_UNAVAILABLE_ATTRIBUTE + + + ) + +465 #i +__MAC_OS_X_VERSION_MIN_REQUIRED + < +__MAC_OS_X_VERSION_10_5 + + +466 + #__AVAILABLE_MAC_OS_X_VERSION_10_5_AND_LATER + +__DARWIN_WEAK_IMPORT_ATTRIBUTE + + + ) + +468 + #__AVAILABLE_MAC_OS_X_VERSION_10_5_AND_LATER + + + ) + +477 #i +__MAC_OS_X_VERSION_MIN_REQUIRED + > +__MAC_OS_X_VERSION_10_5 + + +478 + #__AVAILABLE_MAC_OS_X_VERSION_10_5_AND_LATER_BUT_DEPRECATED + +__DARWIN_DEPRECATED_ATTRIBUTE + + + ) + +480 + #__AVAILABLE_MAC_OS_X_VERSION_10_5_AND_LATER_BUT_DEPRECATED + +__AVAILABLE_MAC_OS_X_VERSION_10_5_AND_LATER + + + ) + +489 #i +__MAC_OS_X_VERSION_MIN_REQUIRED + > +__MAC_OS_X_VERSION_10_5 + + +490 + #__AVAILABLE_MAC_OS_X_VERSION_10_0_AND_LATER_BUT_DEPRECATED_IN_MAC_OS_X_VERSION_10_5 + +__DARWIN_DEPRECATED_ATTRIBUTE + + + ) + +492 + #__AVAILABLE_MAC_OS_X_VERSION_10_0_AND_LATER_BUT_DEPRECATED_IN_MAC_OS_X_VERSION_10_5 + +__AVAILABLE_MAC_OS_X_VERSION_10_0_AND_LATER + + + ) + +501 #i +__MAC_OS_X_VERSION_MIN_REQUIRED + > +__MAC_OS_X_VERSION_10_5 + + +502 + #__AVAILABLE_MAC_OS_X_VERSION_10_1_AND_LATER_BUT_DEPRECATED_IN_MAC_OS_X_VERSION_10_5 + +__DARWIN_DEPRECATED_ATTRIBUTE + + + ) + +504 + #__AVAILABLE_MAC_OS_X_VERSION_10_1_AND_LATER_BUT_DEPRECATED_IN_MAC_OS_X_VERSION_10_5 + +__AVAILABLE_MAC_OS_X_VERSION_10_1_AND_LATER + + + ) + +513 #i +__MAC_OS_X_VERSION_MIN_REQUIRED + > +__MAC_OS_X_VERSION_10_5 + + +514 + #__AVAILABLE_MAC_OS_X_VERSION_10_2_AND_LATER_BUT_DEPRECATED_IN_MAC_OS_X_VERSION_10_5 + +__DARWIN_DEPRECATED_ATTRIBUTE + + + ) + +516 + #__AVAILABLE_MAC_OS_X_VERSION_10_2_AND_LATER_BUT_DEPRECATED_IN_MAC_OS_X_VERSION_10_5 + +__AVAILABLE_MAC_OS_X_VERSION_10_2_AND_LATER + + + ) + +525 #i +__MAC_OS_X_VERSION_MIN_REQUIRED + > +__MAC_OS_X_VERSION_10_5 + + +526 + #__AVAILABLE_MAC_OS_X_VERSION_10_3_AND_LATER_BUT_DEPRECATED_IN_MAC_OS_X_VERSION_10_5 + +__DARWIN_DEPRECATED_ATTRIBUTE + + + ) + +528 + #__AVAILABLE_MAC_OS_X_VERSION_10_3_AND_LATER_BUT_DEPRECATED_IN_MAC_OS_X_VERSION_10_5 + +__AVAILABLE_MAC_OS_X_VERSION_10_3_AND_LATER + + + ) + +537 #i +__MAC_OS_X_VERSION_MIN_REQUIRED + > +__MAC_OS_X_VERSION_10_5 + + +538 + #__AVAILABLE_MAC_OS_X_VERSION_10_4_AND_LATER_BUT_DEPRECATED_IN_MAC_OS_X_VERSION_10_5 + +__DARWIN_DEPRECATED_ATTRIBUTE + + + ) + +540 + #__AVAILABLE_MAC_OS_X_VERSION_10_4_AND_LATER_BUT_DEPRECATED_IN_MAC_OS_X_VERSION_10_5 + +__AVAILABLE_MAC_OS_X_VERSION_10_4_AND_LATER + + + ) + +548 #i +__MAC_OS_X_VERSION_MIN_REQUIRED + > +__MAC_OS_X_VERSION_10_5 + + +549 + #__DEPRECATED_IN_MAC_OS_X_VERSION_10_5_AND_LATER + +__DARWIN_DEPRECATED_ATTRIBUTE + + + ) + +551 + #__DEPRECATED_IN_MAC_OS_X_VERSION_10_5_AND_LATER + + + ) + + @/usr/include/machine/endian.h + +31 #ide +_BSD_MACHINE_ENDIAN_H_ + + +32 + #_BSD_MACHINE_ENDIAN_H_ + + + ) + +34 #i +defed + ( +__c__ +|| defed( +__c64__ +) + +35 + ~"c/dn.h +" + +36 #i +defed + ( +__i386__ +|| defed( +__x86_64__ +) + +37 + ~"i386/dn.h +" + +38 #i +defed + ( +__m__ +) + +39 + ~"m/dn.h +" + +41 #r +cheu + +n + +su܋d + + + @/usr/include/machine/types.h + +31 #ide +_BSD_MACHINE_TYPES_H_ + + +32 + #_BSD_MACHINE_TYPES_H_ + + + ) + +34 #i +defed + ( +__c__ +|| defed ( +__c64__ +) + +35 + ~"c/tys.h +" + +36 #i +defed + ( +__i386__ +|| defed( +__x86_64__ +) + +37 + ~"i386/tys.h +" + +38 #i +defed + ( +__m__ +) + +39 + ~"m/tys.h +" + +41 #r +cheu + +n + +su܋d + + + @/usr/include/secure/_stdio.h + +24 #ide +_STDIO_H_ + + +25 #r +r + "Never use <secure/_stdio.h> directly; include <stdio.h> instead." + +28 #ide +_SECURE__STDIO_H_ + + +29 + #_SECURE__STDIO_H_ + + + ) + +31 + ~<cu/_comm.h +> + +33 #i +_USE_FORTIFY_LEVEL + > 0 + +35 #unde +rtf + + +36 #unde +vrtf + + +37 #unde +tf + + +38 #unde +vtf + + +42
+ $__rtf_chk + (* +__ri +, , +size_t +, + +43 cڡ * +__ri +, ...) + +44 + `__DARWIN_LDBL_COMPAT + ( +__rtf_chk +); + +46 + #rtf +( +r +, ...) \ + +47 + `__but___rtf_chk + ( +r +, 0, + `__dw_obsz +(r), +__VA_ARGS__ +) + + ) + +49
+ $__tf_chk + (* +__ri +, +size_t +, , size_t, + +50 cڡ * +__ri +, ...) + +51 + `__DARWIN_LDBL_COMPAT + ( +__tf_chk +); + +53 + #tf +( +r +, +n +, ...) \ + +54 + `__but___tf_chk + ( +r +, +n +, 0, + `__dw_obsz +(r), +__VA_ARGS__ +) + + ) + +56
+ $__vrtf_chk + (* +__ri +, , +size_t +, + +57 cڡ * +__ri +, +va_li + +g +) + +58 + `__DARWIN_LDBL_COMPAT + ( +__vrtf_chk +); + +60 + #vrtf +( +r +, +fm +, + +) \ + +61 + `__but___vrtf_chk + ( +r +, 0, + `__dw_obsz +(r), +fm +, + +) + + ) + +63
+ $__vtf_chk + (* +__ri +, +size_t +, , size_t, + +64 cڡ * +__ri +, +va_li + +g +) + +65 + `__DARWIN_LDBL_COMPAT + ( +__vtf_chk +); + +67 + #vtf +( +r +, +n +, +fm +, + +) \ + +68 + `__but___vtf_chk + ( +r +, +n +, 0, + `__dw_obsz +(r), +fm +, + +) + + ) + + @/usr/include/sys/_select.h + +36 #ide +_SYS__SELECT_H_ + + +37 + #_SYS__SELECT_H_ + + + ) + +39 + $ +(, +fd_t + * +__ri +, fd_set * __restrict, + +40 +fd_t + * +__ri +, +timev + * __restrict) + +41 #i + `defed +( +_DARWIN_C_SOURCE +|| defed( +_DARWIN_UNLIMITED_SELECT +) + +42 + $__DARWIN_EXTSN_C +( + +) + +44 #i + `defed +( +__LP64__ +&& ! +__DARWIN_NON_CANCELABLE + + +45 + $__DARWIN_1050 +( + +) + +47 + $__DARWIN_ALIAS_C +( + +) + + @/usr/include/sys/_structs.h + +29 + ~<sys/cdefs.h +> + +30 + ~<sys/_tys.h +> + +32 #ifde +__ed_ucڋxt_t + + +33 #ide +__ed_ru_ucڋxt + + +34 + #__ed_ru_ucڋxt + + + ) + +38 #ifde +__ed_ucڋxt64_t + + +39 #ide +__ed_ru_ucڋxt64 + + +40 + #__ed_ru_ucڋxt64 + + + ) + +44 #ifde +__ed_ru_ucڋxt + + +45 #ide +__ed_ru_mcڋxt + + +46 + #__ed_ru_mcڋxt + + + ) + +50 #ifde +__ed_ru_ucڋxt64 + + +51 #ide +__ed_ru_mcڋxt64 + + +52 + #__ed_ru_mcڋxt64 + + + ) + +56 #i +defed +( +__ed_ru_mcڋxt +|| defed( +__ed_ru_mcڋxt64 +) + +57 + ~<mache/_rus.h +> + +60 #i +defed +( +__ed_ack_t +|| defed( +__ed_ru_ucڋxt +|| defed( +__ed_ru_ucڋxt64 +) + +61 #ide +__ed_ru_sigtack + + +62 + #__ed_ru_sigtack + + + ) + +66 #ifde +__ed_ru_sigtack + + +67 #unde +__ed_ru_sigtack + + +69 #ide +_STRUCT_SIGALTSTACK + + +70 #i +__DARWIN_UNIX03 + + +71 + #_STRUCT_SIGALTSTACK + +__dw_sigtack + + + ) + +73 + #_STRUCT_SIGALTSTACK + +sigtack + + + ) + +75 + g_STRUCT_SIGALTSTACK + + +77 * + gss_ +; + +78 +__dw_size_t + + gss_size +; + +79 + gss_ags +; + +84 #ifde +__ed_ru_timeec + + +85 #unde +__ed_ru_timeec + + +86 #ide +_STRUCT_TIMESPEC + + +87 + #_STRUCT_TIMESPEC + +timeec + + + ) + +88 + g_STRUCT_TIMESPEC + + +90 +__dw_time_t + + gtv_c +; + +91 + gtv_nc +; + +96 #ifde +__ed_ru_timev + + +97 #unde +__ed_ru_timev + + +98 #ide +_STRUCT_TIMEVAL + + +99 + #_STRUCT_TIMEVAL + +timev + + + ) + +100 + g_STRUCT_TIMEVAL + + +102 +__dw_time_t + + gtv_c +; + +103 +__dw_sucds_t + + gtv_uc +; + +108 #ifde +__ed_ru_timev32 + + +109 #unde +__ed_ru_timev32 + + +110 #ide +_STRUCT_TIMEVAL32 + + +111 + #_STRUCT_TIMEVAL32 + +timev32 + + + ) + +112 + g_STRUCT_TIMEVAL32 + + +114 +__t32_t + + gtv_c +; + +115 +__t32_t + + gtv_uc +; + +120 #ifde +__ed_ru_ucڋxt + + +121 #unde +__ed_ru_ucڋxt + + +122 #ide +_STRUCT_UCONTEXT + + +123 #i +__DARWIN_UNIX03 + + +124 + #_STRUCT_UCONTEXT + +__dw_ucڋxt + + + ) + +126 + #_STRUCT_UCONTEXT + +ucڋxt + + + ) + +128 + g_STRUCT_UCONTEXT + + +130 + guc_ڡack +; + +131 +__dw_sigt_t + + guc_sigmask +; + +132 +_STRUCT_SIGALTSTACK + + guc_ack +; + +133 +_STRUCT_UCONTEXT + * + guc_lk +; + +134 +__dw_size_t + + guc_mcsize +; + +135 +_STRUCT_MCONTEXT + * + guc_mcڋxt +; + +136 #ifde +_XOPEN_SOURCE + + +137 +_STRUCT_MCONTEXT + + g__mcڋxt_da +; + +143 #ifde +__ed_ru_ucڋxt64 + + +144 #unde +__ed_ru_ucڋxt64 + + +145 #ide +_STRUCT_UCONTEXT64 + + +146 #i +__DARWIN_UNIX03 + + +147 + #_STRUCT_UCONTEXT64 + +__dw_ucڋxt64 + + + ) + +149 + #_STRUCT_UCONTEXT64 + +ucڋxt64 + + + ) + +151 + g_STRUCT_UCONTEXT64 + + +153 + guc_ڡack +; + +154 +__dw_sigt_t + + guc_sigmask +; + +155 +_STRUCT_SIGALTSTACK + + guc_ack +; + +156 +_STRUCT_UCONTEXT64 + * + guc_lk +; + +157 +__dw_size_t + + guc_mcsize +; + +158 +_STRUCT_MCONTEXT64 + * + guc_mcڋxt64 +; + +164 #ifde +__ed_fd_t + + +165 #unde +__ed_fd_t + + +166 #ide +_FD_SET + + +167 + #_FD_SET + + + ) + +174 #ifde +FD_SETSIZE + + +175 + #__DARWIN_FD_SETSIZE + +FD_SETSIZE + + + ) + +177 + #__DARWIN_FD_SETSIZE + 1024 + + ) + +179 + #__DARWIN_NBBY + 8 + + ) + +180 + #__DARWIN_NFDBITS + (( +__t32_t +* +__DARWIN_NBBY + + + ) + +181 + #__DARWIN_howmy +( +x +, +y +(((x+ ((y- 1)/ (y) + + ) + +183 +__BEGIN_DECLS + + +184 + sfd_t + { + +185 +__t32_t + + mfds_bs +[ +__DARWIN_howmy +( +__DARWIN_FD_SETSIZE +, +__DARWIN_NFDBITS +)]; + +186 } + tfd_t +; + +187 +__END_DECLS + + +190 +__le + + +191 + $__dw_fd_ist +( +_n +, +fd_t + * +_p +) + +193 ( +_p +-> +fds_bs +[ +_n +/ +__DARWIN_NFDBITS +] & (1<<(_n % __DARWIN_NFDBITS))); + +194 + } +} + +196 + #__DARWIN_FD_SET +( +n +, +p +d{ +__fd + = (n); ()-> +fds_bs +[__fd/ +__DARWIN_NFDBITS +] |(1<<(__fd % __DARWIN_NFDBITS))); } 0) + + ) + +197 + #__DARWIN_FD_CLR +( +n +, +p +d{ +__fd + = (n); ()-> +fds_bs +[__fd/ +__DARWIN_NFDBITS +] &~(1<<(__fd % __DARWIN_NFDBITS))); } 0) + + ) + +198 + #__DARWIN_FD_ISSET +( +n +, +p + + `__dw_fd_ist +(), (p)) + + ) + +200 #i +__GNUC__ + > 3 || __GNUC__ =3 && +__GNUC_MINOR__ + >= 3 + +205 + #__DARWIN_FD_ZERO +( +p + + `__but_bzo +, (*))) + + ) + +207 + #__DARWIN_FD_ZERO +( +p + + `bzo +, (*))) + + ) + +210 + #__DARWIN_FD_COPY +( +f +, +t + + `bcy +(f,, (*(f))) + + ) + +214 #ifde +__ed_ack_t + + +215 #unde +__ed_ack_t + + +216 #ide +_STACK_T + + +217 + #_STACK_T + + + ) + +218 +_STRUCT_SIGALTSTACK + + tack_t +; + +222 #ifde +__ed_ucڋxt_t + + +223 #unde +__ed_ucڋxt_t + + +225 #ide +_UCONTEXT_T + + +226 + #_UCONTEXT_T + + + ) + +227 +_STRUCT_UCONTEXT + + tucڋxt_t +; + +231 #ifde +__ed_ucڋxt64_t + + +232 #unde +__ed_ucڋxt64_t + + +233 #ide +_UCONTEXT64_T + + +234 + #_UCONTEXT64_T + + + ) + +235 +_STRUCT_UCONTEXT64 + + tucڋxt64_t +; + + @/usr/include/sys/_types.h + +29 #ide +_SYS__TYPES_H_ + + +30 + #_SYS__TYPES_H_ + + + ) + +32 + ~<sys/cdefs.h +> + +33 + ~<mache/_tys.h +> + +36 #i +defed +( +__LP64__ +) + +37 + #__PTHREAD_SIZE__ + 1168 + + ) + +38 + #__PTHREAD_ATTR_SIZE__ + 56 + + ) + +39 + #__PTHREAD_MUTEXATTR_SIZE__ + 8 + + ) + +40 + #__PTHREAD_MUTEX_SIZE__ + 56 + + ) + +41 + #__PTHREAD_CONDATTR_SIZE__ + 8 + + ) + +42 + #__PTHREAD_COND_SIZE__ + 40 + + ) + +43 + #__PTHREAD_ONCE_SIZE__ + 8 + + ) + +44 + #__PTHREAD_RWLOCK_SIZE__ + 192 + + ) + +45 + #__PTHREAD_RWLOCKATTR_SIZE__ + 16 + + ) + +47 + #__PTHREAD_SIZE__ + 596 + + ) + +48 + #__PTHREAD_ATTR_SIZE__ + 36 + + ) + +49 + #__PTHREAD_MUTEXATTR_SIZE__ + 8 + + ) + +50 + #__PTHREAD_MUTEX_SIZE__ + 40 + + ) + +51 + #__PTHREAD_CONDATTR_SIZE__ + 4 + + ) + +52 + #__PTHREAD_COND_SIZE__ + 24 + + ) + +53 + #__PTHREAD_ONCE_SIZE__ + 4 + + ) + +54 + #__PTHREAD_RWLOCK_SIZE__ + 124 + + ) + +55 + #__PTHREAD_RWLOCKATTR_SIZE__ + 12 + + ) + +58 + s__dw_had_hdr_c + + +60 (* + m__route +)(*); + +61 * + m__g +; + +62 +__dw_had_hdr_c + * + m__xt +; + +64 + s_aque_had__t + { + m__sig +; + m__aque +[ +__PTHREAD_ATTR_SIZE__ +]; }; + +65 + s_aque_had_cd_t + { + m__sig +; + m__aque +[ +__PTHREAD_COND_SIZE__ +]; }; + +66 + s_aque_had_cd_t + { + m__sig +; + m__aque +[ +__PTHREAD_CONDATTR_SIZE__ +]; }; + +67 + s_aque_had_mux_t + { + m__sig +; + m__aque +[ +__PTHREAD_MUTEX_SIZE__ +]; }; + +68 + s_aque_had_mux_t + { + m__sig +; + m__aque +[ +__PTHREAD_MUTEXATTR_SIZE__ +]; }; + +69 + s_aque_had__t + { + m__sig +; + m__aque +[ +__PTHREAD_ONCE_SIZE__ +]; }; + +70 + s_aque_had_rwlock_t + { + m__sig +; + m__aque +[ +__PTHREAD_RWLOCK_SIZE__ +]; }; + +71 + s_aque_had_rwlock_t + { + m__sig +; + m__aque +[ +__PTHREAD_RWLOCKATTR_SIZE__ +]; }; + +72 + s_aque_had_t + { + m__sig +; +__dw_had_hdr_c + * + m__nup_ack +; + m__aque +[ +__PTHREAD_SIZE__ +]; }; + +80 #ifde +__lulus + + +81 #ifde +__GNUG__ + + +82 + #__DARWIN_NULL + +__nu + + + ) + +84 #ifde +__LP64__ + + +85 + #__DARWIN_NULL + (0L) + + ) + +87 + #__DARWIN_NULL + 0 + + ) + +91 + #__DARWIN_NULL + ((*)0) + + ) + +94 +__t64_t + + t__dw_blkt_t +; + +95 +__t32_t + + t__dw_blksize_t +; + +96 +__t32_t + + t__dw_dev_t +; + +97 + t__dw_fsblkt_t +; + +98 + t__dw_fsft_t +; + +99 +__ut32_t + + t__dw_gid_t +; + +100 +__ut32_t + + t__dw_id_t +; + +101 +__ut64_t + + t__dw_o64_t +; + +102 #i +__DARWIN_64_BIT_INO_T + + +103 +__dw_o64_t + + t__dw_o_t +; + +105 +__ut32_t + + t__dw_o_t +; + +107 +__dw_tul_t + + t__dw_mach_pt_me_t +; + +108 +__dw_mach_pt_me_t + + t__dw_mach_pt_t +; + +109 +__ut16_t + + t__dw_mode_t +; + +110 +__t64_t + + t__dw_off_t +; + +111 +__t32_t + + t__dw_pid_t +; + +112 +_aque_had__t + + +113 + t__dw_had__t +; + +114 +_aque_had_cd_t + + +115 + t__dw_had_cd_t +; + +116 +_aque_had_cd_t + + +117 + t__dw_had_cd_t +; + +118 + t__dw_had_key_t +; + +119 +_aque_had_mux_t + + +120 + t__dw_had_mux_t +; + +121 +_aque_had_mux_t + + +122 + t__dw_had_mux_t +; + +123 +_aque_had__t + + +124 + t__dw_had__t +; + +125 +_aque_had_rwlock_t + + +126 + t__dw_had_rwlock_t +; + +127 +_aque_had_rwlock_t + + +128 + t__dw_had_rwlock_t +; + +129 +_aque_had_t + + +130 * + t__dw_had_t +; + +131 +__ut32_t + + t__dw_sigt_t +; + +132 +__t32_t + + t__dw_sucds_t +; + +133 +__ut32_t + + t__dw_uid_t +; + +134 +__ut32_t + + t__dw_ucds_t +; + +135 + t__dw_uuid_t +[16]; + + @/usr/include/sys/appleapiopts.h + +29 #ide +__SYS_APPLEAPIOPTS_H__ + + +30 + #__SYS_APPLEAPIOPTS_H__ + + + ) + +33 #ide +__APPLE_API_STANDARD + + +34 + #__APPLE_API_STANDARD + + + ) + +37 #ide +__APPLE_API_STABLE + + +38 + #__APPLE_API_STABLE + + + ) + +41 #ide +__APPLE_API_STRICT_CONFORMANCE + + +43 #ide +__APPLE_API_EVOLVING + + +44 + #__APPLE_API_EVOLVING + + + ) + +47 #ide +__APPLE_API_UNSTABLE + + +48 + #__APPLE_API_UNSTABLE + + + ) + +51 #ide +__APPLE_API_PRIVATE + + +52 + #__APPLE_API_PRIVATE + + + ) + +55 #ide +__APPLE_API_OBSOLETE + + +56 + #__APPLE_API_OBSOLETE + + + ) + + @/usr/include/sys/cdefs.h + +67 #idef +_CDEFS_H_ + + +68 + #_CDEFS_H_ + + + ) + +70 #i +defed +( +__lulus +) + +71 + #__BEGIN_DECLS +
"C" { + + ) + +72 + #__END_DECLS + } + + ) + +74 + #__BEGIN_DECLS + + + ) + +75 + #__END_DECLS + + + ) + +85 #i +defed +( +__STDC__ +|| defed( +__lulus +) + +86 + #__P +( +os +o + + ) + +87 + #__CONCAT +( +x +, +y +x ## + ) +y + +88 + #__STRING +( +x +#x + + ) + +90 + #__cڡ + cڡ + + ) + +91 + #__sigd + sigd + + ) + +92 + #__vީe + vީe + + ) + +93 #i +defed +( +__lulus +) + +94 + #__le + +le + + + ) + +96 #ide +__GNUC__ + + +97 + #__le + + + ) + +102 + #__P +( +os +( + + ) + +103 + #__CONCAT +( +x +, +y +x + ) +y + +104 + #__STRING +( +x +"x" + + ) + +106 #ide +__GNUC__ + + +107 + #__cڡ + + + ) + +108 + #__le + + + ) + +109 + #__sigd + + + ) + +110 + #__vީe + + + ) + +121 #idef +NO_ANSI_KEYWORDS + + +122 cڡ +__cڡ + + + ) + +123 + #le + +__le + + + ) + +124 sigd +__sigd + + + ) + +125 vީ +__vީe + + + ) + +137 #i +defed +( +__MWERKS__ +) && (__MWERKS__ > 0x2400) + +139 #i +__GNUC__ + > 2 || __GNUC__ =2 && +__GNUC_MINOR__ + >= 5 + +140 + #__dd2 + + `__ibu__ +(( +__nܑu__ +)) + + ) + +141 + #__pu2 + + `__ibu__ +(( +__cڡ__ +)) + + ) + +142 #i +__GNUC__ + =2 && +__GNUC_MINOR__ + >= 5 && __GNUC_MINOR__ < 7 + +143 + #__unud + + + ) + +145 + #__unud + + `__ibu__ +(( +__unud__ +)) + + ) + +148 + #__ibu__ +( +x + + + ) + +149 #i +defed +( +__GNUC__ +&& !defed( +__STRICT_ANSI__ +) + +151 + #__dd + +__vީe + + + ) + +152 + #__pu + +__cڡ + + + ) + +157 #ide +__dd + + +158 + #__dd + + + ) + +159 + #__pu + + + ) + +161 #ide +__dd2 + + +162 + #__dd2 + + + ) + +163 + #__pu2 + + + ) + +164 + #__unud + + + ) + +173 #i!( +__GNUC__ + =2 && +__GNUC_MINOR__ + == 95) + +174 #i +__STDC_VERSION__ + < 199901 + +175 + #__ri + + + ) + +177 + #__ri + +ri + + + ) + +189 #i +__GNUC__ + > 2 || __GNUC__ =2 && +__GNUC_MINOR__ + >= 7 + +190 + #__tike +( +fmrg +, +fvg +) \ + +191 + `__ibu__ +(( + `__fm__ + ( +__tf__ +, +fmrg +, +fvg +))) + + ) + +192 + #__snike +( +fmrg +, +fvg +) \ + +193 + `__ibu__ +(( + `__fm__ + ( +__snf__ +, +fmrg +, +fvg +))) + + ) + +195 + #__tike +( +fmrg +, +fvg +) + + ) + +196 + #__snike +( +fmrg +, +fvg +) + + ) + +199 + #__IDSTRING +( +me +, +rg +cڡ me[] +__unud + = + ) +string + +201 #ide +__COPYRIGHT + + +202 + #__COPYRIGHT +( +s + + `__IDSTRING +( +cyright +,s) + + ) + +205 #ide +__RCSID + + +206 + #__RCSID +( +s + + `__IDSTRING +( +rcsid +,s) + + ) + +209 #ide +__SCCSID + + +210 + #__SCCSID +( +s + + `__IDSTRING +( +sccsid +,s) + + ) + +213 #ide +__PROJECT_VERSION + + +214 + #__PROJECT_VERSION +( +s + + `__IDSTRING +( +oje_vsi +,s) + + ) + +272 #i! +defed +( +__DARWIN_UNIX03 +) + +273 #i +defed +( +_DARWIN_C_SOURCE +|| defed( +_XOPEN_SOURCE +|| defed( +_POSIX_C_SOURCE +|| defed( +__LP64__ +|| (defed( +__m__ +&& !defed( +KERNEL +)) + +274 #i +defed +( +_NONSTD_SOURCE +) + +277 + #__DARWIN_UNIX03 + 1 + + ) + +278 #i +defed +( +_NONSTD_SOURCE +|| defed( +KERNEL +) + +279 + #__DARWIN_UNIX03 + 0 + + ) + +281 #i +defed +( +__ENVIRONMENT_MAC_OS_X_VERSION_MIN_REQUIRED__ +) && ((__ENVIRONMENT_MAC_OS_X_VERSION_MIN_REQUIRED__-0) < 1050) + +282 + #__DARWIN_UNIX03 + 0 + + ) + +284 + #__DARWIN_UNIX03 + 1 + + ) + +289 #i! +defed +( +__DARWIN_64_BIT_INO_T +) + +290 #i +defed +( +_DARWIN_USE_64_BIT_INODE +) + +291 + #__DARWIN_64_BIT_INO_T + 1 + + ) + +292 #i +defed +( +_DARWIN_NO_64_BIT_INODE +|| defed( +KERNEL +) + +293 + #__DARWIN_64_BIT_INO_T + 0 + + ) + +295 + #__DARWIN_64_BIT_INO_T + 0 + + ) + +299 #i! +defed +( +__DARWIN_NON_CANCELABLE +) + +300 + #__DARWIN_NON_CANCELABLE + 0 + + ) + +303 #i! +defed +( +__DARWIN_VERS_1050 +) + +304 #i! +defed +( +KERNEL +&& defed( +__ENVIRONMENT_MAC_OS_X_VERSION_MIN_REQUIRED__ +) && ((__ENVIRONMENT_MAC_OS_X_VERSION_MIN_REQUIRED__-0) >= 1050) + +305 + #__DARWIN_VERS_1050 + 1 + + ) + +307 + #__DARWIN_VERS_1050 + 0 + + ) + +314 #i +__DARWIN_UNIX03 + + +315 #i! +defed +( +__LP64__ +&& !defed( +__m__ +) + +316 + #__DARWIN_SUF_UNIX03 + "$UNIX2003" + + ) + +317 + #__DARWIN_SUF_UNIX03_SET + 1 + + ) + +319 + #__DARWIN_SUF_UNIX03 + + + ) + +320 + #__DARWIN_SUF_UNIX03_SET + 0 + + ) + +323 #i +__DARWIN_64_BIT_INO_T + + +324 + #__DARWIN_SUF_64_BIT_INO_T + "$INODE64" + + ) + +326 + #__DARWIN_SUF_64_BIT_INO_T + + + ) + +329 #i +__DARWIN_NON_CANCELABLE + + +330 + #__DARWIN_SUF_NON_CANCELABLE + "$NOCANCEL" + + ) + +332 + #__DARWIN_SUF_NON_CANCELABLE + + + ) + +335 #i +__DARWIN_VERS_1050 + + +336 + #__DARWIN_SUF_1050 + "$1050" + + ) + +338 + #__DARWIN_SUF_1050 + + + ) + +342 + #__DARWIN_SUF_UNIX03 + + + ) + +343 + #__DARWIN_SUF_UNIX03_SET + 0 + + ) + +344 + #__DARWIN_SUF_64_BIT_INO_T + + + ) + +345 + #__DARWIN_SUF_NON_CANCELABLE + + + ) + +346 + #__DARWIN_SUF_1050 + + + ) + +349 + #__DARWIN_SUF_EXTSN + "$DARWIN_EXTSN" + + ) + +354 + #__DARWIN_ALIAS +( +sym + + `__asm +("_" + `__STRING +(sym +__DARWIN_SUF_UNIX03 +) + + ) + +355 + #__DARWIN_ALIAS_C +( +sym + + `__asm +("_" + `__STRING +(sym +__DARWIN_SUF_NON_CANCELABLE + +__DARWIN_SUF_UNIX03 +) + + ) + +356 + #__DARWIN_ALIAS_I +( +sym + + `__asm +("_" + `__STRING +(sym +__DARWIN_SUF_64_BIT_INO_T + +__DARWIN_SUF_UNIX03 +) + + ) + +357 + #__DARWIN_INODE64 +( +sym + + `__asm +("_" + `__STRING +(sym +__DARWIN_SUF_64_BIT_INO_T +) + + ) + +359 + #__DARWIN_1050 +( +sym + + `__asm +("_" + `__STRING +(sym +__DARWIN_SUF_1050 +) + + ) + +360 + #__DARWIN_1050ALIAS +( +sym + + `__asm +("_" + `__STRING +(sym +__DARWIN_SUF_1050 + +__DARWIN_SUF_UNIX03 +) + + ) + +361 + #__DARWIN_1050ALIAS_C +( +sym + + `__asm +("_" + `__STRING +(sym +__DARWIN_SUF_1050 + +__DARWIN_SUF_NON_CANCELABLE + +__DARWIN_SUF_UNIX03 +) + + ) + +362 + #__DARWIN_1050ALIAS_I +( +sym + + `__asm +("_" + `__STRING +(sym +__DARWIN_SUF_1050 + +__DARWIN_SUF_64_BIT_INO_T + +__DARWIN_SUF_UNIX03 +) + + ) + +363 + #__DARWIN_1050INODE64 +( +sym + + `__asm +("_" + `__STRING +(sym +__DARWIN_SUF_1050 + +__DARWIN_SUF_64_BIT_INO_T +) + + ) + +365 + #__DARWIN_EXTSN +( +sym + + `__asm +("_" + `__STRING +(sym +__DARWIN_SUF_EXTSN +) + + ) + +366 + #__DARWIN_EXTSN_C +( +sym + + `__asm +("_" + `__STRING +(sym +__DARWIN_SUF_EXTSN + +__DARWIN_SUF_NON_CANCELABLE +) + + ) + +389 #i +defed +( +_POSIX_C_SOURCE +) && _POSIX_C_SOURCE == 1L + +390 #unde +_POSIX_C_SOURCE + + +391 + #_POSIX_C_SOURCE + 199009L + + ) + +395 #i +defed +( +_POSIX_C_SOURCE +) && _POSIX_C_SOURCE == 2L + +396 #unde +_POSIX_C_SOURCE + + +397 + #_POSIX_C_SOURCE + 199209L + + ) + +401 #ifde +_XOPEN_SOURCE + + +402 #i +_XOPEN_SOURCE + - 0L >= 600L + +403 #unde +_POSIX_C_SOURCE + + +404 + #_POSIX_C_SOURCE + 200112L + + ) + +405 #i +_XOPEN_SOURCE + - 0L >= 500L + +406 #unde +_POSIX_C_SOURCE + + +407 + #_POSIX_C_SOURCE + 199506L + + ) + +415 #i +defed +( +_POSIX_SOURCE +&& !defed( +_POSIX_C_SOURCE +) + +416 + #_POSIX_C_SOURCE + 198808L + + ) + +424 + #__DARWIN_NO_LONG_LONG + ( + `defed +( +__STRICT_ANSI__ +) \ + +425 && ( +__STDC_VERSION__ +-0 < 199901L) \ + +426 && ! + `defed +( +__GNUG__ +)) + + ) + +434 #i +defed +( +__c__ +) + +435 #i +defed +( +__LDBL_MANT_DIG__ +&& defed( +__DBL_MANT_DIG__ +) && \ + +436 +__LDBL_MANT_DIG__ + > +__DBL_MANT_DIG__ + + +437 #i +__ENVIRONMENT_MAC_OS_X_VERSION_MIN_REQUIRED__ +-0 < 1040 + +438 + #__DARWIN_LDBL_COMPAT +( +x + + `__asm +("_" + `__STRING +(x"$LDBLStub") + + ) + +440 + #__DARWIN_LDBL_COMPAT +( +x + + `__asm +("_" + `__STRING +(x"$LDBL128") + + ) + +442 + #__DARWIN_LDBL_COMPAT2 +( +x + + `__asm +("_" + `__STRING +(x"$LDBL128") + + ) + +443 + #__DARWIN_LONG_DOUBLE_IS_DOUBLE + 0 + + ) + +445 + #__DARWIN_LDBL_COMPAT +( +x + + + ) + +446 + #__DARWIN_LDBL_COMPAT2 +( +x + + + ) + +447 + #__DARWIN_LONG_DOUBLE_IS_DOUBLE + 1 + + ) + +449 #i +defed +( +__i386__ +|| defed( +__c64__ +|| defed( +__x86_64__ +|| defed ( +__m__ +) + +450 + #__DARWIN_LDBL_COMPAT +( +x + + + ) + +451 + #__DARWIN_LDBL_COMPAT2 +( +x + + + ) + +452 + #__DARWIN_LONG_DOUBLE_IS_DOUBLE + 0 + + ) + +454 #r +Unknown + +cheu + + +460 #i +__GNUC__ + >= 3 + +461 + #__dd + + `__ibu__ +(( +dd +)) + + ) + +463 + #__dd + + + ) + +474 #i +__DARWIN_LONG_DOUBLE_IS_DOUBLE + + +475 + #_DARWIN_FEATURE_LONG_DOUBLE_IS_DOUBLE + 1 + + ) + +482 #i +__DARWIN_UNIX03 + + +483 + #_DARWIN_FEATURE_UNIX_CONFORMANCE + 3 + + ) + +490 #i +__DARWIN_64_BIT_INO_T + + +491 + #_DARWIN_FEATURE_64_BIT_INODE + 1 + + ) + + @/usr/include/sys/dirent.h + +75 #ide +_SYS_DIRENT_H + + +76 + #_SYS_DIRENT_H + + + ) + +78 + ~<sys/_tys.h +> + +79 + ~<sys/cdefs.h +> + +81 #idef +_INO_T + + +82 +__dw_o_t + + to_t +; + +83 + #_INO_T + + + ) + +87 + #__DARWIN_MAXNAMLEN + 255 + + ) + +89 #agm +ck +(4) + +91 #i! +__DARWIN_64_BIT_INO_T + + +92 + sdt + { + +93 +o_t + + md_o +; + +94 +__ut16_t + + md_ +; + +95 +__ut8_t + + md_ty +; + +96 +__ut8_t + + md_mn +; + +97 + md_me +[ +__DARWIN_MAXNAMLEN + + 1]; + +101 #agm +ck +() + +103 + #__DARWIN_MAXPATHLEN + 1024 + + ) + +105 + #__DARWIN_STRUCT_DIRENTRY + { \ + +106 +__ut64_t + +d_o +; \ + +107 +__ut64_t + +d_ekoff +; \ + +108 +__ut16_t + +d_ +; \ + +109 +__ut16_t + +d_mn +; \ + +110 +__ut8_t + +d_ty +; \ + +111 +d_me +[ +__DARWIN_MAXPATHLEN +]; \ + +112 } + + ) + +114 #i +__DARWIN_64_BIT_INO_T + + +115 +dt + + g__DARWIN_STRUCT_DIRENTRY +; + +120 #i! +defed +( +_POSIX_C_SOURCE +|| defed( +_DARWIN_C_SOURCE +) + +121 + #d_fo + +d_o + + + ) + +122 + #MAXNAMLEN + +__DARWIN_MAXNAMLEN + + + ) + +126 + #DT_UNKNOWN + 0 + + ) + +127 + #DT_FIFO + 1 + + ) + +128 + #DT_CHR + 2 + + ) + +129 + #DT_DIR + 4 + + ) + +130 + #DT_BLK + 6 + + ) + +131 + #DT_REG + 8 + + ) + +132 + #DT_LNK + 10 + + ) + +133 + #DT_SOCK + 12 + + ) + +134 + #DT_WHT + 14 + + ) + +139 + #IFTODT +( +mode +(((mode& 0170000>> 12) + + ) + +140 + #DTTOIF +( +dty +((dty<< 12) + + ) + + @/usr/include/sys/fcntl.h + +70 #ide +_SYS_FCNTL_H_ + + +71 + #_SYS_FCNTL_H_ + + + ) + +78 + ~<sys/_tys.h +> + +79 + ~<sys/cdefs.h +> + +82 #ide +_SIZE_T + + +83 + #_SIZE_T + + + ) + +84 +__dw_size_t + + tsize_t +; + +87 #idef +_MODE_T + + +88 +__dw_mode_t + + tmode_t +; + +89 + #_MODE_T + + + ) + +92 #ide +_OFF_T + + +93 +__dw_off_t + + toff_t +; + +94 + #_OFF_T + + + ) + +97 #ide +_PID_T + + +98 +__dw_pid_t + + tpid_t +; + +99 + #_PID_T + + + ) + +110 + #O_RDONLY + 0x0000 + + ) + +111 + #O_WRONLY + 0x0001 + + ) + +112 + #O_RDWR + 0x0002 + + ) + +113 + #O_ACCMODE + 0x0003 + + ) + +123 #i! +defed +( +_POSIX_C_SOURCE +|| defed( +_DARWIN_C_SOURCE +) + +124 + #FREAD + 0x0001 + + ) + +125 + #FWRITE + 0x0002 + + ) + +127 + #O_NONBLOCK + 0x0004 + + ) + +128 + #O_APPEND + 0x0008 + + ) + +129 + #O_SYNC + 0x0080 + + ) + +130 #i! +defed +( +_POSIX_C_SOURCE +|| defed( +_DARWIN_C_SOURCE +) + +131 + #O_SHLOCK + 0x0010 + + ) + +132 + #O_EXLOCK + 0x0020 + + ) + +133 + #O_ASYNC + 0x0040 + + ) + +134 + #O_FSYNC + +O_SYNC + + + ) + +135 + #O_NOFOLLOW + 0x0100 + + ) + +137 + #O_CREAT + 0x0200 + + ) + +138 + #O_TRUNC + 0x0400 + + ) + +139 + #O_EXCL + 0x0800 + + ) + +140 #i! +defed +( +_POSIX_C_SOURCE +|| defed( +_DARWIN_C_SOURCE +) + +141 + #O_EVTONLY + 0x8000 + + ) + +145 + #O_NOCTTY + 0x20000 + + ) + +148 #i! +defed +( +_POSIX_C_SOURCE +|| defed( +_DARWIN_C_SOURCE +) + +149 + #O_DIRECTORY + 0x100000 + + ) + +150 + #O_SYMLINK + 0x200000 + + ) + +161 #i! +defed +( +_POSIX_C_SOURCE +|| defed( +_DARWIN_C_SOURCE +) + +162 + #FAPPEND + +O_APPEND + + + ) + +163 + #FASYNC + +O_ASYNC + + + ) + +164 + #FFSYNC + +O_FSYNC + + + ) + +165 + #FNONBLOCK + +O_NONBLOCK + + + ) + +166 + #FNDELAY + +O_NONBLOCK + + + ) + +167 + #O_NDELAY + +O_NONBLOCK + + + ) + +174 #i! +defed +( +_POSIX_C_SOURCE +|| defed( +_DARWIN_C_SOURCE +) + +175 + #CPF_OVERWRITE + 1 + + ) + +176 + #CPF_IGNORE_MODE + 2 + + ) + +177 + #CPF_MASK + ( +CPF_OVERWRITE +| +CPF_IGNORE_MODE +) + + ) + +185 + #F_DUPFD + 0 + + ) + +186 + #F_GETFD + 1 + + ) + +187 + #F_SETFD + 2 + + ) + +188 + #F_GETFL + 3 + + ) + +189 + #F_SETFL + 4 + + ) + +190 + #F_GETOWN + 5 + + ) + +191 + #F_SETOWN + 6 + + ) + +192 + #F_GETLK + 7 + + ) + +193 + #F_SETLK + 8 + + ) + +194 + #F_SETLKW + 9 + + ) + +195 #i! +defed +( +_POSIX_C_SOURCE +|| defed( +_DARWIN_C_SOURCE +) + +196 + #F_CHKCLEAN + 41 + + ) + +197 + #F_PREALLOCATE + 42 + + ) + +198 + #F_SETSIZE + 43 + + ) + +199 + #F_RDADVISE + 44 + + ) + +200 + #F_RDAHEAD + 45 + + ) + +201 + #F_READBOOTSTRAP + 46 + + ) + +202 + #F_WRITEBOOTSTRAP + 47 + + ) + +203 + #F_NOCACHE + 48 + + ) + +204 + #F_LOG2PHYS + 49 + + ) + +205 + #F_GETPATH + 50 + + ) + +206 + #F_FULLFSYNC + 51 + + ) + +207 + #F_PATHPKG_CHECK + 52 + + ) + +208 + #F_FREEZE_FS + 53 + + ) + +209 + #F_THAW_FS + 54 + + ) + +210 + #F_GLOBAL_NOCACHE + 55 + + ) + +213 + #F_ADDSIGS + 59 + + ) + +215 + #F_MARKDEPENDENCY + 60 + + ) + +218 + #FCNTL_FS_SPECIFIC_BASE + 0x00010000 + + ) + +223 + #FD_CLOEXEC + 1 + + ) + +226 + #F_RDLCK + 1 + + ) + +227 + #F_UNLCK + 2 + + ) + +228 + #F_WRLCK + 3 + + ) + +234 #ide +SEEK_SET + + +235 + #SEEK_SET + 0 + + ) + +236 + #SEEK_CUR + 1 + + ) + +237 + #SEEK_END + 2 + + ) + +244 #ide +S_IFMT + + +246 + #S_IFMT + 0170000 + + ) + +247 + #S_IFIFO + 0010000 + + ) + +248 + #S_IFCHR + 0020000 + + ) + +249 + #S_IFDIR + 0040000 + + ) + +250 + #S_IFBLK + 0060000 + + ) + +251 + #S_IFREG + 0100000 + + ) + +252 + #S_IFLNK + 0120000 + + ) + +253 + #S_IFSOCK + 0140000 + + ) + +254 #i! +defed +( +_POSIX_C_SOURCE +|| defed( +_DARWIN_C_SOURCE +) + +255 + #S_IFWHT + 0160000 + + ) + +256 + #S_IFXATTR + 0200000 + + ) + +261 + #S_IRWXU + 0000700 + + ) + +262 + #S_IRUSR + 0000400 + + ) + +263 + #S_IWUSR + 0000200 + + ) + +264 + #S_IXUSR + 0000100 + + ) + +266 + #S_IRWXG + 0000070 + + ) + +267 + #S_IRGRP + 0000040 + + ) + +268 + #S_IWGRP + 0000020 + + ) + +269 + #S_IXGRP + 0000010 + + ) + +271 + #S_IRWXO + 0000007 + + ) + +272 + #S_IROTH + 0000004 + + ) + +273 + #S_IWOTH + 0000002 + + ) + +274 + #S_IXOTH + 0000001 + + ) + +276 + #S_ISUID + 0004000 + + ) + +277 + #S_ISGID + 0002000 + + ) + +278 + #S_ISVTX + 0001000 + + ) + +280 #i! +defed +( +_POSIX_C_SOURCE +|| defed( +_DARWIN_C_SOURCE +) + +281 + #S_ISTXT + +S_ISVTX + + + ) + +282 + #S_IREAD + +S_IRUSR + + + ) + +283 + #S_IWRITE + +S_IWUSR + + + ) + +284 + #S_IEXEC + +S_IXUSR + + + ) + +288 #i! +defed +( +_POSIX_C_SOURCE +|| defed( +_DARWIN_C_SOURCE +) + +291 + #F_ALLOCATECONTIG + 0x00000002 + + ) + +292 + #F_ALLOCATEALL + 0x00000004 + + ) + +296 + #F_PEOFPOSMODE + 3 + + ) + +298 + #F_VOLPOSMODE + 4 + + ) + +305 + sock + { + +306 +off_t + + ml_t +; + +307 +off_t + + ml_n +; + +308 +pid_t + + ml_pid +; + +309 + ml_ty +; + +310 + ml_wh +; + +314 #i! +defed +( +_POSIX_C_SOURCE +|| defed( +_DARWIN_C_SOURCE +) + +319 + sdvisy + { + +320 +off_t + + m_offt +; + +321 + m_cou +; + +329 + sfsigtus + { + +330 +off_t + + mfs_fe_t +; + +331 * + mfs_blob_t +; + +332 +size_t + + mfs_blob_size +; + +333 } + tfsigtus_t +; + +336 + #LOCK_SH + 0x01 + + ) + +337 + #LOCK_EX + 0x02 + + ) + +338 + #LOCK_NB + 0x04 + + ) + +339 + #LOCK_UN + 0x08 + + ) + +343 + sfe + { + +344 + mf_ags +; + +345 + mf_posmode +; + +346 +off_t + + mf_offt +; + +347 +off_t + + mf_ngth +; + +348 +off_t + + mf_byoc +; + +349 } + tfe_t +; + +353 + sfbo١nsr + { + +354 +off_t + + mfbt_offt +; + +355 +size_t + + mfbt_ngth +; + +356 * + mfbt_bufr +; + +357 } + tfbo١nsr_t +; + +377 #agm +ck +(4) + +379 + slog2phys + { + +380 + ml2p_ags +; + +381 +off_t + + ml2p_ctigbys +; + +382 +off_t + + ml2p_devofft +; + +385 #agm +ck +() + +387 + #O_POPUP + 0x80000000 + + ) + +388 + #O_ALERT + 0x20000000 + + ) + +394 #i! +defed +( +_POSIX_C_SOURCE +|| defed( +_DARWIN_C_SOURCE +) + +395 #ide +_FILESEC_T + + +396 + g_fec +; + +397 +_fec + * + tfec_t +; + +398 + #_FILESEC_T + + + ) + +401 + mFILESEC_OWNER + = 1, + +402 + mFILESEC_GROUP + = 2, + +403 + mFILESEC_UUID + = 3, + +404 + mFILESEC_MODE + = 4, + +405 + mFILESEC_ACL + = 5, + +406 + mFILESEC_GRPUUID + = 6, + +409 + mFILESEC_ACL_RAW + = 100, + +410 + mFILESEC_ACL_ALLOCSIZE + = 101 + +411 } + tfec_ݔty_t +; + +414 + #FILESEC_GUID + +FILESEC_UUID + + + ) + +417 +__BEGIN_DECLS + + +418 + $ݒ +(cڡ *, , ... + `__DARWIN_ALIAS_C +( +ݒ +); + +419 + $t +(cڡ *, +mode_t + + `__DARWIN_ALIAS_C +( +t +); + +420 + $f +(, , ... + `__DARWIN_ALIAS_C +( +f +); + +421 #i! + `defed +( +_POSIX_C_SOURCE +|| defed( +_DARWIN_C_SOURCE +) + +422 + `ݒx_ +(cڡ *, , +fec_t +); + +423 + `ock +(, ); + +424 +fec_t + + `fec_ +(); + +425 +fec_t + + `fec_dup +(filesec_t); + +426 + `fec_ +( +fec_t +); + +427 + `fec_g_ݔty +( +fec_t +, +fec_ݔty_t +, *); + +428 + `fec_t_ݔty +( +fec_t +, +fec_ݔty_t +, const *); + +429 + `fec_quy_ݔty +( +fec_t +, +fec_ݔty_t +, *); + +430 + #_FILESEC_UNSET_PROPERTY + ((*)0) + + ) + +431 + #_FILESEC_REMOVE_ACL + ((*)1) + + ) + +433 +__END_DECLS + + + @/usr/include/sys/select.h + +63 #ide +_SYS_SELECT_H_ + + +64 + #_SYS_SELECT_H_ + + + ) + +66 + ~<sys/pits.h +> + +67 + ~<sys/cdefs.h +> + +68 + ~<sys/_tys.h +> + +75 + #__ed_fd_t + + + ) + +76 + #__ed_ru_timeec + + + ) + +77 + #__ed_ru_timev + + + ) + +78 + ~<sys/_rus.h +> + +85 #idef +_TIME_T + + +86 + #_TIME_T + + + ) + +87 +__dw_time_t + + ttime_t +; + +90 #ide +_SUSECONDS_T + + +91 + #_SUSECONDS_T + + + ) + +92 +__dw_sucds_t + + tsucds_t +; + +95 #ide +_SIGSET_T + + +96 + #_SIGSET_T + + + ) + +97 +__dw_sigt_t + + tsigt_t +; + +112 #idef +FD_SETSIZE + + +113 + #FD_SETSIZE + +__DARWIN_FD_SETSIZE + + + ) + +115 #ide +FD_SET + + +116 + #FD_SET +( +n +, +p + + `__DARWIN_FD_SET +,) + + ) + +118 #ide +FD_CLR + + +119 + #FD_CLR +( +n +, +p + + `__DARWIN_FD_CLR +,) + + ) + +121 #ide +FD_ISSET + + +122 + #FD_ISSET +( +n +, +p + + `__DARWIN_FD_ISSET +,) + + ) + +124 #ide +FD_ZERO + + +125 + #FD_ZERO +( +p + + `__DARWIN_FD_ZERO +) + + ) + +127 #i! +defed +( +_POSIX_C_SOURCE +|| defed( +_DARWIN_C_SOURCE +) + +128 #ide +FD_COPY + + +129 + #FD_COPY +( +f +, +t + + `__DARWIN_FD_COPY +(f,) + + ) + +134 + g__BEGIN_DECLS + + +136 #ide +__MWERKS__ + + +137 + $p +(, +fd_t + * +__ri +, fd_set * __restrict, + +138 +fd_t + * +__ri +, cڡ +timeec + * __restrict, + +139 cڡ +sigt_t + * +__ri +) + +140 #i + `defed +( +_DARWIN_C_SOURCE +|| defed( +_DARWIN_UNLIMITED_SELECT +) + +141 + $__DARWIN_EXTSN_C +( +p +) + +143 #i + `defed +( +__LP64__ +&& ! +__DARWIN_NON_CANCELABLE + + +144 + $__DARWIN_1050 +( +p +) + +146 + $__DARWIN_ALIAS_C +( +p +) + +152 + ~<sys/_.h +> + +154 +__END_DECLS + + + @/usr/include/sys/unistd.h + +64 #ide +_SYS_UNISTD_H_ + + +65 + #_SYS_UNISTD_H_ + + + ) + +67 + ~<sys/cdefs.h +> + +75 #ifdef +_NOT_AVAILABLE + + +76 + #_POSIX_SAVED_IDS + + + ) + +79 + #_POSIX_VERSION + 200112L + + ) + +80 + #_POSIX2_VERSION + 200112L + + ) + +84 #ide +_POSIX_VDISABLE + + +85 + #_POSIX_VDISABLE + (()'\377') + + ) + +88 + #_POSIX_THREAD_KEYS_MAX + 128 + + ) + +91 + #F_OK + 0 + + ) + +92 + #X_OK + (1<<0 + + ) + +93 + #W_OK + (1<<1 + + ) + +94 + #R_OK + (1<<2 + + ) + +96 #i! +defed +( +_POSIX_C_SOURCE +|| defed( +_DARWIN_C_SOURCE +) + +102 + #_READ_OK + (1<<9 + + ) + +103 + #_WRITE_OK + (1<<10 + + ) + +104 + #_EXECUTE_OK + (1<<11 + + ) + +105 + #_DELETE_OK + (1<<12 + + ) + +106 + #_APPEND_OK + (1<<13 + + ) + +107 + #_RMFILE_OK + (1<<14 + + ) + +108 + #_RATTR_OK + (1<<15 + + ) + +109 + #_WATTR_OK + (1<<16 + + ) + +110 + #_REXT_OK + (1<<17 + + ) + +111 + #_WEXT_OK + (1<<18 + + ) + +112 + #_RPERM_OK + (1<<19 + + ) + +113 + #_WPERM_OK + (1<<20 + + ) + +114 + #_CHOWN_OK + (1<<21 + + ) + +116 + #_ACCESS_EXTENDED_MASK + ( +_READ_OK + | +_WRITE_OK + | +_EXECUTE_OK + | \ + +117 +_DELETE_OK + | +_APPEND_OK + | \ + +118 +_RMFILE_OK + | +_REXT_OK + | \ + +119 +_WEXT_OK + | +_RATTR_OK + | +_WATTR_OK + | +_RPERM_OK + | \ + +120 +_WPERM_OK + | +_CHOWN_OK +) + + ) + +124 #ide +SEEK_SET + + +125 + #SEEK_SET + 0 + + ) + +126 + #SEEK_CUR + 1 + + ) + +127 + #SEEK_END + 2 + + ) + +130 #i! +defed +( +_POSIX_C_SOURCE +|| defed( +_DARWIN_C_SOURCE +) + +132 + #L_SET + +SEEK_SET + + + ) + +133 + #L_INCR + +SEEK_CUR + + + ) + +134 + #L_XTND + +SEEK_END + + + ) + +137 #i! +defed +( +_POSIX_C_SOURCE +|| defed( +_DARWIN_C_SOURCE +) + +138 + sacssx_dest + { + +139 + mad_me_offt +; + +140 + mad_ags +; + +141 + mad_d +[2]; + +143 + #ACCESSX_MAX_DESCRIPTORS + 100 + + ) + +144 + #ACCESSX_MAX_TABLESIZE + (16 * 1024) + + ) + +148 + #_PC_LINK_MAX + 1 + + ) + +149 + #_PC_MAX_CANON + 2 + + ) + +150 + #_PC_MAX_INPUT + 3 + + ) + +151 + #_PC_NAME_MAX + 4 + + ) + +152 + #_PC_PATH_MAX + 5 + + ) + +153 + #_PC_PIPE_BUF + 6 + + ) + +154 + #_PC_CHOWN_RESTRICTED + 7 + + ) + +155 + #_PC_NO_TRUNC + 8 + + ) + +156 + #_PC_VDISABLE + 9 + + ) + +158 #i! +defed +( +_POSIX_C_SOURCE +|| defed( +_DARWIN_C_SOURCE +) + +159 + #_PC_NAME_CHARS_MAX + 10 + + ) + +160 + #_PC_CASE_SENSITIVE + 11 + + ) + +161 + #_PC_CASE_PRESERVING + 12 + + ) + +162 + #_PC_EXTENDED_SECURITY_NP + 13 + + ) + +163 + #_PC_AUTH_OPAQUE_NP + 14 + + ) + +166 + #_PC_2_SYMLINKS + 15 + + ) + +167 + #_PC_ALLOC_SIZE_MIN + 16 + + ) + +168 + #_PC_ASYNC_IO + 17 + + ) + +169 + #_PC_FILESIZEBITS + 18 + + ) + +170 + #_PC_PRIO_IO + 19 + + ) + +171 + #_PC_REC_INCR_XFER_SIZE + 20 + + ) + +172 + #_PC_REC_MAX_XFER_SIZE + 21 + + ) + +173 + #_PC_REC_MIN_XFER_SIZE + 22 + + ) + +174 + #_PC_REC_XFER_ALIGN + 23 + + ) + +175 + #_PC_SYMLINK_MAX + 24 + + ) + +176 + #_PC_SYNC_IO + 25 + + ) + +179 + #_CS_PATH + 1 + + ) + + @/usr/include/sys/wait.h + +64 #ide +_SYS_WAIT_H_ + + +65 + #_SYS_WAIT_H_ + + + ) + +67 + ~<sys/cdefs.h +> + +68 + ~<sys/_tys.h +> + +80 + mP_ALL +, + +81 + mP_PID +, + +82 + mP_PGID + + +83 } + tidty_t +; + +89 #ide +_PID_T + + +90 +__dw_pid_t + + tpid_t +; + +91 + #_PID_T + + + ) + +94 #ide +_ID_T + + +95 +__dw_id_t + + tid_t +; + +96 + #_ID_T + + + ) + +116 + ~<sys/sigl.h +> + +117 + ~<sys/sour.h +> + +128 + #WNOHANG + 0x00000001 + + ) + +129 + #WUNTRACED + 0x00000002 + + ) + +135 #i +defed +( +_POSIX_C_SOURCE +&& !defed( +_DARWIN_C_SOURCE +) + +136 + #_W_INT +( +i +(i) + + ) + +138 + #_W_INT +( +w +(*(*)&(w) + + ) + +139 + #WCOREFLAG + 0200 + + ) + +143 + #_WSTATUS +( +x +( + `_W_INT +(x& 0177) + + ) + +144 + #_WSTOPPED + 0177 + + ) + +150 #i +__DARWIN_UNIX03 + + +151 + #WEXITSTATUS +( +x +(( + `_W_INT +(x>> 8& 0x000000ff) + + ) + +153 + #WEXITSTATUS +( +x +( + `_W_INT +(x>> 8) + + ) + +156 + #WSTOPSIG +( +x +( + `_W_INT +(x>> 8) + + ) + +157 + #WIFCONTINUED +( +x +( + `_WSTATUS +(x= +_WSTOPPED + && + `WSTOPSIG +(x=0x13) + + ) + +158 + #WIFSTOPPED +( +x +( + `_WSTATUS +(x= +_WSTOPPED + && + `WSTOPSIG +(x!0x13) + + ) + +159 + #WIFEXITED +( +x +( + `_WSTATUS +(x=0) + + ) + +160 + #WIFSIGNALED +( +x +( + `_WSTATUS +(x! +_WSTOPPED + && _WSTATUS(x!0) + + ) + +161 + #WTERMSIG +( +x +( + `_WSTATUS +(x)) + + ) + +162 #i(! +defed +( +_POSIX_C_SOURCE +|| defed( +_DARWIN_C_SOURCE +)) + +163 + #WCOREDUMP +( +x +( + `_W_INT +(x& +WCOREFLAG +) + + ) + +165 + #W_EXITCODE +( +t +, +sig +(ԑ<< 8 | (sig)) + + ) + +166 + #W_STOPCODE +( +sig +((sig<< 8 | +_WSTOPPED +) + + ) + +175 + #WEXITED + 0x00000004 + + ) + +176 #i +__DARWIN_UNIX03 + + +178 + #WSTOPPED + 0x00000008 + + ) + +180 + #WCONTINUED + 0x00000010 + + ) + +181 + #WNOWAIT + 0x00000020 + + ) + +184 #i(! +defed +( +_POSIX_C_SOURCE +|| defed( +_DARWIN_C_SOURCE +)) + +190 + #WAIT_ANY + (-1 + + ) + +191 + #WAIT_MYPGRP + 0 + + ) + +193 + ~<mache/dn.h +> + +201 + uwa + { + +202 + mw_us +; + +207 #i +__DARWIN_BYTE_ORDER + = +__DARWIN_LITTLE_ENDIAN + + +208 + mw_Tmsig +:7, + +209 + mw_Cedump +:1, + +210 + mw_Rcode +:8, + +211 + mw_Fr +:16; + +213 #i +__DARWIN_BYTE_ORDER + = +__DARWIN_BIG_ENDIAN + + +214 + mw_Fr +:16, + +215 + mw_Rcode +:8, + +216 + mw_Cedump +:1, + +217 + mw_Tmsig +:7; + +219 } + mw_T +; + +226 #i +__DARWIN_BYTE_ORDER + = +__DARWIN_LITTLE_ENDIAN + + +227 + mw_Stv +:8, + +228 + mw_Stsig +:8, + +229 + mw_Fr +:16; + +231 #i +__DARWIN_BYTE_ORDER + = +__DARWIN_BIG_ENDIAN + + +232 + mw_Fr +:16, + +233 + mw_Stsig +:8, + +234 + mw_Stv +:8; + +236 } + mw_S +; + +238 + #w_rmsig + +w_T +. +w_Tmsig + + + ) + +239 + #w_cedump + +w_T +. +w_Cedump + + + ) + +240 + #w_tcode + +w_T +. +w_Rcode + + + ) + +241 + #w_v + +w_S +. +w_Stv + + + ) + +242 + #w_sig + +w_S +. +w_Stsig + + + ) + +246 #i!( +__DARWIN_UNIX03 + - 0) + +251 + #WSTOPPED + +_WSTOPPED + + + ) + +254 +__BEGIN_DECLS + + +255 +pid_t + + $wa +(* + `__DARWIN_ALIAS_C +( +wa +); + +256 +pid_t + + $wapid +( +pid_t +, *, + `__DARWIN_ALIAS_C +( +wapid +); + +257 #ide +_ANSI_SOURCE + + +258 + $waid +( +idty_t +, +id_t +, +sigfo_t + *, + `__DARWIN_ALIAS_C +( +waid +); + +260 #i (! + `defed +( +_POSIX_C_SOURCE +|| defed( +_DARWIN_C_SOURCE +)) + +261 +pid_t + + `wa3 +(*, , +ruge + *); + +262 +pid_t + + `wa4 +id_t, *, , +ruge + *); + +264 +__END_DECLS + + + @/usr/include/time.h + +63 #ide +_TIME_H_ + + +64 + #_TIME_H_ + + + ) + +66 + ~<_tys.h +> + +68 + #__ed_ru_timeec + + + ) + +69 + ~<_rus.h +> + +71 #ide +NULL + + +72 + #NULL + +__DARWIN_NULL + + + ) + +75 #idef +_CLOCK_T + + +76 + #_CLOCK_T + + + ) + +77 +__dw_ock_t + + tock_t +; + +80 #idef +_SIZE_T + + +81 + #_SIZE_T + + + ) + +82 +__dw_size_t + + tsize_t +; + +85 #idef +_TIME_T + + +86 + #_TIME_T + + + ) + +87 +__dw_time_t + + ttime_t +; + +90 + stm + { + +91 + mtm_c +; + +92 + mtm_m +; + +93 + mtm_hour +; + +94 + mtm_mday +; + +95 + mtm_m +; + +96 + mtm_yr +; + +97 + mtm_wday +; + +98 + mtm_yday +; + +99 + mtm_isd +; + +100 + mtm_gmtoff +; + +101 * + mtm_ze +; + +104 #i +__DARWIN_UNIX03 + + +105 + #CLOCKS_PER_SEC + 1000000 + + ) + +107 + ~<mache/_lims.h +> + +109 + #CLOCKS_PER_SEC + ( +__DARWIN_CLK_TCK +) + + ) + +112 #ide +_ANSI_SOURCE + + +113
* +tzme +[]; + +116
+gde_r +; + +117 #i +__DARWIN_UNIX03 + + +118
+timeze + +__DARWIN_ALIAS +(timezone); + +120
+daylight +; + +122 +__BEGIN_DECLS + + +123 * +asime +(cڡ +tm + *); + +124 +ock_t + + $ock +( + `__DARWIN_ALIAS +( +ock +); + +125 * + `ime +(cڡ +time_t + *); + +126 + `difime +( +time_t +,ime_t); + +127 +tm + * + `gde +(const *); + +128 +tm + * + `gmtime +(cڡ +time_t + *); + +129 +tm + * + `loime +(cڡ +time_t + *); + +130 +time_t + + $mktime +( +tm + * + `__DARWIN_ALIAS +( +mktime +); + +131 +size_t + + $rime +(* +__ri +, +size_t +, cڡ * __ri, cڡ +tm + * __ri + `__DARWIN_ALIAS +( +rime +); + +132 * + $time +(cڡ * +__ri +, cڡ * __ri, +tm + * __ri + `__DARWIN_ALIAS +( +time +); + +133 +time_t + + `time +(time_t *); + +135 #ide +_ANSI_SOURCE + + +136 + `tzt +(); + +140 * + `asime_r +(cڡ +tm + * +__ri +, * __restrict); + +141 * + `ime_r +(cڡ +time_t + *, *); + +142 +tm + * + `gmtime_r +(cڡ +time_t + * +__ri +, tm * __restrict); + +143 +tm + * + `loime_r +(cڡ +time_t + * +__ri +, tm * __restrict); + +145 #i! + `defed +( +_ANSI_SOURCE +&& (!defed( +_POSIX_C_SOURCE +|| defed( +_DARWIN_C_SOURCE +)) + +146 +time_t + + `posix2time +(time_t); + +147 #i! +__DARWIN_UNIX03 + + +148 * + `timeze +(, ); + +150 + `tztwl +(); + +151 +time_t + + `time2posix +(time_t); + +152 +time_t + + `timol +( +tm + * const); + +153 +time_t + + `timegm +( +tm + * const); + +156 #i! + `defed +( +_ANSI_SOURCE +) + +157 + $nop +(cڡ +timeec + *, timee* + `__DARWIN_ALIAS_C +( +nop +); + +159 +__END_DECLS + + +161 #ifde +_USE_EXTENDED_LOCALES_ + + +162 + ~<xlo/_time.h +> + + @/usr/include/xlocale/_stdio.h + +24 #ide +_XLOCALE__STDIO_H_ + + +25 + #_XLOCALE__STDIO_H_ + + + ) + +27 +__BEGIN_DECLS + + +28 + $artf_l +(**, +lo_t +, const *, ...) + +29 + `__DARWIN_LDBL_COMPAT2 +( +artf_l +); + +30 + $rtf_l +( +FILE + * +__ri +, +lo_t +, const * __restrict, ...) + +31 + `__DARWIN_LDBL_COMPAT2 +( +rtf_l +); + +32 + $fsnf_l +( +FILE + * +__ri +, +lo_t +, const * __restrict, ...) + +33 + `__DARWIN_LDBL_COMPAT2 +( +fsnf_l +); + +34 + $tf_l +( +lo_t +, cڡ * +__ri +, ...) + +35 + `__DARWIN_LDBL_COMPAT2 +( +tf_l +); + +36 + $snf_l +( +lo_t +, cڡ * +__ri +, ...) + +37 + `__DARWIN_LDBL_COMPAT2 +( +snf_l +); + +38 + $tf_l +(* +__ri +, +size_t +, +lo_t +, + +39 cڡ * +__ri +, ... + `__DARWIN_LDBL_COMPAT2 +( +tf_l +); + +40 + $rtf_l +(* +__ri +, +lo_t +, const * __restrict, ...) + +41 + `__DARWIN_LDBL_COMPAT2 +( +rtf_l +); + +42 + $ssnf_l +(cڡ * +__ri +, +lo_t +, const * __restrict, + +43 ... + `__DARWIN_LDBL_COMPAT2 +( +ssnf_l +); + +44 + $vartf_l +(**, +lo_t +, cڡ *, +va_li +) + +45 + `__DARWIN_LDBL_COMPAT2 +( +vartf_l +); + +46 + $vrtf_l +( +FILE + * +__ri +, +lo_t +, const * __restrict, + +47 +va_li + + `__DARWIN_LDBL_COMPAT2 +( +vrtf_l +); + +48 + $vfsnf_l +( +FILE + * +__ri +, +lo_t +, const * __restrict, + +49 +va_li + + `__DARWIN_LDBL_COMPAT2 +( +vfsnf_l +); + +50 + $vtf_l +( +lo_t +, cڡ * +__ri +, +va_li +) + +51 + `__DARWIN_LDBL_COMPAT2 +( +vtf_l +); + +52 + $vsnf_l +( +lo_t +, cڡ * +__ri +, +va_li +) + +53 + `__DARWIN_LDBL_COMPAT2 +( +vsnf_l +); + +54 + $vtf_l +(* +__ri +, +size_t +, +lo_t +, + +55 cڡ * +__ri +, +va_li +) + +56 + `__DARWIN_LDBL_COMPAT2 +( +vtf_l +); + +57 + $vrtf_l +(* +__ri +, +lo_t +, const * __restrict, + +58 +va_li + + `__DARWIN_LDBL_COMPAT2 +( +vrtf_l +); + +59 + $vssnf_l +(cڡ * +__ri +, +lo_t +, const * __restrict, + +60 +va_li + + `__DARWIN_LDBL_COMPAT2 +( +vssnf_l +); + +61 +__END_DECLS + + + @/usr/include/xlocale/_stdlib.h + +24 #ide +_XLOCALE__STDLIB_H_ + + +25 + #_XLOCALE__STDLIB_H_ + + + ) + +27 +__BEGIN_DECLS + + +28 +of_l +(cڡ *, +lo_t +); + +29 +oi_l +(cڡ *, +lo_t +); + +30 +_l +(cڡ *, +lo_t +); + +31 #i! +__DARWIN_NO_LONG_LONG + + +33 +l_l +(cڡ *, +lo_t +); + +35 +mbn_l +(cڡ *, +size_t +, +lo_t +); + +36 +size_t + +mbowcs_l +( +wch_t + * +__ri + , const * __restrict, size_t, + +37 +lo_t +); + +38 +mbtowc_l +( +wch_t + * +__ri +, cڡ * __ri, +size_t +, + +39 +lo_t +); + +40 + $od_l +(cڡ *, **, +lo_t + + `__DARWIN_ALIAS +( +od_l +); + +41 + $of_l +(cڡ *, **, +lo_t + + `__DARWIN_ALIAS +( +of_l +); + +42 + `_l +(cڡ *, **, , +lo_t +); + +44 + $d_l +(cڡ *, **, +lo_t +) + +45 + `__DARWIN_LDBL_COMPAT2 +( +d_l +); + +47 + `l_l +(cڡ *, **, , +lo_t +); + +48 #i! +__DARWIN_NO_LONG_LONG + + +50 + `oq_l +(cڡ *, **, , +lo_t +); + +53 + `oul_l +(cڡ *, **, , +lo_t +); + +55 + `ou_l +(cڡ *, **, , +lo_t +); + +56 #i! +__DARWIN_NO_LONG_LONG + + +58 + `ouq_l +(cڡ *, **, , +lo_t +); + +60 +size_t + + `wcombs_l +(* +__ri +, cڡ +wch_t + * __restrict, size_t, + +61 +lo_t +); + +62 + `womb_l +(*, +wch_t +, +lo_t +); + +65 #i! + `defed +( +__lulus +&& defed( +__WCHAR_MAX__ +) && __WCHAR_MAX__ <= 0xffffU + +66 #agm +GCC + +pois + +mbowcs_l + +mbtowc_l + +wcombs_l + +womb_l + + +68 +__END_DECLS + + + @/usr/include/_structs.h + +24 + ~<sys/_rus.h +> + + @/usr/include/i386/endian.h + +66 #ide +_I386__ENDIAN_H_ + + +67 + #_I386__ENDIAN_H_ + + + ) + +69 + ~<sys/cdefs.h +> + +78 + #_QUAD_HIGHWORD + 1 + + ) + +79 + #_QUAD_LOWWORD + 0 + + ) + +85 + #__DARWIN_LITTLE_ENDIAN + 1234 + + ) + +86 + #__DARWIN_BIG_ENDIAN + 4321 + + ) + +87 + #__DARWIN_PDP_ENDIAN + 3412 + + ) + +89 + #__DARWIN_BYTE_ORDER + +__DARWIN_LITTLE_ENDIAN + + + ) + +91 #if +defed +( +KERNEL +|| (!defed( +_POSIX_C_SOURCE +|| defed( +_DARWIN_C_SOURCE +)) + +93 + #LITTLE_ENDIAN + +__DARWIN_LITTLE_ENDIAN + + + ) + +94 + #BIG_ENDIAN + +__DARWIN_BIG_ENDIAN + + + ) + +95 + #PDP_ENDIAN + +__DARWIN_PDP_ENDIAN + + + ) + +97 + #BYTE_ORDER + +__DARWIN_BYTE_ORDER + + + ) + +99 + ~<sys/_dn.h +> + + @/usr/include/i386/types.h + +66 #idef +_MACHTYPES_H_ + + +67 + #_MACHTYPES_H_ + + + ) + +69 #ide +__ASSEMBLER__ + + +70 + ~<i386/_tys.h +> + +71 + ~<sys/cdefs.h +> + +76 #ide +_INT8_T + + +77 + #_INT8_T + + + ) + +78 +__sigd + + tt8_t +; + +80 + tu_t8_t +; + +81 #ide +_INT16_T + + +82 + #_INT16_T + + + ) + +83 + tt16_t +; + +85 + tu_t16_t +; + +86 #ide +_INT32_T + + +87 + #_INT32_T + + + ) + +88 + tt32_t +; + +90 + tu_t32_t +; + +91 #ide +_INT64_T + + +92 + #_INT64_T + + + ) + +93 + tt64_t +; + +95 + tu_t64_t +; + +97 #i +__LP64__ + + +98 +t64_t + + tgi_t +; + +100 +t32_t + + tgi_t +; + +103 #ide +_INTPTR_T + + +104 + #_INTPTR_T + + + ) + +105 +__dw__t + + t_t +; + +107 #ide +_UINTPTR_T + + +108 + #_UINTPTR_T + + + ) + +109 + tu_t +; + +112 #i! +defed +( +_ANSI_SOURCE +&& (!defed( +_POSIX_C_SOURCE +|| defed( +_DARWIN_C_SOURCE +)) + +114 +u_t64_t + + tur_addr_t +; + +115 +u_t64_t + + tur_size_t +; + +116 +t64_t + + tur_ssize_t +; + +117 +t64_t + + tur_lg_t +; + +118 +u_t64_t + + tur_ulg_t +; + +119 +t64_t + + tur_time_t +; + +120 + #USER_ADDR_NULL + (( +ur_addr_t +0) + + ) + +121 + #CAST_USER_ADDR_T +( +a_r +(( +ur_addr_t +)(( +u_t +)_r))) + + ) + +125 +u_t64_t + + tsys_g_t +; + +127 #ide +__offtof + + +128 + #__offtof +( +ty +, +fld +(( +size_t +)(&(y *)0)->fld)) + + ) + + @/usr/include/machine/_limits.h + +28 #ide +_BSD_MACHINE__LIMITS_H_ + + +29 + #_BSD_MACHINE__LIMITS_H_ + + + ) + +31 #i +defed + ( +__c__ +|| defed ( +__c64__ +) + +32 + ~"c/_lims.h +" + +33 #i +defed + ( +__i386__ +|| defed( +__x86_64__ +) + +34 + ~"i386/_lims.h +" + +35 #i +defed + ( +__m__ +) + +36 + ~"m/_lims.h +" + +38 #r +cheu + +n + +su܋d + + + @/usr/include/machine/_structs.h + +28 #i +defed + ( +__c__ +|| defed ( +__c64__ +) + +29 + ~"c/_rus.h +" + +30 #i +defed + ( +__i386__ +|| defed ( +__x86_64__ +) + +31 + ~"i386/_rus.h +" + +32 #i +defed + ( +__m__ +) + +33 + ~"m/_rus.h +" + +35 #r +cheu + +n + +su܋d + + + @/usr/include/machine/_types.h + +28 #ide +_BSD_MACHINE__TYPES_H_ + + +29 + #_BSD_MACHINE__TYPES_H_ + + + ) + +31 #i +defed + ( +__c__ +|| defed ( +__c64__ +) + +32 + ~"c/_tys.h +" + +33 #i +defed + ( +__i386__ +|| defed( +__x86_64__ +) + +34 + ~"i386/_tys.h +" + +35 #i +defed + ( +__m__ +) + +36 + ~"m/_tys.h +" + +38 #r +cheu + +n + +su܋d + + + @/usr/include/ppc/endian.h + +92 #ide +_PPC_ENDIAN_H_ + + +93 + #_PPC_ENDIAN_H_ + + + ) + +95 + ~<sys/cdefs.h +> + +100 + #_QUAD_HIGHWORD + 0 + + ) + +101 + #_QUAD_LOWWORD + 1 + + ) + +107 + #__DARWIN_LITTLE_ENDIAN + 1234 + + ) + +108 + #__DARWIN_BIG_ENDIAN + 4321 + + ) + +109 + #__DARWIN_PDP_ENDIAN + 3412 + + ) + +111 + #__DARWIN_BYTE_ORDER + +__DARWIN_BIG_ENDIAN + + + ) + +113 #if +defed +( +KERNEL +|| (!defed( +_POSIX_C_SOURCE +|| defed( +_DARWIN_C_SOURCE +)) + +115 + #LITTLE_ENDIAN + +__DARWIN_LITTLE_ENDIAN + + + ) + +116 + #BIG_ENDIAN + +__DARWIN_BIG_ENDIAN + + + ) + +117 + #PDP_ENDIAN + +__DARWIN_PDP_ENDIAN + + + ) + +119 + #BYTE_ORDER + +__DARWIN_BYTE_ORDER + + + ) + +121 + ~<sys/_dn.h +> + + @/usr/include/ppc/types.h + +66 #idef +_MACHTYPES_H_ + + +67 + #_MACHTYPES_H_ + + + ) + +69 #ide +__ASSEMBLER__ + + +70 + ~<c/_tys.h +> + +71 + ~<sys/cdefs.h +> + +76 #ide +_INT8_T + + +77 + #_INT8_T + + + ) + +78 +__sigd + + tt8_t +; + +80 + tu_t8_t +; + +81 #ide +_INT16_T + + +82 + #_INT16_T + + + ) + +83 + tt16_t +; + +85 + tu_t16_t +; + +86 #ide +_INT32_T + + +87 + #_INT32_T + + + ) + +88 + tt32_t +; + +90 + tu_t32_t +; + +91 #ide +_INT64_T + + +92 + #_INT64_T + + + ) + +93 + tt64_t +; + +95 + tu_t64_t +; + +97 #i +defed +( +__c64__ +) + +98 +t64_t + + tgi_t +; + +100 +t32_t + + tgi_t +; + +103 #ide +_INTPTR_T + + +104 + #_INTPTR_T + + + ) + +105 +__dw__t + + t_t +; + +107 #ide +_UINTPTR_T + + +108 + #_UINTPTR_T + + + ) + +109 + tu_t +; + +112 #i! +defed +( +_ANSI_SOURCE +&& (!defed( +_POSIX_C_SOURCE +|| defed( +_DARWIN_C_SOURCE +)) + +117 +u_t64_t + + tur_addr_t +; + +118 +u_t64_t + + tur_size_t +; + +119 +t64_t + + tur_ssize_t +; + +120 +t64_t + + tur_lg_t +; + +121 +u_t64_t + + tur_ulg_t +; + +122 +t64_t + + tur_time_t +; + +123 + #USER_ADDR_NULL + (( +ur_addr_t +0) + + ) + +124 + #CAST_USER_ADDR_T +( +a_r +(( +ur_addr_t +)(( +u_t +)_r))) + + ) + +128 +u_t64_t + + tsys_g_t +; + +130 #ide +__offtof + + +131 + #__offtof +( +ty +, +fld +(( +size_t +)(&(y *)0)->fld)) + + ) + + @/usr/include/secure/_common.h + +24 #ide +_SECURE__COMMON_H_ + + +25 + #_SECURE__COMMON_H_ + + + ) + +27 #unde +_USE_FORTIFY_LEVEL + + +28 #ifde +_FORTIFY_SOURCE + && _FORTIFY_SOURCE > 0 + +29 #i +_FORTIFY_SOURCE + > 1 + +30 + #_USE_FORTIFY_LEVEL + 2 + + ) + +32 + #_USE_FORTIFY_LEVEL + 1 + + ) + +35 + #_USE_FORTIFY_LEVEL + 0 + + ) + +38 + #__dw_obsz0 +( +obje + + `__but_obje_size + (obje, 0) + + ) + +39 + #__dw_obsz +( +obje + + `__but_obje_size + (obje, +_USE_FORTIFY_LEVEL + > 1) + + ) + + @/usr/include/sys/resource.h + +64 #ide +_SYS_RESOURCE_H_ + + +65 + #_SYS_RESOURCE_H_ + + + ) + +67 + ~<sys/pits.h +> + +68 + ~<sys/cdefs.h +> + +69 + ~<sys/_tys.h +> + +75 + #__ed_ru_timev + + + ) + +76 + ~<sys/_rus.h +> + +79 #ide +_ID_T + + +80 + #_ID_T + + + ) + +81 +__dw_id_t + + tid_t +; + +88 +__ut64_t + + tim_t +; + +99 + #PRIO_PROCESS + 0 + + ) + +100 + #PRIO_PGRP + 1 + + ) + +101 + #PRIO_USER + 2 + + ) + +103 #i! +defed +( +_POSIX_C_SOURCE +|| defed( +_DARWIN_C_SOURCE +) + +104 + #PRIO_DARWIN_THREAD + 3 + + ) + +109 + #PRIO_MIN + -20 + + ) + +110 + #PRIO_MAX + 20 + + ) + +116 + #PRIO_DARWIN_BG + 0x1000 + + ) + +130 + #RUSAGE_SELF + 0 + + ) + +131 + #RUSAGE_CHILDREN + -1 + + ) + +142 + sruge + { + +143 +timev + + mru_utime +; + +144 +timev + + mru_ime +; + +145 #i +defed +( +_POSIX_C_SOURCE +&& !defed( +_DARWIN_C_SOURCE +) + +146 + mru_aque +[14]; + +153 + mru_maxrss +; + +154 + #ru_f + +ru_ixrss + + + ) + +155 + mru_ixrss +; + +156 + mru_idrss +; + +157 + mru_iss +; + +158 + mru_mt +; + +159 + mru_majt +; + +160 + mru_nsw +; + +161 + mru_block +; + +162 + mru_oublock +; + +163 + mru_msgd +; + +164 + mru_msgrcv +; + +165 + mru_nsigls +; + +166 + mru_nvcsw +; + +167 + mru_nivcsw +; + +168 + #ru_ϡ + +ru_nivcsw + + + ) + +184 + #RLIM_INFINITY + ((( +__ut64_t +)1 << 63- 1 + + ) + +185 + #RLIM_SAVED_MAX + +RLIM_INFINITY + + + ) + +186 + #RLIM_SAVED_CUR + +RLIM_INFINITY + + + ) + +192 + #RLIMIT_CPU + 0 + + ) + +193 + #RLIMIT_FSIZE + 1 + + ) + +194 + #RLIMIT_DATA + 2 + + ) + +195 + #RLIMIT_STACK + 3 + + ) + +196 + #RLIMIT_CORE + 4 + + ) + +197 + #RLIMIT_AS + 5 + + ) + +198 #i! +defed +( +_POSIX_C_SOURCE +|| defed( +_DARWIN_C_SOURCE +) + +199 + #RLIMIT_RSS + +RLIMIT_AS + + + ) + +200 + #RLIMIT_MEMLOCK + 6 + + ) + +201 + #RLIMIT_NPROC + 7 + + ) + +203 + #RLIMIT_NOFILE + 8 + + ) + +204 #i! +defed +( +_POSIX_C_SOURCE +|| defed( +_DARWIN_C_SOURCE +) + +205 + #RLIM_NLIMITS + 9 + + ) + +207 + #_RLIMIT_POSIX_FLAG + 0x1000 + + ) + +213 + sim + { + +214 +im_t + + mim_cur +; + +215 +im_t + + mim_max +; + +218 #i! +defed +( +_POSIX_C_SOURCE +|| defed( +_DARWIN_C_SOURCE +) + +220 + #IOPOL_TYPE_DISK + 0 + + ) + +223 + #IOPOL_SCOPE_PROCESS + 0 + + ) + +224 + #IOPOL_SCOPE_THREAD + 1 + + ) + +227 + #IOPOL_DEFAULT + 0 + + ) + +228 + #IOPOL_NORMAL + 1 + + ) + +229 + #IOPOL_PASSIVE + 2 + + ) + +230 + #IOPOL_THROTTLE + 3 + + ) + +235 +__BEGIN_DECLS + + +236 +giܙy +(, +id_t +); + +237 #i! +defed +( +_POSIX_C_SOURCE +|| defed( +_DARWIN_C_SOURCE +) + +238 +giicy_ +(, ); + +240 + $gim +(, +im + * + `__DARWIN_ALIAS +( +gim +); + +241 + `gruge +(, +ruge + *); + +242 + `riܙy +(, +id_t +, ); + +243 #i! + `defed +( +_POSIX_C_SOURCE +|| defed( +_DARWIN_C_SOURCE +) + +244 + `tiicy_ +(, , ); + +246 + $lim +(, cڡ +im + * + `__DARWIN_ALIAS +( +lim +); + +247 +__END_DECLS + + + @/usr/include/sys/signal.h + +69 #idef +_SYS_SIGNAL_H_ + + +70 + #_SYS_SIGNAL_H_ + + + ) + +72 + ~<sys/cdefs.h +> + +73 + ~<sys/pits.h +> + +75 + #__DARWIN_NSIG + 32 + + ) + +77 #i! +defed +( +_ANSI_SOURCE +&& (!defed( +_POSIX_C_SOURCE +|| defed( +_DARWIN_C_SOURCE +)) + +78 + #NSIG + +__DARWIN_NSIG + + + ) + +81 + ~<mache/sigl.h +> + +83 + #SIGHUP + 1 + + ) + +84 + #SIGINT + 2 + + ) + +85 + #SIGQUIT + 3 + + ) + +86 + #SIGILL + 4 + + ) + +87 + #SIGTRAP + 5 + + ) + +88 + #SIGABRT + 6 + + ) + +89 #i ( +defed +( +_POSIX_C_SOURCE +&& !defed( +_DARWIN_C_SOURCE +)) + +90 + #SIGPOLL + 7 + + ) + +92 + #SIGIOT + +SIGABRT + + + ) + +93 + #SIGEMT + 7 + + ) + +95 + #SIGFPE + 8 + + ) + +96 + #SIGKILL + 9 + + ) + +97 + #SIGBUS + 10 + + ) + +98 + #SIGSEGV + 11 + + ) + +99 + #SIGSYS + 12 + + ) + +100 + #SIGPIPE + 13 + + ) + +101 + #SIGALRM + 14 + + ) + +102 + #SIGTERM + 15 + + ) + +103 + #SIGURG + 16 + + ) + +104 + #SIGSTOP + 17 + + ) + +105 + #SIGTSTP + 18 + + ) + +106 + #SIGCONT + 19 + + ) + +107 + #SIGCHLD + 20 + + ) + +108 + #SIGTTIN + 21 + + ) + +109 + #SIGTTOU + 22 + + ) + +110 #i (! +defed +( +_POSIX_C_SOURCE +|| defed( +_DARWIN_C_SOURCE +)) + +111 + #SIGIO + 23 + + ) + +113 + #SIGXCPU + 24 + + ) + +114 + #SIGXFSZ + 25 + + ) + +115 + #SIGVTALRM + 26 + + ) + +116 + #SIGPROF + 27 + + ) + +117 #i (! +defed +( +_POSIX_C_SOURCE +|| defed( +_DARWIN_C_SOURCE +)) + +118 + #SIGWINCH + 28 + + ) + +119 + #SIGINFO + 29 + + ) + +121 + #SIGUSR1 + 30 + + ) + +122 + #SIGUSR2 + 31 + + ) + +124 #i +defed +( +_ANSI_SOURCE +|| +__DARWIN_UNIX03 + || defed( +__lulus +) + +130 + #SIG_DFL + ((*)())0 + + ) + +131 + #SIG_IGN + ((*)())1 + + ) + +132 + #SIG_HOLD + ((*)())5 + + ) + +133 + #SIG_ERR + (((*)())-1) + + ) + +136 + #SIG_DFL + ((*)))0 + + ) + +137 + #SIG_IGN + ((*)))1 + + ) + +138 + #SIG_HOLD + ((*)))5 + + ) + +139 + #SIG_ERR + (((*)))-1) + + ) + +142 #ide +_ANSI_SOURCE + + +143 + ~<sys/_tys.h +> + +145 + #__ed_mcڋxt_t + + + ) + +146 + #__ed_ack_t + + + ) + +147 + #__ed_ucڋxt_t + + + ) + +148 #i! +defed +( +_POSIX_C_SOURCE +|| defed( +_DARWIN_C_SOURCE +) + +149 #i +defed +( +__c__ +|| defed( +__c64__ +) + +150 + #__ed_mcڋxt64_t + + + ) + +151 + #__ed_ucڋxt64_t + + + ) + +154 + ~<sys/_rus.h +> + +156 #ide +_PID_T + + +157 + #_PID_T + + + ) + +158 +__dw_pid_t + + tpid_t +; + +161 #ide +_PTHREAD_ATTR_T + + +162 + #_PTHREAD_ATTR_T + + + ) + +163 +__dw_had__t + + thad__t +; + +166 #ide +_SIGSET_T + + +167 + #_SIGSET_T + + + ) + +168 +__dw_sigt_t + + tsigt_t +; + +171 #idef +_SIZE_T + + +172 + #_SIZE_T + + + ) + +173 +__dw_size_t + + tsize_t +; + +176 #ide +_UID_T + + +177 + #_UID_T + + + ) + +178 +__dw_uid_t + + tuid_t +; + +181 + usigv + { + +183 + msiv_t +; + +184 * + msiv_r +; + +187 + #SIGEV_NONE + 0 + + ) + +188 + #SIGEV_SIGNAL + 1 + + ) + +189 + #SIGEV_THREAD + 3 + + ) + +191 + ssigevt + { + +192 + msigev_nify +; + +193 + msigev_signo +; + +194 +sigv + + msigev_vue +; + +195 (* + msigev_nify_funi +)( + msigv +); + +196 +had__t + * + msigev_nify_ibus +; + +200 + s__sigfo + { + +201 + msi_signo +; + +202 + msi_o +; + +203 + msi_code +; + +204 +pid_t + + msi_pid +; + +205 +uid_t + + msi_uid +; + +206 + msi_us +; + +207 * + msi_addr +; + +208 +sigv + + msi_vue +; + +209 + msi_bd +; + +210 + m__d +[7]; + +211 } + tsigfo_t +; + +228 #i! +defed +( +_POSIX_C_SOURCE +|| defed( +_DARWIN_C_SOURCE +) + +229 + #ILL_NOOP + 0 + + ) + +231 + #ILL_ILLOPC + 1 + + ) + +232 + #ILL_ILLTRP + 2 + + ) + +233 + #ILL_PRVOPC + 3 + + ) + +234 + #ILL_ILLOPN + 4 + + ) + +235 + #ILL_ILLADR + 5 + + ) + +236 + #ILL_PRVREG + 6 + + ) + +237 + #ILL_COPROC + 7 + + ) + +238 + #ILL_BADSTK + 8 + + ) + +241 #i! +defed +( +_POSIX_C_SOURCE +|| defed( +_DARWIN_C_SOURCE +) + +242 + #FPE_NOOP + 0 + + ) + +244 + #FPE_FLTDIV + 1 + + ) + +245 + #FPE_FLTOVF + 2 + + ) + +246 + #FPE_FLTUND + 3 + + ) + +247 + #FPE_FLTRES + 4 + + ) + +248 + #FPE_FLTINV + 5 + + ) + +249 + #FPE_FLTSUB + 6 + + ) + +250 + #FPE_INTDIV + 7 + + ) + +251 + #FPE_INTOVF + 8 + + ) + +254 #i! +defed +( +_POSIX_C_SOURCE +|| defed( +_DARWIN_C_SOURCE +) + +255 + #SEGV_NOOP + 0 + + ) + +257 + #SEGV_MAPERR + 1 + + ) + +258 + #SEGV_ACCERR + 2 + + ) + +261 #i! +defed +( +_POSIX_C_SOURCE +|| defed( +_DARWIN_C_SOURCE +) + +262 + #BUS_NOOP + 0 + + ) + +264 + #BUS_ADRALN + 1 + + ) + +265 + #BUS_ADRERR + 2 + + ) + +266 + #BUS_OBJERR + 3 + + ) + +269 + #TRAP_BRKPT + 1 + + ) + +270 + #TRAP_TRACE + 2 + + ) + +273 #i! +defed +( +_POSIX_C_SOURCE +|| defed( +_DARWIN_C_SOURCE +) + +274 + #CLD_NOOP + 0 + + ) + +276 + #CLD_EXITED + 1 + + ) + +277 + #CLD_KILLED + 2 + + ) + +278 + #CLD_DUMPED + 3 + + ) + +279 + #CLD_TRAPPED + 4 + + ) + +280 + #CLD_STOPPED + 5 + + ) + +281 + #CLD_CONTINUED + 6 + + ) + +284 + #POLL_IN + 1 + + ) + +285 + #POLL_OUT + 2 + + ) + +286 + #POLL_MSG + 3 + + ) + +287 + #POLL_ERR + 4 + + ) + +288 + #POLL_PRI + 5 + + ) + +289 + #POLL_HUP + 6 + + ) + +292 + u__sigai_u + { + +293 (* + m___hdr +)(); + +294 (* + m___sigai +)(, + m__sigfo + *, + +299 + s__sigai + { + +300 +__sigai_u + + m__sigai_u +; + +301 (* + m_amp +)(*, , , + msigfo_t + *, *); + +302 +sigt_t + + m_mask +; + +303 + m_ags +; + +309 + ssigai + { + +310 +__sigai_u + + m__sigai_u +; + +311 +sigt_t + + m_mask +; + +312 + m_ags +; + +318 + #_hdr + +__sigai_u +. +___hdr + + + ) + +319 + #_sigai + +__sigai_u +. +___sigai + + + ) + +321 + #SA_ONSTACK + 0x0001 + + ) + +322 + #SA_RESTART + 0x0002 + + ) + +323 + #SA_RESETHAND + 0x0004 + + ) + +324 + #SA_NOCLDSTOP + 0x0008 + + ) + +325 + #SA_NODEFER + 0x0010 + + ) + +326 + #SA_NOCLDWAIT + 0x0020 + + ) + +327 + #SA_SIGINFO + 0x0040 + + ) + +328 #i! +defed +( +_POSIX_C_SOURCE +|| defed( +_DARWIN_C_SOURCE +) + +329 + #SA_USERTRAMP + 0x0100 + + ) + +331 + #SA_64REGSET + 0x0200 + + ) + +337 + #SA_USERSPACE_MASK + ( +SA_ONSTACK + | +SA_RESTART + | +SA_RESETHAND + | +SA_NOCLDSTOP + | +SA_NODEFER + | +SA_NOCLDWAIT + | +SA_SIGINFO +) + + ) + +342 + #SIG_BLOCK + 1 + + ) + +343 + #SIG_UNBLOCK + 2 + + ) + +344 + #SIG_SETMASK + 3 + + ) + +347 + #SI_USER + 0x10001 + + ) + +348 + #SI_QUEUE + 0x10002 + + ) + +349 + #SI_TIMER + 0x10003 + + ) + +350 + #SI_ASYNCIO + 0x10004 + + ) + +351 + #SI_MESGQ + 0x10005 + + ) + +353 #i! +defed +( +_POSIX_C_SOURCE +|| defed( +_DARWIN_C_SOURCE +) + +354 (* + tsig_t +)(); + +361 + #SS_ONSTACK + 0x0001 + + ) + +362 + #SS_DISABLE + 0x0004 + + ) + +363 + #MINSIGSTKSZ + 32768 + + ) + +364 + #SIGSTKSZ + 131072 + + ) + +366 #i! + `defed +( +_POSIX_C_SOURCE +|| defed( +_DARWIN_C_SOURCE +) + +371 + ssigvec + { + +372 (* +sv_hdr +)(); + +373 +sv_mask +; + +374 +sv_ags +; + +377 + #SV_ONSTACK + +SA_ONSTACK + + + ) + +378 + #SV_INTERRUPT + +SA_RESTART + + + ) + +379 + #SV_RESETHAND + +SA_RESETHAND + + + ) + +380 + #SV_NODEFER + +SA_NODEFER + + + ) + +381 + #SV_NOCLDSTOP + +SA_NOCLDSTOP + + + ) + +382 + #SV_SIGINFO + +SA_SIGINFO + + + ) + +384 + #sv_ڡack + +sv_ags + + + ) + +390 + ssigack + { + +391 * +ss_ +; + +392 +ss_ڡack +; + +395 #i! + `defed +( +_POSIX_C_SOURCE +|| defed( +_DARWIN_C_SOURCE +) + +400 + #sigmask +( +m +(1 << ((m)-1)) + + ) + +403 + #BADSIG + +SIG_ERR + + + ) + +412 +__BEGIN_DECLS + + +413 (* + `sigl +(, (*)()))(); + +414 +__END_DECLS + + + @/usr/include/xlocale/_time.h + +24 #ide +_XLOCALE__TIME_H_ + + +25 + #_XLOCALE__TIME_H_ + + + ) + +27 +__BEGIN_DECLS + + +28 +size_t + + $rime_l +(* +__ri +, +size_t +, const * __restrict, + +29 cڡ +tm + * +__ri +, +lo_t +) + +30 + `__DARWIN_ALIAS +( +rime_l +); + +31 * + $time_l +(cڡ * +__ri +, const * __restrict, + +32 +tm + * +__ri +, +lo_t + + `__DARWIN_ALIAS +( +time_l +); + +33 +__END_DECLS + + + @/usr/include/i386/_limits.h + +22 #idef +_I386__LIMITS_H_ + + +23 + #_I386__LIMITS_H_ + + + ) + +25 + #__DARWIN_CLK_TCK + 100 + + ) + + @/usr/include/i386/_structs.h + +29 + ~<sys/pits.h +> + +31 #ifde +__ed_mcڋxt_t + + +32 #ide +__ed_ru_mcڋxt + + +33 + #__ed_ru_mcڋxt + + + ) + +37 #i +defed +( +__ed_ru_mcڋxt +) + +38 + ~<mach/i386/_rus.h +> + +42 #ifde +__ed_ru_mcڋxt + + +43 #unde +__ed_ru_mcڋxt + + +45 #ide +_STRUCT_MCONTEXT32 + + +46 #i +__DARWIN_UNIX03 + + +47 + #_STRUCT_MCONTEXT32 + +__dw_mcڋxt32 + + + ) + +48 + g_STRUCT_MCONTEXT32 + + +50 +_STRUCT_X86_EXCEPTION_STATE32 + + g__es +; + +51 +_STRUCT_X86_THREAD_STATE32 + + g__ss +; + +52 +_STRUCT_X86_FLOAT_STATE32 + + g__fs +; + +55 + #_STRUCT_MCONTEXT32 + +mcڋxt32 + + + ) + +56 + g_STRUCT_MCONTEXT32 + + +58 +_STRUCT_X86_EXCEPTION_STATE32 + + ges +; + +59 +_STRUCT_X86_THREAD_STATE32 + + gss +; + +60 +_STRUCT_X86_FLOAT_STATE32 + + gfs +; + +65 #ide +_STRUCT_MCONTEXT64 + + +66 #i +__DARWIN_UNIX03 + + +67 + #_STRUCT_MCONTEXT64 + +__dw_mcڋxt64 + + + ) + +68 + g_STRUCT_MCONTEXT64 + + +70 +_STRUCT_X86_EXCEPTION_STATE64 + + g__es +; + +71 +_STRUCT_X86_THREAD_STATE64 + + g__ss +; + +72 +_STRUCT_X86_FLOAT_STATE64 + + g__fs +; + +75 + #_STRUCT_MCONTEXT64 + +mcڋxt64 + + + ) + +76 + g_STRUCT_MCONTEXT64 + + +78 +_STRUCT_X86_EXCEPTION_STATE64 + + ges +; + +79 +_STRUCT_X86_THREAD_STATE64 + + gss +; + +80 +_STRUCT_X86_FLOAT_STATE64 + + gfs +; + +86 #ifde +__ed_mcڋxt_t + + +87 #unde +__ed_mcڋxt_t + + +88 #ide +_MCONTEXT_T + + +89 + #_MCONTEXT_T + + + ) + +90 #i +defed +( +__LP64__ +) + +91 +_STRUCT_MCONTEXT64 + * + tmcڋxt_t +; + +92 + #_STRUCT_MCONTEXT + +_STRUCT_MCONTEXT64 + + + ) + +94 +_STRUCT_MCONTEXT32 + * + tmcڋxt_t +; + +95 + #_STRUCT_MCONTEXT + +_STRUCT_MCONTEXT32 + + + ) + +100 #i! +defed +( +_POSIX_C_SOURCE +|| defed( +_DARWIN_C_SOURCE +) + +101 #ide +I386_MCONTEXT_SIZE + + +102 + #I386_MCONTEXT_SIZE + ( +mcڋxt +) + + ) + + @/usr/include/i386/_types.h + +28 #idef +_BSD_I386__TYPES_H_ + + +29 + #_BSD_I386__TYPES_H_ + + + ) + +36 #ifde +__GNUC__ + + +37 +__sigd + + t__t8_t +; + +39 + t__t8_t +; + +41 + t__ut8_t +; + +42 + t__t16_t +; + +43 + t__ut16_t +; + +44 + t__t32_t +; + +45 + t__ut32_t +; + +46 + t__t64_t +; + +47 + t__ut64_t +; + +49 + t__dw__t +; + +50 + t__dw_tul_t +; + +70 + t__dw__ru_t +; + +77 + m__mbe8 +[128]; + +78 + m_mbeL +; + +79 } + t__mbe_t +; + +81 +__mbe_t + + t__dw_mbe_t +; + +83 #i +defed +( +__GNUC__ +&& defed( +__PTRDIFF_TYPE__ +) + +84 +__PTRDIFF_TYPE__ + + t__dw_rdiff_t +; + +86 + t__dw_rdiff_t +; + +89 #i +defed +( +__GNUC__ +&& defed( +__SIZE_TYPE__ +) + +90 +__SIZE_TYPE__ + + t__dw_size_t +; + +92 + t__dw_size_t +; + +95 #i( +__GNUC__ + > 2) + +96 +__but_va_li + + t__dw_va_li +; + +98 * + t__dw_va_li +; + +101 #i +defed +( +__GNUC__ +&& defed( +__WCHAR_TYPE__ +) + +102 +__WCHAR_TYPE__ + + t__dw_wch_t +; + +104 +__dw__ru_t + + t__dw_wch_t +; + +107 +__dw_wch_t + + t__dw_ru_t +; + +109 #i +defed +( +__GNUC__ +&& defed( +__WINT_TYPE__ +) + +110 +__WINT_TYPE__ + + t__dw_wt_t +; + +112 +__dw__ru_t + + t__dw_wt_t +; + +115 + t__dw_ock_t +; + +116 +__ut32_t + + t__dw_sockn_t +; + +117 + t__dw_ssize_t +; + +118 + t__dw_time_t +; + + @/usr/include/machine/signal.h + +28 #ide +_BSD_MACHINE_SIGNAL_H_ + + +29 + #_BSD_MACHINE_SIGNAL_H_ + + + ) + +31 #i +defed + ( +__c__ +|| defed ( +__c64__ +) + +32 + ~"c/sigl.h +" + +33 #i +defed + ( +__i386__ +|| defed( +__x86_64__ +) + +34 + ~"i386/sigl.h +" + +35 #i +defed + ( +__m__ +) + +36 + ~"m/sigl.h +" + +38 #r +cheu + +n + +su܋d + + + @/usr/include/ppc/_limits.h + +22 #idef +_PPC__LIMITS_H_ + + +23 + #_PPC__LIMITS_H_ + + + ) + +25 + #__DARWIN_CLK_TCK + 100 + + ) + + @/usr/include/ppc/_structs.h + +29 + ~<sys/cdefs.h +> + +31 #ifde +__ed_mcڋxt_t + + +32 #ide +__ed_ru_mcڋxt + + +33 + #__ed_ru_mcڋxt + + + ) + +37 #ifde +__ed_mcڋxt64_t + + +38 #ide +__ed_ru_mcڋxt64 + + +39 + #__ed_ru_mcڋxt64 + + + ) + +43 #i +defed +( +__ed_ru_mcڋxt +|| defed( +__ed_ru_mcڋxt64 +) + +44 + ~<mach/c/_rus.h +> + +47 #ifde +__ed_ru_mcڋxt + + +48 #unde +__ed_ru_mcڋxt + + +49 #ide +_STRUCT_MCONTEXT + + +50 #i +__DARWIN_UNIX03 + + +51 + #_STRUCT_MCONTEXT + +__dw_mcڋxt + + + ) + +52 + g_STRUCT_MCONTEXT + + +54 +_STRUCT_PPC_EXCEPTION_STATE + + g__es +; + +55 +_STRUCT_PPC_THREAD_STATE + + g__ss +; + +56 +_STRUCT_PPC_FLOAT_STATE + + g__fs +; + +57 +_STRUCT_PPC_VECTOR_STATE + + g__vs +; + +60 + #_STRUCT_MCONTEXT + +mcڋxt + + + ) + +61 + g_STRUCT_MCONTEXT + + +63 +_STRUCT_PPC_EXCEPTION_STATE + + ges +; + +64 +_STRUCT_PPC_THREAD_STATE + + gss +; + +65 +_STRUCT_PPC_FLOAT_STATE + + gfs +; + +66 +_STRUCT_PPC_VECTOR_STATE + + gvs +; + +72 #ifde +__ed_ru_mcڋxt64 + + +73 #unde +__ed_ru_mcڋxt64 + + +74 #ide +_STRUCT_MCONTEXT64 + + +75 #i +__DARWIN_UNIX03 + + +76 + #_STRUCT_MCONTEXT64 + +__dw_mcڋxt64 + + + ) + +77 + g_STRUCT_MCONTEXT64 + + +79 +_STRUCT_PPC_EXCEPTION_STATE64 + + g__es +; + +80 +_STRUCT_PPC_THREAD_STATE64 + + g__ss +; + +81 +_STRUCT_PPC_FLOAT_STATE + + g__fs +; + +82 +_STRUCT_PPC_VECTOR_STATE + + g__vs +; + +85 + #_STRUCT_MCONTEXT64 + +mcڋxt64 + + + ) + +86 + g_STRUCT_MCONTEXT64 + + +88 +_STRUCT_PPC_EXCEPTION_STATE64 + + ges +; + +89 +_STRUCT_PPC_THREAD_STATE64 + + gss +; + +90 +_STRUCT_PPC_FLOAT_STATE + + gfs +; + +91 +_STRUCT_PPC_VECTOR_STATE + + gvs +; + +97 #ifde +__ed_mcڋxt_t + + +98 #unde +__ed_mcڋxt_t + + +99 #ide +_MCONTEXT_T + + +100 + #_MCONTEXT_T + + + ) + +101 +_STRUCT_MCONTEXT + * + tmcڋxt_t +; + +105 #ifde +__ed_mcڋxt64_t + + +106 #unde +__ed_mcڋxt64_t + + +107 #ide +_MCONTEXT64_T + + +108 + #_MCONTEXT64_T + + + ) + +109 +_STRUCT_MCONTEXT64 + * + tmcڋxt64_t +; + +113 #i! +defed +( +_POSIX_C_SOURCE +|| defed( +_DARWIN_C_SOURCE +) + +114 #ide +PPC_MCONTEXT_SIZE + + +115 + #PPC_MCONTEXT_SIZE + ( +PPC_THREAD_STATE_COUNT + + +PPC_FLOAT_STATE_COUNT + + +PPC_EXCEPTION_STATE_COUNT + + +PPC_VECTOR_STATE_COUNT +* () + + ) + +117 #ide +PPC_MCONTEXT64_SIZE + + +118 + #PPC_MCONTEXT64_SIZE + ( +PPC_THREAD_STATE64_COUNT + + +PPC_FLOAT_STATE_COUNT + + +PPC_EXCEPTION_STATE_COUNT + + +PPC_VECTOR_STATE_COUNT +* () + + ) + +126 #ifde +__ed_ru_sigcڋxt + + +127 #unde +__ed_ru_sigcڋxt + + +128 #ide +_STRUCT_SIGCONTEXT + + +129 #i +__DARWIN_UNIX03 + + +130 + #_STRUCT_SIGCONTEXT + +__dw_sigcڋxt + + + ) + +131 + g_STRUCT_SIGCONTEXT + + +133 + g__sc_ڡack +; + +134 + g__sc_mask +; + +135 + g__sc_ +; + +136 + g__sc_psw +; + +137 + g__sc_ +; + +138 * + g__sc_gs +; + +141 + #_STRUCT_SIGCONTEXT + +sigcڋxt + + + ) + +142 + g_STRUCT_SIGCONTEXT + + +144 + gsc_ڡack +; + +145 + gsc_mask +; + +146 + gsc_ +; + +147 + gsc_psw +; + +148 + gsc_ +; + +149 * + gsc_gs +; + +162 #ifde +__ed_ru_sigcڋxt32 + + +163 #unde +__ed_ru_sigcڋxt32 + + +164 #ide +_STRUCT_SIGCONTEXT32 + + +165 #i +__DARWIN_UNIX03 + + +166 + #_STRUCT_SIGCONTEXT32 + +__dw_sigcڋxt32 + + + ) + +167 + g_STRUCT_SIGCONTEXT32 + + +169 + g__sc_ڡack +; + +170 + g__sc_mask +; + +171 + g__sc_ +; + +172 + g__sc_psw +; + +173 + g__sc_ +; + +174 * + g__sc_gs +; + +177 + #_STRUCT_SIGCONTEXT32 + +sigcڋxt32 + + + ) + +178 + g_STRUCT_SIGCONTEXT32 + + +180 + gsc_ڡack +; + +181 + gsc_mask +; + +182 + gsc_ +; + +183 + gsc_psw +; + +184 + gsc_ +; + +185 * + gsc_gs +; + +191 #ifde +__ed_ru_sigcڋxt64 + + +192 #unde +__ed_ru_sigcڋxt64 + + +193 #ide +_STRUCT_SIGCONTEXT64 + + +194 #i +__DARWIN_UNIX03 + + +195 + #_STRUCT_SIGCONTEXT64 + +__dw_sigcڋxt64 + + + ) + +196 + g_STRUCT_SIGCONTEXT64 + + +198 + g__sc_ڡack +; + +199 + g__sc_mask +; + +200 + g__sc_ +; + +201 + g__sc_psw +; + +202 + g__sc_ +; + +203 * + g__sc_gs +; + +206 + #_STRUCT_SIGCONTEXT64 + +sigcڋxt64 + + + ) + +207 + g_STRUCT_SIGCONTEXT64 + + +209 + gsc_ڡack +; + +210 + gsc_mask +; + +211 + gsc_ +; + +212 + gsc_psw +; + +213 + gsc_ +; + +214 * + gsc_gs +; + + @/usr/include/ppc/_types.h + +28 #idef +_BSD_PPC__TYPES_H_ + + +29 + #_BSD_PPC__TYPES_H_ + + + ) + +36 #ifde +__GNUC__ + + +37 +__sigd + + t__t8_t +; + +39 + t__t8_t +; + +41 + t__ut8_t +; + +42 + t__t16_t +; + +43 + t__ut16_t +; + +44 + t__t32_t +; + +45 + t__ut32_t +; + +46 + t__t64_t +; + +47 + t__ut64_t +; + +49 + t__dw__t +; + +50 + t__dw_tul_t +; + +70 + t__dw__ru_t +; + +77 + m__mbe8 +[128]; + +78 + m_mbeL +; + +79 } + t__mbe_t +; + +81 +__mbe_t + + t__dw_mbe_t +; + +83 #i +defed +( +__GNUC__ +&& defed( +__PTRDIFF_TYPE__ +) + +84 +__PTRDIFF_TYPE__ + + t__dw_rdiff_t +; + +86 + t__dw_rdiff_t +; + +89 #i +defed +( +__GNUC__ +&& defed( +__SIZE_TYPE__ +) + +90 +__SIZE_TYPE__ + + t__dw_size_t +; + +92 + t__dw_size_t +; + +95 #i( +__GNUC__ + > 2) + +96 +__but_va_li + + t__dw_va_li +; + +98 * + t__dw_va_li +; + +101 #i +defed +( +__GNUC__ +&& defed( +__WCHAR_TYPE__ +) + +102 +__WCHAR_TYPE__ + + t__dw_wch_t +; + +104 +__dw__ru_t + + t__dw_wch_t +; + +107 +__dw_wch_t + + t__dw_ru_t +; + +109 #i +defed +( +__GNUC__ +&& defed( +__WINT_TYPE__ +) + +110 +__WINT_TYPE__ + + t__dw_wt_t +; + +112 +__dw__ru_t + + t__dw_wt_t +; + +115 + t__dw_ock_t +; + +116 +__ut32_t + + t__dw_sockn_t +; + +117 + t__dw_ssize_t +; + +118 + t__dw_time_t +; + + @/usr/include/sys/_endian.h + +90 #ide +_SYS__ENDIAN_H_ + + +91 + #_SYS__ENDIAN_H_ + + + ) + +93 + ~<sys/cdefs.h +> + +99 #i +defed +( +lt +) + +101 +__BEGIN_DECLS + + +102 +__ut16_t + +ohs +(__uint16_t); + +103 +__ut16_t + +hts +(__uint16_t); + +104 +__ut32_t + +ohl +(__uint32_t); + +105 +__ut32_t + +htl +(__uint32_t); + +106 + g__END_DECLS + + +108 #i +__DARWIN_BYTE_ORDER + = +__DARWIN_BIG_ENDIAN + + +110 + #ohl +( +x +(x) + + ) + +111 + #ohs +( +x +(x) + + ) + +112 + #htl +( +x +(x) + + ) + +113 + #hts +( +x +(x) + + ) + +115 #i +defed +( +KERNEL +|| (!defed( +_POSIX_C_SOURCE +|| defed( +_DARWIN_C_SOURCE +)) + +116 + #NTOHL +( +x +(x) + + ) + +117 + #NTOHS +( +x +(x) + + ) + +118 + #HTONL +( +x +(x) + + ) + +119 + #HTONS +( +x +(x) + + ) + +124 + ~<libkn/_OSByOrd.h +> + +126 + #ohs +( +x + + `__DARWIN_OSSwI16 +(x) + + ) + +127 + #hts +( +x + + `__DARWIN_OSSwI16 +(x) + + ) + +129 + #ohl +( +x + + `__DARWIN_OSSwI32 +(x) + + ) + +130 + #htl +( +x + + `__DARWIN_OSSwI32 +(x) + + ) + +132 #if +defed +( +KERNEL +|| (!defed( +_POSIX_C_SOURCE +|| defed( +_DARWIN_C_SOURCE +)) + +133 + #NTOHL +( +x +(x + `ohl +(( +__ut32_t +)x) + + ) + +134 + #NTOHS +( +x +(x + `ohs +(( +__ut16_t +)x) + + ) + +135 + #HTONL +( +x +(x + `htl +(( +__ut32_t +)x) + + ) + +136 + #HTONS +( +x +(x + `hts +(( +__ut16_t +)x) + + ) + + @/usr/include/i386/signal.h + +33 #idef +_I386_SIGNAL_H_ + + +34 + #_I386_SIGNAL_H_ + 1 + + ) + +36 + ~<sys/cdefs.h +> + +38 #ide +_ANSI_SOURCE + + +39 + tsig_omic_t +; + +41 #i! +defed +( +_POSIX_C_SOURCE +|| defed( +_DARWIN_C_SOURCE +) + +43 + ~<sys/pits.h +> + +45 #ifde +__APPLE_API_OBSOLETE + + +54 + #__ed_ru_sigcڋxt + + + ) + +55 + ~<i386/_rus.h +> + + @/usr/include/libkern/_OSByteOrder.h + +29 #ide +_OS__OSBYTEORDER_H + + +30 + #_OS__OSBYTEORDER_H + + + ) + +40 + ~<sys/_tys.h +> + +43 + #__DARWIN_OSSwCڡI16 +( +x +) \ + +44 (( +__ut16_t +)((((__ut16_t)( +x +) & 0xff00) >> 8) | \ + +45 ((( +__ut16_t +)( +x +& 0x00ff<< 8))) + + ) + +47 + #__DARWIN_OSSwCڡI32 +( +x +) \ + +48 (( +__ut32_t +)((((__ut32_t)( +x +) & 0xff000000) >> 24) | \ + +49 ((( +__ut32_t +)( +x +) & 0x00ff0000) >> 8) | \ + +50 ((( +__ut32_t +)( +x +) & 0x0000ff00) << 8) | \ + +51 ((( +__ut32_t +)( +x +& 0x000000ff<< 24))) + + ) + +53 + #__DARWIN_OSSwCڡI64 +( +x +) \ + +54 (( +__ut64_t +)((((__ut64_t)( +x +) & 0xff00000000000000ULL) >> 56) | \ + +55 ((( +__ut64_t +)( +x +) & 0x00ff000000000000ULL) >> 40) | \ + +56 ((( +__ut64_t +)( +x +) & 0x0000ff0000000000ULL) >> 24) | \ + +57 ((( +__ut64_t +)( +x +) & 0x000000ff00000000ULL) >> 8) | \ + +58 ((( +__ut64_t +)( +x +) & 0x00000000ff000000ULL) << 8) | \ + +59 ((( +__ut64_t +)( +x +) & 0x0000000000ff0000ULL) << 24) | \ + +60 ((( +__ut64_t +)( +x +) & 0x000000000000ff00ULL) << 40) | \ + +61 ((( +__ut64_t +)( +x +& 0x00000000000000ffULL<< 56))) + + ) + +63 #i +defed +( +__GNUC__ +) + +65 #i +defed +( +__i386__ +|| defed( +__x86_64__ +) + +66 + ~<libkn/i386/_OSByOrd.h +> + +69 #i +defed +( +__m__ +) + +70 + ~<libkn/m/OSByOrd.h +> + +74 + #__DARWIN_OSSwI16 +( +x +) \ + +75 ( + `__but_cڡt_p +( +x +? + `__DARWIN_OSSwCڡI16 +(x: + `_OSSwI16 +(x)) + + ) + +77 + #__DARWIN_OSSwI32 +( +x +) \ + +78 ( + `__but_cڡt_p +( +x +? + `__DARWIN_OSSwCڡI32 +(x: + `_OSSwI32 +(x)) + + ) + +80 + #__DARWIN_OSSwI64 +( +x +) \ + +81 ( + `__but_cڡt_p +( +x +? + `__DARWIN_OSSwCڡI64 +(x: + `_OSSwI64 +(x)) + + ) + +85 #i +defed +( +__i386__ +|| defed( +__x86_64__ +) + +87 #i! +defed +( +__DARWIN_OS_INLINE +) + +88 #i +defed +( +__STDC_VERSION__ +) && __STDC_VERSION__ >= 199901L + +89 + #__DARWIN_OS_INLINE + +le + + + ) + +90 #i +defed +( +__MWERKS__ +|| defed( +__lulus +) + +91 + #__DARWIN_OS_INLINE + +le + + + ) + +93 + #__DARWIN_OS_INLINE + +__le__ + + + ) + +97 +__DARWIN_OS_INLINE + + +98 +ut16_t + + +99 + $_OSSwI16 +( + +100 +ut16_t + +da + + +103 + `__DARWIN_OSSwCڡI16 +( +da +); + +104 + } +} + +106 +__DARWIN_OS_INLINE + + +107 +ut32_t + + +108 + $_OSSwI32 +( + +109 +ut32_t + +da + + +112 + `__DARWIN_OSSwCڡI32 +( +da +); + +113 + } +} + +115 +__DARWIN_OS_INLINE + + +116 +ut64_t + + +117 + $_OSSwI64 +( + +118 +ut64_t + +da + + +121 + `__DARWIN_OSSwCڡI64 +( +da +); + +122 + } +} + +125 + #__DARWIN_OSSwI16 +( +x + + `_OSSwI16 +(x) + + ) + +127 + #__DARWIN_OSSwI32 +( +x + + `_OSSwI32 +(x) + + ) + +129 + #__DARWIN_OSSwI64 +( +x + + `_OSSwI64 +(x) + + ) + + @/usr/include/mach/i386/_structs.h + +32 #idef +_MACH_I386__STRUCTS_H_ + + +33 + #_MACH_I386__STRUCTS_H_ + + + ) + +41 #i +__DARWIN_UNIX03 + + +42 + #_STRUCT_X86_THREAD_STATE32 + +__dw_i386_thad_e + + + ) + +43 + g_STRUCT_X86_THREAD_STATE32 + + +45 + g__x +; + +46 + g__ebx +; + +47 + g__ecx +; + +48 + g__edx +; + +49 + g__edi +; + +50 + g__esi +; + +51 + g__ebp +; + +52 + g__e +; + +53 + g__ss +; + +54 + g__eags +; + +55 + g__e +; + +56 + g__cs +; + +57 + g__ds +; + +58 + g__es +; + +59 + g__fs +; + +60 + g__gs +; + +63 + #_STRUCT_X86_THREAD_STATE32 + +i386_thad_e + + + ) + +64 + g_STRUCT_X86_THREAD_STATE32 + + +66 + gx +; + +67 + gebx +; + +68 + gecx +; + +69 + gedx +; + +70 + gedi +; + +71 + gesi +; + +72 + gebp +; + +73 + ge +; + +74 + gss +; + +75 + geags +; + +76 + ge +; + +77 + gcs +; + +78 + gds +; + +79 + ges +; + +80 + gfs +; + +81 + ggs +; + +87 #i +__DARWIN_UNIX03 + + +88 + #_STRUCT_FP_CONTROL + +__dw__cڌ + + + ) + +89 + g_STRUCT_FP_CONTROL + + +91 + g__vid + :1, + +92 + g__dm + :1, + +93 + g__zdiv + :1, + +94 + g__ovr + :1, + +95 + g__und + :1, + +96 + g__ecis + :1, + +98 + g__pc + :2, + +99 #i! +defed +( +_POSIX_C_SOURCE +|| defed( +_DARWIN_C_SOURCE +) + +100 + #FP_PREC_24B + 0 + + ) + +101 + #FP_PREC_53B + 2 + + ) + +102 + #FP_PREC_64B + 3 + + ) + +104 + g__rc + :2, + +105 #i! +defed +( +_POSIX_C_SOURCE +|| defed( +_DARWIN_C_SOURCE +) + +106 + #FP_RND_NEAR + 0 + + ) + +107 + #FP_RND_DOWN + 1 + + ) + +108 + #FP_RND_UP + 2 + + ) + +109 + #FP_CHOP + 3 + + ) + +114 +_STRUCT_FP_CONTROL + + t__dw__cڌ_t +; + +116 + #_STRUCT_FP_CONTROL + +_cڌ + + + ) + +117 + g_STRUCT_FP_CONTROL + + +119 + gvid + :1, + +120 + gdm + :1, + +121 + gzdiv + :1, + +122 + govr + :1, + +123 + gund + :1, + +124 + gecis + :1, + +126 + gpc + :2, + +127 + #FP_PREC_24B + 0 + + ) + +128 + #FP_PREC_53B + 2 + + ) + +129 + #FP_PREC_64B + 3 + + ) + +130 + grc + :2, + +131 + #FP_RND_NEAR + 0 + + ) + +132 + #FP_RND_DOWN + 1 + + ) + +133 + #FP_RND_UP + 2 + + ) + +134 + #FP_CHOP + 3 + + ) + +138 +_STRUCT_FP_CONTROL + + t_cڌ_t +; + +145 #i +__DARWIN_UNIX03 + + +146 + #_STRUCT_FP_STATUS + +__dw__us + + + ) + +147 + g_STRUCT_FP_STATUS + + +149 + g__vid + :1, + +150 + g__dm + :1, + +151 + g__zdiv + :1, + +152 + g__ovr + :1, + +153 + g__und + :1, + +154 + g__ecis + :1, + +155 + g__kt + :1, + +156 + g__rsumm + :1, + +157 + g__c0 + :1, + +158 + g__c1 + :1, + +159 + g__c2 + :1, + +160 + g__tos + :3, + +161 + g__c3 + :1, + +162 + g__busy + :1; + +164 +_STRUCT_FP_STATUS + + t__dw__us_t +; + +166 + #_STRUCT_FP_STATUS + +_us + + + ) + +167 + g_STRUCT_FP_STATUS + + +169 + gvid + :1, + +170 + gdm + :1, + +171 + gzdiv + :1, + +172 + govr + :1, + +173 + gund + :1, + +174 + gecis + :1, + +175 + gkt + :1, + +176 + grsumm + :1, + +177 + gc0 + :1, + +178 + gc1 + :1, + +179 + gc2 + :1, + +180 + gtos + :3, + +181 + gc3 + :1, + +182 + gbusy + :1; + +184 +_STRUCT_FP_STATUS + + t_us_t +; + +189 #i +__DARWIN_UNIX03 + + +190 + #_STRUCT_MMST_REG + +__dw_mm_g + + + ) + +191 + g_STRUCT_MMST_REG + + +193 + g__mm_g +[10]; + +194 + g__mm_rv +[6]; + +197 + #_STRUCT_MMST_REG + +mm_g + + + ) + +198 + g_STRUCT_MMST_REG + + +200 + gmm_g +[10]; + +201 + gmm_rv +[6]; + +208 #i +__DARWIN_UNIX03 + + +209 + #_STRUCT_XMM_REG + +__dw_xmm_g + + + ) + +210 + g_STRUCT_XMM_REG + + +212 + g__xmm_g +[16]; + +215 + #_STRUCT_XMM_REG + +xmm_g + + + ) + +216 + g_STRUCT_XMM_REG + + +218 + gxmm_g +[16]; + +226 #i! +defed +( +_POSIX_C_SOURCE +|| defed( +_DARWIN_C_SOURCE +) + +227 + #FP_STATE_BYTES + 512 + + ) + +230 #i +__DARWIN_UNIX03 + + +231 + #_STRUCT_X86_FLOAT_STATE32 + +__dw_i386_t_e + + + ) + +232 + g_STRUCT_X86_FLOAT_STATE32 + + +234 + g__u_rved +[2]; + +235 +_STRUCT_FP_CONTROL + + g__u_fcw +; + +236 +_STRUCT_FP_STATUS + + g__u_fsw +; + +237 +__ut8_t + + g__u_w +; + +238 +__ut8_t + + g__u_rv1 +; + +239 +__ut16_t + + g__u_f +; + +240 +__ut32_t + + g__u_ +; + +241 +__ut16_t + + g__u_cs +; + +242 +__ut16_t + + g__u_rv2 +; + +243 +__ut32_t + + g__u_dp +; + +244 +__ut16_t + + g__u_ds +; + +245 +__ut16_t + + g__u_rv3 +; + +246 +__ut32_t + + g__u_mxc +; + +247 +__ut32_t + + g__u_mxcmask +; + +248 +_STRUCT_MMST_REG + + g__u_mm0 +; + +249 +_STRUCT_MMST_REG + + g__u_mm1 +; + +250 +_STRUCT_MMST_REG + + g__u_mm2 +; + +251 +_STRUCT_MMST_REG + + g__u_mm3 +; + +252 +_STRUCT_MMST_REG + + g__u_mm4 +; + +253 +_STRUCT_MMST_REG + + g__u_mm5 +; + +254 +_STRUCT_MMST_REG + + g__u_mm6 +; + +255 +_STRUCT_MMST_REG + + g__u_mm7 +; + +256 +_STRUCT_XMM_REG + + g__u_xmm0 +; + +257 +_STRUCT_XMM_REG + + g__u_xmm1 +; + +258 +_STRUCT_XMM_REG + + g__u_xmm2 +; + +259 +_STRUCT_XMM_REG + + g__u_xmm3 +; + +260 +_STRUCT_XMM_REG + + g__u_xmm4 +; + +261 +_STRUCT_XMM_REG + + g__u_xmm5 +; + +262 +_STRUCT_XMM_REG + + g__u_xmm6 +; + +263 +_STRUCT_XMM_REG + + g__u_xmm7 +; + +264 + g__u_rv4 +[14*16]; + +265 + g__u_rved1 +; + +268 + #_STRUCT_X86_FLOAT_STATE32 + +i386_t_e + + + ) + +269 + g_STRUCT_X86_FLOAT_STATE32 + + +271 + gu_rved +[2]; + +272 +_STRUCT_FP_CONTROL + + gu_fcw +; + +273 +_STRUCT_FP_STATUS + + gu_fsw +; + +274 +__ut8_t + + gu_w +; + +275 +__ut8_t + + gu_rv1 +; + +276 +__ut16_t + + gu_f +; + +277 +__ut32_t + + gu_ +; + +278 +__ut16_t + + gu_cs +; + +279 +__ut16_t + + gu_rv2 +; + +280 +__ut32_t + + gu_dp +; + +281 +__ut16_t + + gu_ds +; + +282 +__ut16_t + + gu_rv3 +; + +283 +__ut32_t + + gu_mxc +; + +284 +__ut32_t + + gu_mxcmask +; + +285 +_STRUCT_MMST_REG + + gu_mm0 +; + +286 +_STRUCT_MMST_REG + + gu_mm1 +; + +287 +_STRUCT_MMST_REG + + gu_mm2 +; + +288 +_STRUCT_MMST_REG + + gu_mm3 +; + +289 +_STRUCT_MMST_REG + + gu_mm4 +; + +290 +_STRUCT_MMST_REG + + gu_mm5 +; + +291 +_STRUCT_MMST_REG + + gu_mm6 +; + +292 +_STRUCT_MMST_REG + + gu_mm7 +; + +293 +_STRUCT_XMM_REG + + gu_xmm0 +; + +294 +_STRUCT_XMM_REG + + gu_xmm1 +; + +295 +_STRUCT_XMM_REG + + gu_xmm2 +; + +296 +_STRUCT_XMM_REG + + gu_xmm3 +; + +297 +_STRUCT_XMM_REG + + gu_xmm4 +; + +298 +_STRUCT_XMM_REG + + gu_xmm5 +; + +299 +_STRUCT_XMM_REG + + gu_xmm6 +; + +300 +_STRUCT_XMM_REG + + gu_xmm7 +; + +301 + gu_rv4 +[14*16]; + +302 + gu_rved1 +; + +306 #i +__DARWIN_UNIX03 + + +307 + #_STRUCT_X86_EXCEPTION_STATE32 + +__dw_i386_exi_e + + + ) + +308 + g_STRUCT_X86_EXCEPTION_STATE32 + + +310 + g__no +; + +311 + g__r +; + +312 + g__uvaddr +; + +315 + #_STRUCT_X86_EXCEPTION_STATE32 + +i386_exi_e + + + ) + +316 + g_STRUCT_X86_EXCEPTION_STATE32 + + +318 + gno +; + +319 + gr +; + +320 + guvaddr +; + +324 #i +__DARWIN_UNIX03 + + +325 + #_STRUCT_X86_DEBUG_STATE32 + +__dw_x86_debug_e32 + + + ) + +326 + g_STRUCT_X86_DEBUG_STATE32 + + +328 + g__dr0 +; + +329 + g__dr1 +; + +330 + g__dr2 +; + +331 + g__dr3 +; + +332 + g__dr4 +; + +333 + g__dr5 +; + +334 + g__dr6 +; + +335 + g__dr7 +; + +338 + #_STRUCT_X86_DEBUG_STATE32 + +x86_debug_e32 + + + ) + +339 + g_STRUCT_X86_DEBUG_STATE32 + + +341 + gdr0 +; + +342 + gdr1 +; + +343 + gdr2 +; + +344 + gdr3 +; + +345 + gdr4 +; + +346 + gdr5 +; + +347 + gdr6 +; + +348 + gdr7 +; + +356 #i +__DARWIN_UNIX03 + + +357 + #_STRUCT_X86_THREAD_STATE64 + +__dw_x86_thad_e64 + + + ) + +358 + g_STRUCT_X86_THREAD_STATE64 + + +360 +__ut64_t + + g__x +; + +361 +__ut64_t + + g__rbx +; + +362 +__ut64_t + + g__rcx +; + +363 +__ut64_t + + g__rdx +; + +364 +__ut64_t + + g__rdi +; + +365 +__ut64_t + + g__rsi +; + +366 +__ut64_t + + g__rbp +; + +367 +__ut64_t + + g__r +; + +368 +__ut64_t + + g__r8 +; + +369 +__ut64_t + + g__r9 +; + +370 +__ut64_t + + g__r10 +; + +371 +__ut64_t + + g__r11 +; + +372 +__ut64_t + + g__r12 +; + +373 +__ut64_t + + g__r13 +; + +374 +__ut64_t + + g__r14 +; + +375 +__ut64_t + + g__r15 +; + +376 +__ut64_t + + g__r +; + +377 +__ut64_t + + g__rags +; + +378 +__ut64_t + + g__cs +; + +379 +__ut64_t + + g__fs +; + +380 +__ut64_t + + g__gs +; + +383 + #_STRUCT_X86_THREAD_STATE64 + +x86_thad_e64 + + + ) + +384 + g_STRUCT_X86_THREAD_STATE64 + + +386 +__ut64_t + + gx +; + +387 +__ut64_t + + grbx +; + +388 +__ut64_t + + grcx +; + +389 +__ut64_t + + grdx +; + +390 +__ut64_t + + grdi +; + +391 +__ut64_t + + grsi +; + +392 +__ut64_t + + grbp +; + +393 +__ut64_t + + gr +; + +394 +__ut64_t + + gr8 +; + +395 +__ut64_t + + gr9 +; + +396 +__ut64_t + + gr10 +; + +397 +__ut64_t + + gr11 +; + +398 +__ut64_t + + gr12 +; + +399 +__ut64_t + + gr13 +; + +400 +__ut64_t + + gr14 +; + +401 +__ut64_t + + gr15 +; + +402 +__ut64_t + + gr +; + +403 +__ut64_t + + grags +; + +404 +__ut64_t + + gcs +; + +405 +__ut64_t + + gfs +; + +406 +__ut64_t + + ggs +; + +411 #i +__DARWIN_UNIX03 + + +412 + #_STRUCT_X86_FLOAT_STATE64 + +__dw_x86_t_e64 + + + ) + +413 + g_STRUCT_X86_FLOAT_STATE64 + + +415 + g__u_rved +[2]; + +416 +_STRUCT_FP_CONTROL + + g__u_fcw +; + +417 +_STRUCT_FP_STATUS + + g__u_fsw +; + +418 +__ut8_t + + g__u_w +; + +419 +__ut8_t + + g__u_rv1 +; + +420 +__ut16_t + + g__u_f +; + +423 +__ut32_t + + g__u_ +; + +424 +__ut16_t + + g__u_cs +; + +426 +__ut16_t + + g__u_rv2 +; + +429 +__ut32_t + + g__u_dp +; + +430 +__ut16_t + + g__u_ds +; + +432 +__ut16_t + + g__u_rv3 +; + +433 +__ut32_t + + g__u_mxc +; + +434 +__ut32_t + + g__u_mxcmask +; + +435 +_STRUCT_MMST_REG + + g__u_mm0 +; + +436 +_STRUCT_MMST_REG + + g__u_mm1 +; + +437 +_STRUCT_MMST_REG + + g__u_mm2 +; + +438 +_STRUCT_MMST_REG + + g__u_mm3 +; + +439 +_STRUCT_MMST_REG + + g__u_mm4 +; + +440 +_STRUCT_MMST_REG + + g__u_mm5 +; + +441 +_STRUCT_MMST_REG + + g__u_mm6 +; + +442 +_STRUCT_MMST_REG + + g__u_mm7 +; + +443 +_STRUCT_XMM_REG + + g__u_xmm0 +; + +444 +_STRUCT_XMM_REG + + g__u_xmm1 +; + +445 +_STRUCT_XMM_REG + + g__u_xmm2 +; + +446 +_STRUCT_XMM_REG + + g__u_xmm3 +; + +447 +_STRUCT_XMM_REG + + g__u_xmm4 +; + +448 +_STRUCT_XMM_REG + + g__u_xmm5 +; + +449 +_STRUCT_XMM_REG + + g__u_xmm6 +; + +450 +_STRUCT_XMM_REG + + g__u_xmm7 +; + +451 +_STRUCT_XMM_REG + + g__u_xmm8 +; + +452 +_STRUCT_XMM_REG + + g__u_xmm9 +; + +453 +_STRUCT_XMM_REG + + g__u_xmm10 +; + +454 +_STRUCT_XMM_REG + + g__u_xmm11 +; + +455 +_STRUCT_XMM_REG + + g__u_xmm12 +; + +456 +_STRUCT_XMM_REG + + g__u_xmm13 +; + +457 +_STRUCT_XMM_REG + + g__u_xmm14 +; + +458 +_STRUCT_XMM_REG + + g__u_xmm15 +; + +459 + g__u_rv4 +[6*16]; + +460 + g__u_rved1 +; + +463 + #_STRUCT_X86_FLOAT_STATE64 + +x86_t_e64 + + + ) + +464 + g_STRUCT_X86_FLOAT_STATE64 + + +466 + gu_rved +[2]; + +467 +_STRUCT_FP_CONTROL + + gu_fcw +; + +468 +_STRUCT_FP_STATUS + + gu_fsw +; + +469 +__ut8_t + + gu_w +; + +470 +__ut8_t + + gu_rv1 +; + +471 +__ut16_t + + gu_f +; + +474 +__ut32_t + + gu_ +; + +475 +__ut16_t + + gu_cs +; + +477 +__ut16_t + + gu_rv2 +; + +480 +__ut32_t + + gu_dp +; + +481 +__ut16_t + + gu_ds +; + +483 +__ut16_t + + gu_rv3 +; + +484 +__ut32_t + + gu_mxc +; + +485 +__ut32_t + + gu_mxcmask +; + +486 +_STRUCT_MMST_REG + + gu_mm0 +; + +487 +_STRUCT_MMST_REG + + gu_mm1 +; + +488 +_STRUCT_MMST_REG + + gu_mm2 +; + +489 +_STRUCT_MMST_REG + + gu_mm3 +; + +490 +_STRUCT_MMST_REG + + gu_mm4 +; + +491 +_STRUCT_MMST_REG + + gu_mm5 +; + +492 +_STRUCT_MMST_REG + + gu_mm6 +; + +493 +_STRUCT_MMST_REG + + gu_mm7 +; + +494 +_STRUCT_XMM_REG + + gu_xmm0 +; + +495 +_STRUCT_XMM_REG + + gu_xmm1 +; + +496 +_STRUCT_XMM_REG + + gu_xmm2 +; + +497 +_STRUCT_XMM_REG + + gu_xmm3 +; + +498 +_STRUCT_XMM_REG + + gu_xmm4 +; + +499 +_STRUCT_XMM_REG + + gu_xmm5 +; + +500 +_STRUCT_XMM_REG + + gu_xmm6 +; + +501 +_STRUCT_XMM_REG + + gu_xmm7 +; + +502 +_STRUCT_XMM_REG + + gu_xmm8 +; + +503 +_STRUCT_XMM_REG + + gu_xmm9 +; + +504 +_STRUCT_XMM_REG + + gu_xmm10 +; + +505 +_STRUCT_XMM_REG + + gu_xmm11 +; + +506 +_STRUCT_XMM_REG + + gu_xmm12 +; + +507 +_STRUCT_XMM_REG + + gu_xmm13 +; + +508 +_STRUCT_XMM_REG + + gu_xmm14 +; + +509 +_STRUCT_XMM_REG + + gu_xmm15 +; + +510 + gu_rv4 +[6*16]; + +511 + gu_rved1 +; + +515 #i +__DARWIN_UNIX03 + + +516 + #_STRUCT_X86_EXCEPTION_STATE64 + +__dw_x86_exi_e64 + + + ) + +517 + g_STRUCT_X86_EXCEPTION_STATE64 + + +519 + g__no +; + +520 + g__r +; + +521 +__ut64_t + + g__uvaddr +; + +524 + #_STRUCT_X86_EXCEPTION_STATE64 + +x86_exi_e64 + + + ) + +525 + g_STRUCT_X86_EXCEPTION_STATE64 + + +527 + gno +; + +528 + gr +; + +529 +__ut64_t + + guvaddr +; + +533 #i +__DARWIN_UNIX03 + + +534 + #_STRUCT_X86_DEBUG_STATE64 + +__dw_x86_debug_e64 + + + ) + +535 + g_STRUCT_X86_DEBUG_STATE64 + + +537 +__ut64_t + + g__dr0 +; + +538 +__ut64_t + + g__dr1 +; + +539 +__ut64_t + + g__dr2 +; + +540 +__ut64_t + + g__dr3 +; + +541 +__ut64_t + + g__dr4 +; + +542 +__ut64_t + + g__dr5 +; + +543 +__ut64_t + + g__dr6 +; + +544 +__ut64_t + + g__dr7 +; + +547 + #_STRUCT_X86_DEBUG_STATE64 + +x86_debug_e64 + + + ) + +548 + g_STRUCT_X86_DEBUG_STATE64 + + +550 +__ut64_t + + gdr0 +; + +551 +__ut64_t + + gdr1 +; + +552 +__ut64_t + + gdr2 +; + +553 +__ut64_t + + gdr3 +; + +554 +__ut64_t + + gdr4 +; + +555 +__ut64_t + + gdr5 +; + +556 +__ut64_t + + gdr6 +; + +557 +__ut64_t + + gdr7 +; + + @/usr/include/mach/ppc/_structs.h + +32 #idef +_MACH_PPC__STRUCTS_H_ + + +33 + #_MACH_PPC__STRUCTS_H_ + + + ) + +35 + ~<sys/cdefs.h +> + +43 #i +__DARWIN_UNIX03 + + +44 + #_STRUCT_PPC_THREAD_STATE + +__dw_c_thad_e + + + ) + +45 + g_STRUCT_PPC_THREAD_STATE + + +47 + g__r0 +; + +48 + g__r1 +; + +49 + g__r0 +; + +50 + g__r1 +; + +51 + g__r2 +; + +52 + g__r3 +; + +53 + g__r4 +; + +54 + g__r5 +; + +55 + g__r6 +; + +56 + g__r7 +; + +57 + g__r8 +; + +58 + g__r9 +; + +59 + g__r10 +; + +60 + g__r11 +; + +61 + g__r12 +; + +62 + g__r13 +; + +63 + g__r14 +; + +64 + g__r15 +; + +65 + g__r16 +; + +66 + g__r17 +; + +67 + g__r18 +; + +68 + g__r19 +; + +69 + g__r20 +; + +70 + g__r21 +; + +71 + g__r22 +; + +72 + g__r23 +; + +73 + g__r24 +; + +74 + g__r25 +; + +75 + g__r26 +; + +76 + g__r27 +; + +77 + g__r28 +; + +78 + g__r29 +; + +79 + g__r30 +; + +80 + g__r31 +; + +82 + g__ +; + +83 + g__x +; + +84 + g__ +; + +85 + g__r +; + +86 + g__mq +; + +88 + g__vrve +; + +91 + #_STRUCT_PPC_THREAD_STATE + +c_thad_e + + + ) + +92 + g_STRUCT_PPC_THREAD_STATE + + +94 + gr0 +; + +95 + gr1 +; + +96 + gr0 +; + +97 + gr1 +; + +98 + gr2 +; + +99 + gr3 +; + +100 + gr4 +; + +101 + gr5 +; + +102 + gr6 +; + +103 + gr7 +; + +104 + gr8 +; + +105 + gr9 +; + +106 + gr10 +; + +107 + gr11 +; + +108 + gr12 +; + +109 + gr13 +; + +110 + gr14 +; + +111 + gr15 +; + +112 + gr16 +; + +113 + gr17 +; + +114 + gr18 +; + +115 + gr19 +; + +116 + gr20 +; + +117 + gr21 +; + +118 + gr22 +; + +119 + gr23 +; + +120 + gr24 +; + +121 + gr25 +; + +122 + gr26 +; + +123 + gr27 +; + +124 + gr28 +; + +125 + gr29 +; + +126 + gr30 +; + +127 + gr31 +; + +129 + g +; + +130 + gx +; + +131 + g +; + +132 + gr +; + +133 + gmq +; + +135 + gvrve +; + +139 #i! +defed +( +_POSIX_C_SOURCE +|| defed( +_DARWIN_C_SOURCE +) + +141 #agm +ck +(4) + +143 #i +__DARWIN_UNIX03 + + +144 + #_STRUCT_PPC_THREAD_STATE64 + +__dw_c_thad_e64 + + + ) + +145 + g_STRUCT_PPC_THREAD_STATE64 + + +147 + g__r0 +; + +148 + g__r1 +; + +149 + g__r0 +; + +150 + g__r1 +; + +151 + g__r2 +; + +152 + g__r3 +; + +153 + g__r4 +; + +154 + g__r5 +; + +155 + g__r6 +; + +156 + g__r7 +; + +157 + g__r8 +; + +158 + g__r9 +; + +159 + g__r10 +; + +160 + g__r11 +; + +161 + g__r12 +; + +162 + g__r13 +; + +163 + g__r14 +; + +164 + g__r15 +; + +165 + g__r16 +; + +166 + g__r17 +; + +167 + g__r18 +; + +168 + g__r19 +; + +169 + g__r20 +; + +170 + g__r21 +; + +171 + g__r22 +; + +172 + g__r23 +; + +173 + g__r24 +; + +174 + g__r25 +; + +175 + g__r26 +; + +176 + g__r27 +; + +177 + g__r28 +; + +178 + g__r29 +; + +179 + g__r30 +; + +180 + g__r31 +; + +182 + g__ +; + +183 + g__x +; + +184 + g__ +; + +185 + g__r +; + +187 + g__vrve +; + +190 + #_STRUCT_PPC_THREAD_STATE64 + +c_thad_e64 + + + ) + +191 + g_STRUCT_PPC_THREAD_STATE64 + + +193 + gr0 +; + +194 + gr1 +; + +195 + gr0 +; + +196 + gr1 +; + +197 + gr2 +; + +198 + gr3 +; + +199 + gr4 +; + +200 + gr5 +; + +201 + gr6 +; + +202 + gr7 +; + +203 + gr8 +; + +204 + gr9 +; + +205 + gr10 +; + +206 + gr11 +; + +207 + gr12 +; + +208 + gr13 +; + +209 + gr14 +; + +210 + gr15 +; + +211 + gr16 +; + +212 + gr17 +; + +213 + gr18 +; + +214 + gr19 +; + +215 + gr20 +; + +216 + gr21 +; + +217 + gr22 +; + +218 + gr23 +; + +219 + gr24 +; + +220 + gr25 +; + +221 + gr26 +; + +222 + gr27 +; + +223 + gr28 +; + +224 + gr29 +; + +225 + gr30 +; + +226 + gr31 +; + +228 + g +; + +229 + gx +; + +230 + g +; + +231 + gr +; + +233 + gvrve +; + +237 #agm +ck +() + +243 #i +__DARWIN_UNIX03 + + +244 + #_STRUCT_PPC_FLOAT_STATE + +__dw_c_t_e + + + ) + +245 + g_STRUCT_PPC_FLOAT_STATE + + +247 + g__gs +[32]; + +249 + g__s_d +; + +250 + g__s +; + +253 + #_STRUCT_PPC_FLOAT_STATE + +c_t_e + + + ) + +254 + g_STRUCT_PPC_FLOAT_STATE + + +256 + ggs +[32]; + +258 + gs_d +; + +259 + gs +; + +263 #agm +ck +(4) + +265 #i +__DARWIN_UNIX03 + + +266 + #_STRUCT_PPC_VECTOR_STATE + +__dw_c_ve_e + + + ) + +267 + g_STRUCT_PPC_VECTOR_STATE + + +269 #i +defed +( +__LP64__ +) + +270 + g__ve_vr +[32][4]; + +271 + g__ve_vs +[4]; + +273 + g__ve_vr +[32][4]; + +274 + g__ve_vs +[4]; + +276 + g__ve_d5 +[4]; + +277 + g__ve_vrvid +; + +278 + g__ve_d6 +[7]; + +281 + #_STRUCT_PPC_VECTOR_STATE + +c_ve_e + + + ) + +282 + g_STRUCT_PPC_VECTOR_STATE + + +284 #i +defed +( +__LP64__ +) + +285 + gve_vr +[32][4]; + +286 + gve_vs +[4]; + +288 + gve_vr +[32][4]; + +289 + gve_vs +[4]; + +291 + gve_d5 +[4]; + +292 + gve_vrvid +; + +293 + gve_d6 +[7]; + +297 #agm +ck +() + +316 #agm +ck +(4) + +318 #i +__DARWIN_UNIX03 + + +319 + #_STRUCT_PPC_EXCEPTION_STATE + +__dw_c_exi_e + + + ) + +320 + g_STRUCT_PPC_EXCEPTION_STATE + + +322 #i +defed +( +__LP64__ +) + +323 + g__d +; + +324 + g__dsi +; + +325 + g__exi +; + +326 + g__d0 +; + +327 + g__d1 +[4]; + +329 + g__d +; + +330 + g__dsi +; + +331 + g__exi +; + +332 + g__d0 +; + +333 + g__d1 +[4]; + +337 + #_STRUCT_PPC_EXCEPTION_STATE + +c_exi_e + + + ) + +338 + g_STRUCT_PPC_EXCEPTION_STATE + + +340 #i +defed +( +__LP64__ +) + +341 + gd +; + +342 + gdsi +; + +343 + gexi +; + +344 + gd0 +; + +345 + gd1 +[4]; + +347 + gd +; + +348 + gdsi +; + +349 + gexi +; + +350 + gd0 +; + +351 + gd1 +[4]; + +356 #i! +defed +( +_POSIX_C_SOURCE +|| defed( +_DARWIN_C_SOURCE +) + +357 #i +__DARWIN_UNIX03 + + +358 + #_STRUCT_PPC_EXCEPTION_STATE64 + +__dw_c_exi_e64 + + + ) + +359 + g_STRUCT_PPC_EXCEPTION_STATE64 + + +361 + g__d +; + +362 #i +defed +( +__LP64__ +) + +363 + g__dsi +; + +364 + g__exi +; + +365 + g__d1 +[4]; + +367 + g__dsi +; + +368 + g__exi +; + +369 + g__d1 +[4]; + +373 + #_STRUCT_PPC_EXCEPTION_STATE64 + +c_exi_e64 + + + ) + +374 + g_STRUCT_PPC_EXCEPTION_STATE64 + + +376 + gd +; + +377 #i +defed +( +__LP64__ +) + +378 + gdsi +; + +379 + gexi +; + +380 + gd1 +[4]; + +382 + gdsi +; + +383 + gexi +; + +384 + gd1 +[4]; + +390 #agm +ck +() + + @/usr/include/ppc/signal.h + +32 #idef +_PPC_SIGNAL_H_ + + +33 + #_PPC_SIGNAL_H_ + 1 + + ) + +35 + ~<sys/cdefs.h +> + +37 #ide +_ANSI_SOURCE + + +39 + tsig_omic_t +; + +41 + ~<sys/pits.h +> + +43 #ifde +__APPLE_API_OBSOLETE + + +45 #i! +defed +( +_POSIX_C_SOURCE +|| defed( +_DARWIN_C_SOURCE +) + +47 + #__ed_ru_sigcڋxt + + + ) + +48 + #__ed_ru_sigcڋxt32 + + + ) + +49 + #__ed_ru_sigcڋxt64 + + + ) + +50 + ~<c/_rus.h +> + +55 + #SV_SAVE_REGS + 0x1000 + + ) + +69 + mREGS_SAVED_NONE +, + +70 + mREGS_SAVED_CALLER +, + +73 + mREGS_SAVED_ALL + + +74 } + tgs_ved_t +; + + @/usr/include/libkern/i386/_OSByteOrder.h + +29 #ide +_OS__OSBYTEORDERI386_H + + +30 + #_OS__OSBYTEORDERI386_H + + + ) + +32 #i! +defed +( +__DARWIN_OS_INLINE +) + +33 #i +defed +( +__STDC_VERSION__ +) && __STDC_VERSION__ >= 199901L + +34 + #__DARWIN_OS_INLINE + +le + + + ) + +35 #i +defed +( +__MWERKS__ +|| defed( +__lulus +) + +36 + #__DARWIN_OS_INLINE + +le + + + ) + +38 + #__DARWIN_OS_INLINE + +__le__ + + + ) + +44 +__DARWIN_OS_INLINE + + +45 +__ut16_t + + +46 + $_OSSwI16 +( + +47 +__ut16_t + +_da + + +50 (( +_da + << 8) | (_data >> 8)); + +51 + } +} + +53 +__DARWIN_OS_INLINE + + +54 +__ut32_t + + +55 + $_OSSwI32 +( + +56 +__ut32_t + +_da + + +59 + `__asm__ + ("bsw %0" : "+r" ( +_da +)); + +60 +_da +; + +61 + } +} + +63 #i +defed +( +__i386__ +) + +64 +__DARWIN_OS_INLINE + + +65 +__ut64_t + + +66 + $_OSSwI64 +( + +67 +__ut64_t + +_da + + +70 + `__asm__ + ("bswap %%eax\n\t" + +73 : "+A" ( +_da +)); + +74 +_da +; + +75 + } +} + +76 #i +defed +( +__x86_64__ +) + +77 +__DARWIN_OS_INLINE + + +78 +__ut64_t + + +79 + $_OSSwI64 +( + +80 +__ut64_t + +_da + + +83 + `__asm__ + ("bsw %0" : "+r" ( +_da +)); + +84 +_da +; + +85 + } +} + +87 #r +Unknown + +cheu + + + @ +1 +. +1 +/usr/include +69 +1617 +debug.h +filterfs.c +filterfs.h +lib.c +lib.h +lnode.c +lnode.h +ncache.c +ncache.h +node.c +node.h +options.c +options.h +/usr/include/dirent.h +/usr/include/fcntl.h +/usr/include/stddef.h +/usr/include/stdio.h +/usr/include/stdlib.h +/usr/include/sys/mman.h +/usr/include/sys/stat.h +/usr/include/sys/time.h +/usr/include/sys/types.h +/usr/include/unistd.h +/usr/include/_types.h +/usr/include/_xlocale.h +/usr/include/alloca.h +/usr/include/available.h +/usr/include/machine/endian.h +/usr/include/machine/types.h +/usr/include/secure/_stdio.h +/usr/include/sys/_select.h +/usr/include/sys/_structs.h +/usr/include/sys/_types.h +/usr/include/sys/appleapiopts.h +/usr/include/sys/cdefs.h +/usr/include/sys/dirent.h +/usr/include/sys/fcntl.h +/usr/include/sys/select.h +/usr/include/sys/unistd.h +/usr/include/sys/wait.h +/usr/include/time.h +/usr/include/xlocale/_stdio.h +/usr/include/xlocale/_stdlib.h +/usr/include/_structs.h +/usr/include/i386/endian.h +/usr/include/i386/types.h +/usr/include/machine/_limits.h +/usr/include/machine/_structs.h +/usr/include/machine/_types.h +/usr/include/ppc/endian.h +/usr/include/ppc/types.h +/usr/include/secure/_common.h +/usr/include/sys/resource.h +/usr/include/sys/signal.h +/usr/include/xlocale/_time.h +/usr/include/i386/_limits.h +/usr/include/i386/_structs.h +/usr/include/i386/_types.h +/usr/include/machine/signal.h +/usr/include/ppc/_limits.h +/usr/include/ppc/_structs.h +/usr/include/ppc/_types.h +/usr/include/sys/_endian.h +/usr/include/i386/signal.h +/usr/include/libkern/_OSByteOrder.h +/usr/include/mach/i386/_structs.h +/usr/include/mach/ppc/_structs.h +/usr/include/ppc/signal.h +/usr/include/libkern/i386/_OSByteOrder.h diff --git a/netfs-sample/debug.h b/netfs-sample/debug.h new file mode 100644 index 00000000..606d7e79 --- /dev/null +++ b/netfs-sample/debug.h @@ -0,0 +1,60 @@ +/*----------------------------------------------------------------------------*/ +/*debug.h*/ +/*----------------------------------------------------------------------------*/ +/*Simple facilities for debugging messages*/ +/*----------------------------------------------------------------------------*/ +/*Based on the code of unionfs translator.*/ +/*----------------------------------------------------------------------------*/ +/*Copyright (C) 2001, 2002, 2005 Free Software Foundation, Inc. + Written by Sergiu Ivanov <unlimitedscolobb@gmail.com>. + + This program is free software; you can redistribute it and/or + modify it under the terms of the GNU General Public License as + published by the Free Software Foundation; either version 2 of the + License, or * (at your option) any later version. + + This program is distributed in the hope that it will be useful, but + WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 + USA.*/ +/*----------------------------------------------------------------------------*/ +#ifndef __DEBUG_H__ +#define __DEBUG_H__ + +/*----------------------------------------------------------------------------*/ +#include <stdio.h> +/*----------------------------------------------------------------------------*/ + +/*----------------------------------------------------------------------------*/ +/*--------Macros--------------------------------------------------------------*/ +/*Print debug messages here*/ +#define DEBUG_OUTPUT "/var/tmp/filterfs.dbg" +/*----------------------------------------------------------------------------*/ +#ifdef DEBUG + /*Initializes the log*/ +# define INIT_LOG() filterfs_dbg = fopen(DEBUG_OUTPUT, "wt") + /*Closes the log*/ +# define CLOSE_LOG() fclose(filterfs_dbg) + /*Prints a debug message and flushes the debug output*/ +# define LOG_MSG(fmt, args...) {fprintf(filterfs_dbg, fmt"\n", ##args);\ + fflush(filterfs_dbg);} +#else + /*Remove requests for debugging output*/ +# define INIT_LOG() +# define CLOSE_LOG() +# define LOG_MSG(fmt, args...) +#endif /*DEBUG*/ +/*----------------------------------------------------------------------------*/ + +/*----------------------------------------------------------------------------*/ +/*--------Global Variables----------------------------------------------------*/ +/*The file to write debugging info to*/ +extern FILE * filterfs_dbg; +/*----------------------------------------------------------------------------*/ + +#endif /*__DEBUG_H__*/ diff --git a/netfs-sample/errors b/netfs-sample/errors new file mode 100644 index 00000000..e69de29b --- /dev/null +++ b/netfs-sample/errors diff --git a/netfs-sample/filtered b/netfs-sample/filtered new file mode 100644 index 00000000..e69de29b --- /dev/null +++ b/netfs-sample/filtered diff --git a/netfs-sample/filterfs b/netfs-sample/filterfs Binary files differnew file mode 100755 index 00000000..012a5b3a --- /dev/null +++ b/netfs-sample/filterfs diff --git a/netfs-sample/filterfs.c b/netfs-sample/filterfs.c new file mode 100644 index 00000000..d768e18b --- /dev/null +++ b/netfs-sample/filterfs.c @@ -0,0 +1,1236 @@ +/*----------------------------------------------------------------------------*/ +/*filter.c*/ +/*----------------------------------------------------------------------------*/ +/*The filtering translator*/ +/*----------------------------------------------------------------------------*/ +/*Based on the code of unionfs translator.*/ +/*----------------------------------------------------------------------------*/ +/*Copyright (C) 2001, 2002, 2005 Free Software Foundation, Inc. + Written by Sergiu Ivanov <unlimitedscolobb@gmail.com>. + + This program is free software; you can redistribute it and/or + modify it under the terms of the GNU General Public License as + published by the Free Software Foundation; either version 2 of the + License, or * (at your option) any later version. + + This program is distributed in the hope that it will be useful, but + WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 + USA.*/ +/*----------------------------------------------------------------------------*/ + +/*----------------------------------------------------------------------------*/ +#define _GNU_SOURCE 1 +/*----------------------------------------------------------------------------*/ +#include "filterfs.h" +/*----------------------------------------------------------------------------*/ +#include <error.h> +#include <argp.h> +#include <argz.h> +#include <hurd/netfs.h> +#include <fcntl.h> +/*----------------------------------------------------------------------------*/ +#include "debug.h" +#include "options.h" +#include "ncache.h" +/*----------------------------------------------------------------------------*/ + +/*----------------------------------------------------------------------------*/ +/*--------Macros--------------------------------------------------------------*/ +/*The state modes use in open*/ +#define OPENONLY_STATE_MODES (O_CREAT | O_EXCL | O_NOLINK | O_NOTRANS \ + | O_NONBLOCK) +/*----------------------------------------------------------------------------*/ + +/*----------------------------------------------------------------------------*/ +/*--------Global Variables----------------------------------------------------*/ +/*The name of the server*/ +char * netfs_server_name = "filterfs"; +/*----------------------------------------------------------------------------*/ +/*The version of the server*/ +char * netfs_server_version = "0.0"; +/*----------------------------------------------------------------------------*/ +/*The maximal length of a chain of symbolic links*/ +int netfs_maxsymlinks = 12; +/*----------------------------------------------------------------------------*/ +/*A port to the underlying node*/ +mach_port_t underlying_node; +/*----------------------------------------------------------------------------*/ +/*Status information for the underlying node*/ +io_statbuf_t underlying_node_stat; +/*----------------------------------------------------------------------------*/ +/*Mapped time used for updating node information*/ +volatile struct mapped_time_value * maptime; +/*----------------------------------------------------------------------------*/ +/*The filesystem ID*/ +pid_t fsid; +/*----------------------------------------------------------------------------*/ +/*The file to print debug messages to*/ +FILE * filterfs_dbg; +/*----------------------------------------------------------------------------*/ + +/*----------------------------------------------------------------------------*/ +/*--------Functions-----------------------------------------------------------*/ +/*Attempts to create a file named `name` in `dir` for `user` with mode `mode`*/ +error_t +netfs_attempt_create_file +( + struct iouser * user, + struct node * dir, + char * name, + mode_t mode, + struct node ** node +) +{ + LOG_MSG("netfs_attempt_create_file"); + + /*Unlock `dir` and say that we can do nothing else here*/ + mutex_unlock(&dir->lock); + return EOPNOTSUPP; +}/*netfs_attempt_create_file*/ +/*----------------------------------------------------------------------------*/ +/*Return an error if the process of opening a file should not be allowed + to complete because of insufficient permissions*/ +error_t +netfs_check_open_permissions +( + struct iouser * user, + struct node * np, + int flags, + int newnode +) +{ + LOG_MSG("netfs_check_open_permissions: '%s'", np->nn->lnode->name); + + error_t err = 0; + + /*Cheks user's permissions*/ + if(flags & O_READ) + err = fshelp_access(&np->nn_stat, S_IREAD, user); + if(!err && (flags & O_WRITE)) + err = fshelp_access(&np->nn_stat, S_IWRITE, user); + if(!err && (flags & O_EXEC)) + err = fshelp_access(&np->nn_stat, S_IEXEC, user); + + /*Return the result of the check*/ + return err; +}/*netfs_check_open_permissions*/ +/*----------------------------------------------------------------------------*/ +/*Attempts an utimes call for the user `cred` on node `node`*/ +error_t +netfs_attempt_utimes +( + struct iouser * cred, + struct node * node, + struct timespec * atime, + struct timespec * mtime +) +{ + LOG_MSG("netfs_attempt_utimes"); + + error_t err = 0; + + /*See what information is to be updated*/ + int flags = TOUCH_CTIME; + + /*Check if the user is indeed the owner of the node*/ + err = fshelp_isowner(&node->nn_stat, cred); + + /*If the user is allowed to do utimes*/ + if(!err) + { + /*If atime is to be updated*/ + if(atime) + /*update the atime*/ + node->nn_stat.st_atim = *atime; + else + /*the current time will be set as the atime*/ + flags |= TOUCH_ATIME; + + /*If mtime is to be updated*/ + if(mtime) + /*update the mtime*/ + node->nn_stat.st_mtim = *mtime; + else + /*the current time will be set as mtime*/ + flags |= TOUCH_MTIME; + + /*touch the file*/ + fshelp_touch(&node->nn_stat, flags, maptime); + } + + /*Return the result of operations*/ + return err; +}/*netfs_attempt_utimes*/ +/*----------------------------------------------------------------------------*/ +/*Returns the valid access types for file `node` and user `cred`*/ +error_t +netfs_report_access +( + struct iouser * cred, + struct node * np, + int * types +) +{ + LOG_MSG("netfs_report_access"); + + /*No access at first*/ + *types = 0; + + /*Check the access and set the required bits*/ + if(fshelp_access(&np->nn_stat, S_IREAD, cred) == 0) + *types |= O_READ; + if(fshelp_access(&np->nn_stat, S_IWRITE, cred) == 0) + *types |= O_WRITE; + if(fshelp_access(&np->nn_stat, S_IEXEC, cred) == 0) + *types |= O_EXEC; + + /*Everything OK*/ + return 0; +}/*netfs_report_access*/ +/*----------------------------------------------------------------------------*/ +/*Validates the stat data for the node*/ +error_t +netfs_validate_stat +( + struct node * np, + struct iouser * cred +) +{ + LOG_MSG("netfs_validate_stat: '%s'", np->nn->lnode->name); + + error_t err = 0; + + /*If we are not at the root*/ + if(np != netfs_root_node) + { + /*If the node is not surely up-to-date*/ + if(!(np->nn->flags & FLAG_NODE_ULFS_UPTODATE)) + { + /*update it*/ + err = node_update(np); + } + + /*If no errors have yet occurred*/ + if(!err) + { + /*If the port to the file corresponding to `np` is valid*/ + if(np->nn->port != MACH_PORT_NULL) + { + /*We have a directory here (normally, only they maintain an open port). + Generally, our only concern is to maintain an open port in this case*/ + + /*attempt to stat this file*/ + err = io_stat(np->nn->port, &np->nn_stat); + + /*If stat information has been successfully obtained for the file*/ + if(!err) + /*duplicate the st_mode field of stat structure*/ + np->nn_translated = np->nn_stat.st_mode; + } + else + { + /*We, most probably, have something which is not a directory. Therefore + we will open the port and close it after the stat, so that additional + resources are not consumed.*/ + + /*the parent node of the current node*/ + node_t * dnp; + + /*obtain the parent node of the the current node*/ + err = ncache_node_lookup(np->nn->lnode->dir, &dnp); + + /*the lookup should never fail here*/ + assert(!err); + + /*open a port to the file we are interested in*/ + mach_port_t p = file_name_lookup_under + (dnp->nn->port, np->nn->lnode->name, 0, 0); + + /*put `dnp` back, since we don't need it any more*/ + netfs_nput(dnp); + + if(!p) + return EBADF; + + /*try to stat the node*/ + err = io_stat(p, &np->nn_stat); + + /*deallocate the port*/ + PORT_DEALLOC(p); + } + } + } + /*If we are at the root*/ + else + /*put the size of the node into the stat structure belonging to `np`*/ + node_get_size(np, (OFFSET_T *)&np->nn_stat.st_size); + + /*Return the result of operations*/ + return err; +}/*netfs_validate_stat*/ +/*----------------------------------------------------------------------------*/ +/*Syncs `node` completely to disk*/ +error_t +netfs_attempt_sync +( + struct iouser * cred, + struct node * node, + int wait +) +{ + LOG_MSG("netfs_attempt_sync"); + + /*Operation is not supported*/ + return EOPNOTSUPP; +}/*netfs_attempt_sync*/ +/*----------------------------------------------------------------------------*/ +/*Fetches a directory*/ +error_t +netfs_get_dirents +( + struct iouser * cred, + struct node * dir, + int first_entry, + int num_entries, + char ** data, + mach_msg_type_number_t * data_len, + vm_size_t max_data_len, + int * data_entries +) +{ + LOG_MSG("netfs_get_dirents: '%s'", dir->nn->lnode->name); + + error_t err; + + /*Two pointers required for processing the list of dirents*/ + node_dirent_t * dirent_start, * dirent_current; + + /*The pointer to the beginning of the list of dirents*/ + node_dirent_t * dirent_list = NULL; + + /*The size of the current dirent*/ + size_t size = 0; + + /*The number of dirents added*/ + int count = 0; + + /*The dereferenced value of parameter `data`*/ + char * data_p; + + /*Takes into account the size of the given dirent*/ + int + bump_size + ( + const char * name + ) + { + /*If the required number of entries has not been listed yet*/ + if((num_entries == -1) || (count < num_entries)) + { + /*take the current size and take into account the length of the name*/ + size_t new_size = size + DIRENT_LEN(strlen(name)); + + /*If there is a limit for the received size and it has been exceeded*/ + if((max_data_len > 0) && (new_size > max_data_len)) + /*a new dirent cannot be added*/ + return 0; + + /*memorize the new size*/ + size = new_size; + + /*increase the number of dirents added*/ + ++count; + + /*everything is OK*/ + return 1; + } + else + { + /*dirents cannot be added*/ + return 0; + } + }/*bump_size*/ + + /*Adds a dirent to the list of dirents*/ + int + add_dirent + ( + const char * name, + ino_t ino, + int type + ) + { + /*If the required number of dirents has not been listed yet*/ + if((num_entries == -1) || (count < num_entries)) + { + /*create a new dirent*/ + struct dirent hdr; + + /*obtain the length of the name*/ + size_t name_len = strlen(name); + + /*compute the full size of the dirent*/ + size_t sz = DIRENT_LEN(name_len); + + /*If there is no room for this dirent*/ + if(sz > size) + /*stop*/ + return 0; + else + /*take into account the fact that a new dirent has just been added*/ + size -= sz; + + /*setup the dirent*/ + hdr.d_ino = ino; + hdr.d_reclen = sz; + hdr.d_type = type; + hdr.d_namlen = name_len; + + /*The following two lines of code reflect the old layout of + dirents in the memory. Now libnetfs expects the layout + identical to the layout provided by dir_readdir (see dir_entries_get)*/ + + /*copy the header of the dirent into the final block of dirents*/ + memcpy(data_p, &hdr, DIRENT_NAME_OFFS); + + /*copy the name of the dirent into the block of dirents*/ + strcpy(data_p + DIRENT_NAME_OFFS, name); + + /*This line is commented for the same reason as the two specifically + commented lines above.*/ + /*move the current pointer in the block of dirents*/ + data_p += sz; + + /*count the new dirent*/ + ++count; + + /*everything was OK, so say it*/ + return 1; + } + else + /*no [new] dirents allowed*/ + return 0; + }/*add_dirent*/ + + /*List the dirents for node `dir`*/ + err = node_entries_get(dir, &dirent_list); + + /*If listing was successful*/ + if(!err) + { + /*find the entry whose number is `first_entry`*/ + for + ( + dirent_start = dirent_list, count = 2; + dirent_start && (count < first_entry); + dirent_start = dirent_start->next, ++count + ); + + /*reset number of dirents added so far*/ + count = 0; + + /*make space for entries '.' and '..', if required*/ + if(first_entry == 0) + bump_size("."); + if(first_entry <= 1) + bump_size(".."); + + /*Go through all dirents*/ + for + ( + dirent_current = dirent_start; + dirent_current; + dirent_current = dirent_current->next + ) + /*If another dirent cannot be added succesfully*/ + if(bump_size(dirent_current->dirent->d_name) == 0) + /*stop here*/ + break; + + /*allocate the required space for dirents*/ + *data = mmap(0, size, PROT_READ | PROT_WRITE, MAP_ANON, 0, 0); + + /*check if any error occurred*/ + err = ((void *)*data == MAP_FAILED) ? (errno) : (0); + } + + /*If no errors have occurred so far*/ + if(!err) + { + /*obtain the pointer to the beginning of the block of dirents*/ + data_p = *data; + + /*fill the parameters with useful values*/ + *data_len = size; + *data_entries = count; + + /*reset the number of dirents added*/ + count = 0; + + /*add entries '.' and '..', if required*/ + if(first_entry == 0) + add_dirent(".", 2, DT_DIR); + if(first_entry <= 1) + add_dirent("..", 2, DT_DIR); + + /*Follow the list of dirents beginning with dirents_start*/ + for + ( + dirent_current = dirent_start; dirent_current; + dirent_current = dirent_current->next + ) + /*If the addition of the current dirent fails*/ + if + ( + add_dirent + (dirent_current->dirent->d_name, dirent_current->dirent->d_fileno, + dirent_current->dirent->d_type) == 0 + ) + /*stop adding dirents*/ + break; + } + + /*If the list of dirents has been allocated, free it*/ + if(dirent_list) + node_entries_free(dirent_list); + + /*The directory has been read right now, modify the access time*/ + fshelp_touch(&dir->nn_stat, TOUCH_ATIME, maptime); + + /*Return the result of listing the dirents*/ + return err; +}/*netfs_get_dirents*/ +/*----------------------------------------------------------------------------*/ +/*Looks up `name` under `dir` for `user`*/ +error_t +netfs_attempt_lookup +( + struct iouser * user, + struct node * dir, + char * name, + struct node ** node +) +{ + LOG_MSG("netfs_attempt_lookup: '%s'", name); + + error_t err = 0; + + /*If we are asked to fetch the current directory*/ + if(strcmp(name, ".") == 0) + { + /*add a reference to `dir` and put it into `node`*/ + netfs_nref(dir); + *node = dir; + + /*everything is OK*/ + return 0; + } + /*If we are asked to fetch the parent directory*/ + else if(strcmp(name, "..") == 0) + { + /*If the supplied node is not root*/ + if(dir->nn->lnode->dir) + { + /*The node corresponding to the parent directory must exist here*/ + assert(dir->nn->lnode->dir->node); + + /*put the parent node of `dir` into the result*/ + err = ncache_node_lookup(dir->nn->lnode->dir, node); + } + /*The supplied node is root*/ + else + { + /*this node is not included into our filesystem*/ + err = ENOENT; + *node = NULL; + } + + /*unlock the directory*/ + mutex_unlock(&dir->lock); + + /*stop here*/ + return err; + } + + /*Checks whether the given name satisfied the required property*/ + int + check_property + ( + const char * name + ) + { + /*If there is no property*/ + if(!property) + /*no filtering will be applied, any name is OK*/ + return 0; + + /*The number of occurrences of PROPERTY_PARAM in the property*/ + int param_entries_count = 0; + + /*The pointer to the current occurrence of PROPERTY_PARAM*/ + char * occurrence = strstr(property, PROPERTY_PARAM); + + /*Count the number of occurrences*/ + for(; occurrence; + occurrence = strstr(occurrence + 1, PROPERTY_PARAM), + ++param_entries_count); + + /*Compute the length of the property param*/ + size_t property_param_len = strlen(PROPERTY_PARAM); + + /*The length of the property*/ + size_t property_len = (property) ? (strlen(property)) : (0); + + /*Everything OK at first*/ + err = 0; + + /*Compute the length of the full name once*/ + size_t full_name_len = strlen(dir->nn->lnode->path) + 1 + strlen(name) + 1; + + /*Try to allocate the required space*/ + char * full_name = malloc(full_name_len); + if(!full_name) + { + err = ENOMEM; + return 0; + } + + /*Initialize `full_name` as a valid string*/ + full_name[0] = 0; + + /*Construct the full name*/ + strcpy(full_name, dir->nn->lnode->path); + strcat(full_name, "/"); + strcat(full_name, name); + + LOG_MSG("netfs_attempt_lookup: Applying filter to %s...", full_name); + + /*Compute the space required for the final filtering command*/ + size_t sz = property_len + (strlen(full_name) - property_param_len) + * param_entries_count; + + /*Try to allocate the space for the command*/ + char * cmd = malloc(sz); + if(!cmd) + { + free(full_name); + err = ENOMEM; + return 0; + } + + /*Initialize `cmd` as a valid string*/ + cmd[0] = 0; + + /*The current occurence of PROPERTY_PARAM in property*/ + char * p = strstr(property, PROPERTY_PARAM); + + /*The pointer to the current position in the property*/ + char * propp = property; + + /*While the command has not been constructed*/ + for(; p; p = strstr(propp, PROPERTY_PARAM)) + { + /*add the new part of the property to the command*/ + strncat(cmd, propp, p - propp); + + /*add the filename to the command*/ + strcat(cmd, full_name); + + /*LOG_MSG("\tcmd = '%s'", cmd);*/ + + /*advance the pointer in the property*/ + propp = p + property_param_len; + + /*LOG_MSG("\tpropp points at '%s'", propp);*/ + } + + /*Copy the rest of the property to the command*/ + strcat(cmd, propp); + + /*LOG_MSG("node_entries_get: The filtering command: '%s'.", cmd);*/ + + /*Execute the command*/ + int xcode = WEXITSTATUS(system(cmd)); + + /*Return the exit code of the command*/ + return xcode; + }/*check_property*/ + + /*If the given name does not satisfy the property*/ + if(check_property(name) != 0) + { + /*unlock the directory*/ + mutex_unlock(&dir->lock); + + /*no such file in the directory*/ + return ENOENT; + } + + /*Try to lookup the given file in the underlying directory*/ + mach_port_t p = file_name_lookup_under(dir->nn->port, name, 0, 0); + + /*If the lookup failed*/ + if(p == MACH_PORT_NULL) + { + /*unlock the directory*/ + mutex_unlock(&dir->lock); + + /*no such entry*/ + return ENOENT; + } + + /*Obtain the stat information about the file*/ + io_statbuf_t stat; + err = io_stat(p, &stat); + + /*Deallocate the obtained port*/ + PORT_DEALLOC(p); + + /*If this file is not a directory*/ + if(err || !S_ISDIR(stat.st_mode)) + { + /*do not set the port*/ + p = MACH_PORT_NULL; + } + else + { + /*lookup the port with the right to read the contents of the directory*/ + p = file_name_lookup_under(dir->nn->port, name, O_READ | O_DIRECTORY, 0); + if(p == MACH_PORT_NULL) + { + return EBADF; /*not enough rights?*/ + } + } + + /*The lnode corresponding to the entry we are supposed to fetch*/ + lnode_t * lnode; + + /*Finalizes the execution of this function*/ + void + finalize(void) + { + /*If some errors have occurred*/ + if(err) + { + /*the user should receive nothing*/ + *node = NULL; + + /*If there is some port, free it*/ + if(p != MACH_PORT_NULL) + PORT_DEALLOC(p); + } + /*If there is a node to return*/ + if(*node) + { + /*unlock the node*/ + mutex_unlock(&(*node)->lock); + + /*add the node to the cache*/ + ncache_node_add(*node); + } + + /*Unlock the mutexes in `dir`*/ + mutex_unlock(&dir->nn->lnode->lock); + mutex_unlock(&dir->lock); + }/*finalize*/ + + /*Try to find an lnode called `name` under the lnode corresponding to `dir`*/ + err = lnode_get(dir->nn->lnode, name, &lnode); + + /*If such an entry does not exist*/ + if(err == ENOENT) + { + /*create a new lnode with the supplied name*/ + err = lnode_create(name, &lnode); + if(err) + { + finalize(); + return err; + } + + /*install the new lnode into the directory*/ + lnode_install(dir->nn->lnode, lnode); + } + + /*Obtain the node corresponding to this lnode*/ + err = ncache_node_lookup(lnode, node); + + /*Remove an extra reference from the lnode*/ + lnode_ref_remove(lnode); + + /*If the lookup in the cache failed*/ + if(err) + { + /*stop*/ + finalize(); + return err; + } + + /*Store the port in the node*/ + (*node)->nn->port = p; + + /*Construct the full path to the node*/ + err = lnode_path_construct(lnode, NULL); + if(err) + { + finalize(); + return err; + } + + /*Now the node is up-to-date*/ + (*node)->nn->flags = FLAG_NODE_ULFS_UPTODATE; + + /*Return the result of performing the operations*/ + finalize(); + return err; +}/*netfs_attempt_lookup*/ +/*----------------------------------------------------------------------------*/ +/*Deletes `name` in `dir` for `user`*/ +error_t +netfs_attempt_unlink +( + struct iouser * user, + struct node * dir, + char * name +) +{ + LOG_MSG("netfs_attempt_unlink"); + + return 0; +}/*netfs_attempt_unlink*/ +/*----------------------------------------------------------------------------*/ +/*Attempts to rename `fromdir`/`fromname` to `todir`/`toname`*/ +error_t +netfs_attempt_rename +( + struct iouser * user, + struct node * fromdir, + char * fromname, + struct node * todir, + char * toname, + int excl +) +{ + LOG_MSG("netfs_attempt_rename"); + + /*Operation not supported*/ + return EOPNOTSUPP; +}/*netfs_attempt_rename*/ +/*----------------------------------------------------------------------------*/ +/*Attempts to create a new directory*/ +error_t +netfs_attempt_mkdir +( + struct iouser * user, + struct node * dir, + char * name, + mode_t mode +) +{ + LOG_MSG("netfs_attempt_mkdir"); + + return 0; +}/*netfs_attempt_mkdir*/ +/*----------------------------------------------------------------------------*/ +/*Attempts to remove directory `name` in `dir` for `user`*/ +error_t +netfs_attempt_rmdir +( + struct iouser * user, + struct node * dir, + char * name +) +{ + LOG_MSG("netfs_attempt_rmdir"); + + return 0; +}/*netfs_attempt_rmdir*/ +/*----------------------------------------------------------------------------*/ +/*Attempts to change the mode of `node` for user `cred` to `uid`:`gid`*/ +error_t +netfs_attempt_chown +( + struct iouser * cred, + struct node * node, + uid_t uid, + uid_t gid +) +{ + LOG_MSG("netfs_attempt_chown"); + + /*Operation is not supported*/ + return EOPNOTSUPP; +}/*netfs_attempt_chown*/ +/*----------------------------------------------------------------------------*/ +/*Attempts to change the author of `node` to `author`*/ +error_t +netfs_attempt_chauthor +( + struct iouser * cred, + struct node * node, + uid_t author +) +{ + LOG_MSG("netfs_attempt_chauthor"); + + /*Operation is not supported*/ + return EOPNOTSUPP; +}/*netfs_attempt_chauthor*/ +/*----------------------------------------------------------------------------*/ +/*Attempts to change the mode of `node` to `mode` for `cred`*/ +error_t +netfs_attempt_chmod +( + struct iouser * user, + struct node * node, + mode_t mode +) +{ + LOG_MSG("netfs_attempt_chmod"); + + /*Operation is not supported*/ + return EOPNOTSUPP; +}/*netfs_attempt_chmod*/ +/*----------------------------------------------------------------------------*/ +/*Attempts to turn `node` into a symlink targetting `name`*/ +error_t +netfs_attempt_mksymlink +( + struct iouser * cred, + struct node * node, + char * name +) +{ + LOG_MSG("netfs_attempt_mksymlink"); + + /*Operation is not supported*/ + return EOPNOTSUPP; +}/*netfs_attempt_mksymlink*/ +/*----------------------------------------------------------------------------*/ +/*Attempts to turn `node` into a device; type can be either S_IFBLK or S_IFCHR*/ +error_t +netfs_attempt_mkdev +( + struct iouser * cred, + struct node * node, + mode_t type, + dev_t indexes +) +{ + LOG_MSG("netfs_attempt_mkdev"); + + /*Operation is not supported*/ + return EOPNOTSUPP; +}/*netfs_attempt_mkdev*/ +/*----------------------------------------------------------------------------*/ +/*Attempts to set the passive translator record for `file` passing `argz`*/ +error_t +netfs_set_translator +( + struct iouser * cred, + struct node * node, + char * argz, + size_t arglen +) +{ + LOG_MSG("netfs_set_translator"); + + /*Operation is not supported*/ + return EOPNOTSUPP; +}/*netfs_set_translator */ +/*----------------------------------------------------------------------------*/ +/*Attempts to call chflags for `node`*/ +error_t +netfs_attempt_chflags +( + struct iouser * cred, + struct node * node, + int flags +) +{ + LOG_MSG("netfs_attempt_chflags"); + + /*Operation is not supported*/ + return EOPNOTSUPP; +}/*netfs_attempt_chflags*/ +/*----------------------------------------------------------------------------*/ +/*Attempts to set the size of file `node`*/ +error_t +netfs_attempt_set_size +( + struct iouser * cred, + struct node * node, + loff_t size +) +{ + LOG_MSG("netfs_attempt_set_size"); + + /*Operation is not supported*/ + return EOPNOTSUPP; +}/*netfs_attempt_set_size*/ +/*----------------------------------------------------------------------------*/ +/*Fetches the filesystem status information*/ +error_t +netfs_attempt_statfs +( + struct iouser * cred, + struct node * node, + fsys_statfsbuf_t * st +) +{ + LOG_MSG("netfs_attempt_statfs"); + + /*Operation is not supported*/ + return EOPNOTSUPP; +}/*netfs_attempt_statfs*/ +/*----------------------------------------------------------------------------*/ +/*Syncs the filesystem*/ +error_t +netfs_attempt_syncfs +( + struct iouser * cred, + int wait +) +{ + LOG_MSG("netfs_attempt_syncfs"); + + /*Everythin OK*/ + return 0; +}/*netfs_attempt_syncfs*/ +/*----------------------------------------------------------------------------*/ +/*Creates a link in `dir` with `name` to `file`*/ +error_t +netfs_attempt_link +( + struct iouser * user, + struct node * dir, + struct node * file, + char * name, + int excl +) +{ + LOG_MSG("netfs_attempt_link"); + + /*Operation not supported*/ + return EOPNOTSUPP; +}/*netfs_attempt_link*/ +/*----------------------------------------------------------------------------*/ +/*Attempts to create an anonymous file related to `dir` with `mode`*/ +error_t +netfs_attempt_mkfile +( + struct iouser * user, + struct node * dir, + mode_t mode, + struct node ** node +) +{ + LOG_MSG("netfs_attempt_mkfile"); + + /*Unlock the directory*/ + mutex_unlock(&dir->lock); + + /*Operation not supported*/ + return EOPNOTSUPP; +}/*netfs_attempt_mkfile*/ +/*----------------------------------------------------------------------------*/ +/*Reads the contents of symlink `node` into `buf`*/ +error_t +netfs_attempt_readlink +( + struct iouser * user, + struct node * node, + char * buf +) +{ + LOG_MSG("netfs_attempt_readlink"); + + /*Operation not supported (why?..)*/ + return EOPNOTSUPP; +}/*netfs_attempt_readlink*/ +/*----------------------------------------------------------------------------*/ +/*Reads from file `node` up to `len` bytes from `offset` into `data`*/ +error_t +netfs_attempt_read +( + struct iouser * cred, + struct node * np, + loff_t offset, + size_t * len, + void * data +) +{ + LOG_MSG("netfs_attempt_read"); + + error_t err = 0; + + /*If there is no port open for the current node*/ + if(np->nn->port == MACH_PORT_NULL) + { + /*the parent node of the current node*/ + node_t * dnp; + + /*obtain the parent node of the the current node*/ + err = ncache_node_lookup(np->nn->lnode->dir, &dnp); + + /*the lookup should never fail here*/ + assert(!err); + + /*open a port to the file we are interested in*/ + mach_port_t p = file_name_lookup_under + (dnp->nn->port, np->nn->lnode->name, O_READ, 0); + + /*put `dnp` back, since we don't need it any more*/ + netfs_nput(dnp); + + if(!p) + return EBADF; + + /*store the port in the node*/ + np->nn->port = p; + } + + /*Read the required data from the file*/ + err = io_read(np->nn->port, (char **)&data, len, offset, *len); + + /*Return the result of reading*/ + return err; +}/*netfs_attempt_read*/ +/*----------------------------------------------------------------------------*/ +/*Writes to file `node` up to `len` bytes from offset from `data`*/ +error_t +netfs_attempt_write +( + struct iouser * cred, + struct node * node, + loff_t offset, + size_t * len, + void * data +) +{ + LOG_MSG("netfs_attempt_write"); + + return 0; +}/*netfs_attempt_write*/ +/*----------------------------------------------------------------------------*/ +/*Frees all storage associated with the node*/ +void +netfs_node_norefs +( + struct node * np +) +{ + /*Destroy the node*/ + node_destroy(np); +}/*netfs_node_norefs*/ +/*----------------------------------------------------------------------------*/ +/*Entry point*/ +int +main +( + int argc, + char ** argv +) +{ + /*Start logging*/ + INIT_LOG(); + LOG_MSG(">> Starting initialization..."); + + /*The port on which this translator will be set upon*/ + mach_port_t bootstrap_port; + + error_t err = 0; + + /*Parse the command line arguments*/ + argp_parse(&argp_startup, argc, argv, ARGP_IN_ORDER, 0, 0); + LOG_MSG("Command line arguments parsed."); + + /*Try to create the root node*/ + err = node_create_root(&netfs_root_node); + if(err) + error(EXIT_FAILURE, err, "Failed to create the root node"); + LOG_MSG("Root node created."); + + /*Obtain the bootstrap port*/ + task_get_bootstrap_port(mach_task_self(), &bootstrap_port); + + /*Initialize the translator*/ + netfs_init(); + + /*Obtain a port to the underlying node*/ + underlying_node = netfs_startup(bootstrap_port, O_READ); + LOG_MSG("netfs initialization complete."); + + /*Initialize the root node*/ + err = node_init_root(netfs_root_node); + if(err) + error(EXIT_FAILURE, err, "Failed to initialize the root node"); + LOG_MSG("Root node initialized."); + LOG_MSG("\tRoot node address: 0x%lX", (unsigned long)netfs_root_node); + + /*Map the time for updating node information*/ + err = maptime_map(0, 0, &maptime); + if(err) + error(EXIT_FAILURE, err, "Failed to map the time"); + LOG_MSG("Time mapped."); + + /*Initialize the cache with the required number of nodes*/ + ncache_init(ncache_size); + LOG_MSG("Cache initialized."); + + /*Obtain stat information about the underlying node*/ + err = io_stat(underlying_node, &underlying_node_stat); + if(err) + error(EXIT_FAILURE, err, + "Cannot obtain stat information about the underlying node"); + LOG_MSG("Stat information for undelying node obtained."); + + /*Obtain the ID of the current process*/ + fsid = getpid(); + + /*Setup the stat information for the root node*/ + netfs_root_node->nn_stat = underlying_node_stat; + + netfs_root_node->nn_stat.st_ino = FILTERFS_ROOT_INODE; + netfs_root_node->nn_stat.st_fsid = fsid; + netfs_root_node->nn_stat.st_mode = S_IFDIR | (underlying_node_stat.st_mode + & ~S_IFMT & ~S_ITRANS); /*we are providing a translated directory*/ + + netfs_root_node->nn_translated = netfs_root_node->nn_stat.st_mode; + + /*If the underlying node is not a directory, enhance the permissions + of the root node of filterfs*/ + if(!S_ISDIR(underlying_node_stat.st_mode)) + { + /*can be read by owner*/ + if(underlying_node_stat.st_mode & S_IRUSR) + /*allow execution by the owner*/ + netfs_root_node->nn_stat.st_mode |= S_IXUSR; + /*can be read by group*/ + if(underlying_node_stat.st_mode & S_IRGRP) + /*allow execution by the group*/ + netfs_root_node->nn_stat.st_mode |= S_IXGRP; + /*can be read by others*/ + if(underlying_node_stat.st_mode & S_IROTH) + /*allow execution by the others*/ + netfs_root_node->nn_stat.st_mode |= S_IXOTH; + } + + /*Update the timestamps of the root node*/ + fshelp_touch + (&netfs_root_node->nn_stat, TOUCH_ATIME | TOUCH_MTIME | TOUCH_CTIME, + maptime); + + LOG_MSG(">> Initialization complete. Entering netfs server loop..."); + + /*Start serving clients*/ + for(;;) + netfs_server_loop(); +}/*main*/ +/*----------------------------------------------------------------------------*/ diff --git a/netfs-sample/filterfs.c~ b/netfs-sample/filterfs.c~ new file mode 100644 index 00000000..5aaacf75 --- /dev/null +++ b/netfs-sample/filterfs.c~ @@ -0,0 +1,1236 @@ +/*----------------------------------------------------------------------------*/ +/*filter.c*/ +/*----------------------------------------------------------------------------*/ +/*The filtering translator*/ +/*----------------------------------------------------------------------------*/ +/*Based on the code of unionfs translator.*/ +/*----------------------------------------------------------------------------*/ +/*Copyright (C) 2001, 2002, 2005 Free Software Foundation, Inc. + Written by Sergiu Ivanov <unlimitedscolobb@gmail.com>. + + This program is free software; you can redistribute it and/or + modify it under the terms of the GNU General Public License as + published by the Free Software Foundation; either version 2 of the + License, or * (at your option) any later version. + + This program is distributed in the hope that it will be useful, but + WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 + USA.*/ +/*----------------------------------------------------------------------------*/ + +/*----------------------------------------------------------------------------*/ +#define _GNU_SOURCE 1 +/*----------------------------------------------------------------------------*/ +#include "filterfs.h" +/*----------------------------------------------------------------------------*/ +#include <error.h> +#include <argp.h> +#include <argz.h> +#include <hurd/netfs.h> +#include <fcntl.h> +/*----------------------------------------------------------------------------*/ +#include "debug.h" +#include "options.h" +#include "ncache.h" +/*----------------------------------------------------------------------------*/ + +/*----------------------------------------------------------------------------*/ +/*--------Macros--------------------------------------------------------------*/ +/*The state modes use in open*/ +#define OPENONLY_STATE_MODES (O_CREAT | O_EXCL | O_NOLINK | O_NOTRANS \ + | O_NONBLOCK) +/*----------------------------------------------------------------------------*/ + +/*----------------------------------------------------------------------------*/ +/*--------Global Variables----------------------------------------------------*/ +/*The name of the server*/ +char * netfs_server_name = "filterfs"; +/*----------------------------------------------------------------------------*/ +/*The version of the server*/ +char * netfs_server_version = "0.0"; +/*----------------------------------------------------------------------------*/ +/*The maximal length of a chain of symbolic links*/ +int netfs_maxsymlinks = 12; +/*----------------------------------------------------------------------------*/ +/*A port to the underlying node*/ +mach_port_t underlying_node; +/*----------------------------------------------------------------------------*/ +/*Status information for the underlying node*/ +io_statbuf_t underlying_node_stat; +/*----------------------------------------------------------------------------*/ +/*Mapped time used for updating node information*/ +volatile struct mapped_time_value * maptime; +/*----------------------------------------------------------------------------*/ +/*The filesystem ID*/ +pid_t fsid; +/*----------------------------------------------------------------------------*/ +/*The file to print debug messages to*/ +FILE * filterfs_dbg; +/*----------------------------------------------------------------------------*/ + +/*----------------------------------------------------------------------------*/ +/*--------Functions-----------------------------------------------------------*/ +/*Attempts to create a file named `name` in `dir` for `user` with mode `mode`*/ +error_t +netfs_attempt_create_file + ( + struct iouser * user, + struct node * dir, + char * name, + mode_t mode, + struct node ** node + ) + { + LOG_MSG("netfs_attempt_create_file"); + + /*Unlock `dir` and say that we can do nothing else here*/ + mutex_unlock(&dir->lock); + return EOPNOTSUPP; + }/*netfs_attempt_create_file*/ +/*----------------------------------------------------------------------------*/ +/*Return an error if the process of opening a file should not be allowed + to complete because of insufficient permissions*/ +error_t +netfs_check_open_permissions + ( + struct iouser * user, + struct node * np, + int flags, + int newnode + ) + { + LOG_MSG("netfs_check_open_permissions: '%s'", np->nn->lnode->name); + + error_t err = 0; + + /*Cheks user's permissions*/ + if(flags & O_READ) + err = fshelp_access(&np->nn_stat, S_IREAD, user); + if(!err && (flags & O_WRITE)) + err = fshelp_access(&np->nn_stat, S_IWRITE, user); + if(!err && (flags & O_EXEC)) + err = fshelp_access(&np->nn_stat, S_IEXEC, user); + + /*Return the result of the check*/ + return err; + }/*netfs_check_open_permissions*/ +/*----------------------------------------------------------------------------*/ +/*Attempts an utimes call for the user `cred` on node `node`*/ +error_t +netfs_attempt_utimes + ( + struct iouser * cred, + struct node * node, + struct timespec * atime, + struct timespec * mtime + ) + { + LOG_MSG("netfs_attempt_utimes"); + + error_t err = 0; + + /*See what information is to be updated*/ + int flags = TOUCH_CTIME; + + /*Check if the user is indeed the owner of the node*/ + err = fshelp_isowner(&node->nn_stat, cred); + + /*If the user is allowed to do utimes*/ + if(!err) + { + /*If atime is to be updated*/ + if(atime) + /*update the atime*/ + node->nn_stat.st_atim = *atime; + else + /*the current time will be set as the atime*/ + flags |= TOUCH_ATIME; + + /*If mtime is to be updated*/ + if(mtime) + /*update the mtime*/ + node->nn_stat.st_mtim = *mtime; + else + /*the current time will be set as mtime*/ + flags |= TOUCH_MTIME; + + /*touch the file*/ + fshelp_touch(&node->nn_stat, flags, maptime); + } + + /*Return the result of operations*/ + return err; + }/*netfs_attempt_utimes*/ +/*----------------------------------------------------------------------------*/ +/*Returns the valid access types for file `node` and user `cred`*/ +error_t +netfs_report_access + ( + struct iouser * cred, + struct node * np, + int * types + ) + { + LOG_MSG("netfs_report_access"); + + /*No access at first*/ + *types = 0; + + /*Check the access and set the required bits*/ + if(fshelp_access(&np->nn_stat, S_IREAD, cred) == 0) + *types |= O_READ; + if(fshelp_access(&np->nn_stat, S_IWRITE, cred) == 0) + *types |= O_WRITE; + if(fshelp_access(&np->nn_stat, S_IEXEC, cred) == 0) + *types |= O_EXEC; + + /*Everything OK*/ + return 0; + }/*netfs_report_access*/ +/*----------------------------------------------------------------------------*/ +/*Validates the stat data for the node*/ +error_t +netfs_validate_stat + ( + struct node * np, + struct iouser * cred + ) + { + LOG_MSG("netfs_validate_stat: '%s'", np->nn->lnode->name); + + error_t err = 0; + + /*If we are not at the root*/ + if(np != netfs_root_node) + { + /*If the node is not surely up-to-date*/ + if(!(np->nn->flags & FLAG_NODE_ULFS_UPTODATE)) + { + /*update it*/ + err = node_update(np); + } + + /*If no errors have yet occurred*/ + if(!err) + { + /*If the port to the file corresponding to `np` is valid*/ + if(np->nn->port != MACH_PORT_NULL) + { + /*We have a directory here (normally, only they maintain an open port). + Generally, our only concern is to maintain an open port in this case*/ + + /*attempt to stat this file*/ + err = io_stat(np->nn->port, &np->nn_stat); + + /*If stat information has been successfully obtained for the file*/ + if(!err) + /*duplicate the st_mode field of stat structure*/ + np->nn_translated = np->nn_stat.st_mode; + } + else + { + /*We, most probably, have something which is not a directory. Therefore + we will open the port and close it after the stat, so that additional + resources are not consumed.*/ + + /*the parent node of the current node*/ + node_t * dnp; + + /*obtain the parent node of the the current node*/ + err = ncache_node_lookup(np->nn->lnode->dir, &dnp); + + /*the lookup should never fail here*/ + assert(!err); + + /*open a port to the file we are interested in*/ + mach_port_t p = file_name_lookup_under + (dnp->nn->port, np->nn->lnode->name, 0, 0); + + /*put `dnp` back, since we don't need it any more*/ + netfs_nput(dnp); + + if(!p) + return EBADF; + + /*try to stat the node*/ + err = io_stat(p, &np->nn_stat); + + /*deallocate the port*/ + PORT_DEALLOC(p); + } + } + } + /*If we are at the root*/ + else + /*put the size of the node into the stat structure belonging to `np`*/ + node_get_size(np, (OFFSET_T *)&np->nn_stat.st_size); + + /*Return the result of operations*/ + return err; + }/*netfs_validate_stat*/ +/*----------------------------------------------------------------------------*/ +/*Syncs `node` completely to disk*/ +error_t +netfs_attempt_sync + ( + struct iouser * cred, + struct node * node, + int wait + ) + { + LOG_MSG("netfs_attempt_sync"); + + /*Operation is not supported*/ + return EOPNOTSUPP; + }/*netfs_attempt_sync*/ +/*----------------------------------------------------------------------------*/ +/*Fetches a directory*/ +error_t +netfs_get_dirents + ( + struct iouser * cred, + struct node * dir, + int first_entry, + int num_entries, + char ** data, + mach_msg_type_number_t * data_len, + vm_size_t max_data_len, + int * data_entries + ) + { + LOG_MSG("netfs_get_dirents: '%s'", dir->nn->lnode->name); + + error_t err; + + /*Two pointers required for processing the list of dirents*/ + node_dirent_t * dirent_start, * dirent_current; + + /*The pointer to the beginning of the list of dirents*/ + node_dirent_t * dirent_list = NULL; + + /*The size of the current dirent*/ + size_t size = 0; + + /*The number of dirents added*/ + int count = 0; + + /*The dereferenced value of parameter `data`*/ + char * data_p; + + /*Takes into account the size of the given dirent*/ + int + bump_size + ( + const char * name + ) + { + /*If the required number of entries has not been listed yet*/ + if((num_entries == -1) || (count < num_entries)) + { + /*take the current size and take into account the length of the name*/ + size_t new_size = size + DIRENT_LEN(strlen(name)); + + /*If there is a limit for the received size and it has been exceeded*/ + if((max_data_len > 0) && (new_size > max_data_len)) + /*a new dirent cannot be added*/ + return 0; + + /*memorize the new size*/ + size = new_size; + + /*increase the number of dirents added*/ + ++count; + + /*everything is OK*/ + return 1; + } + else + { + /*dirents cannot be added*/ + return 0; + } + }/*bump_size*/ + + /*Adds a dirent to the list of dirents*/ + int + add_dirent + ( + const char * name, + ino_t ino, + int type + ) + { + /*If the required number of dirents has not been listed yet*/ + if((num_entries == -1) || (count < num_entries)) + { + /*create a new dirent*/ + struct dirent hdr; + + /*obtain the length of the name*/ + size_t name_len = strlen(name); + + /*compute the full size of the dirent*/ + size_t sz = DIRENT_LEN(name_len); + + /*If there is no room for this dirent*/ + if(sz > size) + /*stop*/ + return 0; + else + /*take into account the fact that a new dirent has just been added*/ + size -= sz; + + /*setup the dirent*/ + hdr.d_ino = ino; + hdr.d_reclen = sz; + hdr.d_type = type; + hdr.d_namlen = name_len; + + /*The following two lines of code reflect the old layout of + dirents in the memory. Now libnetfs expects the layout + identical to the layout provided by dir_readdir (see dir_entries_get)*/ + + /*copy the header of the dirent into the final block of dirents*/ + memcpy(data_p, &hdr, DIRENT_NAME_OFFS); + + /*copy the name of the dirent into the block of dirents*/ + strcpy(data_p + DIRENT_NAME_OFFS, name); + + /*This line is commented for the same reason as the two specifically + commented lines above.*/ + /*move the current pointer in the block of dirents*/ + data_p += sz; + + /*count the new dirent*/ + ++count; + + /*everything was OK, so say it*/ + return 1; + } + else + /*no [new] dirents allowed*/ + return 0; + }/*add_dirent*/ + + /*List the dirents for node `dir`*/ + err = node_entries_get(dir, &dirent_list); + + /*If listing was successful*/ + if(!err) + { + /*find the entry whose number is `first_entry`*/ + for + ( + dirent_start = dirent_list, count = 2; + dirent_start && (count < first_entry); + dirent_start = dirent_start->next, ++count + ); + + /*reset number of dirents added so far*/ + count = 0; + + /*make space for entries '.' and '..', if required*/ + if(first_entry == 0) + bump_size("."); + if(first_entry <= 1) + bump_size(".."); + + /*Go through all dirents*/ + for + ( + dirent_current = dirent_start; + dirent_current; + dirent_current = dirent_current->next + ) + /*If another dirent cannot be added succesfully*/ + if(bump_size(dirent_current->dirent->d_name) == 0) + /*stop here*/ + break; + + /*allocate the required space for dirents*/ + *data = mmap(0, size, PROT_READ | PROT_WRITE, MAP_ANON, 0, 0); + + /*check if any error occurred*/ + err = ((void *)*data == MAP_FAILED) ? (errno) : (0); + } + + /*If no errors have occurred so far*/ + if(!err) + { + /*obtain the pointer to the beginning of the block of dirents*/ + data_p = *data; + + /*fill the parameters with useful values*/ + *data_len = size; + *data_entries = count; + + /*reset the number of dirents added*/ + count = 0; + + /*add entries '.' and '..', if required*/ + if(first_entry == 0) + add_dirent(".", 2, DT_DIR); + if(first_entry <= 1) + add_dirent("..", 2, DT_DIR); + + /*Follow the list of dirents beginning with dirents_start*/ + for + ( + dirent_current = dirent_start; dirent_current; + dirent_current = dirent_current->next + ) + /*If the addition of the current dirent fails*/ + if + ( + add_dirent + (dirent_current->dirent->d_name, dirent_current->dirent->d_fileno, + dirent_current->dirent->d_type) == 0 + ) + /*stop adding dirents*/ + break; + } + + /*If the list of dirents has been allocated, free it*/ + if(dirent_list) + node_entries_free(dirent_list); + + /*The directory has been read right now, modify the access time*/ + fshelp_touch(&dir->nn_stat, TOUCH_ATIME, maptime); + + /*Return the result of listing the dirents*/ + return err; + }/*netfs_get_dirents*/ +/*----------------------------------------------------------------------------*/ +/*Looks up `name` under `dir` for `user`*/ +error_t +netfs_attempt_lookup + ( + struct iouser * user, + struct node * dir, + char * name, + struct node ** node + ) + { + LOG_MSG("netfs_attempt_lookup: '%s'", name); + + error_t err = 0; + + /*If we are asked to fetch the current directory*/ + if(strcmp(name, ".") == 0) + { + /*add a reference to `dir` and put it into `node`*/ + netfs_nref(dir); + *node = dir; + + /*everything is OK*/ + return 0; + } + /*If we are asked to fetch the parent directory*/ + else if(strcmp(name, "..") == 0) + { + /*If the supplied node is not root*/ + if(dir->nn->lnode->dir) + { + /*The node corresponding to the parent directory must exist here*/ + assert(dir->nn->lnode->dir->node); + + /*put the parent node of `dir` into the result*/ + err = ncache_node_lookup(dir->nn->lnode->dir, node); + } + /*The supplied node is root*/ + else + { + /*this node is not included into our filesystem*/ + err = ENOENT; + *node = NULL; + } + + /*unlock the directory*/ + mutex_unlock(&dir->lock); + + /*stop here*/ + return err; + } + + /*Checks whether the given name satisfied the required property*/ + int + check_property + ( + const char * name + ) + { + /*If there is no property*/ + if(!property) + /*no filtering will be applied, any name is OK*/ + return 0; + + /*The number of occurrences of PROPERTY_PARAM in the property*/ + int param_entries_count = 0; + + /*The pointer to the current occurrence of PROPERTY_PARAM*/ + char * occurrence = strstr(property, PROPERTY_PARAM); + + /*Count the number of occurrences*/ + for(; occurrence; + occurrence = strstr(occurrence + 1, PROPERTY_PARAM), + ++param_entries_count); + + /*Compute the length of the property param*/ + size_t property_param_len = strlen(PROPERTY_PARAM); + + /*The length of the property*/ + size_t property_len = (property) ? (strlen(property)) : (0); + + /*Everything OK at first*/ + err = 0; + + /*Compute the length of the full name once*/ + size_t full_name_len = strlen(dir->nn->lnode->path) + 1 + strlen(name) + 1; + + /*Try to allocate the required space*/ + char * full_name = malloc(full_name_len); + if(!full_name) + { + err = ENOMEM; + return 0; + } + + /*Initialize `full_name` as a valid string*/ + full_name[0] = 0; + + /*Construct the full name*/ + strcpy(full_name, dir->nn->lnode->path); + strcat(full_name, "/"); + strcat(full_name, name); + + LOG_MSG("netfs_attempt_lookup: Applying filter to %s...", full_name); + + /*Compute the space required for the final filtering command*/ + size_t sz = property_len + (strlen(full_name) - property_param_len) + * param_entries_count; + + /*Try to allocate the space for the command*/ + char * cmd = malloc(sz); + if(!cmd) + { + free(full_name); + err = ENOMEM; + return 0; + } + + /*Initialize `cmd` as a valid string*/ + cmd[0] = 0; + + /*The current occurence of PROPERTY_PARAM in property*/ + char * p = strstr(property, PROPERTY_PARAM); + + /*The pointer to the current position in the property*/ + char * propp = property; + + /*While the command has not been constructed*/ + for(; p; p = strstr(propp, PROPERTY_PARAM)) + { + /*add the new part of the property to the command*/ + strncat(cmd, propp, p - propp); + + /*add the filename to the command*/ + strcat(cmd, full_name); + + /*LOG_MSG("\tcmd = '%s'", cmd);*/ + + /*advance the pointer in the property*/ + propp = p + property_param_len; + + /*LOG_MSG("\tpropp points at '%s'", propp);*/ + } + + /*Copy the rest of the property to the command*/ + strcat(cmd, propp); + + /*LOG_MSG("node_entries_get: The filtering command: '%s'.", cmd);*/ + + /*Execute the command*/ + int xcode = WEXITSTATUS(system(cmd)); + + /*Return the exit code of the command*/ + return xcode; + }/*check_property*/ + + /*If the given name does not satisfy the property*/ + if(check_property(name) != 0) + { + /*unlock the directory*/ + mutex_unlock(&dir->lock); + + /*no such file in the directory*/ + return ENOENT; + } + + /*Try to lookup the given file in the underlying directory*/ + mach_port_t p = file_name_lookup_under(dir->nn->port, name, 0, 0); + + /*If the lookup failed*/ + if(p == MACH_PORT_NULL) + { + /*unlock the directory*/ + mutex_unlock(&dir->lock); + + /*no such entry*/ + return ENOENT; + } + + /*Obtain the stat information about the file*/ + io_statbuf_t stat; + err = io_stat(p, &stat); + + /*Deallocate the obtained port*/ + PORT_DEALLOC(p); + + /*If this file is not a directory*/ + if(err || !S_ISDIR(stat.st_mode)) + { + /*do not set the port*/ + p = MACH_PORT_NULL; + } + else + { + /*lookup the port with the right to read the contents of the directory*/ + p = file_name_lookup_under(dir->nn->port, name, O_READ | O_DIRECTORY, 0); + if(p == MACH_PORT_NULL) + { + return EBADF; /*not enough rights?*/ + } + } + + /*The lnode corresponding to the entry we are supposed to fetch*/ + lnode_t * lnode; + + /*Finalizes the execution of this function*/ + void + finalize(void) + { + /*If some errors have occurred*/ + if(err) + { + /*the user should receive nothing*/ + *node = NULL; + + /*If there is some port, free it*/ + if(p != MACH_PORT_NULL) + PORT_DEALLOC(p); + } + /*If there is a node to return*/ + if(*node) + { + /*unlock the node*/ + mutex_unlock(&(*node)->lock); + + /*add the node to the cache*/ + ncache_node_add(*node); + } + + /*Unlock the mutexes in `dir`*/ + mutex_unlock(&dir->nn->lnode->lock); + mutex_unlock(&dir->lock); + }/*finalize*/ + + /*Try to find an lnode called `name` under the lnode corresponding to `dir`*/ + err = lnode_get(dir->nn->lnode, name, &lnode); + + /*If such an entry does not exist*/ + if(err == ENOENT) + { + /*create a new lnode with the supplied name*/ + err = lnode_create(name, &lnode); + if(err) + { + finalize(); + return err; + } + + /*install the new lnode into the directory*/ + lnode_install(dir->nn->lnode, lnode); + } + + /*Obtain the node corresponding to this lnode*/ + err = ncache_node_lookup(lnode, node); + + /*Remove an extra reference from the lnode*/ + lnode_ref_remove(lnode); + + /*If the lookup in the cache failed*/ + if(err) + { + /*stop*/ + finalize(); + return err; + } + + /*Store the port in the node*/ + (*node)->nn->port = p; + + /*Construct the full path to the node*/ + err = lnode_path_construct(lnode, NULL); + if(err) + { + finalize(); + return err; + } + + /*Now the node is up-to-date*/ + (*node)->nn->flags = FLAG_NODE_ULFS_UPTODATE; + + /*Return the result of performing the operations*/ + finalize(); + return err; + }/*netfs_attempt_lookup*/ +/*----------------------------------------------------------------------------*/ +/*Deletes `name` in `dir` for `user`*/ +error_t +netfs_attempt_unlink + ( + struct iouser * user, + struct node * dir, + char * name + ) + { + LOG_MSG("netfs_attempt_unlink"); + + return 0; + }/*netfs_attempt_unlink*/ +/*----------------------------------------------------------------------------*/ +/*Attempts to rename `fromdir`/`fromname` to `todir`/`toname`*/ +error_t +netfs_attempt_rename + ( + struct iouser * user, + struct node * fromdir, + char * fromname, + struct node * todir, + char * toname, + int excl + ) + { + LOG_MSG("netfs_attempt_rename"); + + /*Operation not supported*/ + return EOPNOTSUPP; + }/*netfs_attempt_rename*/ +/*----------------------------------------------------------------------------*/ +/*Attempts to create a new directory*/ +error_t +netfs_attempt_mkdir + ( + struct iouser * user, + struct node * dir, + char * name, + mode_t mode + ) + { + LOG_MSG("netfs_attempt_mkdir"); + + return 0; + }/*netfs_attempt_mkdir*/ +/*----------------------------------------------------------------------------*/ +/*Attempts to remove directory `name` in `dir` for `user`*/ +error_t +netfs_attempt_rmdir + ( + struct iouser * user, + struct node * dir, + char * name + ) + { + LOG_MSG("netfs_attempt_rmdir"); + + return 0; + }/*netfs_attempt_rmdir*/ +/*----------------------------------------------------------------------------*/ +/*Attempts to change the mode of `node` for user `cred` to `uid`:`gid`*/ +error_t +netfs_attempt_chown + ( + struct iouser * cred, + struct node * node, + uid_t uid, + uid_t gid + ) + { + LOG_MSG("netfs_attempt_chown"); + + /*Operation is not supported*/ + return EOPNOTSUPP; + }/*netfs_attempt_chown*/ +/*----------------------------------------------------------------------------*/ +/*Attempts to change the author of `node` to `author`*/ +error_t +netfs_attempt_chauthor + ( + struct iouser * cred, + struct node * node, + uid_t author + ) + { + LOG_MSG("netfs_attempt_chauthor"); + + /*Operation is not supported*/ + return EOPNOTSUPP; + }/*netfs_attempt_chauthor*/ +/*----------------------------------------------------------------------------*/ +/*Attempts to change the mode of `node` to `mode` for `cred`*/ +error_t +netfs_attempt_chmod + ( + struct iouser * user, + struct node * node, + mode_t mode + ) + { + LOG_MSG("netfs_attempt_chmod"); + + /*Operation is not supported*/ + return EOPNOTSUPP; + }/*netfs_attempt_chmod*/ +/*----------------------------------------------------------------------------*/ +/*Attempts to turn `node` into a symlink targetting `name`*/ +error_t +netfs_attempt_mksymlink + ( + struct iouser * cred, + struct node * node, + char * name + ) + { + LOG_MSG("netfs_attempt_mksymlink"); + + /*Operation is not supported*/ + return EOPNOTSUPP; + }/*netfs_attempt_mksymlink*/ +/*----------------------------------------------------------------------------*/ +/*Attempts to turn `node` into a device; type can be either S_IFBLK or S_IFCHR*/ +error_t +netfs_attempt_mkdev + ( + struct iouser * cred, + struct node * node, + mode_t type, + dev_t indexes + ) + { + LOG_MSG("netfs_attempt_mkdev"); + + /*Operation is not supported*/ + return EOPNOTSUPP; + }/*netfs_attempt_mkdev*/ +/*----------------------------------------------------------------------------*/ +/*Attempts to set the passive translator record for `file` passing `argz`*/ +error_t +netfs_set_translator + ( + struct iouser * cred, + struct node * node, + char * argz, + size_t arglen + ) + { + LOG_MSG("netfs_set_translator"); + + /*Operation is not supported*/ + return EOPNOTSUPP; + }/*netfs_set_translator */ +/*----------------------------------------------------------------------------*/ +/*Attempts to call chflags for `node`*/ +error_t +netfs_attempt_chflags + ( + struct iouser * cred, + struct node * node, + int flags + ) + { + LOG_MSG("netfs_attempt_chflags"); + + /*Operation is not supported*/ + return EOPNOTSUPP; + }/*netfs_attempt_chflags*/ +/*----------------------------------------------------------------------------*/ +/*Attempts to set the size of file `node`*/ +error_t +netfs_attempt_set_size + ( + struct iouser * cred, + struct node * node, + loff_t size + ) + { + LOG_MSG("netfs_attempt_set_size"); + + /*Operation is not supported*/ + return EOPNOTSUPP; + }/*netfs_attempt_set_size*/ +/*----------------------------------------------------------------------------*/ +/*Fetches the filesystem status information*/ +error_t +netfs_attempt_statfs + ( + struct iouser * cred, + struct node * node, + fsys_statfsbuf_t * st + ) + { + LOG_MSG("netfs_attempt_statfs"); + + /*Operation is not supported*/ + return EOPNOTSUPP; + }/*netfs_attempt_statfs*/ +/*----------------------------------------------------------------------------*/ +/*Syncs the filesystem*/ +error_t +netfs_attempt_syncfs + ( + struct iouser * cred, + int wait + ) + { + LOG_MSG("netfs_attempt_syncfs"); + + /*Everythin OK*/ + return 0; + }/*netfs_attempt_syncfs*/ +/*----------------------------------------------------------------------------*/ +/*Creates a link in `dir` with `name` to `file`*/ +error_t +netfs_attempt_link + ( + struct iouser * user, + struct node * dir, + struct node * file, + char * name, + int excl + ) + { + LOG_MSG("netfs_attempt_link"); + + /*Operation not supported*/ + return EOPNOTSUPP; + }/*netfs_attempt_link*/ +/*----------------------------------------------------------------------------*/ +/*Attempts to create an anonymous file related to `dir` with `mode`*/ +error_t +netfs_attempt_mkfile + ( + struct iouser * user, + struct node * dir, + mode_t mode, + struct node ** node + ) + { + LOG_MSG("netfs_attempt_mkfile"); + + /*Unlock the directory*/ + mutex_unlock(&dir->lock); + + /*Operation not supported*/ + return EOPNOTSUPP; + }/*netfs_attempt_mkfile*/ +/*----------------------------------------------------------------------------*/ +/*Reads the contents of symlink `node` into `buf`*/ +error_t +netfs_attempt_readlink + ( + struct iouser * user, + struct node * node, + char * buf + ) + { + LOG_MSG("netfs_attempt_readlink"); + + /*Operation not supported (why?..)*/ + return EOPNOTSUPP; + }/*netfs_attempt_readlink*/ +/*----------------------------------------------------------------------------*/ +/*Reads from file `node` up to `len` bytes from `offset` into `data`*/ +error_t +netfs_attempt_read + ( + struct iouser * cred, + struct node * np, + loff_t offset, + size_t * len, + void * data + ) + { + LOG_MSG("netfs_attempt_read"); + + error_t err = 0; + + /*If there is no port open for the current node*/ + if(np->nn->port == MACH_PORT_NULL) + { + /*the parent node of the current node*/ + node_t * dnp; + + /*obtain the parent node of the the current node*/ + err = ncache_node_lookup(np->nn->lnode->dir, &dnp); + + /*the lookup should never fail here*/ + assert(!err); + + /*open a port to the file we are interested in*/ + mach_port_t p = file_name_lookup_under + (dnp->nn->port, np->nn->lnode->name, O_READ, 0); + + /*put `dnp` back, since we don't need it any more*/ + netfs_nput(dnp); + + if(!p) + return EBADF; + + /*store the port in the node*/ + np->nn->port = p; + } + + /*Read the required data from the file*/ + err = io_read(np->nn->port, (char **)&data, len, offset, *len); + + /*Return the result of reading*/ + return err; + }/*netfs_attempt_read*/ +/*----------------------------------------------------------------------------*/ +/*Writes to file `node` up to `len` bytes from offset from `data`*/ +error_t +netfs_attempt_write + ( + struct iouser * cred, + struct node * node, + loff_t offset, + size_t * len, + void * data + ) + { + LOG_MSG("netfs_attempt_write"); + + return 0; + }/*netfs_attempt_write*/ +/*----------------------------------------------------------------------------*/ +/*Frees all storage associated with the node*/ +void +netfs_node_norefs + ( + struct node * np + ) + { + /*Destroy the node*/ + node_destroy(np); + }/*netfs_node_norefs*/ +/*----------------------------------------------------------------------------*/ +/*Entry point*/ +int +main + ( + int argc, + char ** argv + ) + { + /*Start logging*/ + INIT_LOG(); + LOG_MSG(">> Starting initialization..."); + + /*The port on which this translator will be set upon*/ + mach_port_t bootstrap_port; + + error_t err = 0; + + /*Parse the command line arguments*/ + argp_parse(&argp_startup, argc, argv, ARGP_IN_ORDER, 0, 0); + LOG_MSG("Command line arguments parsed."); + + /*Try to create the root node*/ + err = node_create_root(&netfs_root_node); + if(err) + error(EXIT_FAILURE, err, "Failed to create the root node"); + LOG_MSG("Root node created."); + + /*Obtain the bootstrap port*/ + task_get_bootstrap_port(mach_task_self(), &bootstrap_port); + + /*Initialize the translator*/ + netfs_init(); + + /*Obtain a port to the underlying node*/ + underlying_node = netfs_startup(bootstrap_port, O_READ); + LOG_MSG("netfs initialization complete."); + + /*Initialize the root node*/ + err = node_init_root(netfs_root_node); + if(err) + error(EXIT_FAILURE, err, "Failed to initialize the root node"); + LOG_MSG("Root node initialized."); + LOG_MSG("\tRoot node address: 0x%lX", (unsigned long)netfs_root_node); + + /*Map the time for updating node information*/ + err = maptime_map(0, 0, &maptime); + if(err) + error(EXIT_FAILURE, err, "Failed to map the time"); + LOG_MSG("Time mapped."); + + /*Initialize the cache with the required number of nodes*/ + ncache_init(ncache_size); + LOG_MSG("Cache initialized."); + + /*Obtain stat information about the underlying node*/ + err = io_stat(underlying_node, &underlying_node_stat); + if(err) + error(EXIT_FAILURE, err, + "Cannot obtain stat information about the underlying node"); + LOG_MSG("Stat information for undelying node obtained."); + + /*Obtain the ID of the current process*/ + fsid = getpid(); + + /*Setup the stat information for the root node*/ + netfs_root_node->nn_stat = underlying_node_stat; + + netfs_root_node->nn_stat.st_ino = FILTERFS_ROOT_INODE; + netfs_root_node->nn_stat.st_fsid = fsid; + netfs_root_node->nn_stat.st_mode = S_IFDIR | (underlying_node_stat.st_mode + & ~S_IFMT & ~S_ITRANS); /*we are providing a translated directory*/ + + netfs_root_node->nn_translated = netfs_root_node->nn_stat.st_mode; + + /*If the underlying node is not a directory, enhance the permissions + of the root node of filterfs*/ + if(!S_ISDIR(underlying_node_stat.st_mode)) + { + /*can be read by owner*/ + if(underlying_node_stat.st_mode & S_IRUSR) + /*allow execution by the owner*/ + netfs_root_node->nn_stat.st_mode |= S_IXUSR; + /*can be read by group*/ + if(underlying_node_stat.st_mode & S_IRGRP) + /*allow execution by the group*/ + netfs_root_node->nn_stat.st_mode |= S_IXGRP; + /*can be read by others*/ + if(underlying_node_stat.st_mode & S_IROTH) + /*allow execution by the others*/ + netfs_root_node->nn_stat.st_mode |= S_IXOTH; + } + + /*Update the timestamps of the root node*/ + fshelp_touch + (&netfs_root_node->nn_stat, TOUCH_ATIME | TOUCH_MTIME | TOUCH_CTIME, + maptime); + + LOG_MSG(">> Initialization complete. Entering netfs server loop..."); + + /*Start serving clients*/ + for(;;) + netfs_server_loop(); + }/*main*/ +/*----------------------------------------------------------------------------*/ diff --git a/netfs-sample/filterfs.h b/netfs-sample/filterfs.h new file mode 100644 index 00000000..4470a7fb --- /dev/null +++ b/netfs-sample/filterfs.h @@ -0,0 +1,453 @@ +/*----------------------------------------------------------------------------*/ +/*filter.h*/ +/*----------------------------------------------------------------------------*/ +/*The definitions for the filtering translator*/ +/*----------------------------------------------------------------------------*/ +/*Based on the code of unionfs translator.*/ +/*----------------------------------------------------------------------------*/ +/*Copyright (C) 2001, 2002, 2005 Free Software Foundation, Inc. + Written by Sergiu Ivanov <unlimitedscolobb@gmail.com>. + + This program is free software; you can redistribute it and/or + modify it under the terms of the GNU General Public License as + published by the Free Software Foundation; either version 2 of the + License, or * (at your option) any later version. + + This program is distributed in the hope that it will be useful, but + WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 + USA.*/ +/*----------------------------------------------------------------------------*/ +#ifndef __FILTERFS_H__ +#define __FILTERFS_H__ +/*----------------------------------------------------------------------------*/ +#include <stddef.h> +#include <stdlib.h> +#include <cthreads.h> +#include <unistd.h> +#include <sys/mman.h> +#include <sys/types.h> +#include <sys/stat.h> +#include <sys/statfs.h> +#include <sys/time.h> +#include <hurd/ihash.h> +#include <hurd/iohelp.h> +/*----------------------------------------------------------------------------*/ +#include "lib.h" +#include "node.h" +/*----------------------------------------------------------------------------*/ + +/*----------------------------------------------------------------------------*/ +/*--------Macros--------------------------------------------------------------*/ +/*The inode for the root node*/ +#define FILTERFS_ROOT_INODE 1 +/*----------------------------------------------------------------------------*/ + +/*----------------------------------------------------------------------------*/ +/*--------Global Variables----------------------------------------------------*/ +/*A mapped time value for filterfs*/ +/*Required for a very fast access to time*/ +extern volatile struct mapped_time_value * maptime; +/*----------------------------------------------------------------------------*/ +/*A port to the underlying node*/ +extern mach_port_t underlying_node; +/*----------------------------------------------------------------------------*/ +/*The stat information about the underlying node*/ +extern io_statbuf_t underlying_node_stat; +/*----------------------------------------------------------------------------*/ + +/*----------------------------------------------------------------------------*/ +/*--------Structures----------------------------------------------------------*/ +/*A single entry in a directory*/ +struct filterfs_dir_entry + { + char * name; /*name of the entry*/ + size_t hv; /*hash value of NAME*/ + + struct node * node; /*the active node referred to by this node (may be 0)*/ + /*NETFS_NDOE_REFCNT_LOCK should be hel whule frobbing this*/ + + struct stat stat; /*status information*/ + + char * symlink_target; /*the name of the node this entry might refer to*/ + + time_t stat_timestamp; /*the moment at which the status information was retreieved*/ + + /*the directory to which this entry belongs*/ + struct filterfs_dir * dir; + + /*link to the entry in hash bucket and the address of the previous entry's + (or hashtable's) pointer to this entry*/ + /*If self_p is null, then this entry is deleted and awaiting + the final disposal*/ + struct filterfs_dir_entry * next, ** self_p; + + /*the next and the previous entries in the 'directory order'; 0 if there + are none*/ + struct filterfs_dir_entry * ordered_next, ** ordered_self_p; + + /*when the presence/absence of this file was last checked*/ + time_t name_timestamp; + + /*used for removing this entry*/ + hurd_ihash_locp_t inode_locp; + + /*a field for a negative result of lookup*/ + int noent : 1; + + /*a marker for gabage collecting*/ + int valid : 1; + };/*struct filterfs_dir_entry*/ +/*----------------------------------------------------------------------------*/ +/*A directory*/ +struct filterfs_dir + { + /*the number of entries in the hash table*/ + size_t num_entries; + + /*the number of entries that have nodes attached*/ + /*We keep an additional reference to our node if there is any, + to prevent it from going away*/ + size_t num_live_entries; + + /*the hash table for entries*/ + struct filterfs_dir_entry ** htable; + size_t htable_len; /*the lenght of the hash table*/ + + /*the list of entries in 'directory order'.*/ + /*The entries are listed in a linked list using the ordered_next + and ordered_self_p fields in each entry. Not all entries in htable + need to be in this list*/ + struct filterfs_dir_entry * ordered; + + /*the filesystem node corresponding to this directory*/ + struct node * node; + + /*the filesystem this directory is in*/ + struct filterfs * fs; + + /*when the presence/absence of this file was last checked*/ + time_t name_timestamp; + + /*used for removing this entry*/ + hurd_ihash_locp_t inode_locp; + + /*Stuff for detecting bulk stats (?)*/ + /*Might be reduntant for this project*/ + + /*the timestamp of the first sample in bulk_stat_count1, rounded to + BULK_STAT_PERIOD seconds*/ + time_t buld_stat_base_stamp; + + /*the number of stats done in the period + [bulk_stat_base_stamp, bulk_stat_base_stamp + BULK_STAT_PERIOD]*/ + unsigned bulk_stat_count_first_half; + + /*the number of stats done in the period + [bulk_stat_bast_stamp + BULK_STAT_PERIOD, + bulk_stat_bast_stamp + 2 * BULK_STAT_PERIOD]*/ + unsigned bulk_stat_count_second_half; + };/*struct filterfs_dir*/ +/*----------------------------------------------------------------------------*/ +/*A particular filesystem*/ +struct filterfs + { + /*the root of the filesystem*/ + struct node * root; + + /*inode numbers*/ + /*Assigned sequentially in the order of creation*/ + ino_t next_inode; + + /*the identifier of the filesystem (?)*/ + int fsid; + + /*a hash table mapping inode numbers to directory entries*/ + struct hurd_ihash inode_mappings; + + /*the lock for the hash table*/ + spin_lock_t inode_mappings_lock; + };/*struct filterfs*/ +/*----------------------------------------------------------------------------*/ + +/*----------------------------------------------------------------------------*/ +/*--------Functions-----------------------------------------------------------*/ +/*Attempts to create a file named `name` in `dir` for `user` with mode `mode`*/ +error_t +netfs_attempt_create_file + ( + struct iouser * user, + struct node * dir, + char * name, + mode_t mode, + struct node ** node + ); +/*----------------------------------------------------------------------------*/ +/*Returns an error if the process of opening a file should not be allowed + to complete because of insufficient permissions*/ +error_t +netfs_check_open_permissions + ( + struct iouser * user, + struct node * np, + int flags, + int newnode + ); +/*----------------------------------------------------------------------------*/ +/*Attempts an utimes call for the user `cred` on node `node`*/ +error_t +netfs_attempt_utimes + ( + struct iouser * cred, + struct node * node, + struct timespec * atime, + struct timespec * mtime + ); +/*----------------------------------------------------------------------------*/ +/*Returns the valid access types for file `node` and user `cred`*/ +error_t +netfs_report_access + ( + struct iouser * cred, + struct node * np, + int * types + ); +/*----------------------------------------------------------------------------*/ +/*Validates the stat data for the node*/ +error_t +netfs_validate_stat + ( + struct node * np, + struct iouser * cred + ); +/*----------------------------------------------------------------------------*/ +/*Syncs `node` completely to disk*/ +error_t +netfs_attempt_sync + ( + struct iouser * cred, + struct node * node, + int wait + ); +/*----------------------------------------------------------------------------*/ +/*Fetches a directory*/ +error_t +netfs_get_dirents + ( + struct iouser * cred, + struct node * dir, + int first_entry, + int num_entries, + char ** data, + mach_msg_type_number_t * data_len, + vm_size_t max_data_len, + int * data_entries + ); +/*----------------------------------------------------------------------------*/ +/*Looks up `name` under `dir` for `user`*/ +error_t +netfs_attempt_lookup + ( + struct iouser * user, + struct node * dir, + char * name, + struct node ** node + ); +/*----------------------------------------------------------------------------*/ +/*Deletes `name` in `dir` for `user`*/ +error_t +netfs_attempt_unlink + ( + struct iouser * user, + struct node * dir, + char * name + ); +/*----------------------------------------------------------------------------*/ +/*Attempts to rename `fromdir`/`fromname` to `todir`/`toname`*/ +error_t +netfs_attempt_rename + ( + struct iouser * user, + struct node * fromdir, + char * fromname, + struct node * todir, + char * toname, + int excl + ); +/*----------------------------------------------------------------------------*/ +/*Attempts to create a new directory*/ +error_t +netfs_attempt_mkdir + ( + struct iouser * user, + struct node * dir, + char * name, + mode_t mode + ); +/*----------------------------------------------------------------------------*/ +/*Attempts to remove directory `name` in `dir` for `user`*/ +error_t +netfs_attempt_rmdir + ( + struct iouser * user, + struct node * dir, + char * name + ); +/*----------------------------------------------------------------------------*/ +/*Attempts to change the owner of `node` for user `cred` to `uid`:`gid`*/ +error_t +netfs_attempt_chown + ( + struct iouser * cred, + struct node * node, + uid_t uid, + uid_t gid + ); +/*----------------------------------------------------------------------------*/ +/*Attempts to change the author of `node` to `author`*/ +error_t +netfs_attempt_chauthor + ( + struct iouser * cred, + struct node * node, + uid_t author + ); +/*----------------------------------------------------------------------------*/ +/*Attempts to change the mode of `node` to `mode` for `cred`*/ +error_t +netfs_attempt_chmod + ( + struct iouser * user, + struct node * node, + mode_t mode + ); +/*----------------------------------------------------------------------------*/ +/*Attempts to turn `node` into a symlink targetting `name`*/ +error_t +netfs_attempt_mksymlink + ( + struct iouser * cred, + struct node * node, + char * name + ); +/*----------------------------------------------------------------------------*/ +/*Attempts to turn `node` into a device; type can be either S_IFBLK or S_IFCHR*/ +error_t +netfs_attempt_mkdev + ( + struct iouser * cred, + struct node * node, + mode_t type, + dev_t indexes + ); +/*----------------------------------------------------------------------------*/ +/*Attempts to set the passive translator record for `file` passing `argz`*/ +error_t +netfs_set_translator + ( + struct iouser * cred, + struct node * node, + char * argz, + size_t arglen + ); +/*----------------------------------------------------------------------------*/ +/*Attempts to call chflags for `node`*/ +error_t +netfs_attempt_chflags + ( + struct iouser * cred, + struct node * node, + int flags + ); +/*----------------------------------------------------------------------------*/ +/*Attempts to set the size of file `node`*/ +error_t +netfs_attempt_set_size + ( + struct iouser * cred, + struct node * node, + loff_t size + ); +/*----------------------------------------------------------------------------*/ +/*Fetches the filesystem status information*/ +error_t +netfs_attempt_statfs + ( + struct iouser * cred, + struct node * node, + fsys_statfsbuf_t * st + ); +/*----------------------------------------------------------------------------*/ +/*Syncs the filesystem*/ +error_t +netfs_attempt_syncfs + ( + struct iouser * cred, + int wait + ); +/*----------------------------------------------------------------------------*/ +/*Creates a link in `dir` with `name` to `file`*/ +error_t +netfs_attempt_link + ( + struct iouser * user, + struct node * dir, + struct node * file, + char * name, + int excl + ); +/*----------------------------------------------------------------------------*/ +/*Attempts to create an anonymous file related to `dir` with `mode`*/ +error_t +netfs_attempt_mkfile + ( + struct iouser * user, + struct node * dir, + mode_t mode, + struct node ** node + ); +/*----------------------------------------------------------------------------*/ +/*Reads the contents of symlink `node` into `buf`*/ +error_t +netfs_attempt_readlink + ( + struct iouser * user, + struct node * node, + char * buf + ); +/*----------------------------------------------------------------------------*/ +/*Reads from file `node` up to `len` bytes from `offset` into `data`*/ +error_t +netfs_attempt_read + ( + struct iouser * cred, + struct node * np, + loff_t offset, + size_t * len, + void * data + ); +/*----------------------------------------------------------------------------*/ +/*Writes to file `node` up to `len` bytes from offset from `data`*/ +error_t +netfs_attempt_write + ( + struct iouser * cred, + struct node * node, + loff_t offset, + size_t * len, + void * data + ); +/*----------------------------------------------------------------------------*/ +/*Frees all storage associated with the node*/ +void +netfs_node_norefs + ( + struct node * np + ); +/*----------------------------------------------------------------------------*/ +#endif diff --git a/netfs-sample/lib.c b/netfs-sample/lib.c new file mode 100644 index 00000000..aa0ff0be --- /dev/null +++ b/netfs-sample/lib.c @@ -0,0 +1,193 @@ +/*----------------------------------------------------------------------------*/ +/*lib.h*/ +/*----------------------------------------------------------------------------*/ +/*Basic routines for filesystem manipulations*/ +/*----------------------------------------------------------------------------*/ +/*Based on the code of unionfs translator.*/ +/*----------------------------------------------------------------------------*/ +/*Copyright (C) 2001, 2002, 2005 Free Software Foundation, Inc. + Written by Sergiu Ivanov <unlimitedscolobb@gmail.com>. + + This program is free software; you can redistribute it and/or + modify it under the terms of the GNU General Public License as + published by the Free Software Foundation; either version 2 of the + License, or * (at your option) any later version. + + This program is distributed in the hope that it will be useful, but + WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 + USA.*/ +/*----------------------------------------------------------------------------*/ + +/*----------------------------------------------------------------------------*/ +#define _GNU_SOURCE 1 +/*----------------------------------------------------------------------------*/ +#include <sys/mman.h> +/*----------------------------------------------------------------------------*/ +#include "lib.h" +#include "debug.h" +/*----------------------------------------------------------------------------*/ + +/*----------------------------------------------------------------------------*/ +/*--------Functions-----------------------------------------------------------*/ +/*Fetches directory entries for `dir`*/ +error_t +dir_entries_get + ( + file_t dir, + char ** dirent_data, /*the list of directory entries as returned + by dir_readdir*/ + size_t * dirent_data_size, /*the size of `dirent_data`*/ + struct dirent *** dirent_list /*the array of pointers to beginnings of + dirents in dirent_data*/ + ) + { + error_t err = 0; + + /*The data (array of dirents(?)) returned by dir_readdir*/ + char * data; + + /*The size of `data`*/ + size_t data_size; + + /*The number of entries in `data`*/ + int entries_num; + + /*Try to read the contents of the specified directory*/ + err = dir_readdir(dir, &data, &data_size, 0, -1, 0, &entries_num); + if(err) + return err; + + /*Create a new list of dirents*/ + struct dirent ** list; + + /*Allocate the memory for the list of dirents and for the + finalizing element*/ + list = malloc(sizeof(struct dirent *) * (entries_num + 1)); + + /*If memory allocation has failed*/ + if(!list) + { + /*free the result of dir_readdir*/ + munmap(data, data_size); + + /*return the corresponding error*/ + return ENOMEM; + } + + /*The current directory entry*/ + struct dirent * dp; + + int i; + + /*Go through every element of the list of dirents*/ + for + ( + i = 0, dp = (struct dirent *)data; + i < entries_num; + ++i, dp = (struct dirent *)((char *)dp + dp->d_reclen)) + /*copy the current value into the list*/ + *(list + i) = dp; + + /*Nullify the last element of the list*/ + *(list + i) = NULL; + + /*Copy the required values in the parameters*/ + *dirent_data = data; + *dirent_data_size = data_size; + *dirent_list = list; + + /*Return success*/ + return err; + }/*dir_entries_get*/ +/*----------------------------------------------------------------------------*/ +/*Lookup `name` under `dir` (or cwd, if `dir` is invalid)*/ +error_t +file_lookup + ( + file_t dir, + char * name, + int flags0, /*try to open with these flags first*/ + int flags1, /*try to open with these flags, if `flags0` fail*/ + int mode, /*if the file is to be created, create it with this mode*/ + file_t * port, /*store the port to the looked up file here*/ + io_statbuf_t * stat /*store the stat information here*/ + ) + { + error_t err = 0; + + /*The port to the looked up file*/ + file_t p; + + /*The stat information about the looked up file*/ + io_statbuf_t s; + + /*Performs a lookup under 'dir' or in cwd, if `dir` is invalid*/ + file_t + do_file_lookup + ( + file_t dir, + char * name, /*lookup this file*/ + int flags, /*lookup the file with these flags*/ + int mode /*if a new file is to be created, create it with this mode*/ + ) + { + /*The result of lookup*/ + file_t p; + + /*If `dir` is a valid port*/ + if(dir != MACH_PORT_NULL) + /*try to lookup `name` under `dir`*/ + p = file_name_lookup_under(dir, name, flags, mode); + else + /*lookup `name` under current cwd*/ + p = file_name_lookup(name, flags, mode); + + /*Return the result of the lookup*/ + return p; + }/*do_file_lookup*/ + + /*Lookup `name` under the suggested `dir`*/ + p = do_file_lookup(dir, name, flags0, mode); + + /*If the lookup failed*/ + if(p == MACH_PORT_NULL) + /*try to lookup for `name` using alternative flags `flags1`*/ + p = do_file_lookup(dir, name, flags1, mode); + + /*If the port is valid*/ + if(p != MACH_PORT_NULL) + { + /*If stat information is required*/ + if(stat) + { + /*obtain stat information for `p`*/ + err = io_stat(p, &s); + if(err) + PORT_DEALLOC(p); + } + } + else + /*copy `errno` into `err`*/ + err = errno; + + /*If no errors have happened during lookup*/ + if(!err) + { + /*copy the resulting port into *`port`*/ + *port = p; + + /*fill in the receiver for stat information, if requried*/ + if(stat) + *stat = s; + } + + /*Return the result of performing operations*/ + return err; + }/*file_lookup*/ +/*----------------------------------------------------------------------------*/ diff --git a/netfs-sample/lib.h b/netfs-sample/lib.h new file mode 100644 index 00000000..6335efcf --- /dev/null +++ b/netfs-sample/lib.h @@ -0,0 +1,82 @@ +/*----------------------------------------------------------------------------*/ +/*lib.h*/ +/*----------------------------------------------------------------------------*/ +/*Declarations of basic routines for filesystem manipulations*/ +/*----------------------------------------------------------------------------*/ +/*Based on the code of unionfs translator.*/ +/*----------------------------------------------------------------------------*/ +/*Copyright (C) 2001, 2002, 2005 Free Software Foundation, Inc. + Written by Sergiu Ivanov <unlimitedscolobb@gmail.com>. + + This program is free software; you can redistribute it and/or + modify it under the terms of the GNU General Public License as + published by the Free Software Foundation; either version 2 of the + License, or * (at your option) any later version. + + This program is distributed in the hope that it will be useful, but + WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 + USA.*/ +/*----------------------------------------------------------------------------*/ +#ifndef __LIB_H__ +#define __LIB_H__ + +/*----------------------------------------------------------------------------*/ +#define __USE_FILE_OFFSET64 +/*----------------------------------------------------------------------------*/ +#include <hurd.h> +#include <dirent.h> +#include <stddef.h> +/*----------------------------------------------------------------------------*/ + +/*----------------------------------------------------------------------------*/ +/*--------Macros--------------------------------------------------------------*/ +/*Alignment of directory entries*/ +#define DIRENT_ALIGN 4 +/*----------------------------------------------------------------------------*/ +/*The offset of the directory name in the directory entry structure*/ +#define DIRENT_NAME_OFFS offsetof(struct dirent, d_name) +/*----------------------------------------------------------------------------*/ +/*Computes the length of the structure before the name + the name + 0, + all padded to DIRENT_ALIGN*/ +#define DIRENT_LEN(name_len)\ + ((DIRENT_NAME_OFFS + (name_len) + 1 + DIRENT_ALIGN - 1) &\ + ~(DIRENT_ALIGN - 1)) +/*----------------------------------------------------------------------------*/ +/*Deallocate the given port for the current task*/ +#define PORT_DEALLOC(p) (mach_port_deallocate(mach_task_self(), (p))) +/*----------------------------------------------------------------------------*/ + +/*----------------------------------------------------------------------------*/ +/*--------Functions-----------------------------------------------------------*/ +/*Fetches directory entries for `dir`*/ +error_t +dir_entries_get + ( + file_t dir, + char ** dirent_data, /*the list of directory entries as returned + by dir_readdir*/ + size_t * dirent_data_size, /*the size of `dirent_data`*/ + struct dirent *** dirent_list /*the array of pointers to beginnings of + dirents in dirent_data*/ + ); +/*----------------------------------------------------------------------------*/ +/*Lookup `name` under `dir` (or cwd, if `dir` is invalid)*/ +error_t +file_lookup + ( + file_t dir, + char * name, + int flags0, /*try to open with these flags first*/ + int flags1, /*try to open with these flags, if `flags0` fail*/ + int mode, /*if the file is to be created, create it with this mode*/ + file_t * port, /*store the port to the looked up file here*/ + io_statbuf_t * stat /*store the stat information here*/ + ); +/*----------------------------------------------------------------------------*/ +#endif /*__LIB_H__*/ diff --git a/netfs-sample/lnode.c b/netfs-sample/lnode.c new file mode 100644 index 00000000..33394ed0 --- /dev/null +++ b/netfs-sample/lnode.c @@ -0,0 +1,305 @@ +/*----------------------------------------------------------------------------*/ +/*lnode.c*/ +/*----------------------------------------------------------------------------*/ +/*Implementation of policies of management of 'light nodes'*/ +/*----------------------------------------------------------------------------*/ +/*Based on the code of unionfs translator.*/ +/*----------------------------------------------------------------------------*/ +/*Copyright (C) 2001, 2002, 2005 Free Software Foundation, Inc. + Written by Sergiu Ivanov <unlimitedscolobb@gmail.com>. + + This program is free software; you can redistribute it and/or + modify it under the terms of the GNU General Public License as + published by the Free Software Foundation; either version 2 of the + License, or * (at your option) any later version. + + This program is distributed in the hope that it will be useful, but + WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 + USA.*/ +/*----------------------------------------------------------------------------*/ + +/*----------------------------------------------------------------------------*/ +#define _GNU_SOURCE +/*----------------------------------------------------------------------------*/ +#include "lnode.h" +#include "debug.h" +/*----------------------------------------------------------------------------*/ + +/*----------------------------------------------------------------------------*/ +/*--------Functions-----------------------------------------------------------*/ +/*Adds a reference to the `lnode` (which must be locked)*/ +void +lnode_ref_add + ( + lnode_t * node + ) + { + /*Increment the number of references*/ + ++node->references; + }/*lnode_ref_add*/ +/*----------------------------------------------------------------------------*/ +/*Removes a reference from `node` (which must be locked). If that was the last + reference, destroy the node*/ +void +lnode_ref_remove + ( + lnode_t * node + ) + { + /*Fail if the node is not referenced by anybody*/ + assert(node->references); + + /*Decrement the number of references to `node`*/ + --node->references; + + /*If there are no references remaining*/ + if(node->references == 0) + { + /*uninstall the node from the directory it is in and destroy it*/ + lnode_uninstall(node); + lnode_destroy(node); + } + else + /*simply unlock the node*/ + mutex_unlock(&node->lock); + }/*lnode_ref_remove*/ +/*----------------------------------------------------------------------------*/ +/*Creates a new lnode with `name`; the new node is locked and contains + a single reference*/ +error_t +lnode_create + ( + char * name, + lnode_t ** node /*put the result here*/ + ) + { + /*Allocate the memory for the node*/ + lnode_t * node_new = malloc(sizeof(lnode_t)); + + /*If the memory has not been allocated*/ + if(!node_new) + { + /*stop*/ + return ENOMEM; + } + + /*The copy of the name*/ + char * name_cp = NULL; + + /*If the name exists*/ + if(name) + { + /*duplicate it*/ + name_cp = strdup(name); + + /*If the name has not been duplicated*/ + if(!name_cp) + { + /*free the node*/ + free(node_new); + + /*stop*/ + return ENOMEM; + } + } + + /*Setup the new node*/ + memset(node_new, 0, sizeof(lnode_t)); + node_new->name = name_cp; + node_new->name_len = (name_cp) ? (strlen(name_cp)) : (0); + + /*Setup one reference to this lnode*/ + node_new->references = 1; + + /*Initialize the mutex and acquire a lock on this lnode*/ + mutex_init(&node_new->lock); + mutex_lock(&node_new->lock); + + /*Store the result in the second parameter*/ + *node = node_new; + + /*Return success*/ + return 0; + }/*lnode_create*/ +/*----------------------------------------------------------------------------*/ +/*Destroys the given lnode*/ +void +lnode_destroy + ( + lnode_t * node /*destroy this*/ + ) + { + /*Destroy the name of the node*/ + free(node->name); + + /*Destroy the node itself*/ + free(node); + }/*lnode_destroy*/ +/*----------------------------------------------------------------------------*/ +/*Constructs the full path for the given lnode and stores the result both in + the parameter and inside the lnode (the same string, actually)*/ +error_t +lnode_path_construct + ( + lnode_t * node, + char ** path /*store the path here*/ + ) + { + error_t err = 0; + + /*The final path*/ + char * p; + + /*The final length of the path*/ + int p_len = 0; + + /*A temporary pointer to an lnode*/ + lnode_t * n; + + /*While the root node of the filterfs filesystem has not been reached*/ + for(n = node; n && n->dir; n = n->dir) + /*add the length of the name of `n` to `p_len` make some space for + the delimiter '/', if we are not approaching the root node*/ + /*p_len += n->name_len + ((n->dir->dir) ? (1) : (0));*/ + /*There is some path to our root node, so we will anyway have to + add a '/'*/ + p_len += n->name_len + 1; + + /*Include the space for the path to the root node of the filterfs + (n is now the root of the filesystem)*/ + p_len += strlen(n->path) + 1; + + /*Try to allocate the space for the string*/ + p = malloc(p_len * sizeof(char)); + if(!p) + err = ENOMEM; + /*If memory allocation has been successful*/ + else + { + /*put a terminal 0 at the end of the path*/ + p[--p_len] = 0; + + /*While the root node of the filterfs filesystem has not been reached*/ + for(n = node; n && n->dir; n = n->dir) + { + /*compute the position where the name of `n` is to be inserted*/ + p_len -= n->name_len; + + /*copy the name of the node into the path (omit the terminal 0)*/ + strncpy(p + p_len, n->name, n->name_len); + + /*If we are not at the root node of the filterfs filesystem, add the + separator*/ + /*if(n->dir->dir) + p[--p_len] = '/';*/ + /*we anyway have to add the separator slash*/ + p[--p_len] = '/'; + } + + /*put the path to the root node at the beginning of the first path + (n is at the root now)*/ + strncpy(p, n->path, strlen(n->path)); + + /*destroy the former path in lnode, if it exists*/ + if(node->path) + free(node->path); + + /*store the new path inside the lnode*/ + node->path = p; + + /*store the path in the parameter*/ + if(path) + *path = p; + } + + /*Return the result of operations*/ + return err; + }/*lnode_path_construct*/ +/*----------------------------------------------------------------------------*/ +/*Gets a light node by its name, locks it and increments its refcount*/ +error_t +lnode_get + ( + lnode_t * dir, /*search here*/ + char * name, /*search for this name*/ + lnode_t ** node /*put the result here*/ + ) + { + error_t err = 0; + + /*The pointer to the required lnode*/ + lnode_t * n; + + /*Find `name` among the names of entries in `dir`*/ + for(n = dir->entries; n && (strcmp(n->name, name) != 0); n = n->next); + + /*If the search has been successful*/ + if(n) + { + /*lock the node*/ + mutex_lock(&n->lock); + + /*increment the refcount of the found lnode*/ + lnode_ref_add(n); + + /*put a pointer to `n` into the parameter*/ + *node = n; + } + else + err = ENOENT; + + /*Return the result of operations*/ + return err; + }/*lnode_get*/ +/*----------------------------------------------------------------------------*/ +/*Install the lnode into the lnode tree: add a reference to `dir` (which must + be locked)*/ +void +lnode_install + ( + lnode_t * dir, /*install here*/ + lnode_t * node /*install this*/ + ) + { + /*Install `node` into the list of entries in `dir`*/ + node->next = dir->entries; + node->prevp = &dir->entries; /*this node is the first on the list*/ + if(dir->entries) + dir->entries->prevp = &node->next; /*here `prevp` gets the value + corresponding to its meaning*/ + dir->entries = node; + + /*Add a new reference to dir*/ + lnode_ref_add(dir); + + /*Setup the `dir` link in node*/ + node->dir = dir; + }/*lnode_install*/ +/*----------------------------------------------------------------------------*/ +/*Unistall the node from the node tree; remove a reference from the lnode + containing `node`*/ +void +lnode_uninstall + ( + lnode_t * node + ) + { + /*Remove a reference from the parent*/ + lnode_ref_remove(node->dir); + + /*Make the next pointer in the previous element point to the element, + which follows `node`*/ + *node->prevp = node->next; + + /*If the current node is not the last one, connect the list after removal + of the current node*/ + if(node->next) + node->next->prevp = &node->next; + }/*lnode_uninstall*/ +/*----------------------------------------------------------------------------*/ diff --git a/netfs-sample/lnode.h b/netfs-sample/lnode.h new file mode 100644 index 00000000..7c42c8d4 --- /dev/null +++ b/netfs-sample/lnode.h @@ -0,0 +1,143 @@ +/*----------------------------------------------------------------------------*/ +/*lnode.h*/ +/*----------------------------------------------------------------------------*/ +/*Management of cheap 'light nodes'*/ +/*----------------------------------------------------------------------------*/ +/*Based on the code of unionfs translator.*/ +/*----------------------------------------------------------------------------*/ +/*Copyright (C) 2001, 2002, 2005 Free Software Foundation, Inc. + Written by Sergiu Ivanov <unlimitedscolobb@gmail.com>. + + This program is free software; you can redistribute it and/or + modify it under the terms of the GNU General Public License as + published by the Free Software Foundation; either version 2 of the + License, or * (at your option) any later version. + + This program is distributed in the hope that it will be useful, but + WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 + USA.*/ +/*----------------------------------------------------------------------------*/ +#ifndef __LNODE_H__ +#define __LNODE_H__ + +/*----------------------------------------------------------------------------*/ +#include <error.h> +#include <hurd/netfs.h> +/*----------------------------------------------------------------------------*/ + +/*----------------------------------------------------------------------------*/ +/*A candy synonym for the fundamental libnetfs node*/ +typedef struct node node_t; +/*----------------------------------------------------------------------------*/ +/*The light node*/ +struct lnode + { + /*the name of the lnode*/ + char * name; + + /*the length of the name; `name` does not change, and this value is used + quite often, therefore calculate it just once*/ + size_t name_len; + + /*the full path to the lnode*/ + char * path; + + /*the associated flags*/ + int flags; + + /*the number of references to this lnode*/ + int references; + + /*the reference to the real node*/ + node_t * node; + + /*the next lnode and the pointer to this lnode from the previous one*/ + struct lnode * next, **prevp; + + /*the lnode (directory) in which this node is contained*/ + struct lnode * dir; + + /*the beginning of the list of entries contained in this lnode (directory)*/ + struct lnode * entries; + + /*a lock*/ + struct mutex lock; + };/*struct lnode*/ +/*----------------------------------------------------------------------------*/ +typedef struct lnode lnode_t; +/*----------------------------------------------------------------------------*/ + +/*----------------------------------------------------------------------------*/ +/*--------Functions-----------------------------------------------------------*/ +/*Adds a reference to the `lnode` (which must be locked)*/ +void +lnode_ref_add + ( + lnode_t * node + ); +/*----------------------------------------------------------------------------*/ +/*Removes a reference from `node` (which must be locked). If that was the last + reference, destroy the node*/ +void +lnode_ref_remove + ( + lnode_t * node + ); +/*----------------------------------------------------------------------------*/ +/*Creates a new lnode with `name`; the new node is locked and contains + a single reference*/ +error_t +lnode_create + ( + char * name, + lnode_t ** node /*put the result here*/ + ); +/*----------------------------------------------------------------------------*/ +/*Destroys the given lnode*/ +void +lnode_destroy + ( + lnode_t * node /*destroy this*/ + ); +/*----------------------------------------------------------------------------*/ +/*Constructs the full path for the given lnode and stores the result both in + the parameter and inside the lnode (the same string, actually)*/ +error_t +lnode_path_construct + ( + lnode_t * node, + char ** path /*store the path here*/ + ); +/*----------------------------------------------------------------------------*/ +/*Gets a light node by its name, locks it and increments its refcount*/ +error_t +lnode_get + ( + lnode_t * dir, /*search here*/ + char * name, /*search for this name*/ + lnode_t ** node /*put the result here*/ + ); +/*----------------------------------------------------------------------------*/ +/*Install the lnode into the lnode tree: add a reference to `dir` (which must + be locked)*/ +void +lnode_install + ( + lnode_t * dir, /*install here*/ + lnode_t * node /*install this*/ + ); +/*----------------------------------------------------------------------------*/ +/*Unistall the node from the node tree; remove a reference from the lnode*/ +void +lnode_uninstall + ( + lnode_t * node + ); +/*----------------------------------------------------------------------------*/ +#endif /*__LNODE_H__*/ diff --git a/netfs-sample/ncache.c b/netfs-sample/ncache.c new file mode 100644 index 00000000..12462d31 --- /dev/null +++ b/netfs-sample/ncache.c @@ -0,0 +1,221 @@ +/*----------------------------------------------------------------------------*/ +/*ncache.h*/ +/*----------------------------------------------------------------------------*/ +/*The implementation of the cache of nodes*/ +/*----------------------------------------------------------------------------*/ +/*Based on the code of unionfs translator.*/ +/*----------------------------------------------------------------------------*/ +/*Copyright (C) 2001, 2002, 2005 Free Software Foundation, Inc. + Written by Sergiu Ivanov <unlimitedscolobb@gmail.com>. + + This program is free software; you can redistribute it and/or + modify it under the terms of the GNU General Public License as + published by the Free Software Foundation; either version 2 of the + License, or * (at your option) any later version. + + This program is distributed in the hope that it will be useful, but + WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 + USA.*/ +/*----------------------------------------------------------------------------*/ + +/*----------------------------------------------------------------------------*/ +#define _GNU_SOURCE 1 +/*----------------------------------------------------------------------------*/ +#include "ncache.h" +/*----------------------------------------------------------------------------*/ + +/*----------------------------------------------------------------------------*/ +/*--------Global Variables----------------------------------------------------*/ +/*The global cache chain*/ +ncache_t ncache; +/*----------------------------------------------------------------------------*/ +/*Cache size (may be overwritten by the user)*/ +int ncache_size = NCACHE_SIZE; +/*----------------------------------------------------------------------------*/ + +/*----------------------------------------------------------------------------*/ +/*--------Functions-----------------------------------------------------------*/ +/*Initializes the node cache*/ +void +ncache_init + ( + int size_max + ) + { + /*Reset the LRU and MRU ends of the list*/ + ncache.mru = ncache.lru = NULL; + + /*Set the maximal size according to the parameter*/ + ncache.size_max = size_max; + + /*The cache is empty so far; remark that*/ + ncache.size_current = 0; + + /*Init the lock*/ + mutex_init(&ncache.lock); + }/*ncache_init*/ +/*----------------------------------------------------------------------------*/ +/*Looks up the lnode and stores the result in `node`; creates a new entry + in the cache if the lookup fails*/ +error_t +ncache_node_lookup + ( + lnode_t * lnode, /*search for this*/ + node_t ** node /*put the result here*/ + ) + { + error_t err = 0; + + /*Obtain the pointer to the node corresponding to `lnode`*/ + node_t * n = lnode->node; + + /*If a node has already been created for the given lnode*/ + if(n != NULL) + { + /*count a new reference to 'n'*/ + netfs_nref(n); + } + else + { + /*create a new node for the given lnode and store the result in `n`*/ + err = node_create(lnode, &n); + } + + /*If no errors have occurred during the previous operations*/ + if(!err) + { + /*lock the mutex in the looked up node*/ + mutex_lock(&n->lock); + + /*store the lookup result in `node`*/ + *node = n; + } + + /*Return the result of operations*/ + return err; + }/*ncache_node_lookup*/ +/*----------------------------------------------------------------------------*/ +/*Removes the given node from the cache*/ +static +void +ncache_node_remove + ( + node_t * node + ) + { + /*Obtain the pointer to the netnode (this contains the information + specific of us)*/ + struct netnode * nn = node->nn; + + /*If there exists a successor of this node in the cache chain*/ + if(nn->ncache_next) + /*remove the reference in the successor*/ + nn->ncache_next->nn->ncache_prev = nn->ncache_prev; + /*If there exists a predecessor of this node in the cache chain*/ + if(nn->ncache_prev) + /*remove the reference in the predecessor*/ + nn->ncache_prev->nn->ncache_next = nn->ncache_next; + + /*If the node was located at the MRU end of the list*/ + if(ncache.mru == node) + /*shift the MRU end to the next node*/ + ncache.mru = nn->ncache_next; + /*If the node was located at the LRU end of the list*/ + if(ncache.lru == node) + /*shift the LRU end to the previous node*/ + ncache.lru = nn->ncache_prev; + + /*Invalidate the references inside the node*/ + nn->ncache_next = nn->ncache_prev = NULL; + + /*Count the removal of a node*/ + --ncache.size_current; + }/*ncache_node_remove*/ +/*----------------------------------------------------------------------------*/ +/*Resets the node cache*/ +void +ncache_reset(void) + { + /*The node being currently deleted*/ + node_t * node; + + /*Acquire a lock on the cache*/ + mutex_lock(&ncache.lock); + + /*Remove the whole cache chain*/ + for(node = ncache.mru; node != NULL; ncache_node_remove(node), node = ncache.mru); + + /*Release the lock*/ + mutex_unlock(&ncache.lock); + }/*ncache_reset*/ +/*----------------------------------------------------------------------------*/ +/*Adds the given node to the cache*/ +void +ncache_node_add + ( + node_t * node /*the node to add*/ + ) + { + /*Acquire a lock on the cache*/ + mutex_lock(&ncache.lock); + + /*If there already are some nodes in the cache and it is enabled*/ + if((ncache.size_max > 0) || (ncache.size_current > 0)) + { + /*If the node to be added is not at the MRU end already*/ + if(ncache.mru != node) + { + /*If the node is correctly integrated in the cache*/ + if((node->nn->ncache_next != NULL) && (node->nn->ncache_prev != NULL)) + /*remove the old entry*/ + ncache_node_remove(node); + else + /*add a new reference to the node*/ + netfs_nref(node); + + /*put the node at the MRU end of the cache chain*/ + node->nn->ncache_next = ncache.mru; + node->nn->ncache_prev = NULL; + + /*setup the pointer in the old MRU end, if it exists*/ + if(ncache.mru != NULL) + ncache.mru->nn->ncache_prev = node; + + /*setup the LRU end of the cache chain, if it did not exist previously*/ + if(ncache.lru == NULL) + ncache.lru = node; + + /*shift the MRU end to the new node*/ + ncache.mru = node; + + /*count the addition*/ + ++ncache.size_current; + } + } + + /*While the size of the cache is exceeding the maximal size*/ + node_t * old_lru; + for + ( + old_lru = ncache.lru; + ncache.size_current > ncache.size_max; + old_lru = ncache.lru + ) + { + /*remove the current LRU end of the list from the cache*/ + ncache_node_remove(old_lru); + + /*release the reference to the node owned by this thread*/ + netfs_nrele(old_lru); + } + + /*Release the lock on the cache*/ + mutex_unlock(&ncache.lock); + }/*ncache_node_add*/ +/*----------------------------------------------------------------------------*/ diff --git a/netfs-sample/ncache.h b/netfs-sample/ncache.h new file mode 100644 index 00000000..124d514e --- /dev/null +++ b/netfs-sample/ncache.h @@ -0,0 +1,100 @@ +/*----------------------------------------------------------------------------*/ +/*ncache.h*/ +/*----------------------------------------------------------------------------*/ +/*The cache of nodes*/ +/*----------------------------------------------------------------------------*/ +/*Based on the code of unionfs translator.*/ +/*----------------------------------------------------------------------------*/ +/*Copyright (C) 2001, 2002, 2005 Free Software Foundation, Inc. + Written by Sergiu Ivanov <unlimitedscolobb@gmail.com>. + + This program is free software; you can redistribute it and/or + modify it under the terms of the GNU General Public License as + published by the Free Software Foundation; either version 2 of the + License, or * (at your option) any later version. + + This program is distributed in the hope that it will be useful, but + WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 + USA.*/ +/*----------------------------------------------------------------------------*/ +#ifndef __NCACHE_H__ +#define __NCACHE_H__ + +/*----------------------------------------------------------------------------*/ +#include <error.h> +#include <hurd/netfs.h> +/*----------------------------------------------------------------------------*/ +#include "node.h" +/*----------------------------------------------------------------------------*/ + +/*----------------------------------------------------------------------------*/ +/*--------Macros--------------------------------------------------------------*/ +/*The default maximal cache size*/ +#define NCACHE_SIZE 256 +/*----------------------------------------------------------------------------*/ + +/*----------------------------------------------------------------------------*/ +/*A cache chain*/ +struct ncache + { + /*the MRU end of the cache chain*/ + node_t * mru; + + /*the LRU end of the cache chain*/ + node_t * lru; + + /*the maximal number of nodes to cache*/ + int size_max; + + /*the current length of the cache chain*/ + int size_current; + + /*a lock*/ + struct mutex lock; + };/*struct ncache*/ +/*----------------------------------------------------------------------------*/ +typedef struct ncache ncache_t; +/*----------------------------------------------------------------------------*/ + +/*----------------------------------------------------------------------------*/ +/*--------Global Variables----------------------------------------------------*/ +/*The cache size (may be overwritten by the user)*/ +extern int cache_size; +/*----------------------------------------------------------------------------*/ + +/*----------------------------------------------------------------------------*/ +/*--------Functions-----------------------------------------------------------*/ +/*Initializes the node cache*/ +void +ncache_init + ( + int size_max + ); +/*----------------------------------------------------------------------------*/ +/*Looks up the lnode and stores the result in `node`; creates a new entry + in the cache if the lookup fails*/ +error_t +ncache_node_lookup + ( + lnode_t * lnode, /*search for this*/ + node_t ** node /*put the result here*/ + ); +/*----------------------------------------------------------------------------*/ +/*Resets the node cache*/ +void +ncache_reset(void); +/*----------------------------------------------------------------------------*/ +/*Adds the given node to the cache*/ +void +ncache_node_add + ( + node_t * node /*the node to add*/ + ); +/*----------------------------------------------------------------------------*/ +#endif /*__NCACHE_H__*/ diff --git a/netfs-sample/node.c b/netfs-sample/node.c new file mode 100644 index 00000000..602660b6 --- /dev/null +++ b/netfs-sample/node.c @@ -0,0 +1,803 @@ +/*----------------------------------------------------------------------------*/ +/*node.c*/ +/*----------------------------------------------------------------------------*/ +/*Implementation of node management strategies*/ +/*----------------------------------------------------------------------------*/ +/*Based on the code of unionfs translator.*/ +/*----------------------------------------------------------------------------*/ +/*Copyright (C) 2001, 2002, 2005 Free Software Foundation, Inc. + Written by Sergiu Ivanov <unlimitedscolobb@gmail.com>. + + This program is free software; you can redistribute it and/or + modify it under the terms of the GNU General Public License as + published by the Free Software Foundation; either version 2 of the + License, or * (at your option) any later version. + + This program is distributed in the hope that it will be useful, but + WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 + USA.*/ +/*----------------------------------------------------------------------------*/ + +/*----------------------------------------------------------------------------*/ +#define _GNU_SOURCE 1 +/*----------------------------------------------------------------------------*/ +#include <stdlib.h> +#include <fcntl.h> +#include <sys/stat.h> +#include <sys/mman.h> +#include <stdio.h> +/*----------------------------------------------------------------------------*/ +#include "debug.h" +#include "node.h" +#include "options.h" +#include "lib.h" +#include "filterfs.h" +/*----------------------------------------------------------------------------*/ + +/*----------------------------------------------------------------------------*/ +/*--------Global Variables----------------------------------------------------*/ +/*The lock protecting the underlying filesystem*/ +struct mutex ulfs_lock = MUTEX_INITIALIZER; +/*----------------------------------------------------------------------------*/ + +/*----------------------------------------------------------------------------*/ +/*--------Functions-----------------------------------------------------------*/ +/*Derives a new node from `lnode` and adds a reference to `lnode`*/ +error_t +node_create +( + lnode_t * lnode, + node_t ** node /*store the result here*/ +) +{ + error_t err = 0; + + /*Create a new netnode*/ + netnode_t * netnode_new = malloc(sizeof(netnode_t)); + + /*If the memory could not be allocated*/ + if(netnode_new == NULL) + err = ENOMEM; + else + { + /*create a new node from the netnode*/ + node_t * node_new = netfs_make_node(netnode_new); + + /*If the creation failed*/ + if(node_new == NULL) + { + /*set the error code*/ + err = ENOMEM; + + /*destroy the netnode created above*/ + free(netnode_new); + + /*stop*/ + return err; + } + + /*link the lnode to the new node*/ + lnode->node = node_new; + lnode_ref_add(lnode); + + /*setup the references in the newly created node*/ + node_new->nn->lnode = lnode; + node_new->nn->flags = 0; + node_new->nn->ncache_next = node_new->nn->ncache_prev = NULL; + + /*store the result of creation in the second parameter*/ + *node = node_new; + } + + /*Return the result of operations*/ + return err; +}/*node_create*/ +/*----------------------------------------------------------------------------*/ +/*Destroys the specified node and removes a light reference from the + associated light node*/ +void +node_destroy +( + node_t * np +) +{ + /*Die if the node does not belong to node cache*/ + assert(!np->nn->ncache_next || !np->nn->ncache_prev); + + /*Destroy the port to the underlying filesystem allocated to the node*/ + PORT_DEALLOC(np->nn->port); + + /*Lock the lnode corresponding to the current node*/ + mutex_lock(&np->nn->lnode->lock); + + /*Orphan the light node*/ + np->nn->lnode->node = NULL; + + /*Remove a reference from the lnode*/ + lnode_ref_remove(np->nn->lnode); + + /*Free the netnode and the node itself*/ + free(np->nn); + free(np); +}/*node_destroy*/ +/*----------------------------------------------------------------------------*/ +/*Creates the root node and the corresponding lnode*/ +error_t +node_create_root +( + node_t ** root_node /*store the result here*/ +) +{ + /*Try to create a new lnode*/ + lnode_t * lnode; + error_t err = lnode_create(NULL, &lnode); + + /*Stop, if the creation failed*/ + if(err) + return err; + + /*Try to derive the node corresponding to `lnode`*/ + node_t * node; + err = node_create(lnode, &node); + + /*If the operation failed*/ + if(err) + { + /*destroy the created lnode*/ + lnode_destroy(lnode); + + /*stop*/ + return err; + } + + /*Release the lock on the lnode*/ + mutex_unlock(&lnode->lock); + + /*Store the result in the parameter*/ + *root_node = node; + + /*Return the result*/ + return err; +}/*node_create_root*/ +/*----------------------------------------------------------------------------*/ +/*Initializes the port to the underlying filesystem for the root node*/ +error_t +node_init_root +( + node_t * node /*the root node*/ +) +{ + error_t err = 0; + + /*Acquire a lock for operations on the underlying filesystem*/ + mutex_lock(&ulfs_lock); + + /*Open the port to the directory specified in `dir`*/ + node->nn->port = file_name_lookup(dir, O_READ | O_DIRECTORY, 0); + + /*If the directory could not be opened*/ + if(node->nn->port == MACH_PORT_NULL) + { + /*set the error code accordingly*/ + err = errno; + LOG_MSG("node_init_root: Could not open the port for %s.", dir); + + /*release the lock and stop*/ + mutex_unlock(&ulfs_lock); + return err; + } + + LOG_MSG("node_init_root: Port for %s opened successfully.", dir); + LOG_MSG("\tPort: 0x%lX", (unsigned long)node->nn->port); + + /*Stat the root node*/ + err = io_stat(node->nn->port, &node->nn_stat); + if(err) + { + /*deallocate the port*/ + PORT_DEALLOC(node->nn->port); + + LOG_MSG("node_init_root: Could not stat the root node."); + + /*unlock the mutex and exit*/ + mutex_unlock(&ulfs_lock); + return err; + } + + /*Set the path to the corresponding lnode to `dir`*/ + node->nn->lnode->path = strdup(dir); + if(!node->nn->lnode->path) + { + /*deallocate the port*/ + PORT_DEALLOC(node->nn->port); + + /*unlock the mutex*/ + mutex_unlock(&ulfs_lock); + + LOG_MSG("node_init_root: Could not strdup the directory."); + return ENOMEM; + } + + /*The current position in dir*/ + char * p = dir + strlen(dir); + + /*Go through the path from end to beginning*/ + for(; p >= dir; --p) + { + /*If the current character is a '/'*/ + if(*p == '/') + { + /*If p is not the first character*/ + if(p > dir) + { + /*if this slash is escaped, skip it*/ + if(*(p - 1) == '\\') + continue; + } + + /*advance the pointer to the first character after the slash*/ + ++p; + + /*stop*/ + break; + } + } + + LOG_MSG("node_init_root: The name of root node is %s.", p); + + /*Set the name of the lnode to the last element in the path to dir*/ + node->nn->lnode->name = strdup(p); + /*If the name of the node could not be duplicated*/ + if(!node->nn->lnode->name) + { + /*free the name of the path to the node and deallocate teh port*/ + free(node->nn->lnode->path); + PORT_DEALLOC(node->nn->port); + + /*unlock the mutex*/ + mutex_unlock(&ulfs_lock); + + LOG_MSG("node_init_root: Could not strdup the name of the root node."); + return ENOMEM; + } + + /*Compute the length of the name of the root node*/ + node->nn->lnode->name_len = strlen(p); + + /*Release the lock for operations on the undelying filesystem*/ + mutex_unlock(&ulfs_lock); + + /*Return the result of operations*/ + return err; +}/*node_init_root*/ +/*----------------------------------------------------------------------------*/ +/*Frees a list of dirents*/ +void +node_entries_free +( + node_dirent_t * dirents /*free this*/ +) +{ + /*The current and the next elements*/ + node_dirent_t * dirent, * dirent_next; + + /*Go through all elements of the list*/ + for(dirent = dirents; dirent; dirent = dirent_next) + { + /*store the next element*/ + dirent_next = dirent->next; + + /*free the dirent stored in the current element of the list*/ + free(dirent->dirent); + + /*free the current element*/ + free(dirent); + } +}/*node_entries_free*/ +/*----------------------------------------------------------------------------*/ +/*Reads the directory entries from `node`, which must be locked*/ +error_t +node_entries_get +( + node_t * node, + node_dirent_t ** dirents /*store the result here*/ +) +{ + error_t err = 0; + + /*Obtain the path to the current node*/ + char * path_to_node = node->nn->lnode->path; + + /*The number of PROPERTY_PARAMs in the property*/ + int param_entries_count = 0; + + /*The length of the property*/ + size_t property_len = (property) ? (strlen(property)) : (0); + + /*The length of PROPERTY_PARAM*/ + size_t property_param_len = strlen(PROPERTY_PARAM); + + /*The full name and the filtering command*/ + char * full_name = NULL, * cmd = NULL; + + /*The lengths of the full name and the filtering command in chunks*/ + size_t full_name_size = 1, cmd_size = 1; + + /*If some property was indeed specified*/ + if(property_len != 0) + { + /*the pointer to the current occurrence of PROPERTY_PARAM*/ + char * occurrence = strstr(property, PROPERTY_PARAM); + + /*count the number of occurrences*/ + for(; occurrence; + occurrence = strstr(occurrence + 1, PROPERTY_PARAM), + ++param_entries_count); + + /*try allocate the memory for the fullname and the filtering command*/ + full_name = malloc(full_name_size * STRING_CHUNK); + if(!full_name) + return ENOMEM; + + cmd = malloc(cmd_size * STRING_CHUNK); + if(!cmd) + { + free(full_name); + return ENOMEM; + } + } + + /*Obtain the length of the path*/ + size_t pathlen = strlen(path_to_node); + + /*Checks if the given file satisfies the property. Zero value means that + the entry must be filtered out*/ + int + check_property + ( + const char * name /*the name of the file*/ + ) + { + /*If there is no property*/ + if(!property) + /*no filtering will be applied, any name is OK*/ + return 0; + + /*Everything OK at first*/ + err = 0; + + /*Compute the length of the full name once*/ + size_t full_name_len = pathlen + 1 + strlen(name) + 1; + + /*See how much space (in chunks) is required for the full name*/ + int chunks = full_name_size; + for(; full_name_len > chunks * STRING_CHUNK; ++chunks); + + /*If more memory is requied*/ + if(chunks > full_name_size) + { + /*free the old full name*/ + free(full_name); + + /*try to allocate the new memory*/ + full_name = malloc(chunks * STRING_CHUNK); + if(!full_name) + { + err = ENOMEM; + free(cmd); /*the string for the command is definitely allocated here*/ + return 0; + } + + /*store the new size*/ + full_name_size = chunks; + } + + /*Initialize `full_name` as a valid string*/ + full_name[0] = 0; + + /*Construct the full name*/ + strcpy(full_name, path_to_node); + strcat(full_name, "/"); + strcat(full_name, name); + + /*LOG_MSG("node_entries_get: Applying filter to %s...", full_name);*/ + + /*Compute the space required for the final filtering command*/ + size_t sz = property_len + (strlen(full_name) - property_param_len) + * param_entries_count; + + /*See how much space (in chunks) is required for the command*/ + for(chunks = cmd_size; sz > chunks * STRING_CHUNK; ++chunks); + + /*If more memory is requied*/ + if(chunks > cmd_size) + { + /*free the old command*/ + free(cmd); + + /*try to allocate the new memory*/ + cmd = malloc(chunks * STRING_CHUNK); + if(!cmd) + { + err = ENOMEM; + free(full_name); /*the string for the full name is + definitely allocated here*/ + return 0; + } + + /*store the new size*/ + cmd_size = chunks; + } + + /*Initialize `cmd` as a valid string*/ + cmd[0] = 0; + + /*The current occurence of PROPERTY_PARAM in property*/ + char * p = strstr(property, PROPERTY_PARAM); + + /*The pointer to the current position in the property*/ + char * propp = property; + + /*While the command has not been constructed*/ + for(; p; p = strstr(propp, PROPERTY_PARAM)) + { + /*add the new part of the property to the command*/ + strncat(cmd, propp, p - propp); + + /*add the filename to the command*/ + strcat(cmd, full_name); + + /*LOG_MSG("\tcmd = '%s'", cmd);*/ + + /*advance the pointer in the property*/ + propp = p + property_param_len; + + /*LOG_MSG("\tpropp points at '%s'", propp);*/ + } + + /*Copy the rest of the property to the command*/ + strcat(cmd, propp); + + /*LOG_MSG("node_entries_get: The filtering command: '%s'.", cmd);*/ + + /*Execute the command*/ + int xcode = WEXITSTATUS(system(cmd)); + + /*Return the exit code of the command*/ + return xcode; + }/*check_property*/ + + /*The list of dirents*/ + struct dirent ** dirent_list, **dirent; + + /*The head of the list of dirents*/ + node_dirent_t * node_dirent_list = NULL; + + /*The size of the array of pointers to dirent*/ + size_t dirent_data_size; + + /*The array of dirents*/ + char * dirent_data; + + /*Obtain the directory entries for the given node*/ + err = dir_entries_get + (node->nn->port, &dirent_data, &dirent_data_size, &dirent_list); + if(err) + { + return err; + } + + /*The new entry in the list*/ + node_dirent_t * node_dirent_new; + + /*The new dirent*/ + struct dirent * dirent_new; + + /*LOG_MSG("node_entries_get: Getting entries for %p", node);*/ + + /*The name of the current dirent*/ + char * name; + + /*The length of the current name*/ + size_t name_len; + + /*The size of the current dirent*/ + size_t size; + + /*The exit code of property*/ + int good; + + /*Go through all elements of the list of pointers to dirent*/ + for(dirent = dirent_list; *dirent; ++dirent) + { + /*obtain the name of the current dirent*/ + name = &((*dirent)->d_name[0]); + + /*If the current dirent is either '.' or '..', skip it*/ + if((strcmp(name, ".") == 0) || (strcmp(name, "..") == 0)) + continue; + + /*check if the current dirent has the property*/ + good = check_property(name); + if(err) + break; + + /*If the current entry is not good, skip it*/ + if(good != 0) + continue; + + /*obtain the length of the current name*/ + name_len = strlen(name); + + /*obtain the length of the current dirent*/ + size = DIRENT_LEN(name_len); + + /*create a new list element*/ + node_dirent_new = malloc(sizeof(node_dirent_t)); + if(!node_dirent_new) + { + err = ENOMEM; + break; + } + + /*create a new dirent*/ + dirent_new = malloc(size); + if(!dirent_new) + { + free(node_dirent_new); + err = ENOMEM; + break; + } + + /*fill the dirent with information*/ + dirent_new->d_ino = (*dirent)->d_ino; + dirent_new->d_type = (*dirent)->d_type; + dirent_new->d_reclen = size; + strcpy((char *)dirent_new + DIRENT_NAME_OFFS, name); + + /*add the dirent to the list*/ + node_dirent_new->dirent = dirent_new; + node_dirent_new->next = node_dirent_list; + node_dirent_list = node_dirent_new; + } + + /*If something went wrong in the loop*/ + if(err) + /*free the list of dirents*/ + node_entries_free(node_dirent_list); + else + /*store the list of dirents in the second parameter*/ + *dirents = node_dirent_list; + + /*Free the list of pointers to dirent*/ + free(dirent_list); + + /*Free the results of listing the dirents*/ + munmap(dirent_data, dirent_data_size); + + /*Free the full name and the command (if these are present at all)*/ + if(full_name) + free(full_name); + if(cmd) + free(cmd); + + /*Return the result of operations*/ + return err; +}/*node_entries_get*/ +/*----------------------------------------------------------------------------*/ +/*Makes sure that all ports to the underlying filesystem of `node` are up to + date*/ +error_t +node_update +( + node_t * node +) +{ + error_t err = 0; + + /*The full path to this node*/ + char * path; + + /*Stat information for `node`*/ + io_statbuf_t stat; + + /*The port to the file corresponding to `node`*/ + file_t port; + + /*If the specified node is the root node or if it must not be updated*/ + if(NODE_IS_ROOT(node) || (node->nn->flags & FLAG_NODE_ULFS_FIXED)) + /*do nothing*/ + return err; /*return 0; actually*/ + + /*Gain exclusive access to the root node of the filesystem*/ + mutex_lock(&netfs_root_node->lock); + + /*Construct the full path to `node`*/ + err = lnode_path_construct(node->nn->lnode, &path); + if(err) + { + mutex_unlock(&netfs_root_node->lock); + return err; + } + + /*Deallocate `node`'s port to the underlying filesystem*/ + if(node->nn->port) + PORT_DEALLOC(node->nn->port); + + /*Try to lookup the file for `node` in its untranslated version*/ + err = file_lookup + ( + netfs_root_node->nn->port, path, O_READ | O_NOTRANS, O_NOTRANS, + 0, &port, &stat + ); + if(err) + { + node->nn->port = MACH_PORT_NULL; + err = 0; /*failure (?)*/ + return err; + } + + /*If the node looked up is actually the root node of filterfs filesystem*/ + if + ( + (stat.st_ino == underlying_node_stat.st_ino) + && (stat.st_fsid == underlying_node_stat.st_fsid) + ) + /*set `err` accordingly*/ + err = ELOOP; + else + { + /*deallocate the obtained port*/ + PORT_DEALLOC(port); + + /*obtain the translated version of the required node*/ + err = file_lookup + (netfs_root_node->nn->port, path, O_READ, 0, 0, &port, &stat); + } + + /*If there have been errors*/ + if(err) + /*reset the port*/ + port = MACH_PORT_NULL; + + /*Store the port in the node*/ + node->nn->port = port; + + /*Remove the flag about the invalidity of the current node and set the + flag that the node is up-to-date*/ + node->nn->flags &= ~FLAG_NODE_INVALIDATE; + node->nn->flags |= FLAG_NODE_ULFS_UPTODATE; + + /*Release the lock on the root node of filterfs filesystem*/ + mutex_unlock(&netfs_root_node->lock); + + /*Return the result of operations*/ + return err; +}/*node_update*/ +/*----------------------------------------------------------------------------*/ +/*Computes the size of the given directory*/ +error_t +node_get_size +( + node_t * dir, + OFFSET_T * off +) +{ + error_t err = 0; + + /*The final size*/ + size_t size = 0; + + /*The number of directory entries*/ + /*int count = 0;*/ + + /*The the node in the directory entries list from which we start counting*/ + /*node_dirent_t * dirent_start = NULL;*/ + + /*The currently analyzed dirent*/ + node_dirent_t * dirent_current = NULL; + + /*The pointer to the beginning of the list of dirents*/ + node_dirent_t * dirent_list = NULL; + + /*The first entry we have to analyze*/ + /*int first_entry = 2;*/ + + /*Takes into consideration the name of the current dirent*/ + void + bump_size + ( + const char * name + ) + { + /*Increment the current size by the size of the current dirent*/ + size += DIRENT_LEN(strlen(name)); + + /*Count the current dirent*/ + /*++count;*/ + }/*bump_size*/ + + /*Obtain the list of entries in the current directory*/ + err = node_entries_get(dir, &dirent_list); + if(err) + return err; + + /*Obtain the pointer to the dirent which has the number first_entry*/ + /*Actually, the first element of the list*/ + /*This code is included in unionfs, but it's completely useless here*/ + /*for + ( + dirent_start = dirent_list, count = 2; + dirent_start && count < first_entry; + dirent_start = dirent_start->next, ++count + );*/ + + /*Reset the count*/ + /*count = 0;*/ + + /*Make space for '.' and '..' entries*/ + /*This code is included in unionfs, but it's completely useless here*/ + /*if(first_entry == 0) + bump_size("."); + if(first_entry <= 1) + bump_size("..");*/ + + /*See how much space is required for the node*/ + for + ( + dirent_current = dirent_list/*dirent_start*/; dirent_current; + dirent_current = dirent_current->next + ) + bump_size(dirent_current->dirent->d_name); + + /*Free the list of dirents*/ + node_entries_free(dirent_list); + + /*Return the size*/ + *off = size; + return 0; +}/*node_get_size*/ +/*----------------------------------------------------------------------------*/ +/*Remove the file called `name` under `dir`*/ +error_t +node_unlink_file +( + node_t * dir, + char * name +) +{ + error_t err = 0; + + /*The port to the file which will be unlinked*/ + mach_port_t p; + + /*Stat information about the file which will be unlinked*/ + io_statbuf_t stat; + + /*If port corresponding to `dir` is invalid*/ + if(dir->nn->port == MACH_PORT_NULL) + /*stop with an error*/ + return ENOENT; /*FIXME: Is the return value indeed meaningful here?*/ + + /*Attempt to lookup the specified file*/ + err = file_lookup(dir->nn->port, name, O_NOTRANS, O_NOTRANS, 0, &p, &stat); + if(err) + return err; + + /*Deallocate the obtained port*/ + PORT_DEALLOC(p); + + /*Unlink file `name` under `dir`*/ + err = dir_unlink(dir->nn->port, name); + if(err) + return err; + + return err; +}/*node_unlink_file*/ +/*----------------------------------------------------------------------------*/ diff --git a/netfs-sample/node.c~ b/netfs-sample/node.c~ new file mode 100644 index 00000000..ec83b41b --- /dev/null +++ b/netfs-sample/node.c~ @@ -0,0 +1,803 @@ +/*----------------------------------------------------------------------------*/ +/*node.c*/ +/*----------------------------------------------------------------------------*/ +/*Implementation of node management strategies*/ +/*----------------------------------------------------------------------------*/ +/*Based on the code of unionfs translator.*/ +/*----------------------------------------------------------------------------*/ +/*Copyright (C) 2001, 2002, 2005 Free Software Foundation, Inc. + Written by Sergiu Ivanov <unlimitedscolobb@gmail.com>. + + This program is free software; you can redistribute it and/or + modify it under the terms of the GNU General Public License as + published by the Free Software Foundation; either version 2 of the + License, or * (at your option) any later version. + + This program is distributed in the hope that it will be useful, but + WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 + USA.*/ +/*----------------------------------------------------------------------------*/ + +/*----------------------------------------------------------------------------*/ +#define _GNU_SOURCE 1 +/*----------------------------------------------------------------------------*/ +#include <stdlib.h> +#include <fcntl.h> +#include <sys/stat.h> +#include <sys/mman.h> +#include <stdio.h> +/*----------------------------------------------------------------------------*/ +#include "debug.h" +#include "node.h" +#include "options.h" +#include "lib.h" +#include "filterfs.h" +/*----------------------------------------------------------------------------*/ + +/*----------------------------------------------------------------------------*/ +/*--------Global Variables----------------------------------------------------*/ +/*The lock protecting the underlying filesystem*/ +struct mutex ulfs_lock = MUTEX_INITIALIZER; +/*----------------------------------------------------------------------------*/ + +/*----------------------------------------------------------------------------*/ +/*--------Functions-----------------------------------------------------------*/ +/*Derives a new node from `lnode` and adds a reference to `lnode`*/ +error_t +node_create + ( + lnode_t * lnode, + node_t ** node /*store the result here*/ + ) + { + error_t err = 0; + + /*Create a new netnode*/ + netnode_t * netnode_new = malloc(sizeof(netnode_t)); + + /*If the memory could not be allocated*/ + if(netnode_new == NULL) + err = ENOMEM; + else + { + /*create a new node from the netnode*/ + node_t * node_new = netfs_make_node(netnode_new); + + /*If the creation failed*/ + if(node_new == NULL) + { + /*set the error code*/ + err = ENOMEM; + + /*destroy the netnode created above*/ + free(netnode_new); + + /*stop*/ + return err; + } + + /*link the lnode to the new node*/ + lnode->node = node_new; + lnode_ref_add(lnode); + + /*setup the references in the newly created node*/ + node_new->nn->lnode = lnode; + node_new->nn->flags = 0; + node_new->nn->ncache_next = node_new->nn->ncache_prev = NULL; + + /*store the result of creation in the second parameter*/ + *node = node_new; + } + + /*Return the result of operations*/ + return err; + }/*node_create*/ +/*----------------------------------------------------------------------------*/ +/*Destroys the specified node and removes a light reference from the + associated light node*/ +void +node_destroy + ( + node_t * np + ) + { + /*Die if the node does not belong to node cache*/ + assert(!np->nn->ncache_next || !np->nn->ncache_prev); + + /*Destroy the port to the underlying filesystem allocated to the node*/ + PORT_DEALLOC(np->nn->port); + + /*Lock the lnode corresponding to the current node*/ + mutex_lock(&np->nn->lnode->lock); + + /*Orphan the light node*/ + np->nn->lnode->node = NULL; + + /*Remove a reference from the lnode*/ + lnode_ref_remove(np->nn->lnode); + + /*Free the netnode and the node itself*/ + free(np->nn); + free(np); + }/*node_destroy*/ +/*----------------------------------------------------------------------------*/ +/*Creates the root node and the corresponding lnode*/ +error_t +node_create_root + ( + node_t ** root_node /*store the result here*/ + ) + { + /*Try to create a new lnode*/ + lnode_t * lnode; + error_t err = lnode_create(NULL, &lnode); + + /*Stop, if the creation failed*/ + if(err) + return err; + + /*Try to derive the node corresponding to `lnode`*/ + node_t * node; + err = node_create(lnode, &node); + + /*If the operation failed*/ + if(err) + { + /*destroy the created lnode*/ + lnode_destroy(lnode); + + /*stop*/ + return err; + } + + /*Release the lock on the lnode*/ + mutex_unlock(&lnode->lock); + + /*Store the result in the parameter*/ + *root_node = node; + + /*Return the result*/ + return err; + }/*node_create_root*/ +/*----------------------------------------------------------------------------*/ +/*Initializes the port to the underlying filesystem for the root node*/ +error_t +node_init_root + ( + node_t * node /*the root node*/ + ) + { + error_t err = 0; + + /*Acquire a lock for operations on the underlying filesystem*/ + mutex_lock(&ulfs_lock); + + /*Open the port to the directory specified in `dir`*/ + node->nn->port = file_name_lookup(dir, O_READ | O_DIRECTORY, 0); + + /*If the directory could not be opened*/ + if(node->nn->port == MACH_PORT_NULL) + { + /*set the error code accordingly*/ + err = errno; + LOG_MSG("node_init_root: Could not open the port for %s.", dir); + + /*release the lock and stop*/ + mutex_unlock(&ulfs_lock); + return err; + } + + LOG_MSG("node_init_root: Port for %s opened successfully.", dir); + LOG_MSG("\tPort: 0x%lX", (unsigned long)node->nn->port); + + /*Stat the root node*/ + err = io_stat(node->nn->port, &node->nn_stat); + if(err) + { + /*deallocate the port*/ + PORT_DEALLOC(node->nn->port); + + LOG_MSG("node_init_root: Could not stat the root node."); + + /*unlock the mutex and exit*/ + mutex_unlock(&ulfs_lock); + return err; + } + + /*Set the path to the corresponding lnode to `dir`*/ + node->nn->lnode->path = strdup(dir); + if(!node->nn->lnode->path) + { + /*deallocate the port*/ + PORT_DEALLOC(node->nn->port); + + /*unlock the mutex*/ + mutex_unlock(&ulfs_lock); + + LOG_MSG("node_init_root: Could not strdup the directory."); + return ENOMEM; + } + + /*The current position in dir*/ + char * p = dir + strlen(dir); + + /*Go through the path from end to beginning*/ + for(; p >= dir; --p) + { + /*If the current character is a '/'*/ + if(*p == '/') + { + /*If p is not the first character*/ + if(p > dir) + { + /*if this slash is escaped, skip it*/ + if(*(p - 1) == '\\') + continue; + } + + /*advance the pointer to the first character after the slash*/ + ++p; + + /*stop*/ + break; + } + } + + LOG_MSG("node_init_root: The name of root node is %s.", p); + + /*Set the name of the lnode to the last element in the path to dir*/ + node->nn->lnode->name = strdup(p); + /*If the name of the node could not be duplicated*/ + if(!node->nn->lnode->name) + { + /*free the name of the path to the node and deallocate teh port*/ + free(node->nn->lnode->path); + PORT_DEALLOC(node->nn->port); + + /*unlock the mutex*/ + mutex_unlock(&ulfs_lock); + + LOG_MSG("node_init_root: Could not strdup the name of the root node."); + return ENOMEM; + } + + /*Compute the length of the name of the root node*/ + node->nn->lnode->name_len = strlen(p); + + /*Release the lock for operations on the undelying filesystem*/ + mutex_unlock(&ulfs_lock); + + /*Return the result of operations*/ + return err; + }/*node_init_root*/ +/*----------------------------------------------------------------------------*/ +/*Frees a list of dirents*/ +void +node_entries_free + ( + node_dirent_t * dirents /*free this*/ + ) + { + /*The current and the next elements*/ + node_dirent_t * dirent, * dirent_next; + + /*Go through all elements of the list*/ + for(dirent = dirents; dirent; dirent = dirent_next) + { + /*store the next element*/ + dirent_next = dirent->next; + + /*free the dirent stored in the current element of the list*/ + free(dirent->dirent); + + /*free the current element*/ + free(dirent); + } + }/*node_entries_free*/ +/*----------------------------------------------------------------------------*/ +/*Reads the directory entries from `node`, which must be locked*/ +error_t +node_entries_get + ( + node_t * node, + node_dirent_t ** dirents /*store the result here*/ + ) + { + error_t err = 0; + + /*Obtain the path to the current node*/ + char * path_to_node = node->nn->lnode->path; + + /*The number of PROPERTY_PARAMs in the property*/ + int param_entries_count = 0; + + /*The length of the property*/ + size_t property_len = (property) ? (strlen(property)) : (0); + + /*The length of PROPERTY_PARAM*/ + size_t property_param_len = strlen(PROPERTY_PARAM); + + /*The full name and the filtering command*/ + char * full_name = NULL, * cmd = NULL; + + /*The lengths of the full name and the filtering command in chunks*/ + size_t full_name_size = 1, cmd_size = 1; + + /*If some property was indeed specified*/ + if(property_len != 0) + { + /*the pointer to the current occurrence of PROPERTY_PARAM*/ + char * occurrence = strstr(property, PROPERTY_PARAM); + + /*count the number of occurrences*/ + for(; occurrence; + occurrence = strstr(occurrence + 1, PROPERTY_PARAM), + ++param_entries_count); + + /*try allocate the memory for the fullname and the filtering command*/ + full_name = malloc(full_name_size * STRING_CHUNK); + if(!full_name) + return ENOMEM; + + cmd = malloc(cmd_size * STRING_CHUNK); + if(!cmd) + { + free(full_name); + return ENOMEM; + } + } + + /*Obtain the length of the path*/ + size_t pathlen = strlen(path_to_node); + + /*Checks if the given file satisfies the property. Zero value means that + the entry must be filtered out*/ + int + check_property + ( + const char * name /*the name of the file*/ + ) + { + /*If there is no property*/ + if(!property) + /*no filtering will be applied, any name is OK*/ + return 0; + + /*Everything OK at first*/ + err = 0; + + /*Compute the length of the full name once*/ + size_t full_name_len = pathlen + 1 + strlen(name) + 1; + + /*See how much space (in chunks) is required for the full name*/ + int chunks = full_name_size; + for(; full_name_len > chunks * STRING_CHUNK; ++chunks); + + /*If more memory is requied*/ + if(chunks > full_name_size) + { + /*free the old full name*/ + free(full_name); + + /*try to allocate the new memory*/ + full_name = malloc(chunks * STRING_CHUNK); + if(!full_name) + { + err = ENOMEM; + free(cmd); /*the string for the command is definitely allocated here*/ + return 0; + } + + /*store the new size*/ + full_name_size = chunks; + } + + /*Initialize `full_name` as a valid string*/ + full_name[0] = 0; + + /*Construct the full name*/ + strcpy(full_name, path_to_node); + strcat(full_name, "/"); + strcat(full_name, name); + + /*LOG_MSG("node_entries_get: Applying filter to %s...", full_name);*/ + + /*Compute the space required for the final filtering command*/ + size_t sz = property_len + (strlen(full_name) - property_param_len) + * param_entries_count; + + /*See how much space (in chunks) is required for the command*/ + for(chunks = cmd_size; sz > chunks * STRING_CHUNK; ++chunks); + + /*If more memory is requied*/ + if(chunks > cmd_size) + { + /*free the old command*/ + free(cmd); + + /*try to allocate the new memory*/ + cmd = malloc(chunks * STRING_CHUNK); + if(!cmd) + { + err = ENOMEM; + free(full_name); /*the string for the full name is + definitely allocated here*/ + return 0; + } + + /*store the new size*/ + cmd_size = chunks; + } + + /*Initialize `cmd` as a valid string*/ + cmd[0] = 0; + + /*The current occurence of PROPERTY_PARAM in property*/ + char * p = strstr(property, PROPERTY_PARAM); + + /*The pointer to the current position in the property*/ + char * propp = property; + + /*While the command has not been constructed*/ + for(; p; p = strstr(propp, PROPERTY_PARAM)) + { + /*add the new part of the property to the command*/ + strncat(cmd, propp, p - propp); + + /*add the filename to the command*/ + strcat(cmd, full_name); + + /*LOG_MSG("\tcmd = '%s'", cmd);*/ + + /*advance the pointer in the property*/ + propp = p + property_param_len; + + /*LOG_MSG("\tpropp points at '%s'", propp);*/ + } + + /*Copy the rest of the property to the command*/ + strcat(cmd, propp); + + /*LOG_MSG("node_entries_get: The filtering command: '%s'.", cmd);*/ + + /*Execute the command*/ + int xcode = WEXITSTATUS(system(cmd)); + + /*Return the exit code of the command*/ + return xcode; + }/*check_property*/ + + /*The list of dirents*/ + struct dirent ** dirent_list, **dirent; + + /*The head of the list of dirents*/ + node_dirent_t * node_dirent_list = NULL; + + /*The size of the array of pointers to dirent*/ + size_t dirent_data_size; + + /*The array of dirents*/ + char * dirent_data; + + /*Obtain the directory entries for the given node*/ + err = dir_entries_get + (node->nn->port, &dirent_data, &dirent_data_size, &dirent_list); + if(err) + { + return err; + } + + /*The new entry in the list*/ + node_dirent_t * node_dirent_new; + + /*The new dirent*/ + struct dirent * dirent_new; + + /*LOG_MSG("node_entries_get: Getting entries for %p", node);*/ + + /*The name of the current dirent*/ + char * name; + + /*The length of the current name*/ + size_t name_len; + + /*The size of the current dirent*/ + size_t size; + + /*The exit code of property*/ + int good; + + /*Go through all elements of the list of pointers to dirent*/ + for(dirent = dirent_list; *dirent; ++dirent) + { + /*obtain the name of the current dirent*/ + name = &((*dirent)->d_name[0]); + + /*If the current dirent is either '.' or '..', skip it*/ + if((strcmp(name, ".") == 0) || (strcmp(name, "..") == 0)) + continue; + + /*check if the current dirent has the property*/ + good = check_property(name); + if(err) + break; + + /*If the current entry is not good, skip it*/ + if(good != 0) + continue; + + /*obtain the length of the current name*/ + name_len = strlen(name); + + /*obtain the length of the current dirent*/ + size = DIRENT_LEN(name_len); + + /*create a new list element*/ + node_dirent_new = malloc(sizeof(node_dirent_t)); + if(!node_dirent_new) + { + err = ENOMEM; + break; + } + + /*create a new dirent*/ + dirent_new = malloc(size); + if(!dirent_new) + { + free(node_dirent_new); + err = ENOMEM; + break; + } + + /*fill the dirent with information*/ + dirent_new->d_ino = (*dirent)->d_ino; + dirent_new->d_type = (*dirent)->d_type; + dirent_new->d_reclen = size; + strcpy((char *)dirent_new + DIRENT_NAME_OFFS, name); + + /*add the dirent to the list*/ + node_dirent_new->dirent = dirent_new; + node_dirent_new->next = node_dirent_list; + node_dirent_list = node_dirent_new; + } + + /*If something went wrong in the loop*/ + if(err) + /*free the list of dirents*/ + node_entries_free(node_dirent_list); + else + /*store the list of dirents in the second parameter*/ + *dirents = node_dirent_list; + + /*Free the list of pointers to dirent*/ + free(dirent_list); + + /*Free the results of listing the dirents*/ + munmap(dirent_data, dirent_data_size); + + /*Free the full name and the command (if these are present at all)*/ + if(full_name) + free(full_name); + if(cmd) + free(cmd); + + /*Return the result of operations*/ + return err; + }/*node_entries_get*/ +/*----------------------------------------------------------------------------*/ +/*Makes sure that all ports to the underlying filesystem of `node` are up to + date*/ +error_t +node_update + ( + node_t * node + ) + { + error_t err = 0; + + /*The full path to this node*/ + char * path; + + /*Stat information for `node`*/ + io_statbuf_t stat; + + /*The port to the file corresponding to `node`*/ + file_t port; + + /*If the specified node is the root node or if it must not be updated*/ + if(NODE_IS_ROOT(node) || (node->nn->flags & FLAG_NODE_ULFS_FIXED)) + /*do nothing*/ + return err; /*return 0; actually*/ + + /*Gain exclusive access to the root node of the filesystem*/ + mutex_lock(&netfs_root_node->lock); + + /*Construct the full path to `node`*/ + err = lnode_path_construct(node->nn->lnode, &path); + if(err) + { + mutex_unlock(&netfs_root_node->lock); + return err; + } + + /*Deallocate `node`'s port to the underlying filesystem*/ + if(node->nn->port) + PORT_DEALLOC(node->nn->port); + + /*Try to lookup the file for `node` in its untranslated version*/ + err = file_lookup + ( + netfs_root_node->nn->port, path, O_READ | O_NOTRANS, O_NOTRANS, + 0, &port, &stat + ); + if(err) + { + node->nn->port = MACH_PORT_NULL; + err = 0; /*failure (?)*/ + return err; + } + + /*If the node looked up is actually the root node of filterfs filesystem*/ + if + ( + (stat.st_ino == underlying_node_stat.st_ino) + && (stat.st_fsid == underlying_node_stat.st_fsid) + ) + /*set `err` accordingly*/ + err = ELOOP; + else + { + /*deallocate the obtained port*/ + PORT_DEALLOC(port); + + /*obtain the translated version of the required node*/ + err = file_lookup + (netfs_root_node->nn->port, path, O_READ, 0, 0, &port, &stat); + } + + /*If there have been errors*/ + if(err) + /*reset the port*/ + port = MACH_PORT_NULL; + + /*Store the port in the node*/ + node->nn->port = port; + + /*Remove the flag about the invalidity of the current node and set the + flag that the node is up-to-date*/ + node->nn->flags &= ~FLAG_NODE_INVALIDATE; + node->nn->flags |= FLAG_NODE_ULFS_UPTODATE; + + /*Release the lock on the root node of filterfs filesystem*/ + mutex_unlock(&netfs_root_node->lock); + + /*Return the result of operations*/ + return err; + }/*node_update*/ +/*----------------------------------------------------------------------------*/ +/*Computes the size of the given directory*/ +error_t +node_get_size + ( + node_t * dir, + OFFSET_T * off + ) + { + error_t err = 0; + + /*The final size*/ + size_t size = 0; + + /*The number of directory entries*/ + /*int count = 0;*/ + + /*The the node in the directory entries list from which we start counting*/ + /*node_dirent_t * dirent_start = NULL;*/ + + /*The currently analyzed dirent*/ + node_dirent_t * dirent_current = NULL; + + /*The pointer to the beginning of the list of dirents*/ + node_dirent_t * dirent_list = NULL; + + /*The first entry we have to analyze*/ + /*int first_entry = 2;*/ + + /*Takes into consideration the name of the current dirent*/ + void + bump_size + ( + const char * name + ) + { + /*Increment the current size by the size of the current dirent*/ + size += DIRENT_LEN(strlen(name)); + + /*Count the current dirent*/ + /*++count;*/ + }/*bump_size*/ + + /*Obtain the list of entries in the current directory*/ + err = node_entries_get(dir, &dirent_list); + if(err) + return err; + + /*Obtain the pointer to the dirent which has the number first_entry*/ + /*Actually, the first element of the list*/ + /*This code is included in unionfs, but it's completely useless here*/ + /*for + ( + dirent_start = dirent_list, count = 2; + dirent_start && count < first_entry; + dirent_start = dirent_start->next, ++count + );*/ + + /*Reset the count*/ + /*count = 0;*/ + + /*Make space for '.' and '..' entries*/ + /*This code is included in unionfs, but it's completely useless here*/ + /*if(first_entry == 0) + bump_size("."); + if(first_entry <= 1) + bump_size("..");*/ + + /*See how much space is required for the node*/ + for + ( + dirent_current = dirent_list/*dirent_start*/; dirent_current; + dirent_current = dirent_current->next + ) + bump_size(dirent_current->dirent->d_name); + + /*Free the list of dirents*/ + node_entries_free(dirent_list); + + /*Return the size*/ + *off = size; + return 0; + }/*node_get_size*/ +/*----------------------------------------------------------------------------*/ +/*Remove the file called `name` under `dir`*/ +error_t +node_unlink_file + ( + node_t * dir, + char * name + ) + { + error_t err = 0; + + /*The port to the file which will be unlinked*/ + mach_port_t p; + + /*Stat information about the file which will be unlinked*/ + io_statbuf_t stat; + + /*If port corresponding to `dir` is invalid*/ + if(dir->nn->port == MACH_PORT_NULL) + /*stop with an error*/ + return ENOENT; /*FIXME: Is the return value indeed meaningful here?*/ + + /*Attempt to lookup the specified file*/ + err = file_lookup(dir->nn->port, name, O_NOTRANS, O_NOTRANS, 0, &p, &stat); + if(err) + return err; + + /*Deallocate the obtained port*/ + PORT_DEALLOC(p); + + /*Unlink file `name` under `dir`*/ + err = dir_unlink(dir->nn->port, name); + if(err) + return err; + + return err; + }/*node_unlink_file*/ +/*----------------------------------------------------------------------------*/ diff --git a/netfs-sample/node.h b/netfs-sample/node.h new file mode 100644 index 00000000..dcd618d4 --- /dev/null +++ b/netfs-sample/node.h @@ -0,0 +1,168 @@ +/*----------------------------------------------------------------------------*/ +/*node.h*/ +/*----------------------------------------------------------------------------*/ +/*Node management. Also see lnode.h*/ +/*----------------------------------------------------------------------------*/ +/*Based on the code of unionfs translator.*/ +/*----------------------------------------------------------------------------*/ +/*Copyright (C) 2001, 2002, 2005 Free Software Foundation, Inc. + Written by Sergiu Ivanov <unlimitedscolobb@gmail.com>. + + This program is free software; you can redistribute it and/or + modify it under the terms of the GNU General Public License as + published by the Free Software Foundation; either version 2 of the + License, or * (at your option) any later version. + + This program is distributed in the hope that it will be useful, but + WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 + USA.*/ +/*----------------------------------------------------------------------------*/ +#ifndef __NODE_H__ +#define __NODE_H__ + +/*----------------------------------------------------------------------------*/ +#include <error.h> +#include <sys/stat.h> +#include <hurd/netfs.h> +/*----------------------------------------------------------------------------*/ +#include "lnode.h" +/*----------------------------------------------------------------------------*/ + +/*----------------------------------------------------------------------------*/ +/*--------Macros--------------------------------------------------------------*/ +/*Checks whether the give node is the root of the filterfs filesystem*/ +#define NODE_IS_ROOT(n) (((n)->nn->lnode->dir) ? (0) : (1)) +/*----------------------------------------------------------------------------*/ +/*Node flags*/ +#define FLAG_NODE_ULFS_FIXED 0x00000001 /*this node should not be updated*/ +#define FLAG_NODE_INVALIDATE 0x00000002 /*this node must be updated*/ +#define FLAG_NODE_ULFS_UPTODATE 0x00000004 /*this node has just been updated*/ +/*----------------------------------------------------------------------------*/ +/*The type of offset corresponding to the current platform*/ +#ifdef __USE_FILE_OFFSET64 +# define OFFSET_T __off64_t +#else +# define OFFSET_T __off_t +#endif /*__USE_FILE_OFFSET64*/ +/*----------------------------------------------------------------------------*/ +/*The size of a chunk of a string (for a small optimization in checking + the property)*/ +#define STRING_CHUNK 256 +/*----------------------------------------------------------------------------*/ + +/*----------------------------------------------------------------------------*/ +/*The user-defined node for libnetfs*/ +struct netnode + { + /*the reference to the corresponding light node*/ + lnode_t * lnode; + + /*the flags associated with this node (might be not required)*/ + int flags; + + /*a port to the underlying filesystem*/ + file_t port; + + /*the neighbouring entries in the cache*/ + node_t * ncache_prev, * ncache_next; + };/*struct netnode*/ +/*----------------------------------------------------------------------------*/ +typedef struct netnode netnode_t; +/*----------------------------------------------------------------------------*/ +/*A list element containing directory entry*/ +struct node_dirent + { + /*the directory entry*/ + struct dirent * dirent; + + /*the next element*/ + struct node_dirent * next; + };/*struct node_dirent*/ +/*----------------------------------------------------------------------------*/ +typedef struct node_dirent node_dirent_t; +/*----------------------------------------------------------------------------*/ + +/*----------------------------------------------------------------------------*/ +/*--------Global Variables----------------------------------------------------*/ +/*The lock protecting the underlying filesystem*/ +extern struct mutex ulfs_lock; +/*----------------------------------------------------------------------------*/ + +/*----------------------------------------------------------------------------*/ +/*--------Functions-----------------------------------------------------------*/ +/*Derives a new node from `lnode` and adds a reference to `lnode`*/ +error_t +node_create + ( + lnode_t * lnode, + node_t ** node /*store the result here*/ + ); +/*----------------------------------------------------------------------------*/ +/*Destroys the specified node and removes a light reference from the + associated light node*/ +void +node_destroy + ( + node_t * np + ); +/*----------------------------------------------------------------------------*/ +/*Creates the root node and the corresponding lnode*/ +error_t +node_create_root + ( + node_t ** root_node /*store the result here*/ + ); +/*----------------------------------------------------------------------------*/ +/*Initializes the port to the underlying filesystem for the root node*/ +error_t +node_init_root + ( + node_t * node /*the root node*/ + ); +/*----------------------------------------------------------------------------*/ +/*Frees a list of dirents*/ +void +node_entries_free + ( + node_dirent_t * dirents /*free this*/ + ); +/*----------------------------------------------------------------------------*/ +/*Reads the directory entries from `node`, which must be locked*/ +error_t +node_entries_get + ( + node_t * node, + node_dirent_t ** dirents /*store the result here*/ + ); +/*----------------------------------------------------------------------------*/ +/*Makes sure that all ports to the underlying filesystem of `node` are up to + date*/ +error_t +node_update + ( + node_t * node + ); +/*----------------------------------------------------------------------------*/ +/*Computes the size of the given directory*/ +error_t +node_get_size + ( + node_t * dir, + OFFSET_T * off + ); +/*----------------------------------------------------------------------------*/ +/*Remove the file called `name` under `dir`*/ +error_t +node_unlink_file + ( + node_t * dir, + char * name + ); +/*----------------------------------------------------------------------------*/ +#endif /*__NODE_H__*/ diff --git a/netfs-sample/options.c b/netfs-sample/options.c new file mode 100644 index 00000000..c39d3f2b --- /dev/null +++ b/netfs-sample/options.c @@ -0,0 +1,255 @@ +/*----------------------------------------------------------------------------*/ +/*options.h*/ +/*----------------------------------------------------------------------------*/ +/*Definitions for parsing the command line switches*/ +/*----------------------------------------------------------------------------*/ +/*Based on the code of unionfs translator.*/ +/*----------------------------------------------------------------------------*/ +/*Copyright (C) 2001, 2002, 2005 Free Software Foundation, Inc. + Written by Sergiu Ivanov <unlimitedscolobb@gmail.com>. + + This program is free software; you can redistribute it and/or + modify it under the terms of the GNU General Public License as + published by the Free Software Foundation; either version 2 of the + License, or * (at your option) any later version. + + This program is distributed in the hope that it will be useful, but + WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 + USA.*/ +/*----------------------------------------------------------------------------*/ + +/*----------------------------------------------------------------------------*/ +#define _GNU_SOURCE 1 +/*----------------------------------------------------------------------------*/ +#include <argp.h> +#include <error.h> +/*----------------------------------------------------------------------------*/ +#include "debug.h" +#include "options.h" +#include "ncache.h" +#include "node.h" +/*----------------------------------------------------------------------------*/ + +/*----------------------------------------------------------------------------*/ +/*--------Macros--------------------------------------------------------------*/ +/*Short documentation for argp*/ +#define ARGS_DOC "DIR" +#define DOC "Shows the contents of DIR filtered according to PROPERTY.\ + If DIR is not specified, ~/ is assumed." +/*----------------------------------------------------------------------------*/ + +/*----------------------------------------------------------------------------*/ +/*--------Forward Declarations------------------------------------------------*/ +/*Argp parser function for the common options*/ +static +error_t +argp_parse_common_options + ( + int key, + char * arg, + struct argp_state * state + ); +/*----------------------------------------------------------------------------*/ +/*Argp parser function for the startup options*/ +static +error_t +argp_parse_startup_options + ( + int key, + char * arg, + struct argp_state * state + ); +/*----------------------------------------------------------------------------*/ + +/*----------------------------------------------------------------------------*/ +/*--------Global Variables----------------------------------------------------*/ +/*This variable is set to a non-zero value after the parsing of starup options + is finished*/ +/*Whenever the argument parser is later called to modify the + options of filterfs the root node will be initialized accordingly directly + by the parser*/ +static int parsing_startup_options_finished; +/*----------------------------------------------------------------------------*/ +/*Argp options common to both the runtime and the startup parser*/ +static const struct argp_option argp_common_options[] = + { + {OPT_LONG_CACHE_SIZE, OPT_CACHE_SIZE, "SIZE", 0, + "The maximal number of nodes in the node cache"}, + {OPT_LONG_PROPERTY, OPT_PROPERTY, "PROPERTY", 0, + "The command which will act as a filter"} + }; +/*----------------------------------------------------------------------------*/ +/*Argp options only meaningful for startupp parsing*/ +static const struct argp_option argp_startup_options[] = + { + {0} + }; +/*----------------------------------------------------------------------------*/ +/*Argp parser for only the common options*/ +static const struct argp argp_parser_common_options = + {argp_common_options, argp_parse_common_options, 0, 0, 0}; +/*----------------------------------------------------------------------------*/ +/*Argp parser for only the startup options*/ +static const struct argp argp_parser_startup_options = + {argp_startup_options, argp_parse_startup_options, 0, 0, 0}; +/*----------------------------------------------------------------------------*/ +/*The list of children parsers for runtime arguments*/ +static const struct argp_child argp_children_runtime[] = + { + {&argp_parser_common_options}, + {&netfs_std_runtime_argp}, + {0} + }; +/*----------------------------------------------------------------------------*/ +/*The list of children parsers for startup arguments*/ +static const struct argp_child argp_children_startup[] = + { + {&argp_parser_startup_options}, + {&argp_parser_common_options}, + {&netfs_std_startup_argp}, + {0} + }; +/*----------------------------------------------------------------------------*/ +/*The version of the server for argp*/ +const char * argp_program_version = "0.0"; +/*----------------------------------------------------------------------------*/ +/*The arpg parser for runtime arguments*/ +struct argp argp_runtime = + {0, 0, 0, 0, argp_children_runtime}; +/*----------------------------------------------------------------------------*/ +/*The argp parser for startup arguments*/ +struct argp argp_startup = + {0, 0, ARGS_DOC, DOC, argp_children_startup}; +/*----------------------------------------------------------------------------*/ +/*The filtering command*/ +char * property = NULL; +/*----------------------------------------------------------------------------*/ +/*The directory to filter*/ +char * dir = NULL; +/*----------------------------------------------------------------------------*/ + +/*----------------------------------------------------------------------------*/ +/*--------Functions-----------------------------------------------------------*/ +/*Argp parser function for the common options*/ +static +error_t +argp_parse_common_options + ( + int key, + char * arg, + struct argp_state * state + ) + { + error_t err = 0; + + /*Go through the possible options*/ + switch(key) + { + case OPT_CACHE_SIZE: + { + /*store the new cache-size*/ + ncache_size = strtol(arg, NULL, 10); + + break; + } + case OPT_PROPERTY: + { + /*try to duplicate the filtering command*/ + property = strdup(arg); + if(!property) + error(EXIT_FAILURE, ENOMEM, "Could not strdup the property"); + + break; + } + case ARGP_KEY_ARG: /*the directory to filter*/ + { + /*try to duplicate the directory name*/ + dir = strdup(arg); + if(!dir) + error(EXIT_FAILURE, ENOMEM, "argp_parse_common_options: " + "Could not strdup the directory"); + + /*fill all trailing spaces with 0*/ + int i = strlen(dir) - 1; + /*for(i = strlen(dir) - 1; (i >= 0) && (dir[i] == ' '); dir[i--] = 0);*/ + /*the original filename may contain spaces*/ + + /*If the last non blank symbol is a '/' and it's not the only one*/ + if((dir[i] == '/') && (i != 0)) + /*put 0 instead*/ + dir[i] = 0; + + LOG_MSG("argp_parse_common_options: Filtering the directory %s.", dir); + + break; + } + case ARGP_KEY_END: + { + /*If parsing of startup options has not finished*/ + if(!parsing_startup_options_finished) + { + /*reset the cache*/ + ncache_reset(); + + /*If the directory has not been specified*/ + if(!dir) + { + /*assume the directory to be the home directory*/ + ; + + /*FIXME: The default directory is /var/tmp*/ + dir = "/var/tmp"; + } + + /*set the flag that the startup options have already been parsed*/ + parsing_startup_options_finished = 1; + } + else + { +/*TODO: Take care of runtime calls modifying the property*/ + } + } + /*If the option could not be recognized*/ + default: + { + /*set the error code*/ + err = ARGP_ERR_UNKNOWN; + } + } + + /*Return the result*/ + return err; + }/*argp_parse_common_options*/ +/*----------------------------------------------------------------------------*/ +/*Argp parser function for the startup options*/ +static +error_t +argp_parse_startup_options + ( + int key, + char * arg, + struct argp_state * state + ) + { + /*Do nothing in a beautiful way*/ + error_t err = 0; + + switch(key) + { + default: + { + err = ARGP_ERR_UNKNOWN; + + break; + } + } + + return err; + }/*argp_parse_startup_options*/ +/*----------------------------------------------------------------------------*/ diff --git a/netfs-sample/options.h b/netfs-sample/options.h new file mode 100644 index 00000000..0f917bb0 --- /dev/null +++ b/netfs-sample/options.h @@ -0,0 +1,64 @@ +/*----------------------------------------------------------------------------*/ +/*options.h*/ +/*----------------------------------------------------------------------------*/ +/*Declarations for parsing the command line switches*/ +/*----------------------------------------------------------------------------*/ +/*Based on the code of unionfs translator.*/ +/*----------------------------------------------------------------------------*/ +/*Copyright (C) 2001, 2002, 2005 Free Software Foundation, Inc. + Written by Sergiu Ivanov <unlimitedscolobb@gmail.com>. + + This program is free software; you can redistribute it and/or + modify it under the terms of the GNU General Public License as + published by the Free Software Foundation; either version 2 of the + License, or * (at your option) any later version. + + This program is distributed in the hope that it will be useful, but + WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 + USA.*/ +/*----------------------------------------------------------------------------*/ +#ifndef __OPTIONS_H__ +#define __OPTIONS_H__ + +/*----------------------------------------------------------------------------*/ +/*--------Macros--------------------------------------------------------------*/ +/*The possible short options*/ +#define OPT_CACHE_SIZE 'c' +/*the property according to which filtering will be performed*/ +#define OPT_PROPERTY 'p' +/*----------------------------------------------------------------------------*/ +/*The corresponding long options*/ +#define OPT_LONG_CACHE_SIZE "cache-size" +#define OPT_LONG_PROPERTY "property" +/*----------------------------------------------------------------------------*/ +/*Makes a long option out of option name*/ +#define OPT_LONG(o) "--"o +/*----------------------------------------------------------------------------*/ +/*The substring of the property which shall be replaced by the filename*/ +#define PROPERTY_PARAM "{}" +/*----------------------------------------------------------------------------*/ + +/*----------------------------------------------------------------------------*/ +/*--------Global Variables----------------------------------------------------*/ +/*The argp parser for startup arguments*/ +extern struct argp argp_startup; +/*----------------------------------------------------------------------------*/ +/*The argp parser for rutime arguments*/ +extern struct argp argp_runtime; +/*----------------------------------------------------------------------------*/ +/*The number of nodes in cache (see ncache.{c,h})*/ +extern int ncache_size; +/*----------------------------------------------------------------------------*/ +/*The filtering command*/ +extern char * property; +/*----------------------------------------------------------------------------*/ +/*The directory to filter*/ +extern char * dir; +/*----------------------------------------------------------------------------*/ +#endif /*__OPTIONS_H__*/ |
