On 01/02/2017 09:51 AM, Ján Tomko wrote: > On Fri, Nov 18, 2016 at 09:26:36AM -0500, John Ferlan wrote: >> Create a utility routine in order to read the scsi_host fabric_name files >> looking for a match to a passed fabric_name >> >> Signed-off-by: John Ferlan <jferlan@xxxxxxxxxx> >> --- >> src/libvirt_private.syms | 1 + >> src/util/virutil.c | 86 >> ++++++++++++++++++++++++++++++++++++++++-------- >> src/util/virutil.h | 4 +++ >> 3 files changed, 78 insertions(+), 13 deletions(-) >> > >> diff --git a/src/util/virutil.c b/src/util/virutil.c >> index a135819..fb72f2d 100644 >> --- a/src/util/virutil.c >> +++ b/src/util/virutil.c >> @@ -2166,6 +2166,18 @@ virManageVport(const int parent_host, >> return ret; >> } >> >> +# define READ_WWN(wwn_path, buf) \ > > This macro either jumps to a label or alters a third variable. > I don't think its scope should extend one function. > >> + do { \ > >> + if (virFileReadAll(wwn_path, 1024, &buf) < 0) \ >> + goto cleanup; \ > > These two lines can be split out and with the STR{,N}EQ included, > this macro can be COMPARE_WWN, removing the need for changing > p. Or turned into a more complex function like virUSBSysReadFile. > Not quite sure why it's felt 'p' wouldn't need changing. On my test system the "port_name", "node_name", and "fabric_wwn" files each have "0x######\n", but the stored/XML format will be ###### Maybe it's just late and I'm overthinking it. >> + if ((p = strchr(buf, '\n'))) \ >> + *p = '\0'; \ >> + if (STRPREFIX(buf, "0x")) \ >> + p = buf + strlen("0x"); \ >> + else \ >> + p = buf; \ >> + } while (0) >> + >> /* virGetFCHostNameByWWN: >> * >> * Iterate over the sysfs tree to get FC host name (e.g. host5) > > The rest looks good to me. > So I went with a function: /* virReadCompareWWN * @prefix: path to the wwn file * @d_name: name of the current directory * @f_name: file name to read * * Read/compare the on-disk file with the passed wwn value. * * Returns: * -1 : Error * 0 : No match * 1 : Match */ static int virReadCompareWWN(const char *prefix, const char *d_name, const char *f_name, const char *wwn) { char *path; char *buf = NULL; char *p; int ret = -1; if (virAsprintf(&path, "%s/%s/%s", prefix, d_name, f_name) < 0) return -1; if (!virFileExists(path)) { ret = 0; goto cleanup; } if (virFileReadAll(path, 1024, &buf) < 0) goto cleanup; if ((p = strchr(buf, '\n'))) *p = '\0'; if (STRPREFIX(buf, "0x")) p = buf + strlen("0x"); else p = buf; if (STRNEQ(wwn, p)) ret = 0; else ret = 1; cleanup: VIR_FREE(path); VIR_FREE(buf); return ret; } It should be obvious what the callers do, but again I can post an updated series as long as you're generally fine with this. Tks - John -- libvir-list mailing list libvir-list@xxxxxxxxxx https://www.redhat.com/mailman/listinfo/libvir-list