// This file is part of BOINC. // http://boinc.berkeley.edu // Copyright (C) 2019 University of California // // BOINC is free software; you can redistribute it and/or modify it // under the terms of the GNU Lesser General Public License // as published by the Free Software Foundation, // either version 3 of the License, or (at your option) any later version. // // BOINC is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. // See the GNU Lesser General Public License for more details. // // You should have received a copy of the GNU Lesser General Public License // along with BOINC. If not, see . // message_handler - check and validate new messages // [--d debug_level] // [--one_pass] // make one pass through table, then exit // // int handle_message(MSG_FROM_HOST&) // handle a message from the host // // return nonzero on error #include "config.h" #include #include #include #include "boinc_db.h" #include "util.h" #include "error_numbers.h" #include "str_replace.h" #include "str_util.h" #include "svn_version.h" #include "sched_config.h" #include "sched_util.h" #include "sched_msgs.h" 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; safe_strcpy(mth.xml, mfh.xml); retval = mth.insert(); if (retval) { printf("insert failed %s\n", boincerror(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 (1) { retval = mfh.enumerate(buf); if (retval) { if (retval != ERR_DB_NOT_FOUND) { log_messages.printf(MSG_DEBUG, "DB connection lost, exiting\n" ); exit(0); } break; } 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(MSG_CRITICAL, "boinc_db.open failed: %s\n", boinc_db.error_string() ); exit(1); } /* sprintf(buf, "where name='%s'", app_name); retval = app.lookup(buf); if (retval) { log_messages.printf(MSG_CRITICAL, "can't find app %s\n", app_name ); exit(1); } */ // coverity[loop_top] - infinite loop is intended while (1) { check_stop_daemons(); did_something = do_message_scan(); if (one_pass) break; if (!did_something) { daemon_sleep(5); } } return 0; } void usage(char *name) { fprintf(stderr, "check and validate new messages\n\n" "Usage: %s [OPTION]...\n\n" "Options:\n" " [ -d X ] Set debug level to X\n" " [ --one_pass ] make one pass through table, then exit\n" " [ -h --help ] show this help text.\n" " [ -v | --version ] show version information\n", name ); } int main(int argc, char** argv) { int i, retval; bool one_pass = false; check_stop_daemons(); for (i=1; i