/** *************************************************************************** * main() ;-) * */ int main(int argc, char * argv[]) { stats_main_start = get_current_time_millis(); int rv = 0; pthread_key_create(&thread_name, NULL); pthread_setspecific(thread_name, (char *)"[MAIN] "); pthread_key_create(&duplicate_path_buffer, NULL); rv = process_args(argc, argv); LOG(L_PROGRESS, "Log level: %s\n", log_level_name[log_level]); // If process_args returns non-zero it means we need to exit right away // with an exit code one less than the returned value. Need to exit via // the DONE section both to free any memory that may have been allocated // already and also to properly return (not exit) from main (see below). if (rv) { rv--; goto DONE; } // If bad --path values given, don't try to process them. Arguably one // could process the good ones (if any) but better to flag the path // error up front instead of spending time doing a partial scan. if (start_path_state == START_PATH_ERROR) { rv = 1; goto DONE; } LOG(L_INFO, "Claimed CPU cores: %d\n", cpu_cores()); max_open_files = get_file_limit() - 10; LOG(L_INFO, "Max open files: %d\n", max_open_files); signal(SIGUSR1, &handle_signal); signal(SIGUSR2, &handle_signal); switch (operation) { case COMMAND_scan: scan(); break; case COMMAND_refresh: operation_refresh(); break; case COMMAND_report: operation_report(); break; case COMMAND_uniques: operation_uniques(); break; case COMMAND_license: show_license(); break; case COMMAND_version: printf(DUPD_VERSION "\n"); break; case COMMAND_dups: operation_dups(); break; case COMMAND_file: operation_file(); break; case COMMAND_ls: operation_ls(); break; case COMMAND_rmsh: operation_shell_script(); break; case COMMAND_validate: rv = operation_validate(); break; case COMMAND_usage: show_usage(); break; case COMMAND_man: show_usage(); break; case COMMAND_help: show_help(); break; case COMMAND_testing: testing(); break; case COMMAND_hash: operation_hash_file(); break; case OPTGEN_NO_COMMAND: show_help(); rv = 1; break; default: // LCOV_EXCL_START printf("error: unknown operation [%d]\n", operation); rv = 1; } // LCOV_EXCL_STOP DONE: if (free_file_path) { free(file_path); } if (free_db_path) { free(db_path); } if (free_cache_db_path) { free(cache_db_path); } if (path_sep_string) { free(path_sep_string); } free_size_tree(); free_size_list(); free_path_block(); free_filecompare(); free_scanlist(); free_start_paths(); free_read_list(); free_dirtree(); free_path_buffer(); stats_time_total = get_current_time_millis() - stats_main_start; LOG(L_PROGRESS, "Total time: %ld ms\n", stats_time_total); if (stats_file != NULL) { save_stats(); } if (log_level >= 0) { if (operation == COMMAND_scan || operation == COMMAND_refresh || operation == COMMAND_license || operation == COMMAND_version || operation == COMMAND_validate || operation == COMMAND_usage || operation == COMMAND_man || operation == COMMAND_help) { if (!strcmp("dev", DUPD_VERSION + strlen(DUPD_VERSION) - 3)) { if (isatty(fileno(stdout))) { fprintf(stdout, "\nNote: This is a development version of dupd (" DUPD_VERSION ") (" GITHASH ")\n"); fprintf(stdout, "May contain known bugs or unstable work in progress!\n"); fprintf(stdout, "If stability is desired, use a release version of dupd.\n"); } } } } // Call return() instead of exit() just to make valgrind mark as // an error any reachable allocations. That makes them show up // when running the tests. return(rv); }
void proposal_create_operation::validate() const { FC_ASSERT( !proposed_ops.empty() ); for( const auto& op : proposed_ops ) operation_validate( op.op ); }
void transaction::validate() const { FC_ASSERT( operations.size() > 0, "A transaction must have at least one operation", ("trx",*this) ); for( const auto& op : operations ) operation_validate(op); }