commit 8fb140b4fcd8b5d66e4a4fd382e328d5e4b81eb0
parent cdd129b5fbab9ee543ec3674694b935b48e391e3
Author: Roberto E. Vargas Caballero <roberto@clue.aero>
Date: Mon, 12 Aug 2019 16:41:22 +0200
[libk] Move loadimg() to libk.
This function is generic code, and it is a totally independent
function, so the best place for it is in a library, and it
that case libk is the best place.
Change-Id: I2907297031abd0e700da4a2612bd0997fffcfacc
Diffstat:
4 files changed, 44 insertions(+), 42 deletions(-)
diff --git a/include/libk.h b/include/libk.h
@@ -15,3 +15,4 @@ extern int kvprint(int fd, const char *fmt, va_list va);
extern void kerror(const char *s);
extern int putenv(char *name);
extern int tokenize(char *line, int siz, char *tokens[], int ntoks);
+extern int loadimg(char *name, void *dst, long *n);
diff --git a/src/libk/Makefile b/src/libk/Makefile
@@ -17,6 +17,7 @@ OBJS = doprnt.o \
fromstring.o \
tobytes.o \
tostring.o \
+ loadimg.o \
__assert.o \
TARGET = $(LIBDIR)/libk.a
diff --git a/src/libk/loadimg.c b/src/libk/loadimg.c
@@ -0,0 +1,42 @@
+#include <errno.h>
+
+#include <libk.h>
+#include <limits.h>
+#include <rcode/rcode.h>
+
+int
+loadimg(char *name, void *dst, long *n)
+{
+ int err = -1;
+ int fd;
+ Dir dir;
+ long cnt, r;
+ char *d = dst;
+
+ if (dirstat(name, &dir) < 0)
+ goto err0;
+ if ((fd = open(name, O_READ)) < 0)
+ goto err0;
+
+ if (n && dir.length > *n && *n > 0)
+ dir.length = *n;
+
+ for (cnt = dir.length; cnt > 0; cnt -= r) {
+ r = (cnt > INT_MAX) ? INT_MAX : cnt;
+ r = read(fd, d, r);
+ if (r == 0)
+ break;
+ if (r < 0)
+ goto err1;
+ d += r;
+ }
+
+ if (n)
+ *n = dir.length - cnt;
+ err = 0;
+
+err1:
+ close(fd);
+err0:
+ return err;
+}
diff --git a/target/native/rom.c b/target/native/rom.c
@@ -135,48 +135,6 @@ namespace(void)
return;
}
-// TODO: move to generic code
-int
-loadimg(char *name, void *dst, long *n)
-{
- int fd;
- Dir dir;
- long cnt, r;
- char *d = dst;
-
- if (dirstat(name, &dir) < 0)
- goto err0;
- fd = open(name, O_READ);
- if (fd < 0)
- goto err0;
-
- if (n) {
- if (dir.length > *n && *n > 0)
- dir.length = *n;
- }
-
- for (cnt = dir.length; cnt > 0; cnt -= r) {
- r = (cnt > INT_MAX) ? INT_MAX : cnt;
- r = read(fd, d, r);
- if (r == 0)
- break;
- if (r < 0)
- goto err1;
- d += r;
- }
-
- if (n)
- *n = dir.length - cnt;
-
- close(fd);
- return 0;
-
-err1:
- close(fd);
-err0:
- return -1;
-}
-
void
loadfip(void)
{