void trace_submit(int pid, int *status, int *usedtime, int *usedmem, int timelimit, int casetimelimit, int memlimit, int language, int spj) { int pstat, sig, ecode; struct user_regs_struct regs; struct rusage usage; int tmpmem, tmptime, sub=0; while(1) { wait4(pid, &pstat, 0, &usage); if(language==LANG_JAVA)tmpmem=(usage.ru_minflt*getpagesize())>>10; else tmpmem=get_proc_status(pid, "VmPeak:"); if(tmpmem>*usedmem)*usedmem=tmpmem; if(get_file_size("error.out")) { *status=JG_RE; ptrace(PTRACE_KILL, pid, NULL, NULL); break; } if(!spj&&get_file_size("user.out")>get_file_size("data.out")*2+1024) { *status=JG_OL; ptrace(PTRACE_KILL, pid, NULL, NULL); break; } if(WIFEXITED(pstat))break; ecode=WEXITSTATUS(pstat); if(ecode==0x05||ecode==0); else { if(*status==JG_AC) { switch(ecode) { case SIGCHLD: case SIGALRM: alarm(0); case SIGKILL: case SIGXCPU: *status=JG_TL; break; case SIGXFSZ: *status=JG_OL; break; default: *status=JG_RE; } print_runtime_error(strsignal(ecode)); } ptrace(PTRACE_KILL, pid, NULL, NULL); break; } if(WIFSIGNALED(pstat)) { sig=WTERMSIG(pstat); if(*status==JG_AC) { switch(sig) { case SIGCHLD: case SIGALRM: alarm(0); case SIGKILL: case SIGXCPU: *status=JG_TL; break; case SIGXFSZ: *status=JG_OL; break; default: *status=JG_RE; } print_runtime_error(strsignal(sig)); } break; } ptrace(PTRACE_GETREGS, pid, NULL, ®s); if(oksyscall[regs.REG_SYSCALL]==0) { *status=JG_RE; char msg[MAXLINE+1]; sprintf(msg, "does not allow syscall id:%d name:%s", (int)regs.REG_SYSCALL, syscallname[regs.REG_SYSCALL]); print_runtime_error(msg); ptrace(PTRACE_KILL, pid, NULL, NULL); break; } else if(sub==1&&oksyscall[regs.REG_SYSCALL]>0) --oksyscall[regs.REG_SYSCALL]; sub=1-sub; ptrace(PTRACE_SYSCALL, pid, NULL, NULL); }
/* * Description: Executes the second transition * Input: 1. Input file handle * 2. Name of input file * 3. Code length in memory word * 4. Data length in memory word */ void second_transition_execute(FILE* pFile, char* file_name_without_extension, unsigned int previous_transition_ic, unsigned int previous_transition_dc) { compiler_output_files output_files; int line_number = 0; /* Creates transition first data */ transition_data* transition = create_transition_data(); if (transition == NULL) { return; } /* Create ob file */ output_files.ob_file = create_output_file(file_name_without_extension, CODE_FILE_EXT); if (output_files.ob_file == NULL) { return; } output_files.entry_file = NULL; output_files.extern_file = NULL; /* Write first line to ob file */ write_code_and_data_size_to_output_file(previous_transition_ic, previous_transition_dc, output_files.ob_file); /* Step 1 - Initializes IC to zero*/ transition->IC = 0; /* Reads all code lines */ while (!feof(pFile) && !transition->is_runtimer_error) { char line[MAX_LINE_LENGTH]; line_number++; /* Step 2 - Read next line*/ if (fgets(line, MAX_LINE_LENGTH + 1, pFile)) { /* This isn't an empty line or a comment */ if (!is_empty_or_comment(line)) { transition->current_line_information = create_line_info(file_name_without_extension, line_number, line); /* Process line */ if (transition->current_line_information != NULL) { second_transition_process_line(transition, &output_files); free(transition->current_line_information); } else { transition->is_runtimer_error = true; } } } } /* No error has occurred */ if (!transition->is_runtimer_error && !transition->is_compiler_error) { /* Write data initialization section into ob file */ write_data_to_output_file(output_files.ob_file); /* Close files */ if (output_files.ob_file != NULL) { fclose(output_files.ob_file); } if (output_files.extern_file != NULL) { fclose(output_files.extern_file); } if (output_files.entry_file != NULL) { fclose(output_files.entry_file); } } else { /* Close and delete file */ if (output_files.ob_file != NULL) { char* full_name = allocate_string(strlen(file_name_without_extension) + strlen(CODE_FILE_EXT)); fclose(output_files.ob_file); if (full_name != NULL) { strcpy(full_name, file_name_without_extension); strcat(full_name, CODE_FILE_EXT); remove(full_name); free(full_name); } else { print_runtime_error("Couldn't delete compilation files"); } } /* Close and delete file */ if (output_files.extern_file != NULL) { char* full_name = allocate_string(strlen(file_name_without_extension) + strlen(EXTERN_FILE_EXT)); fclose(output_files.extern_file); if (full_name != NULL) { strcpy(full_name, file_name_without_extension); strcat(full_name, EXTERN_FILE_EXT); remove(full_name); free(full_name); } else { print_runtime_error("Couldn't delete compilation files"); } } /* Close and delete file */ if (output_files.entry_file != NULL) { char* full_name = allocate_string(strlen(file_name_without_extension) + strlen(ENTRY_FILE_EXT)); fclose(output_files.entry_file); if (full_name != NULL) { strcpy(full_name, file_name_without_extension); strcat(full_name, ENTRY_FILE_EXT); remove(full_name); free(full_name); } else { print_runtime_error("Couldn't delete compilation files"); } } } }