Mercurial > hg > Applications > mh
diff support/bboards/mmdfII/bboards/qu2bb_send.c @ 0:bce86c4163a3
Initial revision
author | kono |
---|---|
date | Mon, 18 Apr 2005 23:46:02 +0900 |
parents | |
children |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/support/bboards/mmdfII/bboards/qu2bb_send.c Mon Apr 18 23:46:02 2005 +0900 @@ -0,0 +1,157 @@ +#ifndef POP +/* qu2bb_send.c - manager for qu --> bb */ +#else POP +/* qu2po_send.c - manager for qu --> po */ +#endif POP + + +#include "util.h" +#include "mmdf.h" +#include "phs.h" +#include "ch.h" + +/* */ + +extern LLog *logptr; +extern char *supportaddr; + +struct rp_construct rp_hend = { /* end of host list */ + RP_NOOP, + 'e', 'n', 'd', ' ', 'o', 'f', ' ', 'h', 'o', 's', 't', ' ', + 'i', 'g', 'n', 'o', 'r', 'e', 'd', + NULL +}; + +struct rp_construct rp_aend = { /* end of address list */ + RP_OK, +#ifndef POP + 'b', 'b', 'o', 'a', 'r', 'd', 's', ' ', 'e', 'n', 'd', ' ', +#else POP + 'p', 'o', 'p', ' ', 'e', 'n', 'd', ' ', +#endif POP + 'o', 'f', ' ', 'a', 'd', 'd', 'r', ' ', 'l', 'i', 's', 't', + NULL +}; + +struct rp_construct rp_badr = { /* no such bboard */ + RP_USER, + 'u', 'n', 'k', 'n', 'o', 'w', 'n', ' ', +#ifndef POP + 'b', 'b', 'o', 'a', 'r', 'd', +#else POP + 'p', 'o', 'p', ' ', 's', 'u', 'b', 's', 'c', 'r', 'i', 'b', 'e', 'r', +#endif POP + NULL +}; + +struct rp_construct rp_err = { /* error, retry later */ + RP_AGN, + 'u', 'n', 'k', 'n', 'o', 'w', 'n', ' ', 'e', 'r', 'r', 'o', 'r', + NULL +}; + +/* */ + +qu2bb_send (chanptr) +Chan *chanptr; +{ + short result; + char info[LINESIZE], + sender[LINESIZE]; + +#ifdef DEBUG + ll_log (logptr, LLOGBTR, "qu2bb_send()"); +#endif + + if (rp_isbad (result = qu_pkinit ())) + return result; + if (rp_isbad (result = bb_sbinit ())) + return result; + + while (rp_gval ((result = + qu_rinit (info, sender, chanptr -> ch_apout))) == RP_OK) { +#ifdef DEBUG + ll_log (logptr, LLOGGEN, "info=%s sender=%s", info, sender); +#endif + if (rp_isbad (result = bb_winit (info, sender))) + return result; + if (rp_isbad (result = qu2bb_each (sender))) + return result; + qu_rend(); + } + qu_rend(); + + if (rp_gval (result) != RP_DONE) { + ll_log (logptr, LLOGTMP, "not DONE [%s]", rp_valstr (result)); + return RP_RPLY; + } + + qu_pkend (); + bb_sbend (); + + return result; +} + +/* */ +LOCFUN +qu2bb_each (sender) +char *sender; +{ + short result; + char adr[LINESIZE], + host[LINESIZE]; + RP_Buf replyval; + +#ifdef DEBUG + ll_log (logptr, LLOGBTR, "qu2bb_each(sender='%s')", sender); +#endif + + FOREVER { /* loop through the addresses */ + if (rp_isbad (result = qu_radr (host, adr))) + return result; +#ifdef RP_HOK + if (rp_gval (result) == RP_HOK) {/* no-op the sub-list indication */ + qu_wrply ((struct rp_bufstruct *) &rp_hend, rp_conlen (rp_hend)); + continue; + } +#endif RP_HOK + if (rp_gval (result) == RP_DONE) { + qu_wrply ((RP_Buf *) &rp_aend, rp_conlen (rp_aend)); + return RP_OK; + } + + switch (replyval.rp_val = bb_wtadr (host, adr)) { + case RP_AOK: + case RP_OK: + switch (replyval.rp_val = bb_txtcpy ()) { + case RP_MOK: + replyval.rp_line[0] = NULL; + break; + default: + ll_log (logptr, LLOGFAT, "unknown error [%s]", + rp_valstr (replyval.rp_val)); + blt (&rp_err, (char *) &replyval, sizeof rp_err); + break; + } + break; + + case RP_USER: +#ifndef POP + ll_log (logptr, LLOGFAT, "unknown bboard '%s'", adr); +#else POP + ll_log (logptr, LLOGFAT, "unknown pop subscriber '%s'", adr); +#endif POP + blt (&rp_badr, (char *) &replyval, sizeof rp_badr); + break; + + default: + ll_log (logptr, LLOGFAT, "unknown error [%s]", + rp_valstr (replyval.rp_val)); + blt (&rp_err, (char *) &replyval, sizeof rp_err); + break; + } + + qu_wrply (&replyval, + (sizeof replyval.rp_val) + strlen (replyval.rp_line)); + } +}