void *parse_input() { char comand[128]; char listStr [8] = "list\n"; char getStr [8] = "get "; char putStr [8] = "put "; struct data data; int size; void *out_msg; size_t size_struct = sizeof(struct data); for(;;) { /* if (fgets (comand, 128, stdin) == NULL) { if (!feof(stdin)) exit(EXIT_FAILURE); else return NULL; } */ sprintf(comand, "get 80\n"); if (equalStr(comand, listStr, 5) == 0) { out_msg = malloc(size_struct); data.data_type = LIST; data.size = 0; memcpy(out_msg, &data, size_struct); break; } else if(equalStr(comand, getStr, 4) == 0) { out_msg = malloc(size_struct); if (control_request_get(out_msg, comand) == -1) printf("Wrong get comand. Insert a right filename\n"); else { data.data_type = GET; data.size = 0; memcpy(data.str, comand + 4, strlen(comand + 4)); memcpy(out_msg, &data, sizeof(struct data)); break; } } else if (equalStr(comand, putStr, 4) == 0) { size = map_file_in_mem(comand + 4, &out_msg); if (size == -1) { printf("Request PUT. No such file in the computer: %s\n", comand + 4); continue; } data.data_type = PUT; data.size = size; /* TODO: manage this size better */ sprintf(data.str, comand + 4); memcpy(out_msg, &data, sizeof(struct data)); break; } else { printf("Wrong comand. Choose between list, get and put.\n"); } break; } return out_msg; }
int Checker::checkDiff(void) { int ans_fd = open(m_ans_file.c_str(), O_RDONLY); if(-1 == ans_fd) { perror("ans_file not exist"); exit(1); } int user_out_fd = open(m_user_out_file.c_str(), O_RDONLY); if(-1 == user_out_fd) { perror("user_out_file not exist"); exit(1); } char *user_out, *ans; off_t user_out_len= lseek(user_out_fd, 0, SEEK_END); off_t ans_len = lseek(ans_fd, 0, SEEK_END); if(-1 == user_out_len || -1 == ans_len) { perror("lseek fail"); exit(1); } // test output limit // if(user_out_len >= MAX_OUTPUT) // { // return OLE; // } lseek(user_out_fd, 0, SEEK_SET); lseek(ans_fd, 0, SEEK_SET); if(0 == (user_out_len && ans_len)) { if(user_out_len || ans_len) { return WA; } return AC; } if((user_out = (char *)mmap(NULL, user_out_len, PROT_READ | PROT_WRITE, MAP_PRIVATE, user_out_fd, 0)) == MAP_FAILED) { perror("mmap user_out fail"); exit(1); } if((ans = (char *)mmap(NULL, ans_len, PROT_READ | PROT_WRITE, MAP_PRIVATE, ans_fd, 0)) == MAP_FAILED) { munmap(user_out, user_out_len); perror("mmap ans fail"); exit(1); } if((user_out_len == ans_len) && equalStr(user_out, ans)) { munmap(user_out, user_out_len); munmap(ans, ans_len); return AC; } const char *cuser = user_out, *cans = ans; const char *end_user = user_out + user_out_len; const char *end_ans = ans + ans_len; while((cuser < end_user) && (cans < end_ans)) { while((cuser < end_user) && (*cuser == ' ' || *cuser == '\n' || *cuser == '\r' || *cuser == '\t')) ++cuser; while((cans < end_ans) && (*cans == ' ' || *cans == '\n' || *cans == '\r' || *cans == '\t')) ++cans; if(cuser == end_user || cans == end_ans) break; if(*cuser != *cans) break; ++cuser; ++cans; } while((cuser < end_user) && (*cuser == ' ' || *cuser == '\n' || *cuser == '\r' || *cuser == '\t')) { ++cuser; } while((cans < end_ans) && (*cans == ' ' || *cans == '\n' || *cans == '\r' || *cans == '\t')) { ++cans; } if(cuser == end_user && cans == end_ans) { munmap(user_out, user_out_len); munmap(ans, ans_len); return PE; } munmap(user_out, user_out_len); munmap(ans, ans_len); return WA; }