/* * SIPB service monitor: news module * * Nickolai Zeldovich * February 2002 */ #include #include #include "sipbmon.h" static rxx full_line (".*\\n.*", "s"); static rxx news_greeting ("^200 .* \\(posting ok\\).[\\r\\n]*$"); static rxx news_group_resp ("^211 .* mit.test[\\r\\n]*$"); static bool check_news_gr_resp (struct sm_service *svc, str buf, bool eof) { if (eof) { service_down (svc, "unexpected EOF after GROUP"); return false; } if (news_group_resp.match (buf)) { service_up (svc); return false; } if (full_line.match (buf)) { service_down (svc, "unrecognized response to GROUP"); return false; } if (buf.len() > 1024) { service_down (svc, "GROUP response too long"); return false; } return true; } static void check_news_gr_sent (struct sm_service *svc) { svc_read (svc, wrap (&check_news_gr_resp, svc)); } static bool check_news_greet (struct sm_service *svc, str buf, bool eof) { if (eof) { service_down (svc, "unexpected EOF after connect"); return false; } if (news_greeting.match (buf)) { svc_write (svc, "GROUP mit.test\r\n", wrap (&check_news_gr_sent, svc)); return false; } if (full_line.match (buf)) { service_down (svc, "unexpected greeting after connect"); return false; } if (buf.len() > 1024) { service_down (svc, "too much data in greeting"); return false; } return true; } void check_news (struct sm_service *svc) { svc_read (svc, wrap (&check_news_greet, svc)); }