static int sys_close(int fd) { if (FD_CHECK(fd)) { close_fs(FD_ENTRY(fd)); FD_ENTRY(fd) = NULL; return 0; } return -1; }
static int sys_ioctl(int fd, int request, void * argp) { if (FD_CHECK(fd)) { PTR_VALIDATE(argp); return ioctl_fs(FD_ENTRY(fd), request, argp); } return -1; }
static int sys_stat(int fd, uintptr_t st) { PTR_VALIDATE(st); if (FD_CHECK(fd)) { return stat_node(FD_ENTRY(fd), st); } return -1; }
static int sys_write(int fd, char * ptr, int len) { if (FD_CHECK(fd)) { PTR_VALIDATE(ptr); fs_node_t * node = FD_ENTRY(fd); uint32_t out = write_fs(node, node->offset, len, (uint8_t *)ptr); node->offset += out; return out; } return -1; }
static int sys_seek(int fd, int offset, int whence) { if (FD_CHECK(fd)) { if (fd < 3) return 0; switch (whence) { case 0: FD_ENTRY(fd)->offset = offset; break; case 1: FD_ENTRY(fd)->offset += offset; break; case 2: FD_ENTRY(fd)->offset = FD_ENTRY(fd)->length + offset; break; } return FD_ENTRY(fd)->offset; } return -1; }
static int sys_readdir(int fd, int index, struct dirent * entry) { if (FD_CHECK(fd)) { PTR_VALIDATE(entry); struct dirent * kentry = readdir_fs(FD_ENTRY(fd), (uint32_t)index); if (kentry) { memcpy(entry, kentry, sizeof *entry); free(kentry); return 0; } else { return 1; } } return -1; }
static int sys_write(int fd, char * ptr, int len) { if (FD_CHECK(fd)) { PTR_VALIDATE(ptr); fs_node_t * node = FD_ENTRY(fd); if (!has_permission(node, 02)) { debug_print(WARNING, "access denied (write, fd=%d)", fd); return -EACCES; } uint32_t out = write_fs(node, node->offset, len, (uint8_t *)ptr); node->offset += out; return out; } return -1; }
static int sys_write(int fd, char * ptr, int len) { if (FD_CHECK(fd)) { PTR_VALIDATE(ptr); fs_node_t * node = FD_ENTRY(fd); if (!(FD_MODE(fd) & 02)) { debug_print(WARNING, "access denied (write, fd=%d)", fd); return -EACCES; } uint32_t out = write_fs(node, FD_OFFSET(fd), len, (uint8_t *)ptr); FD_OFFSET(fd) += out; return out; } return -EBADF; }
static int sys_read(int fd, char * ptr, int len) { if (FD_CHECK(fd)) { PTR_VALIDATE(ptr); fs_node_t * node = FD_ENTRY(fd); if (!(FD_MODE(fd) & 01)) { debug_print(WARNING, "access denied (read, fd=%d, mode=%d, %s, %s)", fd, FD_MODE(fd), node->name, current_process->name); return -EACCES; } uint32_t out = read_fs(node, FD_OFFSET(fd), len, (uint8_t *)ptr); FD_OFFSET(fd) += out; return (int)out; } return -EBADF; }
static int sys_seek(int fd, int offset, int whence) { if (FD_CHECK(fd)) { if (fd < 3) { return 0; } switch (whence) { case 0: FD_OFFSET(fd) = offset; break; case 1: FD_OFFSET(fd) += offset; break; case 2: FD_OFFSET(fd) = FD_ENTRY(fd)->length + offset; break; } return FD_OFFSET(fd); } return -EBADF; }
#define FD_ENTRY(_name, _fmt) \ [CR_FD_##_name] = { \ .fmt = _fmt ".img", \ .magic = _name##_MAGIC, \ } #define FD_ENTRY_F(_name, _fmt, _f) \ [CR_FD_##_name] = { \ .fmt = _fmt ".img", \ .magic = _name##_MAGIC, \ .oflags = _f, \ } struct cr_fd_desc_tmpl imgset_template[CR_FD_MAX] = { FD_ENTRY(INVENTORY, "inventory"), FD_ENTRY(FDINFO, "fdinfo-%d"), FD_ENTRY(PAGEMAP, "pagemap-%ld"), FD_ENTRY(SHMEM_PAGEMAP, "pagemap-shmem-%ld"), FD_ENTRY(REG_FILES, "reg-files"), FD_ENTRY(EXT_FILES, "ext-files"), FD_ENTRY(NS_FILES, "ns-files"), FD_ENTRY(EVENTFD_FILE, "eventfd"), FD_ENTRY(EVENTPOLL_FILE,"eventpoll"), FD_ENTRY(EVENTPOLL_TFD, "eventpoll-tfd"), FD_ENTRY(SIGNALFD, "signalfd"), FD_ENTRY(INOTIFY_FILE, "inotify"), FD_ENTRY(INOTIFY_WD, "inotify-wd"), FD_ENTRY(FANOTIFY_FILE, "fanotify"), FD_ENTRY(FANOTIFY_MARK, "fanotify-mark"), FD_ENTRY(CORE, "core-%d"),
* about dumped processes is stored. Each file carries some * small portion of info about the whole picture, see below * for more details. */ #define FD_ENTRY(_name, _fmt, _show) \ [CR_FD_##_name] = { \ .fmt = _fmt ".img", \ .magic = _name##_MAGIC, \ .show = _show, \ } static void show_raw_image(int fd, struct cr_options *opt) {}; struct cr_fd_desc_tmpl fdset_template[CR_FD_MAX] = { FD_ENTRY(INVENTORY, "inventory", show_inventory), FD_ENTRY(FDINFO, "fdinfo-%d", show_files), FD_ENTRY(PAGES, "pages-%d", show_pages), FD_ENTRY(SHMEM_PAGES, "pages-shmem-%ld", show_pages), FD_ENTRY(REG_FILES, "reg-files", show_reg_files), FD_ENTRY(EVENTFD, "eventfd", show_eventfds), FD_ENTRY(EVENTPOLL, "eventpoll", show_eventpoll), FD_ENTRY(EVENTPOLL_TFD, "eventpoll-tfd", show_eventpoll_tfd), FD_ENTRY(SIGNALFD, "signalfd", show_signalfd), FD_ENTRY(INOTIFY, "inotify", show_inotify), FD_ENTRY(INOTIFY_WD, "inotify-wd", show_inotify_wd), FD_ENTRY(CORE, "core-%d", show_core), FD_ENTRY(MM, "mm-%d", show_mm), FD_ENTRY(VMAS, "vmas-%d", show_vmas), FD_ENTRY(PIPES, "pipes", show_pipes), FD_ENTRY(PIPES_DATA, "pipes-data", show_pipes_data),
/* * The cr fd set is the set of files where the information * about dumped processes is stored. Each file carries some * small portion of info about the whole picture, see below * for more details. */ #define FD_ENTRY(_name, _fmt) \ [CR_FD_##_name] = { \ .fmt = _fmt ".img", \ .magic = _name##_MAGIC, \ } struct cr_fd_desc_tmpl fdset_template[CR_FD_MAX] = { FD_ENTRY(INVENTORY, "inventory"), FD_ENTRY(FDINFO, "fdinfo-%d"), FD_ENTRY(PAGEMAP, "pagemap-%ld"), FD_ENTRY(SHMEM_PAGEMAP, "pagemap-shmem-%ld"), FD_ENTRY(REG_FILES, "reg-files"), FD_ENTRY(EXT_FILES, "ext-files"), FD_ENTRY(NS_FILES, "ns-files"), FD_ENTRY(EVENTFD_FILE, "eventfd"), FD_ENTRY(EVENTPOLL_FILE,"eventpoll"), FD_ENTRY(EVENTPOLL_TFD, "eventpoll-tfd"), FD_ENTRY(SIGNALFD, "signalfd"), FD_ENTRY(INOTIFY_FILE, "inotify"), FD_ENTRY(INOTIFY_WD, "inotify-wd"), FD_ENTRY(FANOTIFY_FILE, "fanotify"), FD_ENTRY(FANOTIFY_MARK, "fanotify-mark"), FD_ENTRY(CORE, "core-%d"),