Signed-off-by: Victor Westerhuis <vic...@westerhu.is> --- debuginfod/debuginfod.cxx | 74 ++++++++++++++++++++++++--------------- 1 file changed, 46 insertions(+), 28 deletions(-)
diff --git a/debuginfod/debuginfod.cxx b/debuginfod/debuginfod.cxx index 9542c5e2..35b5fc18 100644 --- a/debuginfod/debuginfod.cxx +++ b/debuginfod/debuginfod.cxx @@ -120,6 +120,24 @@ using namespace std; #endif +#ifdef ENABLE_SYSTEMD +#define report_error(status, errnum, format, ...) \ + do \ + { \ + int s = (status), e = (errnum); \ + if (s != 0 && e != 0) \ + { \ + (void) sd_notifyf (false, "ERRNO=%d", e); \ + (void) sd_notifyf (false, "STATUS=" format, ##__VA_ARGS__); \ + } \ + error (s, e, format, ##__VA_ARGS__); \ + } \ + while (false) +#else +#define report_error(...) error(__VA_ARGS__) +#endif + + inline bool string_endswith(const string& haystack, const string& needle) { @@ -3316,10 +3334,10 @@ main (int argc, char *argv[]) #endif int rc = regcomp (& file_include_regex, ".*", REG_EXTENDED|REG_NOSUB); // match everything if (rc != 0) - error (EXIT_FAILURE, 0, "regcomp failure: %d", rc); + report_error (EXIT_FAILURE, 0, "regcomp failure: %d", rc); rc = regcomp (& file_exclude_regex, "^$", REG_EXTENDED|REG_NOSUB); // match nothing if (rc != 0) - error (EXIT_FAILURE, 0, "regcomp failure: %d", rc); + report_error (EXIT_FAILURE, 0, "regcomp failure: %d", rc); // default parameters for fdcache are computed from system stats struct statfs sfs; @@ -3337,8 +3355,8 @@ main (int argc, char *argv[]) argp_program_version_hook = print_version; // this works (void) argp_parse (&argp, argc, argv, ARGP_IN_ORDER, &remaining, NULL); if (remaining != argc) - error (EXIT_FAILURE, 0, - "unexpected argument: %s", argv[remaining]); + report_error (EXIT_FAILURE, 0, + "unexpected argument: %s", argv[remaining]); if (scan_archives.size()==0 && !scan_files && source_paths.size()>0) obatched(clog) << "warning: without -F -R -U -Z, ignoring PATHs" << endl; @@ -3362,13 +3380,13 @@ main (int argc, char *argv[]) if (rc == SQLITE_CORRUPT) { (void) unlink (db_path.c_str()); - error (EXIT_FAILURE, 0, - "cannot open %s, deleted database: %s", db_path.c_str(), sqlite3_errmsg(db)); + report_error (EXIT_FAILURE, 0, + "cannot open %s, deleted database: %s", db_path.c_str(), sqlite3_errmsg(db)); } else if (rc) { - error (EXIT_FAILURE, 0, - "cannot open %s, consider deleting database: %s", db_path.c_str(), sqlite3_errmsg(db)); + report_error (EXIT_FAILURE, 0, + "cannot open %s, consider deleting database: %s", db_path.c_str(), sqlite3_errmsg(db)); } // open the readonly query variant @@ -3381,8 +3399,8 @@ main (int argc, char *argv[]) NULL); if (rc) { - error (EXIT_FAILURE, 0, - "cannot open %s, consider deleting database: %s", db_path.c_str(), sqlite3_errmsg(dbq)); + report_error (EXIT_FAILURE, 0, + "cannot open %s, consider deleting database: %s", db_path.c_str(), sqlite3_errmsg(dbq)); } @@ -3393,16 +3411,16 @@ main (int argc, char *argv[]) rc = sqlite3_create_function(dbq, "sharedprefix", 2, SQLITE_UTF8, NULL, & sqlite3_sharedprefix_fn, NULL, NULL); if (rc != SQLITE_OK) - error (EXIT_FAILURE, 0, - "cannot create sharedprefix function: %s", sqlite3_errmsg(dbq)); + report_error (EXIT_FAILURE, 0, + "cannot create sharedprefix function: %s", sqlite3_errmsg(dbq)); if (verbose > 3) obatched(clog) << "ddl: " << DEBUGINFOD_SQLITE_DDL << endl; rc = sqlite3_exec (db, DEBUGINFOD_SQLITE_DDL, NULL, NULL, NULL); if (rc != SQLITE_OK) { - error (EXIT_FAILURE, 0, - "cannot run database schema ddl: %s", sqlite3_errmsg(db)); + report_error (EXIT_FAILURE, 0, + "cannot run database schema ddl: %s", sqlite3_errmsg(db)); } vector<MHD_Daemon *> daemons; @@ -3413,7 +3431,7 @@ main (int argc, char *argv[]) if (fds <= 0) { close_databases (); - error (EXIT_FAILURE, -fds, "cannot get fds from systemd"); + report_error (EXIT_FAILURE, -fds, "cannot get fds from systemd"); } for (int i = 0; i < fds; ++i) @@ -3424,13 +3442,13 @@ main (int argc, char *argv[]) if (rc < 0) { close_databases (); - error (EXIT_FAILURE, -rc, "unable to determine fd type"); + report_error (EXIT_FAILURE, -rc, "unable to determine fd type"); } else if (rc == 0) { close_databases (); - error (EXIT_FAILURE, 0, - "fd %d is not of the correct socket type", fd); + report_error (EXIT_FAILURE, 0, + "fd %d is not of the correct socket type", fd); } MHD_Daemon *d = MHD_start_daemon (MHD_USE_THREAD_PER_CONNECTION @@ -3450,8 +3468,8 @@ main (int argc, char *argv[]) if (d == NULL) { close_databases (); - error (EXIT_FAILURE, 0, - "cannot start http server on fd %d", fd); + report_error (EXIT_FAILURE, 0, + "cannot start http server on fd %d", fd); } obatched(clog) << "started http server on fd " << fd << endl; @@ -3491,7 +3509,7 @@ main (int argc, char *argv[]) if (d4 == NULL && d6 == NULL) // neither ipv4 nor ipv6? boo { close_databases (); - error (EXIT_FAILURE, 0, "cannot start http server at port %d", http_port); + report_error (EXIT_FAILURE, 0, "cannot start http server at port %d", http_port); } obatched(clog) << "started http server on " @@ -3531,8 +3549,8 @@ main (int argc, char *argv[]) obatched(clog) << "extra ddl:\n" << i << endl; rc = sqlite3_exec (db, i.c_str(), NULL, NULL, NULL); if (rc != SQLITE_OK && rc != SQLITE_DONE && rc != SQLITE_ROW) - error (0, 0, - "warning: cannot run database extra ddl %s: %s", i.c_str(), sqlite3_errmsg(db)); + report_error (0, 0, + "warning: cannot run database extra ddl %s: %s", i.c_str(), sqlite3_errmsg(db)); } if (maxigroom) @@ -3563,7 +3581,7 @@ main (int argc, char *argv[]) pthread_t pt; rc = pthread_create (& pt, NULL, thread_main_groom, NULL); if (rc) - error (EXIT_FAILURE, rc, "cannot spawn thread to groom database\n"); + report_error (EXIT_FAILURE, rc, "cannot spawn thread to groom database\n"); else all_threads.push_back(pt); @@ -3571,13 +3589,13 @@ main (int argc, char *argv[]) { rc = pthread_create (& pt, NULL, thread_main_fts_source_paths, NULL); if (rc) - error (EXIT_FAILURE, rc, "cannot spawn thread to traverse source paths\n"); + report_error (EXIT_FAILURE, rc, "cannot spawn thread to traverse source paths\n"); all_threads.push_back(pt); for (unsigned i=0; i<concurrency; i++) { rc = pthread_create (& pt, NULL, thread_main_scanner, NULL); if (rc) - error (EXIT_FAILURE, rc, "cannot spawn thread to scan source files / archives\n"); + report_error (EXIT_FAILURE, rc, "cannot spawn thread to scan source files / archives\n"); all_threads.push_back(pt); } } @@ -3610,8 +3628,8 @@ main (int argc, char *argv[]) rc = sqlite3_exec (db, DEBUGINFOD_SQLITE_CLEANUP_DDL, NULL, NULL, NULL); if (rc != SQLITE_OK) { - error (0, 0, - "warning: cannot run database cleanup ddl: %s", sqlite3_errmsg(db)); + report_error (0, 0, + "warning: cannot run database cleanup ddl: %s", sqlite3_errmsg(db)); } // NB: no problem with unconditional free here - an earlier failed regcomp would exit program -- 2.30.1