123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297openEio.StdopenTypestype_Effect.t+=|Await_readable:Unix.file_descr->unitEffect.t|Await_writable:Unix.file_descr->unitEffect.t|Get_monotonic_clock:Eio.Time.Mono.tyrEffect.t|Pipe:Switch.t->(source_tyr*sink_tyr)Effect.tletawait_readablefd=Effect.perform(Await_readablefd)letawait_writablefd=Effect.perform(Await_writablefd)letpipesw=letr,w=Effect.perform(Pipesw)inletr=(r:source_tyr:>[<source_ty]r)inletw=(w:sink_tyr:>[<sink_ty]r)inr,wmoduleRcfd=RcfdmoduleFork_action=Fork_actionmoduleThread_pool=Thread_poolexternaleio_readlinkat:Unix.file_descr->string->Cstruct.t->int="eio_unix_readlinkat"letread_link_unixfdpath=matchfdwith|None->Unix.readlinkpath|Somefd->letrecauxsize=letbuf=Cstruct.create_unsafesizeinletlen=eio_readlinkatfdpathbufiniflen<sizethenCstruct.to_string~lenbufelseaux(size*4)inaux1024letread_linkfdpath=Fd.use_exn_opt"readlink"fd(funfd->read_link_unixfdpath)externaleio_fchmodat:Unix.file_descr->string->int->int->unit="eio_unix_fchmodat"letchmod_unixfdpath~flags~mode=eio_fchmodatfdpathmodeflagsletchmodfdpath~flags~mode=Fd.use_exn"chmod"fd(funfd->chmod_unix~flags~modefdpath)externaleio_fchownat:Unix.file_descr->string->int64->int64->int->unit="eio_unix_fchownat"letchown_unix~flags~uid~gidfdpath=eio_fchownatfdpathuidgidflagsletchown~flags~uid~gidfdpath=Fd.use_exn"chown"fd(funfd->chown_unix~uid~gid~flagsfdpath)typesockaddr=[`TcpofEio.Net.Ipaddr.v4v6*int|`UdpofEio.Net.Ipaddr.v4v6*int]externaleio_getaddrinfo:string->string->(sockaddrlist,Eio.Net.Getaddrinfo_error.t)result="eio_unix_getaddrinfo"letgetaddrinfo~servicenode=matcheio_getaddrinfonodeservicewith|Okx->List.rev(x:>Eio.Net.Sockaddr.tlist)|Errore->raise@@Eio.Net.err@@Eio.Net.Address_lookup_failedemoduleSockopt=struct(* Keep in sync with [find_sockopt] C function. *)typet=(* bool *)|TCP_CORK|TCP_QUICKACK|IP_FREEBIND|IP_BIND_ADDRESS_NO_PORT(* int *)|TCP_KEEPIDLE|TCP_KEEPINTVL|TCP_KEEPCNT|TCP_USER_TIMEOUT|TCP_MAXSEG|TCP_DEFER_ACCEPT|TCP_SYNCNT|TCP_WINDOW_CLAMP|TCP_FASTOPEN|IP_LOCAL_PORT_RANGE|IP_MTU_DISCOVER|IP_TTL|IP_MTU(* int option *)|TCP_LINGER2(* string option *)|TCP_CONGESTIONendexternalsetsockopt_int:Unix.file_descr->Sockopt.t->int->unit="caml_eio_sockopt_int_set"externalgetsockopt_int:Unix.file_descr->Sockopt.t->int="caml_eio_sockopt_int_get"externalsetsockopt_string:Unix.file_descr->Sockopt.t->string->unit="caml_eio_sockopt_string_set"externalgetsockopt_string:Unix.file_descr->Sockopt.t->string="caml_eio_sockopt_string_get"leterr_run_sockfnx=tryfnxwith|Unix.Unix_error(code,name,arg)->raise(Err.vcodenamearg)|Not_found->raise(Eio.Net.errInvalid_option)letgetsockopt_intfdopt=Fd.use_exn"getsockopt_int"fd(funfd->err_run_sock(getsockopt_intfd)opt)letgetsockopt_stringfdopt=Fd.use_exn"getsockopt_string"fd(funfd->err_run_sock(getsockopt_stringfd)opt)letsetsockopt_intfdoptv=Fd.use_exn"setsockopt_int"fd(funfd->err_run_sock(setsockopt_intfdopt)v)letsetsockopt_stringfdoptv=Fd.use_exn"setsockopt_string"fd(funfd->err_run_sock(setsockopt_stringfdopt)v)letsetsockopt:typea.Fd.t->aEio.Net.Sockopt.t->a->unit=funfdoptv->letopenEio.Net.SockoptinletopenSockoptinmatchoptwith|TCP_CORK->setsockopt_intfdTCP_CORK(ifvthen1else0)|TCP_KEEPIDLE->ifv<0thenFmt.invalid_arg"TCP_KEEPIDLE must be non-negative, got %d"v;setsockopt_intfdTCP_KEEPIDLEv|TCP_KEEPINTVL->ifv<0thenFmt.invalid_arg"TCP_KEEPINTVL must be non-negative, got %d"v;setsockopt_intfdTCP_KEEPINTVLv|TCP_KEEPCNT->ifv<0thenFmt.invalid_arg"TCP_KEEPCNT must be non-negative, got %d"v;setsockopt_intfdTCP_KEEPCNTv|TCP_USER_TIMEOUT->ifv<0thenFmt.invalid_arg"TCP_USER_TIMEOUT must be non-negative, got %d"v;setsockopt_intfdTCP_USER_TIMEOUTv|TCP_MAXSEG->ifv<0thenFmt.invalid_arg"TCP_MAXSEG must be non-negative, got %d"v;setsockopt_intfdTCP_MAXSEGv|TCP_LINGER2->letv=matchvwith|None->0|Somenwhenn<0->Fmt.invalid_arg"TCP_LINGER2 must be non-negative, got %d"n|Somen->ninsetsockopt_intfdTCP_LINGER2v|TCP_DEFER_ACCEPT->ifv<0thenFmt.invalid_arg"TCP_DEFER_ACCEPT must be non-negative, got %d"v;setsockopt_intfdTCP_DEFER_ACCEPTv|TCP_CONGESTION->setsockopt_stringfdTCP_CONGESTIONv|TCP_SYNCNT->ifv<1||v>255thenFmt.invalid_arg"TCP_SYNCNT must be between 1 and 255, got %d"v;setsockopt_intfdTCP_SYNCNTv|TCP_WINDOW_CLAMP->ifv<0thenFmt.invalid_arg"TCP_WINDOW_CLAMP must be non-negative, got %d"v;setsockopt_intfdTCP_WINDOW_CLAMPv|TCP_QUICKACK->setsockopt_intfdTCP_QUICKACK(ifvthen1else0)|TCP_FASTOPEN->ifv<0thenFmt.invalid_arg"TCP_FASTOPEN queue length must be non-negative, got %d"v;setsockopt_intfdTCP_FASTOPENv|IP_FREEBIND->setsockopt_intfdIP_FREEBIND(ifvthen1else0)|IP_BIND_ADDRESS_NO_PORT->setsockopt_intfdIP_BIND_ADDRESS_NO_PORT(ifvthen1else0)|IP_LOCAL_PORT_RANGE->let(lower,upper)=viniflower<0||lower>65535thenFmt.invalid_arg"IP_LOCAL_PORT_RANGE lower bound must be 0-65535, got %d"lower;ifupper<0||upper>65535thenFmt.invalid_arg"IP_LOCAL_PORT_RANGE upper bound must be 0-65535, got %d"upper;iflower<>0&&upper<>0&&lower>upperthenFmt.invalid_arg"IP_LOCAL_PORT_RANGE lower bound (%d) must be <= upper bound (%d)"lowerupper;letcombined=(upperlsl16)lorlowerinsetsockopt_intfdIP_LOCAL_PORT_RANGEcombined|IP_TTL->ifv<1||v>255thenFmt.invalid_arg"IP_TTL must be between 1 and 255, got %d"v;setsockopt_intfdIP_TTLv|IP_MTU->invalid_arg"IP_MTU is a read-only socket option"|IP_MTU_DISCOVER->leti=matchvwith|`Dont->0|`Want->1|`Do->2|`Probe->3insetsockopt_intfdIP_MTU_DISCOVERi|_->Fd.use_exn"setsockopt"fd@@funfd->trymatchoptwith|Eio.Net.Sockopt.SO_DEBUG->Unix.setsockoptfdUnix.SO_DEBUGv|Eio.Net.Sockopt.SO_BROADCAST->Unix.setsockoptfdUnix.SO_BROADCASTv|Eio.Net.Sockopt.SO_REUSEADDR->Unix.setsockoptfdUnix.SO_REUSEADDRv|Eio.Net.Sockopt.SO_KEEPALIVE->Unix.setsockoptfdUnix.SO_KEEPALIVEv|Eio.Net.Sockopt.SO_DONTROUTE->Unix.setsockoptfdUnix.SO_DONTROUTEv|Eio.Net.Sockopt.SO_OOBINLINE->Unix.setsockoptfdUnix.SO_OOBINLINEv|Eio.Net.Sockopt.TCP_NODELAY->Unix.setsockoptfdUnix.TCP_NODELAYv|Eio.Net.Sockopt.IPV6_ONLY->Unix.setsockoptfdUnix.IPV6_ONLYv|Eio.Net.Sockopt.SO_REUSEPORT->Unix.setsockoptfdUnix.SO_REUSEPORTv|Eio.Net.Sockopt.SO_SNDBUF->Unix.setsockopt_intfdUnix.SO_SNDBUFv|Eio.Net.Sockopt.SO_RCVBUF->Unix.setsockopt_intfdUnix.SO_RCVBUFv|Eio.Net.Sockopt.SO_RCVLOWAT->Unix.setsockopt_intfdUnix.SO_RCVLOWATv|Eio.Net.Sockopt.SO_SNDLOWAT->Unix.setsockopt_intfdUnix.SO_SNDLOWATv|Eio.Net.Sockopt.SO_LINGER->Unix.setsockopt_optintfdUnix.SO_LINGERv|Eio.Net.Sockopt.SO_RCVTIMEO->Unix.setsockopt_floatfdUnix.SO_RCVTIMEOv|Eio.Net.Sockopt.SO_SNDTIMEO->Unix.setsockopt_floatfdUnix.SO_SNDTIMEOv|Net.Sockopt_boolbo->Unix.setsockoptfdbov|Net.Sockopt_intbo->Unix.setsockopt_intfdbov|Net.Sockopt_optintbo->Unix.setsockopt_optintfdbov|Net.Sockopt_floatbo->Unix.setsockopt_floatfdbov|_->raise(Eio.Net.errInvalid_option)withUnix.Unix_error(code,name,arg)->raise(Err.vcodenamearg)letgetsockopt:typea.Fd.t->aEio.Net.Sockopt.t->a=funfdopt->letopenSockoptinletopenEio.Net.Sockoptinmatchoptwith|TCP_CORK->getsockopt_intfdTCP_CORK<>0|TCP_KEEPIDLE->getsockopt_intfdTCP_KEEPIDLE|TCP_KEEPINTVL->getsockopt_intfdTCP_KEEPINTVL|TCP_KEEPCNT->getsockopt_intfdTCP_KEEPCNT|TCP_USER_TIMEOUT->getsockopt_intfdTCP_USER_TIMEOUT|TCP_MAXSEG->getsockopt_intfdTCP_MAXSEG|TCP_LINGER2->letv=getsockopt_intfdTCP_LINGER2inifv<0thenNoneelseSomev|TCP_DEFER_ACCEPT->getsockopt_intfdTCP_DEFER_ACCEPT|TCP_CONGESTION->getsockopt_stringfdTCP_CONGESTION|TCP_SYNCNT->getsockopt_intfdTCP_SYNCNT|TCP_WINDOW_CLAMP->getsockopt_intfdTCP_WINDOW_CLAMP|TCP_QUICKACK->getsockopt_intfdTCP_QUICKACK<>0|TCP_FASTOPEN->getsockopt_intfdTCP_FASTOPEN|IP_FREEBIND->getsockopt_intfdIP_FREEBIND<>0|IP_BIND_ADDRESS_NO_PORT->getsockopt_intfdIP_BIND_ADDRESS_NO_PORT<>0|IP_LOCAL_PORT_RANGE->letcombined=getsockopt_intfdIP_LOCAL_PORT_RANGEinletlower=combinedland0xFFFFinletupper=(combinedlsr16)land0xFFFFin(lower,upper)|IP_TTL->getsockopt_intfdIP_TTL|IP_MTU->getsockopt_intfdIP_MTU|IP_MTU_DISCOVER->beginleti=getsockopt_intfdIP_MTU_DISCOVERinmatchiwith|0(* IP_PMTUDISC_DONT *)->`Dont|1(* IP_PMTUDISC_WANT *)->`Want|2(* IP_PMTUDISC_DO *)->`Do|3(* IP_PMTUDISC_PROBE *)->`Probe|i->Fmt.failwith"Unknown IP_MTU_DISCOVER value: %d"iend|_->Fd.use_exn"getsockopt"fd@@funfd:a->trymatchoptwith|Eio.Net.Sockopt.SO_DEBUG->Unix.getsockoptfdUnix.SO_DEBUG|Eio.Net.Sockopt.SO_BROADCAST->Unix.getsockoptfdUnix.SO_BROADCAST|Eio.Net.Sockopt.SO_REUSEADDR->Unix.getsockoptfdUnix.SO_REUSEADDR|Eio.Net.Sockopt.SO_KEEPALIVE->Unix.getsockoptfdUnix.SO_KEEPALIVE|Eio.Net.Sockopt.SO_DONTROUTE->Unix.getsockoptfdUnix.SO_DONTROUTE|Eio.Net.Sockopt.SO_OOBINLINE->Unix.getsockoptfdUnix.SO_OOBINLINE|Eio.Net.Sockopt.TCP_NODELAY->Unix.getsockoptfdUnix.TCP_NODELAY|Eio.Net.Sockopt.IPV6_ONLY->Unix.getsockoptfdUnix.IPV6_ONLY|Eio.Net.Sockopt.SO_REUSEPORT->Unix.getsockoptfdUnix.SO_REUSEPORT|Eio.Net.Sockopt.SO_SNDBUF->Unix.getsockopt_intfdUnix.SO_SNDBUF|Eio.Net.Sockopt.SO_RCVBUF->Unix.getsockopt_intfdUnix.SO_RCVBUF|Eio.Net.Sockopt.SO_RCVLOWAT->Unix.getsockopt_intfdUnix.SO_RCVLOWAT|Eio.Net.Sockopt.SO_SNDLOWAT->Unix.getsockopt_intfdUnix.SO_SNDLOWAT|Eio.Net.Sockopt.SO_LINGER->Unix.getsockopt_optintfdUnix.SO_LINGER|Eio.Net.Sockopt.SO_RCVTIMEO->Unix.getsockopt_floatfdUnix.SO_RCVTIMEO|Eio.Net.Sockopt.SO_SNDTIMEO->Unix.getsockopt_floatfdUnix.SO_SNDTIMEO|Net.Sockopt_boolbo->Unix.getsockoptfdbo|Net.Sockopt_intbo->Unix.getsockopt_intfdbo|Net.Sockopt_optintbo->Unix.getsockopt_optintfdbo|Net.Sockopt_floatbo->Unix.getsockopt_floatfdbo|_->raise(Eio.Net.errInvalid_option)withUnix.Unix_error(code,name,arg)->raise(Err.vcodenamearg)