X-Git-Url: http://www.chiark.greenend.org.uk/ucgi/~ianmdlvl/git?p=elogind.git;a=blobdiff_plain;f=udev_db.c;h=f9adf5c6317554b6bb53cc9d24989f879b28a21f;hp=afbd50e50fc00fdfb9fa1948a209f0d8ec2893b4;hb=2b996ad19339858ab702c27c9976581ca6784628;hpb=8a4c0c32f4252efb0f0adbf5cdc0261d359cd568 diff --git a/udev_db.c b/udev_db.c index afbd50e50..f9adf5c63 100644 --- a/udev_db.c +++ b/udev_db.c @@ -1,8 +1,6 @@ /* * udev_db.c * - * Userspace devfs - * * Copyright (C) 2003 Greg Kroah-Hartman * Copyright (C) 2004-2005 Kay Sievers * @@ -68,10 +66,18 @@ int udev_db_add_device(struct udevice *udev) if (udev->test_run) return 0; - get_db_filename(udev->devpath, filename, sizeof(filename)); + /* don't write anything if udev created only the node with the + * kernel name without any interesting data to remember + */ + if (strcmp(udev->name, udev->kernel_name) == 0 && + list_empty(&udev->symlink_list) && list_empty(&udev->env_list) && + !udev->partitions && !udev->ignore_remove) { + dbg("nothing interesting to store in udevdb, skip"); + goto exit; + } + get_db_filename(udev->devpath, filename, sizeof(filename)); create_path(filename); - f = fopen(filename, "w"); if (f == NULL) { err("unable to create db file '%s'", filename); @@ -84,11 +90,15 @@ int udev_db_add_device(struct udevice *udev) list_for_each_entry(name_loop, &udev->symlink_list, node) fprintf(f, "S:%s\n", name_loop->name); 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); - + if (udev->partitions) + fprintf(f, "A:%u\n", udev->partitions); + if (udev->ignore_remove) + fprintf(f, "R:%u\n", udev->ignore_remove); + list_for_each_entry(name_loop, &udev->env_list, node) + fprintf(f, "E:%s\n", name_loop->name); fclose(f); +exit: return 0; } @@ -117,38 +127,51 @@ static int parse_db_file(struct udevice *udev, const char *filename) case 'P': if (count > sizeof(udev->devpath)) count = sizeof(udev->devpath); - strlcpy(udev->devpath, &bufline[2], count-1); + memcpy(udev->devpath, &bufline[2], count-2); + udev->devpath[count-2] = '\0'; break; case 'N': if (count > sizeof(udev->name)) count = sizeof(udev->name); - strlcpy(udev->name, &bufline[2], count-1); + memcpy(udev->name, &bufline[2], count-2); + udev->name[count-2] = '\0'; break; case 'M': if (count > sizeof(line)) count = sizeof(line); - strlcpy(line, &bufline[2], count-1); + memcpy(line, &bufline[2], count-2); + line[count-2] = '\0'; sscanf(line, "%u:%u", &major, &minor); udev->devt = makedev(major, minor); break; case 'S': if (count > sizeof(line)) count = sizeof(line); - strlcpy(line, &bufline[2], count-1); + memcpy(line, &bufline[2], count-2); + line[count-2] = '\0'; name_list_add(&udev->symlink_list, line, 0); break; case 'A': if (count > sizeof(line)) count = sizeof(line); - strlcpy(line, &bufline[2], count-1); + memcpy(line, &bufline[2], count-2); + line[count-2] = '\0'; udev->partitions = atoi(line); break; case 'R': if (count > sizeof(line)) count = sizeof(line); - strlcpy(line, &bufline[2], count-1); + memcpy(line, &bufline[2], count-2); + line[count-2] = '\0'; udev->ignore_remove = atoi(line); break; + case 'E': + if (count > sizeof(line)) + count = sizeof(line); + memcpy(line, &bufline[2], count-2); + line[count-2] = '\0'; + name_list_add(&udev->env_list, line, 0); + break; } } file_unmap(buf, bufsize); @@ -228,16 +251,19 @@ int udev_db_search_name(char *devpath, size_t len, const char *name) case 'P': if (count > sizeof(path)) count = sizeof(path); - strlcpy(path, &bufline[2], count-1); + memcpy(path, &bufline[2], count-2); + path[count-2] = '\0'; break; case 'N': case 'S': if (count > sizeof(nodename)) count = sizeof(nodename); - strlcpy(nodename, &bufline[2], count-1); + memcpy(nodename, &bufline[2], count-2); + nodename[count-2] = '\0'; dbg("compare '%s' '%s'", nodename, name); if (strcmp(nodename, name) == 0) { - strlcpy(devpath, path, len); + memcpy(devpath, &bufline[2], count-2); + devpath[count-2] = '\0'; file_unmap(buf, bufsize); closedir(dir); return 0; @@ -303,12 +329,14 @@ int udev_db_dump_names(int (*handler_function)(const char *path, const char *nam case 'P': if (count > sizeof(path)) count = sizeof(path); - strlcpy(path, &bufline[2], count-1); + memcpy(path, &bufline[2], count-2); + path[count-2] = '\0'; break; case 'N': if (count > sizeof(nodename)) count = sizeof(nodename); - strlcpy(nodename, &bufline[2], count-1); + memcpy(nodename, &bufline[2], count-2); + nodename[count-2] = '\0'; break; default: continue;