123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081open!ImportmoduleOpen_option=structtypet=(* THESE MUST STAY IN THE SAME ORDER AS IN syslog_stubs.c!!! *)|PID|CONS|ODELAY|NDELAY|NOWAIT|PERROR[@@derivingsexp]externalto_int:t->int="core_syslog_open_option_to_int"letcollect_maskit=to_inttloriletmaskts=List.fold~f:collect_mask~init:0tsendmoduleFacility=structmoduleT=structtypet=(* THESE MUST STAY IN THE SAME ORDER AS IN syslog_stubs.c!!! *)|KERN|USER|MAIL|DAEMON|AUTH|SYSLOG|LPR|NEWS|UUCP|CRON|AUTHPRIV|FTP|LOCAL0|LOCAL1|LOCAL2|LOCAL3|LOCAL4|LOCAL5|LOCAL6|LOCAL7[@@derivingsexp]externalto_int:t->int="core_syslog_facility_to_int"endincludeTincludeSexpable.To_stringable(T)let%test_unit_=[%test_result:string]~expect:"KERN"(to_stringKERN)let%test_unit_=[%test_result:t]~expect:LOCAL7(of_string"LOCAL7")endmoduleLevel=structmoduleT=structtypet=(* THESE MUST STAY IN THE SAME ORDER AS IN syslog_stubs.c!!! *)|EMERG|ALERT|CRIT|ERR|WARNING|NOTICE|INFO|DEBUG[@@derivingsexp,enumerate,compare]letcompareab=compareba(* listed in descending order *)let%test_unit_=[%test_result:int]~expect:1(compareEMERGDEBUG)externalto_int:t->int="core_syslog_level_to_int"letcollect_maskit=to_inttloriletmaskts=List.fold~f:collect_mask~init:0tsendincludeTincludeSexpable.To_stringable(T)let%test_unit_=[%test_result:string]~expect:"EMERG"(to_stringEMERG)let%test_unit_=[%test_result:t]~expect:DEBUG(of_string"DEBUG")endexternalcore_syslog_openlog:stringoption->int->int->unit="core_syslog_openlog"externalcore_syslog_syslog:int->string->unit="core_syslog_syslog"externalcore_syslog_closelog:unit->unit="core_syslog_closelog"[@@noalloc]externalcore_syslog_setlogmask:int->unit="core_syslog_setlogmask"[@@noalloc]letopenlog?id?(options=[])?(facility=Facility.USER)()=core_syslog_openlogid(Open_option.maskoptions)(Facility.to_intfacility)letsyslog?(facility=Facility.USER)?(level=Level.INFO)message=core_syslog_syslog(Level.to_intlevellorFacility.to_intfacility)messageletsyslogf?facility?levelformat=ksprintf(funmessage->syslog?facility?levelmessage)formatletlogmask_range?(to_level=Level.EMERG)from_level=List.foldLevel.all~init:0~f:(funlogmasklevel->ifLevel.comparefrom_levellevel<1&&Level.comparelevelto_level<1thenLevel.to_intlevellorlogmaskelselogmask)letsetlogmask?(allowed_levels=[])?(from_level=Level.DEBUG)?to_level()=core_syslog_setlogmask(Level.maskallowed_levelslorlogmask_range?to_levelfrom_level)letcloselog=core_syslog_closelog