Esempio n. 1
0
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;
}
Esempio n. 2
0
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;

}