示例#1
0
int read_loop(const int fd) {
    char *line = NULL;
    size_t linecap = 0;
    ssize_t linelen;
    int line_size;
    char *response = NULL;
    printf("\n>>> ");
    while ((linelen = getline(&line, &linecap, stdin)) > 0) {
        line[linelen-1] = '\0';
        if (line[0] == 'l') {
            local_parse(line, linelen);
            printf("\n>>> ");
            continue;
        }
        if (strnstr(line, "put", 3) != 0) {
            int name_size = strlen(&line[4]);
            char name[name_size];
            strncpy(name, &line[4], name_size);
            assert(name[name_size-1] == 0);
            printf("Name '%s', %i:\n", name, name_size);
            if (access(name, R_OK) != -1) {
                int in_fd = open(name, O_RDONLY,
                        S_IWUSR | S_IRUSR | S_IRGRP | S_IROTH);
                int file_size = get_fd_size(in_fd);
                write(fd, &file_size, sizeof(int));
                char *file_line = malloc(file_size);
                read(in_fd, file_line, file_size);
                write(fd, file_line, file_size);
                free(file_line);
                free(line);
                continue;
            } else {
                puts("File couldn't be read");
                printf("\n>>> ");
                continue;
            }
        }
        line_size = linelen;
        write(fd, &line_size, sizeof(int));
        write(fd, line, line_size);
        if (read(fd, &line_size, sizeof(int)) == -1) {
            perror("reading size");
            exit(-1);
        }
        response = malloc(line_size);
        if (read(fd, response, line_size) == -1) {
            perror("reading message");
            exit(-1);
        }
        printf("%s\n", response);
        if (strcmp(response, "exit") == 0) {
            break;
        }
        free(response);
        printf("\n>>> ");
    }
    close(fd);
    return 0;
}
示例#2
0
int main(int argc, char **argv)
{
    if (argc != 2) {
        fprintf(stderr, "USAGE: %s FILE\n", argv[0]);
        return -1;
    }

    printf("PID: %d\n", getpid());

    int fd = open(argv[1], O_RDWR);
    if (fd < 0) {
        fprintf(stderr, "mmap_test: %s: %s\n", argv[1], strerror(errno));
        return -1;
    }

    size_t fd_size = get_fd_size(fd);
    uint32_t *addr = mmap((void *) 0x80000000, fd_size, PROT_WRITE | PROT_READ,
                          MAP_SHARED, fd, 0);
    if (addr == MAP_FAILED) {
        perror("mmap_test: mmap failed");
        return -1;
    }

    volatile int x = addr[0];
    (void) x;

    int pm = open("/proc/self/pagemap", O_RDONLY);
    lseek(pm, (intptr_t) addr / getpagesize() * 8, SEEK_SET);
    uint64_t page;
    read(pm, &page, sizeof(page));
    printf("Physical Address: 0x%" PRIx64 "\n", page << 12);

    while (1) {
        sleep(5);
    }


    munmap(addr, fd_size);

    return 0;
}
示例#3
0
void *listen_loop(void *data) {
    puts("Thread spawned");
    const int fd = (int)data;
    int size;
    char *buffer;
    char *response;
    int response_size;
    while (read(fd, &size, sizeof(int)) > 0) {
        buffer = malloc(size);
        read(fd, buffer, size);

        if (strnstr(buffer, "cd", 2) != 0) {
            response_size = 12;
            response = malloc(response_size);
            memcpy(response, "server cd'd", response_size);
            write(fd, &response_size, sizeof(int));
            write(fd, response, response_size);
        } else if (strnstr(buffer, "put", 3) != 0) {
            puts("put");
            int name_size = strlen(&buffer[5]);
            char name[name_size];
            strncpy(name, &buffer[5], name_size);
            int in_fd = open(&buffer[5], O_CREAT | O_WRONLY,
                    S_IWUSR | S_IRUSR | S_IRGRP | S_IROTH);
            int file_size = size - (4 + name_size);
            if (file_size > 0) {
                write(in_fd, &buffer, file_size);
            }
            close(in_fd);
            response_size = 9;
            response = malloc(response_size);
            memcpy(response, "success", response_size);
            write(fd, response, response_size);
            write(fd, response, response_size);
        } else if (strnstr(buffer, "get", 3) != 0) {
            int name_size = strlen(&buffer[5]);
            char name[name_size];
            strncpy(name, &buffer[4], name_size);
            printf("Name %s:\n", name);
            if (access(name, R_OK) != -1) {
                int in_fd = open(&buffer[5], O_RDONLY,
                        S_IWUSR | S_IRUSR | S_IRGRP | S_IROTH);
                int file_size = get_fd_size(in_fd);
                write(fd, &file_size, sizeof(int));
                char *file_buffer = malloc(file_size);
                read(in_fd, file_buffer, file_size);
                write(fd, file_buffer, file_size);
                free(file_buffer);
                free(buffer);
                continue;
            } else {
                response_size = 15;
                response = malloc(response_size);
                memcpy(response, "File not found", response_size);
                write(fd, &response_size, sizeof(int));
                write(fd, response, response_size);
            }
        } else {
            response_size = 16;
            response = malloc(response_size);
            memcpy(response, "Invalid command", response_size);
            write(fd, &response_size, sizeof(int));
            write(fd, response, response_size);
        }
        free(buffer);
        free(response);
    }
    close(fd);
    puts("thread exited");
    pthread_exit(NULL);
}