diff options
-rw-r--r-- | include/slibtool/slibtool.h | 1 | ||||
-rw-r--r-- | src/internal/slibtool_mapfile_impl.c | 40 | ||||
-rw-r--r-- | src/internal/slibtool_mapfile_impl.h | 7 |
3 files changed, 48 insertions, 0 deletions
diff --git a/include/slibtool/slibtool.h b/include/slibtool/slibtool.h index 30024f4..ce76377 100644 --- a/include/slibtool/slibtool.h +++ b/include/slibtool/slibtool.h @@ -85,6 +85,7 @@ enum slbt_custom_error { SLBT_ERR_LDRPATH_INIT, SLBT_ERR_LINK_FLOW, SLBT_ERR_LINK_FREQ, + SLBT_ERR_BAD_DATA, SLBT_ERR_UNINSTALL_FAIL, }; diff --git a/src/internal/slibtool_mapfile_impl.c b/src/internal/slibtool_mapfile_impl.c index e5d40d1..a9c1d61 100644 --- a/src/internal/slibtool_mapfile_impl.c +++ b/src/internal/slibtool_mapfile_impl.c @@ -3,8 +3,11 @@ #include <unistd.h> #include <stdint.h> #include <stdlib.h> +#include <string.h> #include <sys/mman.h> #include <sys/stat.h> + +#include "slibtool_errinfo_impl.h" #include "slibtool_mapfile_impl.h" static void slbt_munmap(void * addr, size_t size) @@ -67,6 +70,8 @@ struct slbt_map_info * slbt_map_file( mapinfo->addr = addr; mapinfo->size = st.st_size; + mapinfo->mark = addr; + mapinfo->cap = &mapinfo->mark[st.st_size]; return mapinfo; } @@ -76,3 +81,38 @@ void slbt_unmap_file(struct slbt_map_info * mapinfo) slbt_munmap(mapinfo->addr,mapinfo->size); free(mapinfo); } + +int slbt_mapped_readline( + const struct slbt_driver_ctx * dctx, + struct slbt_map_info * mapinfo, + char * buf, + size_t buflen) +{ + const char * ch; + const char * cap; + const char * mark; + const char * newline; + size_t len; + + mark = mapinfo->mark; + cap = mapinfo->cap; + + for (ch=mark, newline=0; ch<cap && !newline; ch++) + if (*ch == '\n') + newline = ch; + + len = ch - mark; + + if (newline && (buflen <= len)) + return SLBT_CUSTOM_ERROR(dctx,SLBT_ERR_FLOW_ERROR); + + if (!newline) + return SLBT_CUSTOM_ERROR(dctx,SLBT_ERR_BAD_DATA); + + memcpy(buf,mark,len); + buf[len] = 0; + + mapinfo->mark += len; + + return 0; +} diff --git a/src/internal/slibtool_mapfile_impl.h b/src/internal/slibtool_mapfile_impl.h index 567fc8f..4b96c11 100644 --- a/src/internal/slibtool_mapfile_impl.h +++ b/src/internal/slibtool_mapfile_impl.h @@ -7,6 +7,8 @@ struct slbt_map_info { void * addr; size_t size; + char * mark; + char * cap; }; struct slbt_map_info * slbt_map_file( @@ -15,4 +17,9 @@ struct slbt_map_info * slbt_map_file( void slbt_unmap_file(struct slbt_map_info *); +int slbt_mapped_readline( + const struct slbt_driver_ctx *, + struct slbt_map_info *, + char *, size_t); + #endif |