diff --git a/sched/message_handler.C b/sched/message_handler.C new file mode 100644 index 0000000000..eef3a8c46d --- /dev/null +++ b/sched/message_handler.C @@ -0,0 +1,154 @@ +// The contents of this file are subject to the BOINC Public License +// Version 1.0 (the "License"); you may not use this file except in +// compliance with the License. You may obtain a copy of the License at +// http://boinc.berkeley.edu/license_1.0.txt +// +// Software distributed under the License is distributed on an "AS IS" +// basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See the +// License for the specific language governing rights and limitations +// under the License. +// +// The Original Code is the Berkeley Open Infrastructure for Network Computing. +// +// The Initial Developer of the Original Code is the SETI@home project. +// Portions created by the SETI@home project are Copyright (C) 2002 +// University of California at Berkeley. All Rights Reserved. +// +// Contributor(s): +// + +// +// message_handler - check and validate new messages +// [-d debug_level] +// [-one_pass] // make one pass through table, then exit +// [-asynch] // fork, run in separate process +// +// int handle_message(MSG_FROM_HOST&) +// handle a message from the host +// +// return nonzero on error + +using namespace std; + +#include + +#include "boinc_db.h" +#include "util.h" +#include "sched_config.h" +#include "sched_util.h" +#include "sched_msgs.h" + +SCHED_CONFIG config; +char app_name[256]; + +extern int handle_message(MSG_FROM_HOST&); + +int handle_message(MSG_FROM_HOST& mfh) { + int retval; + + printf( + "got message \n%s\n", + mfh.xml + ); + DB_MSG_TO_HOST mth; + mth.clear(); + mth.create_time = time(0); + mth.hostid = mfh.hostid; + mth.handled = false; + strcpy(mth.xml, mfh.xml); + retval = mth.insert(); + if (retval) { + printf("insert failed %d\n", retval); + } + return 0; +} + +// make one pass through msgs_from_host with handled == 0 +// return true if there were any +// +bool do_message_scan() { + DB_MSG_FROM_HOST mfh; + char buf[256]; + bool found=false; + int retval; + + sprintf(buf, "where handled=0"); + while (!mfh.enumerate(buf)) { + retval = handle_message(mfh); + if (!retval) { + mfh.handled = true; + mfh.update(); + } + found = true; + } + return found; +} + +int main_loop(bool one_pass) { + int retval; + bool did_something; + // char buf[256]; + + retval = boinc_db.open(config.db_name, config.db_host, config.db_user, config.db_passwd); + if (retval) { + log_messages.printf(SCHED_MSG_LOG::CRITICAL, "boinc_db.open failed: %d\n", retval); + exit(1); + } +/* + sprintf(buf, "where name='%s'", app_name); + retval = app.lookup(buf); + if (retval) { + log_messages.printf(SCHED_MSG_LOG::CRITICAL, "can't find app %s\n", app.name); + exit(1); + } +*/ + while (1) { + check_stop_daemons(); + did_something = do_message_scan(); + if (one_pass) break; + if (!did_something) { + sleep(5); + } + } + return 0; +} + + +int main(int argc, char** argv) { + int i, retval; + bool asynch = false, one_pass = false; + + check_stop_daemons(); + + for (i=1; i