Add a helper for /dev/block/major:minor paths

This commit is contained in:
Zbigniew Jędrzejewski-Szmek 2017-10-31 11:30:40 +01:00
parent 553e15f21b
commit c67f84b025
3 changed files with 17 additions and 15 deletions

View file

@ -33,3 +33,8 @@ int whitelisted_char_for_devnode(char c, const char *additional);
(strlen("/sys/dev/block/") + DECIMAL_STR_MAX(dev_t) + 1 + DECIMAL_STR_MAX(dev_t) + strlen_ptr(suffix)) (strlen("/sys/dev/block/") + DECIMAL_STR_MAX(dev_t) + 1 + DECIMAL_STR_MAX(dev_t) + strlen_ptr(suffix))
#define xsprintf_sys_block_path(buf, suffix, devno) \ #define xsprintf_sys_block_path(buf, suffix, devno) \
xsprintf(buf, "/sys/dev/block/%u:%u%s", major(devno), minor(devno), strempty(suffix)) xsprintf(buf, "/sys/dev/block/%u:%u%s", major(devno), minor(devno), strempty(suffix))
#define DEV_NUM_PATH_MAX \
(strlen("/dev/block/") + DECIMAL_STR_MAX(dev_t) + 1 + DECIMAL_STR_MAX(dev_t))
#define xsprintf_dev_num_path(buf, type, devno) \
xsprintf(buf, "/dev/%s/%u:%u", type, major(devno), minor(devno))

View file

@ -25,6 +25,7 @@
#include "bootspec.h" #include "bootspec.h"
#include "conf-files.h" #include "conf-files.h"
#include "def.h" #include "def.h"
#include "device-nodes.h"
#include "efivars.h" #include "efivars.h"
#include "fd-util.h" #include "fd-util.h"
#include "fileio.h" #include "fileio.h"
@ -420,7 +421,7 @@ static int verify_esp(
sd_id128_t *ret_uuid) { sd_id128_t *ret_uuid) {
_cleanup_blkid_free_probe_ blkid_probe b = NULL; _cleanup_blkid_free_probe_ blkid_probe b = NULL;
_cleanup_free_ char *t = NULL; char t[DEV_NUM_PATH_MAX];
uint64_t pstart = 0, psize = 0; uint64_t pstart = 0, psize = 0;
struct stat st, st2; struct stat st, st2;
const char *v, *t2; const char *v, *t2;
@ -478,10 +479,7 @@ static int verify_esp(
if (detect_container() > 0 || geteuid() != 0) if (detect_container() > 0 || geteuid() != 0)
goto finish; goto finish;
r = asprintf(&t, "/dev/block/%u:%u", major(st.st_dev), minor(st.st_dev)); xsprintf_dev_num_path(t, "block", st.st_dev);
if (r < 0)
return log_oom();
errno = 0; errno = 0;
b = blkid_new_probe_from_filename(t); b = blkid_new_probe_from_filename(t);
if (!b) if (!b)

View file

@ -25,6 +25,7 @@
#include <sys/stat.h> #include <sys/stat.h>
#include <unistd.h> #include <unistd.h>
#include "device-nodes.h"
#include "dirent-util.h" #include "dirent-util.h"
#include "format-util.h" #include "format-util.h"
#include "fs-util.h" #include "fs-util.h"
@ -337,7 +338,7 @@ out:
void udev_node_add(struct udev_device *dev, bool apply, void udev_node_add(struct udev_device *dev, bool apply,
mode_t mode, uid_t uid, gid_t gid, mode_t mode, uid_t uid, gid_t gid,
struct udev_list *seclabel_list) { struct udev_list *seclabel_list) {
char filename[sizeof("/dev/block/:") + 2*DECIMAL_STR_MAX(unsigned)]; char filename[DEV_NUM_PATH_MAX];
struct udev_list_entry *list_entry; struct udev_list_entry *list_entry;
log_debug("handling device node '%s', devnum=%s, mode=%#o, uid="UID_FMT", gid="GID_FMT, log_debug("handling device node '%s', devnum=%s, mode=%#o, uid="UID_FMT", gid="GID_FMT,
@ -347,10 +348,9 @@ void udev_node_add(struct udev_device *dev, bool apply,
return; return;
/* always add /dev/{block,char}/$major:$minor */ /* always add /dev/{block,char}/$major:$minor */
xsprintf(filename, "/dev/%s/%u:%u", xsprintf_dev_num_path(filename,
streq(udev_device_get_subsystem(dev), "block") ? "block" : "char", streq(udev_device_get_subsystem(dev), "block") ? "block" : "char",
major(udev_device_get_devnum(dev)), udev_device_get_devnum(dev));
minor(udev_device_get_devnum(dev)));
node_symlink(dev, udev_device_get_devnode(dev), filename); node_symlink(dev, udev_device_get_devnode(dev), filename);
/* create/update symlinks, add symlinks to name index */ /* create/update symlinks, add symlinks to name index */
@ -360,16 +360,15 @@ void udev_node_add(struct udev_device *dev, bool apply,
void udev_node_remove(struct udev_device *dev) { void udev_node_remove(struct udev_device *dev) {
struct udev_list_entry *list_entry; struct udev_list_entry *list_entry;
char filename[sizeof("/dev/block/:") + 2*DECIMAL_STR_MAX(unsigned)]; char filename[DEV_NUM_PATH_MAX];
/* remove/update symlinks, remove symlinks from name index */ /* remove/update symlinks, remove symlinks from name index */
udev_list_entry_foreach(list_entry, udev_device_get_devlinks_list_entry(dev)) udev_list_entry_foreach(list_entry, udev_device_get_devlinks_list_entry(dev))
link_update(dev, udev_list_entry_get_name(list_entry), false); link_update(dev, udev_list_entry_get_name(list_entry), false);
/* remove /dev/{block,char}/$major:$minor */ /* remove /dev/{block,char}/$major:$minor */
xsprintf(filename, "/dev/%s/%u:%u", xsprintf_dev_num_path(filename,
streq(udev_device_get_subsystem(dev), "block") ? "block" : "char", streq(udev_device_get_subsystem(dev), "block") ? "block" : "char",
major(udev_device_get_devnum(dev)), udev_device_get_devnum(dev));
minor(udev_device_get_devnum(dev)));
unlink(filename); unlink(filename);
} }