12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667openHxdmoduleUnix_scheduler=Make(structtype+'at='aend)typeerror=Seekletunix={bind=(funxf->f(Unix_scheduler.prjx));return=Unix_scheduler.inj}letlseek_in_file=letlseekicposmode=letmode=matchmodewith|`CUR->Unix.SEEK_CUR|`END->Unix.SEEK_END|`SET->Unix.SEEK_SETinmatchUnix.lseek(Unix.descr_of_in_channelic)posmodewith|res->Unix_scheduler.inj(Okres)|exception_exn->Unix_scheduler.inj(ErrorSeek)in{lseek}letdrainfdmax=lettmp=Bytes.create0x1000inletrecgocursor=letlen=min0x1000(max-cursor)inletres=Unix.readfdtmp0leninifres=0thenraiseEnd_of_file;ifcursor+res<maxthengo(cursor+res)ingo0letlseek_in_stdin=letlseekicposmode=(* XXX(dinosaure): we must must know where we are in [stdin]. *)letcur=tryUnix.lseekUnix.stdin0SEEK_CURwith_exn->0inmatchmodewith|`CURwhenpos>=0->(trydrain(Unix.descr_of_in_channelic)pos;Unix_scheduler.inj(Ok(cur+pos))withEnd_of_file->Unix_scheduler.inj(ErrorSeek))|`SETwhenpos>=0&&cur=0->(trydrain(Unix.descr_of_in_channelic)pos;Unix_scheduler.inj(Ok(cur+pos))withEnd_of_file->Unix_scheduler.inj(ErrorSeek))|`CURwhenpos<0->letpos=Unix.lseekUnix.stdinposSEEK_CURinUnix_scheduler.inj(Okpos)|`SET->letpos=Unix.lseekUnix.stdinposSEEK_SETinUnix_scheduler.inj(Okpos)|_->Unix_scheduler.inj(ErrorSeek)in{lseek}letrecvicbuffer~off~len=letlen=inputicbufferoffleninUnix_scheduler.inj(Oklen)letsendocbuffer~off~len=outputoc(Bytes.unsafe_of_stringbuffer)offlen;Unix_scheduler.inj(Oklen)letgenerateconfigurationicocseekppf=letlseek=ific==stdinthenlseek_in_stdinelselseek_in_fileinletres=generateconfigurationunixrecvsendicoclseekseekppfinmatchUnix_scheduler.prjreswith|Ok()->Ok()|ErrorSeek->Error(`Msg"sorry cannot seek")