123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174moduleList=structincludeListLabelsletconcat_mapl~f=mapl~f|>concatendinclude(StdLabels:moduletypeofstructincludeStdLabelsendwithmoduleList:=StdLabels.List)includeMoreLabelsmoduleSMap=structincludeMap.Make(String)letlookuptkey=matchfindtkeywith|x->Somex|exceptionNot_found->None;;endmoduleSSet=Set.Make(String)includeShexp_sexp.StdincludeShexp_bigstring_io.Stdexternalreraise:exn->_="%reraise"letprotectx~finally~fx=matchfxwith|y->finallyx;y|exceptione->finallyx;reraisee;;letsprintf=Printf.sprintflet(^/)=Filename.concatmoduleW:sigtype'atvalunit:unittvalint:inttvalstring:stringtvalprocess_status:Unix.process_statustvalfd:Unix.file_descrtvalstats:Unix.LargeFile.statstvaldir_handle:Unix.dir_handletvalpair:'at->'bt->('a*'b)tend=structtype'at=unitletunit=()letint=()letstring=()letprocess_status=()letfd=()letstats=()letdir_handle=()letpair__=()end(* We require a witness to be sure we apply the function fully *)letretry_eintr:'a.'aW.t->(unit->'a)->'a=let[@inlinealways]recloopfn=tryf()with|Unix.Unix_error(EINTR,_,_)whenn<1000->loopf(n+1)infun_f->loopf0;;letretry_eintr1wfx=retry_eintrw(fun()->fx)letretry_eintr2wfxy=retry_eintrw(fun()->fxy)letretry_eintr3wfxyz=retry_eintrw(fun()->fxyz)moduleUnix=structopenUnixtypenonrecfile_descr=file_descrtypenonrecstats=LargeFile.statstypenonrecaccess_permission=access_permissionexceptionUnix_error=Unix_errorletgetpid=getpidletenvironment=environmentletstdin=stdinletstdout=stdoutletstderr=stderrletsleepf=sleepfletclosex=retry_eintr1W.unitclosexletopenfilexyz=retry_eintr3W.fdopenfilexyzletreadlinkx=retry_eintr1W.stringreadlinkxletmkdirxy=retry_eintr2W.unitmkdirxyletchmodxy=retry_eintr2W.unitchmodxyletchownxyz=retry_eintr3W.unitchownxyzletunlinkx=retry_eintr1W.unitunlinkxletrmdirx=retry_eintr1W.unitrmdirxletmkfifoxy=retry_eintr2W.unitmkfifoxyletlinkxy=retry_eintr2W.unitlinkxyletsymlinkxy=retry_eintr2W.unitsymlinkxyletrenamexy=retry_eintr2W.unitrenamexyletstatx=retry_eintr1W.statsLargeFile.statxletlstatx=retry_eintr1W.statsLargeFile.lstatxletaccessxy=retry_eintr2W.unitaccessxyletreaddirx=retry_eintr1W.stringreaddirxletopendirx=retry_eintr1W.dir_handleopendirxletclosedirx=retry_eintr1W.unitclosedirxletlseekxyz=retry_eintr3W.intlseekxyzletwaitpidxy=retry_eintr2W.(pairintprocess_status)waitpidxyendmodulePosixat=structopenPosixatmoduleFd=FdmoduleOpen_flag=Open_flagmoduleAt_flag=At_flagmoduleAccess_permission=Access_permissionmoduleFile_kind=File_kindmoduleFile_perm=File_permmoduleStats=Statsletat_fdcwd=at_fdcwdlethas_mkfifoat=has_mkfifoatletopenat~dir~path~flags~perm=retry_eintrW.fd(fun()->openat~dir~path~flags~perm);;letfaccessat~dir~path~mode~flags=retry_eintrW.unit(fun()->faccessat~dir~path~mode~flags);;letfchmodat~dir~path~perm~flags=retry_eintrW.unit(fun()->fchmodat~dir~path~perm~flags);;letfchownat~dir~path~uid~gid~flags=retry_eintrW.unit(fun()->fchownat~dir~path~uid~gid~flags);;letmkdirat~dir~path~perm=retry_eintrW.unit(fun()->mkdirat~dir~path~perm)letunlinkat~dir~path~flags=retry_eintrW.unit(fun()->unlinkat~dir~path~flags);;letmkfifoat~dir~path~perm=retry_eintrW.unit(fun()->mkfifoat~dir~path~perm)letlinkat~olddir~oldpath~newdir~newpath~flags=retry_eintrW.unit(fun()->linkat~olddir~oldpath~newdir~newpath~flags);;letrenameat~olddir~oldpath~newdir~newpath=retry_eintrW.unit(fun()->renameat~olddir~oldpath~newdir~newpath);;letsymlinkat~oldpath~newdir~newpath=retry_eintrW.unit(fun()->symlinkat~oldpath~newdir~newpath);;letfstatat~dir~path~flags=retry_eintrW.stats(fun()->fstatat~dir~path~flags);;letreadlinkat~dir~path=retry_eintrW.string(fun()->readlinkat~dir~path)letfdopendirfd=retry_eintr1W.dir_handlefdopendirfdend