From: Ladislav Michl <ladis@linux-mips.org> To: rauc@pengutronix.de Cc: Trent Piepho <tpiepho@impinj.com> Subject: [RAUC] [PATCH 1/3] Normalize device names to find mounted slots (2) Date: Fri, 10 May 2019 11:48:38 +0200 [thread overview] Message-ID: <20190510094838.GB29451@lenoch> (raw) In-Reply-To: <20190510094803.GA29451@lenoch> This one is meant to be squashed into this one: https://github.com/rauc/rauc/pull/406 --- src/config_file.c | 60 ++++++++++++++++++++++++++--------------------- 1 file changed, 33 insertions(+), 27 deletions(-) diff --git a/src/config_file.c b/src/config_file.c index 875e0ee..d966533 100644 --- a/src/config_file.c +++ b/src/config_file.c @@ -494,38 +494,44 @@ free: return res; } -// Something that is, or can be, mounted onto a mount point +/* Something that is, or can be, mounted onto a mount point */ typedef struct { - gboolean is_device; // vs being a loop mounted file - dev_t dev; // the device, or for a file, the device the file is on - ino_t inode; // inode of file for a non-device + dev_t dev; /* the device, or for a file, the device the file is on */ + ino_t inode; /* inode of file for a non-device */ + gchar is_device; /* vs being a loop mounted file */ } MountableObj; -// Take a device (or file) path and normalize it -static MountableObj *normalize_mountable_object(const gchar *devicepath) +/* Take a device (or file) path or name and normalize it */ +static gboolean normalize_mountable_object(const gchar *name, MountableObj *obj) { - MountableObj *obj; GStatBuf st; - if (g_stat(devicepath, &st) == -1) { + if (g_stat(name, &st) == -1) { /* Virtual filesystems like devpts trigger case */ - g_debug("Can't stat '%s', assuming unmountable: %s", devicepath, g_strerror(errno)); - return NULL; + g_debug("Can't stat '%s', assuming unmountable: %s", name, g_strerror(errno)); + return FALSE; } - obj = g_new0(MountableObj, 1); - if (S_ISBLK(st.st_mode)) { - obj->is_device = TRUE; + switch (st.st_mode & S_IFMT) { + case S_IFCHR: + obj->is_device = 1; obj->dev = st.st_rdev; - } else if (S_ISREG(st.st_mode)) { - obj->is_device = FALSE; + break; + case S_IFBLK: + obj->is_device = 2; + obj->dev = st.st_rdev; + break; + case S_IFDIR: + case S_IFREG: + obj->is_device = 0; obj->dev = st.st_dev; obj->inode = st.st_ino; - } else { - g_debug("Device '%s' is not something which is mountable", devicepath); - g_clear_pointer(&obj, g_free); + break; + default: + g_debug("Device '%s' is unmountable", name); + return FALSE; } - return obj; + return TRUE; } /* Compare two MountableObj for equality */ @@ -546,24 +552,24 @@ RaucSlot *find_slot_by_device(GHashTable *slots, const gchar *device) { GHashTableIter iter; RaucSlot *slot; - g_autofree MountableObj *obj = NULL; + MountableObj obj; + gboolean normalized; g_return_val_if_fail(slots, NULL); g_return_val_if_fail(device, NULL); - obj = normalize_mountable_object(device); + normalized = normalize_mountable_object(device, &obj); g_hash_table_iter_init(&iter, slots); while (g_hash_table_iter_next(&iter, NULL, (gpointer*) &slot)) { if (g_strcmp0(slot->device, device) == 0) goto out; - // Path doesn't match, but maybe device is same? - if (obj) { - g_autofree MountableObj *slot_obj = - normalize_mountable_object(slot->device); - - if (slot_obj && is_same_mountable_object(obj, slot_obj)) + /* Path doesn't match, but maybe device is the same? */ + if (normalized) { + MountableObj slot_obj; + if (normalize_mountable_object(slot->device, &slot_obj) && + is_same_mountable_object(&obj, &slot_obj)) goto out; } } -- 2.20.1 _______________________________________________ RAUC mailing list
next prev parent reply other threads:[~2019-05-10 9:48 UTC|newest] Thread overview: 4+ messages / expand[flat|nested] mbox.gz Atom feed top 2019-05-10 9:48 [RAUC] [RFC 0/3] Fix slots with nodev mounts Ladislav Michl 2019-05-10 9:48 ` Ladislav Michl [this message] 2019-05-10 9:49 ` [RAUC] [PATCH 2/3] Try harder to determine slot state (preview) Ladislav Michl 2019-05-10 9:49 ` [RAUC] [PATCH 3/3] Bind mount seed slot Ladislav Michl
Reply instructions: You may reply publicly to this message via plain-text email using any one of the following methods: * Save the following mbox file, import it into your mail client, and reply-to-all from there: mbox Avoid top-posting and favor interleaved quoting: https://en.wikipedia.org/wiki/Posting_style#Interleaved_style * Reply using the --to, --cc, and --in-reply-to switches of git-send-email(1): git send-email \ --in-reply-to=20190510094838.GB29451@lenoch \ --to=ladis@linux-mips.org \ --cc=rauc@pengutronix.de \ --cc=tpiepho@impinj.com \ --subject='Re: [RAUC] [PATCH 1/3] Normalize device names to find mounted slots (2)' \ /path/to/YOUR_REPLY https://kernel.org/pub/software/scm/git/docs/git-send-email.html * If your mail client supports setting the In-Reply-To header via mailto: links, try the mailto: link
This is a public inbox, see mirroring instructions for how to clone and mirror all data and code used for this inbox