mirror of
https://xff.cz/git/u-boot/
synced 2025-10-01 15:31:27 +02:00
arm: smh: Use numeric modes for smh_open
There's no point in using string constants for smh_open if we are just going to have to parse them. Instead, use numeric modes. The user needs to be a bit careful with these, since they are much closer semantically to string modes used by fopen(3) than the numeric modes used with open(2). Signed-off-by: Sean Anderson <sean.anderson@seco.com>
This commit is contained in:
@@ -22,9 +22,6 @@
|
|||||||
#define SYSREAD 0x06
|
#define SYSREAD 0x06
|
||||||
#define SYSFLEN 0x0C
|
#define SYSFLEN 0x0C
|
||||||
|
|
||||||
#define MODE_READ 0x0
|
|
||||||
#define MODE_READBIN 0x1
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Call the handler
|
* Call the handler
|
||||||
*/
|
*/
|
||||||
@@ -46,28 +43,16 @@ static noinline long smh_trap(unsigned int sysnum, void *addr)
|
|||||||
* Open a file on the host. Mode is "r" or "rb" currently. Returns a file
|
* Open a file on the host. Mode is "r" or "rb" currently. Returns a file
|
||||||
* descriptor or -1 on error.
|
* descriptor or -1 on error.
|
||||||
*/
|
*/
|
||||||
long smh_open(const char *fname, char *modestr)
|
long smh_open(const char *fname, enum smh_open_mode mode)
|
||||||
{
|
{
|
||||||
long fd;
|
long fd;
|
||||||
unsigned long mode;
|
|
||||||
struct smh_open_s {
|
struct smh_open_s {
|
||||||
const char *fname;
|
const char *fname;
|
||||||
unsigned long mode;
|
unsigned long mode;
|
||||||
size_t len;
|
size_t len;
|
||||||
} open;
|
} open;
|
||||||
|
|
||||||
debug("%s: file \'%s\', mode \'%s\'\n", __func__, fname, modestr);
|
debug("%s: file \'%s\', mode \'%u\'\n", __func__, fname, mode);
|
||||||
|
|
||||||
/* Check the file mode */
|
|
||||||
if (!(strcmp(modestr, "r"))) {
|
|
||||||
mode = MODE_READ;
|
|
||||||
} else if (!(strcmp(modestr, "rb"))) {
|
|
||||||
mode = MODE_READBIN;
|
|
||||||
} else {
|
|
||||||
printf("%s: ERROR mode \'%s\' not supported\n", __func__,
|
|
||||||
modestr);
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
|
|
||||||
open.fname = fname;
|
open.fname = fname;
|
||||||
open.len = strlen(fname);
|
open.len = strlen(fname);
|
||||||
@@ -155,7 +140,7 @@ static int smh_load_file(const char * const name, ulong load_addr,
|
|||||||
long len;
|
long len;
|
||||||
long ret;
|
long ret;
|
||||||
|
|
||||||
fd = smh_open(name, "rb");
|
fd = smh_open(name, MODE_READ | MODE_BINARY);
|
||||||
if (fd == -1)
|
if (fd == -1)
|
||||||
return -1;
|
return -1;
|
||||||
|
|
||||||
|
@@ -6,7 +6,30 @@
|
|||||||
#ifndef _SEMIHOSTING_H
|
#ifndef _SEMIHOSTING_H
|
||||||
#define _SEMIHOSTING_H
|
#define _SEMIHOSTING_H
|
||||||
|
|
||||||
long smh_open(const char *fname, char *modestr);
|
/**
|
||||||
|
* enum smh_open_mode - Numeric file modes for use with smh_open()
|
||||||
|
* MODE_READ: 'r'
|
||||||
|
* MODE_BINARY: 'b'
|
||||||
|
* MODE_PLUS: '+'
|
||||||
|
* MODE_WRITE: 'w'
|
||||||
|
* MODE_APPEND: 'a'
|
||||||
|
*
|
||||||
|
* These modes represent the mode string used by fopen(3) in a form which can
|
||||||
|
* be passed to smh_open(). These do NOT correspond directly to %O_RDONLY,
|
||||||
|
* %O_CREAT, etc; see fopen(3) for details. In particular, @MODE_PLUS
|
||||||
|
* effectively results in adding %O_RDWR, and @MODE_WRITE will add %O_TRUNC.
|
||||||
|
* For compatibility, @MODE_BINARY should be added when opening non-text files
|
||||||
|
* (such as images).
|
||||||
|
*/
|
||||||
|
enum smh_open_mode {
|
||||||
|
MODE_READ = 0x0,
|
||||||
|
MODE_BINARY = 0x1,
|
||||||
|
MODE_PLUS = 0x2,
|
||||||
|
MODE_WRITE = 0x4,
|
||||||
|
MODE_APPEND = 0x8,
|
||||||
|
};
|
||||||
|
|
||||||
|
long smh_open(const char *fname, enum smh_open_mode mode);
|
||||||
long smh_read(long fd, void *memp, size_t len);
|
long smh_read(long fd, void *memp, size_t len);
|
||||||
long smh_close(long fd);
|
long smh_close(long fd);
|
||||||
long smh_flen(long fd);
|
long smh_flen(long fd);
|
||||||
|
Reference in New Issue
Block a user