summaryrefslogtreecommitdiff
path: root/ubi-utils/src/libubi.c
diff options
context:
space:
mode:
authorArtem Bityutskiy <Artem.Bityutskiy@nokia.com>2009-04-26 09:01:12 +0300
committerArtem Bityutskiy <Artem.Bityutskiy@nokia.com>2009-05-11 12:05:50 +0300
commit32252f2b902d88f2991d260f2982b10b2016c33b (patch)
tree3081ae785d80c563837815a5b053747f0c9d1f34 /ubi-utils/src/libubi.c
parente7454c3c3928ee7af7e76c0521f477881c9bf60f (diff)
ubi-utils: add sysfs interface support and new tool
This large commit makes several things. 1. Switches libmtd to use the new sysfs interface 2. Implements new handy 'mtdinfo' utility 3. Does minore amendmends in libubi and some ubi-tools. Signed-off-by: Artem Bityutskiy <Artem.Bityutskiy@nokia.com>
Diffstat (limited to 'ubi-utils/src/libubi.c')
-rw-r--r--ubi-utils/src/libubi.c35
1 files changed, 17 insertions, 18 deletions
diff --git a/ubi-utils/src/libubi.c b/ubi-utils/src/libubi.c
index 5c8ce9e..5b22e21 100644
--- a/ubi-utils/src/libubi.c
+++ b/ubi-utils/src/libubi.c
@@ -24,12 +24,12 @@
#include <stdio.h>
#include <string.h>
#include <fcntl.h>
-#include <sys/stat.h>
-#include <sys/types.h>
#include <dirent.h>
#include <unistd.h>
-#include <sys/ioctl.h>
#include <limits.h>
+#include <sys/ioctl.h>
+#include <sys/stat.h>
+#include <sys/types.h>
#include <libubi.h>
#include "libubi_int.h"
#include "common.h"
@@ -94,7 +94,6 @@ static int read_positive_ll(const char *file, long long *value)
}
if (sscanf(buf, "%lld\n", value) != 1) {
- /* This must be a UBI bug */
errmsg("cannot read integer from \"%s\"\n", file);
errno = EINVAL;
goto out_error;
@@ -227,7 +226,7 @@ static int read_major(const char *file, int *major, int *minor)
/**
* dev_read_int - read a positive 'int' value from an UBI device sysfs file.
* @patt: file pattern to read from
- * @dev_num: UBI device number
+ * @dev_num: UBI device number
* @value: the result is stored here
*
* This function returns %0 in case of success and %-1 in case of failure.
@@ -422,9 +421,9 @@ static int vol_node2nums(struct libubi *lib, const char *node, int *dev_num,
* dev_node2num - find UBI device number by its character device node.
* @lib: UBI library descriptor
* @node: UBI character device node name
+ * @dev_num: UBI device number is returned here
*
- * This function returns positive UBI device number in case of success and %-1
- * in case of failure.
+ * This function returns %0 in case of success and %-1 in case of failure.
*/
static int dev_node2num(struct libubi *lib, const char *node, int *dev_num)
{
@@ -433,8 +432,7 @@ static int dev_node2num(struct libubi *lib, const char *node, int *dev_num)
int i, major, minor;
if (stat(node, &st))
- return sys_errmsg("cannot get information about \"%s\"",
- node);
+ return sys_errmsg("cannot get information about \"%s\"", node);
if (!S_ISCHR(st.st_mode)) {
errno = EINVAL;
@@ -749,8 +747,7 @@ int ubi_probe_node(libubi_t desc, const char *node)
char file[strlen(lib->ubi_vol) + 100];
if (stat(node, &st))
- return sys_errmsg("cannot get information about \"%s\"",
- node);
+ return sys_errmsg("cannot get information about \"%s\"", node);
if (!S_ISCHR(st.st_mode)) {
errmsg("\"%s\" is not a character device", node);
@@ -837,9 +834,10 @@ int ubi_get_info(libubi_t desc, struct ubi_info *info)
if (!dirent)
break;
- if (strlen(dirent->d_name) > 256) {
+ if (strlen(dirent->d_name) >= 255) {
errmsg("invalid entry in %s: \"%s\"",
lib->sysfs_ubi, dirent->d_name);
+ errno = EINVAL;
goto out_close;
}
@@ -896,6 +894,7 @@ int ubi_mkvol(libubi_t desc, const char *node, struct ubi_mkvol_request *req)
strncpy(r.name, req->name, UBI_MAX_VOLUME_NAME + 1);
r.name_len = n;
+ desc = desc;
fd = open(node, O_RDONLY);
if (fd == -1)
return sys_errmsg("cannot open \"%s\"", node);
@@ -1036,10 +1035,8 @@ int ubi_get_dev_info1(libubi_t desc, int dev_num, struct ubi_dev_info *info)
memset(info, '\0', sizeof(struct ubi_dev_info));
info->dev_num = dev_num;
- if (!dev_present(lib, dev_num)) {
- errno = ENODEV;
+ if (!dev_present(lib, dev_num))
return -1;
- }
sysfs_ubi = opendir(lib->sysfs_ubi);
if (!sysfs_ubi)
@@ -1056,7 +1053,7 @@ int ubi_get_dev_info1(libubi_t desc, int dev_num, struct ubi_dev_info *info)
if (!dirent)
break;
- if (strlen(dirent->d_name) > 256) {
+ if (strlen(dirent->d_name) >= 255) {
errmsg("invalid entry in %s: \"%s\"",
lib->sysfs_ubi, dirent->d_name);
goto out_close;
@@ -1120,7 +1117,8 @@ int ubi_get_dev_info(libubi_t desc, const char *node, struct ubi_dev_info *info)
err = ubi_probe_node(desc, node);
if (err != 1) {
- errno = ENODEV;
+ if (err == 2)
+ errno = ENODEV;
return -1;
}
@@ -1196,7 +1194,8 @@ int ubi_get_vol_info(libubi_t desc, const char *node, struct ubi_vol_info *info)
err = ubi_probe_node(desc, node);
if (err != 2) {
- errno = ENODEV;
+ if (err == 1)
+ errno = ENODEV;
return -1;
}