Signed-off-by: Kay Sievers <kay.sievers@suse.de>
#define PATH_TO_NAME_CHAR '@'
#define PATH_TO_NAME_CHAR '@'
-static int get_db_filename(const char *devpath, char *filename, size_t len)
+static int devpath_to_db_path(const char *devpath, char *filename, size_t len)
+ /* add location of db files */
start = strlcpy(filename, udev_db_path, len);
end = strlcat(filename, devpath, len);
if (end > len)
start = strlcpy(filename, udev_db_path, len);
end = strlcat(filename, devpath, len);
if (end > len)
+static int db_file_to_devpath(const char *filename, char *devpath, size_t len)
+{
+ size_t end, i;
+
+ strlcpy(devpath, "/", len);
+ end = strlcat(devpath, filename, len);
+
+ /* replace PATH_TO_NAME_CHAR to transform name into devpath */
+ for (i = 1; i < end; i++)
+ if (devpath[i] == PATH_TO_NAME_CHAR)
+ devpath[i] = '/';
+
+ return 0;
+}
+
int udev_db_add_device(struct udevice *udev)
{
char filename[PATH_SIZE];
int udev_db_add_device(struct udevice *udev)
{
char filename[PATH_SIZE];
- get_db_filename(udev->devpath, filename, sizeof(filename));
+ devpath_to_db_path(udev->devpath, filename, sizeof(filename));
create_path(filename);
f = fopen(filename, "w");
if (f == NULL) {
create_path(filename);
f = fopen(filename, "w");
if (f == NULL) {
}
dbg("storing data for device '%s' in '%s'", udev->devpath, filename);
}
dbg("storing data for device '%s' in '%s'", udev->devpath, filename);
- fprintf(f, "P:%s\n", udev->devpath);
fprintf(f, "N:%s\n", udev->name);
list_for_each_entry(name_loop, &udev->symlink_list, node)
fprintf(f, "S:%s\n", name_loop->name);
fprintf(f, "N:%s\n", udev->name);
list_for_each_entry(name_loop, &udev->symlink_list, node)
fprintf(f, "S:%s\n", name_loop->name);
-static int parse_db_file(struct udevice *udev, const char *filename)
+int udev_db_get_device(struct udevice *udev, const char *devpath)
+ char filename[PATH_SIZE];
char line[PATH_SIZE];
unsigned int major, minor;
char *bufline;
char line[PATH_SIZE];
unsigned int major, minor;
char *bufline;
size_t cur;
size_t count;
size_t cur;
size_t count;
+ devpath_to_db_path(devpath, filename, sizeof(filename));
if (file_map(filename, &buf, &bufsize) != 0) {
dbg("no db file to read '%s'", filename);
return -1;
}
if (file_map(filename, &buf, &bufsize) != 0) {
dbg("no db file to read '%s'", filename);
return -1;
}
+ strlcpy(udev->devpath, devpath, sizeof(udev->devpath));
cur = 0;
while (cur < bufsize) {
count = buf_get_line(buf, bufsize, cur);
cur = 0;
while (cur < bufsize) {
count = buf_get_line(buf, bufsize, cur);
cur += count+1;
switch(bufline[0]) {
cur += count+1;
switch(bufline[0]) {
- case 'P':
- if (count > sizeof(udev->devpath))
- count = sizeof(udev->devpath);
- memcpy(udev->devpath, &bufline[2], count-2);
- udev->devpath[count-2] = '\0';
- break;
case 'N':
if (count > sizeof(udev->name))
count = sizeof(udev->name);
case 'N':
if (count > sizeof(udev->name))
count = sizeof(udev->name);
{
char filename[PATH_SIZE];
{
char filename[PATH_SIZE];
- get_db_filename(udev->devpath, filename, sizeof(filename));
+ devpath_to_db_path(udev->devpath, filename, sizeof(filename));
unlink(filename);
return 0;
}
unlink(filename);
return 0;
}
-int udev_db_get_device(struct udevice *udev, const char *devpath)
-{
- char filename[PATH_SIZE];
-
- get_db_filename(devpath, filename, sizeof(filename));
- if (parse_db_file(udev, filename) != 0)
- return -1;
-
- return 0;
-}
-
-int udev_db_search_name(const char *name, char *devpath, size_t len)
+int udev_db_lookup_name(const char *name, char *devpath, size_t len)
int found = 0;
dir = opendir(udev_db_path);
int found = 0;
dir = opendir(udev_db_path);
ent = readdir(dir);
if (ent == NULL || ent->d_name[0] == '\0')
break;
ent = readdir(dir);
if (ent == NULL || ent->d_name[0] == '\0')
break;
if (ent->d_name[0] == '.')
continue;
if (ent->d_name[0] == '.')
continue;
cur += count+1;
switch(bufline[0]) {
cur += count+1;
switch(bufline[0]) {
- case 'P':
- if (count > sizeof(path))
- count = sizeof(path);
- memcpy(path, &bufline[2], count-2);
- path[count-2] = '\0';
- break;
case 'N':
case 'S':
if (count > sizeof(nodename))
case 'N':
case 'S':
if (count > sizeof(nodename))
nodename[count-2] = '\0';
dbg("compare '%s' '%s'", nodename, name);
if (strcmp(nodename, name) == 0) {
nodename[count-2] = '\0';
dbg("compare '%s' '%s'", nodename, name);
if (strcmp(nodename, name) == 0) {
+ db_file_to_devpath(ent->d_name, devpath, len);
- if (found) {
- strlcpy(devpath, path, len);
ent = readdir(dir);
if (ent == NULL || ent->d_name[0] == '\0')
break;
ent = readdir(dir);
if (ent == NULL || ent->d_name[0] == '\0')
break;
if (ent->d_name[0] == '.')
continue;
if (ent->d_name[0] == '.')
continue;
extern int udev_db_delete_device(struct udevice *dev);
extern int udev_db_get_device(struct udevice *udev, const char *devpath);
extern int udev_db_delete_device(struct udevice *dev);
extern int udev_db_get_device(struct udevice *udev, const char *devpath);
-extern int udev_db_search_name(const char *name, char *devpath, size_t len);
+extern int udev_db_lookup_name(const char *name, char *devpath, size_t len);
extern int udev_db_get_all_entries(struct list_head *name_list);
#endif /* _UDEV_DB_H_ */
extern int udev_db_get_all_entries(struct list_head *name_list);
#endif /* _UDEV_DB_H_ */
strlcpy(filename, name, sizeof(filename));
while (1) {
dbg("look for existing node '%s'", filename);
strlcpy(filename, name, sizeof(filename));
while (1) {
dbg("look for existing node '%s'", filename);
- if (udev_db_search_name(filename, db_devpath, sizeof(db_devpath)) != 0) {
+ if (udev_db_lookup_name(filename, db_devpath, sizeof(db_devpath)) != 0) {
dbg("free num=%d", num);
break;
}
dbg("free num=%d", num);
break;
}
- retval = udev_db_search_name(pos, devpath, sizeof(devpath));
+ retval = udev_db_lookup_name(pos, devpath, sizeof(devpath));
if (retval != 0) {
fprintf(stderr, "no record for '%s' in database\n", pos);
goto exit;
if (retval != 0) {
fprintf(stderr, "no record for '%s' in database\n", pos);
goto exit;