| |
| |
| |
| |
| |
| |
| #include <stdint.h> |
| #include <stdbool.h> |
| #include <unistd.h> |
| #include <fcntl.h> |
| #include <sys/mman.h> |
| #include <sys/types.h> |
| #include <sys/stat.h> |
| |
| #include <apimagic/apimagic.h> |
| #include "apimagic_errinfo_impl.h" |
| |
| int amgc_map_input( |
| const struct amgc_driver_ctx * dctx, |
| int fd, |
| const char * path, |
| int prot, |
| struct amgc_input * map) |
| { |
| struct stat st; |
| bool fnew; |
| int ret; |
| |
| if ((fnew = (fd < 0))) |
| fd = open(path,O_RDONLY | O_CLOEXEC); |
| |
| if (fd < 0) |
| return AMGC_SYSTEM_ERROR(dctx); |
| |
| if ((ret = fstat(fd,&st) < 0) && fnew) |
| close(fd); |
| |
| else if ((st.st_size == 0) && fnew) |
| close(fd); |
| |
| if (ret < 0) |
| return AMGC_SYSTEM_ERROR(dctx); |
| |
| else if (st.st_size == 0) |
| return AMGC_CUSTOM_ERROR( |
| dctx,AMGC_ERR_SOURCE_SIZE_ZERO); |
| |
| map->size = st.st_size; |
| map->addr = mmap(0,map->size,prot,MAP_PRIVATE,fd,0); |
| |
| if (fnew) |
| close(fd); |
| |
| return (map->addr == MAP_FAILED) |
| ? AMGC_SYSTEM_ERROR(dctx) |
| : 0; |
| } |
| |
| int amgc_unmap_input(struct amgc_input * map) |
| { |
| return munmap(map->addr,map->size); |
| } |