X-Git-Url: https://www.chiark.greenend.org.uk/ucgi/~ianmdlvl/git?p=elogind.git;a=blobdiff_plain;f=udev_db.c;h=b9c504430f311a7dfd5aced114fbda9ab2637d60;hp=f2a890ea421c7b3ad8b633a8275727298b5ff405;hb=7e720bd4ad8257d81d273d98294ebbcc03ade9ba;hpb=02fa9ae58920b431bc37182716dd863f1c482651;ds=sidebyside diff --git a/udev_db.c b/udev_db.c index f2a890ea4..b9c504430 100644 --- a/udev_db.c +++ b/udev_db.c @@ -33,7 +33,7 @@ #include "libsysfs/sysfs/libsysfs.h" #include "udev.h" -#include "udev_lib.h" +#include "udev_utils.h" #include "logging.h" #include "udev_db.h" @@ -79,7 +79,9 @@ int udev_db_add_device(struct udevice *udev) fprintf(f, "P:%s\n", udev->devpath); fprintf(f, "N:%s\n", udev->name); fprintf(f, "S:%s\n", udev->symlink); - fprintf(f, "A:%d\n", udev->partitions); + fprintf(f, "M:%u:%u\n", major(udev->devt), minor(udev->devt)); + fprintf(f, "A:%u\n", udev->partitions); + fprintf(f, "R:%u\n", udev->ignore_remove); fclose(f); @@ -89,6 +91,8 @@ int udev_db_add_device(struct udevice *udev) static int parse_db_file(struct udevice *udev, const char *filename) { char line[NAME_SIZE]; + char temp[NAME_SIZE]; + unsigned int major, minor; char *bufline; char *buf; size_t bufsize; @@ -111,21 +115,42 @@ static int parse_db_file(struct udevice *udev, const char *filename) if (count > DEVPATH_SIZE) count = DEVPATH_SIZE-1; strncpy(udev->devpath, &bufline[2], count-2); + udev->devpath[count-2] = '\0'; break; case 'N': if (count > NAME_SIZE) count = NAME_SIZE-1; strncpy(udev->name, &bufline[2], count-2); + udev->name[count-2] = '\0'; + break; + case 'M': + if (count > NAME_SIZE) + count = NAME_SIZE-1; + strncpy(temp, &bufline[2], count-2); + temp[count-2] = '\0'; + sscanf(temp, "%u:%u", &major, &minor); + udev->devt = makedev(major, minor); break; case 'S': if (count > NAME_SIZE) count = NAME_SIZE-1; strncpy(udev->symlink, &bufline[2], count-2); + udev->symlink[count-2] = '\0'; break; case 'A': - strfieldcpy(line, &bufline[2]); + if (count > NAME_SIZE) + count = NAME_SIZE-1; + strncpy(line, &bufline[2], count-2); + line[count-2] = '\0'; udev->partitions = atoi(line); break; + case 'R': + if (count > NAME_SIZE) + count = NAME_SIZE-1; + strncpy(line, &bufline[2], count-2); + line[count-2] = '\0'; + udev->ignore_remove = atoi(line); + break; } } @@ -181,7 +206,7 @@ int udev_db_get_device_byname(struct udevice *udev, const char *name) memset(&db_udev, 0x00, sizeof(struct udevice)); if (parse_db_file(&db_udev, filename) == 0) { char *pos; - int len; + unsigned int len; if (strncmp(name, db_udev.name, NAME_SIZE) == 0) { goto found;