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; }
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; }
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); }