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