state: backend_raw: factor out state_backend_raw_file_get_size() into separate function
This patch factors out the state_backend_raw_file_get_size() into a separate function and adds some ifdefs to make this code work under Linux aswell. Signed-off-by: Marc Kleine-Budde <mkl@pengutronix.de>
This commit is contained in:
parent
e5ec09d771
commit
cba8ec9e57
|
@ -1216,6 +1216,60 @@ out_free:
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#ifdef __BAREBOX__
|
||||||
|
#define STAT_GIVES_SIZE(s) (S_ISREG(s.st_mode) || S_ISCHR(s.st_mode))
|
||||||
|
#define BLKGET_GIVES_SIZE(s) 0
|
||||||
|
#ifndef BLKGETSIZE64
|
||||||
|
#define BLKGETSIZE64 -1
|
||||||
|
#endif
|
||||||
|
#else
|
||||||
|
#define STAT_GIVES_SIZE(s) (S_ISREG(s.st_mode))
|
||||||
|
#define BLKGET_GIVES_SIZE(s) (S_ISBLK(s.st_mode))
|
||||||
|
#endif
|
||||||
|
|
||||||
|
static int state_backend_raw_file_get_size(const char *path, size_t *out_size)
|
||||||
|
{
|
||||||
|
struct mtd_info_user meminfo;
|
||||||
|
struct stat s;
|
||||||
|
int ret;
|
||||||
|
|
||||||
|
ret = stat(path, &s);
|
||||||
|
if (ret)
|
||||||
|
return -errno;
|
||||||
|
|
||||||
|
/*
|
||||||
|
* under Linux, stat() gives the size only on regular files
|
||||||
|
* under barebox, it works on char dev, too
|
||||||
|
*/
|
||||||
|
if (STAT_GIVES_SIZE(s)) {
|
||||||
|
*out_size = s.st_size;
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* this works under Linux on block devs */
|
||||||
|
if (BLKGET_GIVES_SIZE(s)) {
|
||||||
|
int fd;
|
||||||
|
|
||||||
|
fd = open(path, O_RDONLY);
|
||||||
|
if (fd < 0)
|
||||||
|
return -errno;
|
||||||
|
|
||||||
|
ret = ioctl(fd, BLKGETSIZE64, out_size);
|
||||||
|
close(fd);
|
||||||
|
if (!ret)
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* try mtd next */
|
||||||
|
ret = mtd_get_meminfo(path, &meminfo);
|
||||||
|
if (!ret) {
|
||||||
|
*out_size = meminfo.size;
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* state_backend_raw_file - create a raw file backend store for a state instance
|
* state_backend_raw_file - create a raw file backend store for a state instance
|
||||||
*
|
*
|
||||||
|
@ -1239,20 +1293,21 @@ int state_backend_raw_file(struct state *state, const char *of_path,
|
||||||
struct state_backend_raw *backend_raw;
|
struct state_backend_raw *backend_raw;
|
||||||
struct state_backend *backend;
|
struct state_backend *backend;
|
||||||
struct state_variable *sv;
|
struct state_variable *sv;
|
||||||
int ret;
|
|
||||||
struct stat s;
|
|
||||||
struct mtd_info_user meminfo;
|
struct mtd_info_user meminfo;
|
||||||
|
size_t path_size = 0;
|
||||||
|
int ret;
|
||||||
|
|
||||||
if (state->backend)
|
if (state->backend)
|
||||||
return -EBUSY;
|
return -EBUSY;
|
||||||
|
|
||||||
ret = stat(path, &s);
|
ret = state_backend_raw_file_get_size(path, &path_size);
|
||||||
if (!ret && S_ISCHR(s.st_mode)) {
|
if (ret)
|
||||||
if (size == 0)
|
return ret;
|
||||||
size = s.st_size;
|
|
||||||
else if (offset + size > s.st_size)
|
if (size == 0)
|
||||||
return -EINVAL;
|
size = path_size;
|
||||||
}
|
else if (offset + size > path_size)
|
||||||
|
return -EINVAL;
|
||||||
|
|
||||||
backend_raw = xzalloc(sizeof(*backend_raw));
|
backend_raw = xzalloc(sizeof(*backend_raw));
|
||||||
backend = &backend_raw->backend;
|
backend = &backend_raw->backend;
|
||||||
|
|
Loading…
Reference in New Issue