/** * \brief Print on standard out the -ls arguments: number of i-nodes,blocks, permissions, number of links, owner, group, last modification time and directory name. symlinks. * * \param file_info with all file attributes read out from operating system. * * \return void **/ static void combine_ls(const StatType* file_info) { int written = 0; /* Print i-node */ written = fprintf(stdout, "%6lu", (unsigned long) file_info->st_ino); if (written < 0) { print_error(strerror(errno)); } /* Print number of blocks */ /* magic number divide by 2 depends on block size of file system. * The st_blocks member of the stat structure returns: * The total number of physical blocks of size 512 bytes actually allocated on disk. see also http://stackoverflow.com/questions/1346807/how-does-stat-command-calculate-the-blocks-of-a-file */ written = fprintf(stdout, "%5lu ", (unsigned long) file_info->st_blocks / 2); if (written < 0) { print_error(strerror(errno)); } print_file_permissions(file_info); /* Print number of hard links */ written = fprintf(stdout, "%2lu", (unsigned long) file_info->st_nlink); if (written < 0) { print_error(strerror(errno)); } print_user_group(file_info); /* Print file size */ written = fprintf(stdout, "%13lu ", (unsigned long) file_info->st_size); if (written < 0) { print_error(strerror(errno)); } print_file_change_time(file_info); }
/* * #error "This make CE" * #warning "Just warning message" * #include </dev/core> * #include </dev/zero> * #include </dev/random> * #include </etc/passwd> * #include <../../../etc/passwd> * egrep '^\s*#include\s*[<"][./].*[>"]' Main.cc */ void compile() { update_solution_status(oj_solution.cid, oj_solution.sid, OJ_COM, 0); char stdout_compiler[PATH_SIZE]; char stderr_compiler[PATH_SIZE]; snprintf(stdout_compiler, PATH_SIZE, "%s/stdout_compiler.txt", oj_solution.work_dir); snprintf(stderr_compiler, PATH_SIZE, "%s/stderr_compiler.txt", oj_solution.work_dir); pid_t compiler = fork(); // create a child process for compiler if (compiler < 0) { FM_LOG_FATAL("fork compiler failed: %s", strerror(errno)); exit(EXIT_FORK_COMPILER); } else if (compiler == 0) { // child process: run compiler log_add_info("compiler"); set_compile_limit(); stdout = freopen(stdout_compiler, "w", stdout); stderr = freopen(stderr_compiler, "w", stderr); if (stdout == nullptr || stderr == nullptr) { FM_LOG_FATAL("error freopen: stdout(%p), stderr(%p)", stdout, stderr); exit(EXIT_COMPILE_IO); } print_user_group(); print_word_dir(); switch (oj_solution.lang) { case LANG_C99: print_compiler(CP_C99); execvp(CP_C99[0], (char *const *) CP_C99); break; case LANG_C11: print_compiler(CP_C11); execvp(CP_C11[0], (char *const *) CP_C11); break; case LANG_CPP98: print_compiler(CP_CC98); execvp(CP_CC98[0], (char *const *) CP_CC98); break; case LANG_CPP11: print_compiler(CP_CC11); execvp(CP_CC11[0], (char *const *) CP_CC11); break; case LANG_CPP14: print_compiler(CP_CC14); execvp(CP_CC14[0], (char *const *) CP_CC14); break; case LANG_CPP17: print_compiler(CP_CC98); execvp(CP_CC98[0], (char *const *) CP_CC17); break; case LANG_PASCAL: print_compiler(CP_PAS); execvp(CP_PAS[0], (char *const *) CP_PAS); break; case LANG_JAVA: print_compiler(CP_J); execvp(CP_J[0], (char *const *) CP_J); break; case LANG_PYTHON27: print_compiler(CP_PY27); execvp(CP_PY27[0], (char *const *) CP_PY27); break; case LANG_PYTHON3: print_compiler(CP_PY3); execvp(CP_PY3[0], (char *const *) CP_PY3); break; case LANG_KOTLIN: print_compiler(CP_KT); execvp(CP_KT[0], (char *const *) CP_KT); break; default: FM_LOG_FATAL("Unknown language %d", oj_solution.lang); break; } // execvp error FM_LOG_FATAL("execvp compiler error"); exit(EXIT_COMPILE_EXEC); } else { // parent process: Judger int status = 0; if (waitpid(compiler, &status, WUNTRACED) == -1) { FM_LOG_FATAL("waitpid for compiler failed: %s", strerror(errno)); exit(EXIT_COMPILE_ERROR); // SE } FM_LOG_DEBUG("compiler finished"); if ((oj_solution.lang == LANG_PYTHON27 || oj_solution.lang == LANG_PYTHON3) && file_size(stderr_compiler)) { FM_LOG_TRACE("compile error"); output_acm_result(OJ_CE, 0, 0, 0); exit(EXIT_OK); } if (WIFEXITED(status)) { // normal termination if (EXIT_SUCCESS == WEXITSTATUS(status)) { FM_LOG_DEBUG("compile succeeded"); } else if (GCC_COMPILE_ERROR == WEXITSTATUS(status)) { FM_LOG_TRACE("compile error"); output_acm_result(OJ_CE, 0, 0, 0); exit(EXIT_OK); } else { if (fix_gcc_result(stderr_compiler)) { FM_LOG_WARNING("Compiler Limit Exceeded!"); output_acm_result(OJ_CE, 0, 0, 0); exit(EXIT_OK); } else { FM_LOG_FATAL("compiler unknown exit status %d", WEXITSTATUS(status)); output_acm_result(OJ_CE, 0, 0, 0); exit(EXIT_COMPILE_ERROR); } } } else { if (WIFSIGNALED(status)) { // killed by signal int signo = WTERMSIG(status); FM_LOG_WARNING("Compiler Limit Exceeded: %s", strsignal(signo)); output_acm_result(OJ_CE, 0, 0, 0); stderr = freopen(stderr_compiler, "w", stderr); fprintf(stderr, "Compiler Limit Exceeded: %s\n", strsignal(signo)); exit(EXIT_OK); } else if (WIFSTOPPED(status)) { // stopped by signal int signo = WSTOPSIG(status); FM_LOG_FATAL("stopped by signal: %s\n", strsignal(signo)); } else { FM_LOG_FATAL("unknown stop reason, status(%d)", status); } exit(EXIT_COMPILE_ERROR); // SE } } }
int main(int argc, char *argv[], char *envp[]) { log_open(LOG_FILE); FM_LOG_TRACE("---"); check_pid(); int sockfd; socklen_t clilen; struct sockaddr_in serv_addr{}; struct sockaddr_in cli_addr{}; const char *cfg_file; if (argc > 1) { cfg_file = argv[1]; } else { cfg_file = DEFAULT_CFG_FILE; } read_config(cfg_file); FM_LOG_TRACE("read_config"); sockfd = socket(AF_INET, SOCK_STREAM, 0); if (sockfd < 0) { fatal_error("ERROR opening socket"); } FM_LOG_TRACE("socket"); bzero((char *) &serv_addr, sizeof(serv_addr)); serv_addr.sin_family = AF_INET; if (inet_aton(oj_config.ip, &serv_addr.sin_addr) == 0) { serv_addr.sin_addr.s_addr = INADDR_ANY; } serv_addr.sin_port = htons(oj_config.port); FM_LOG_NOTICE("IP address: %s %s", oj_config.ip, inet_ntoa(serv_addr.sin_addr)); FM_LOG_NOTICE("port: %d %d", oj_config.port, ntohs(serv_addr.sin_port)); int yes = 1; if (setsockopt(sockfd, SOL_SOCKET, SO_REUSEADDR, &yes, sizeof(int)) == -1) { fatal_error("setsockopt SO_REUSEADDR failed"); } if (bind(sockfd, (struct sockaddr *) &serv_addr, sizeof(serv_addr)) < 0) { fatal_error("ERROR on binding"); } FM_LOG_TRACE("bind"); clilen = sizeof(cli_addr); if (listen(sockfd, oj_config.backlog) < 0) { fatal_error("ERROR on listening"); } FM_LOG_NOTICE("listen backlog: %d", oj_config.backlog); if (daemon(0, 0) == -1) { FM_LOG_FATAL("Cannot daemonize"); pidfile_remove(pfh); exit(EXIT_FAILURE); } print_word_dir(); print_user_group(); pidfile_write(pfh); struct sigaction sa{}; sa.sa_handler = signal_handler; sigemptyset(&sa.sa_mask); sa.sa_flags = 0; if (sigaction(SIGTERM, &sa, nullptr) == -1) { // install signal hander for timeout FM_LOG_FATAL("cannot handle SIGTERM"); exit(EXIT_FAILURE); } else { FM_LOG_DEBUG("set signal_handler"); } for (int i = 0; i < oj_config.thread_num; i++) { std::thread t(ThreadWork); t.detach(); } FM_LOG_NOTICE("thread count: %d", oj_config.thread_num); std::thread(SendWork).detach(); while (isRunning) { int newsockfd = accept(sockfd, (struct sockaddr *) &cli_addr, &clilen); if (newsockfd != -1) { work(newsockfd, cli_addr); } } pidfile_remove(pfh); close(sockfd); return 0; }