/**************************************************************/ /* treebnf: a tree oriented bnf library */ /* Copyright (C) 2024 SysDeer Technologies, LLC */ /* Released under GPLv2 and GPLv3; see COPYING.TREEBNF. */ /**************************************************************/ #include #include #include #include #include #include #include #include #include "treebnf_driver_impl.h" #include "treebnf_errinfo_impl.h" int tbnf_lib_map_raw_input( const struct tbnf_driver_ctx * dctx, int fd, const char * path, int prot, struct tbnf_raw_input * map) { int ret; struct stat st; bool fnew; int fdcwd; fdcwd = tbnf_driver_fdcwd(dctx); if ((fnew = (fd < 0))) fd = openat(fdcwd,path,O_RDONLY | O_CLOEXEC); if (fd < 0) return TBNF_SYSTEM_ERROR(dctx,path); if ((ret = fstat(fd,&st) < 0) && fnew) close(fd); else if ((st.st_size == 0) && fnew) close(fd); if (ret < 0) return TBNF_SYSTEM_ERROR(dctx,path); else if (st.st_size == 0) return TBNF_CUSTOM_ERROR( dctx,TBNF_ERR_IMAGE_SIZE_ZERO); map->map_size = st.st_size; map->map_addr = mmap(0,map->map_size,prot,MAP_PRIVATE,fd,0); if (fnew) close(fd); return (map->map_addr == MAP_FAILED) ? TBNF_SYSTEM_ERROR(dctx,0) : 0; } int tbnf_lib_unmap_raw_input(struct tbnf_raw_input * map) { return munmap(map->map_addr,map->map_size); }