From 7eb95d226f6b3f95174518dbfc403b45edf823a9 Mon Sep 17 00:00:00 2001 From: fengtao Date: Thu, 20 Feb 2020 16:57:14 +0800 Subject: [PATCH 1/2] init --- libhbalinux-1.0.13-conf.patch | 28 ++ libhbalinux-1.0.17.tar.gz | Bin 0 -> 42628 bytes libhbalinux-fix-non-pci-netdev.patch | 719 +++++++++++++++++++++++++++ libhbalinux.spec | 89 ++++ libhbalinux_bak.spec | 173 +++++++ 5 files changed, 1009 insertions(+) create mode 100644 libhbalinux-1.0.13-conf.patch create mode 100644 libhbalinux-1.0.17.tar.gz create mode 100644 libhbalinux-fix-non-pci-netdev.patch create mode 100644 libhbalinux.spec create mode 100644 libhbalinux_bak.spec diff --git a/libhbalinux-1.0.13-conf.patch b/libhbalinux-1.0.13-conf.patch new file mode 100644 index 0000000..7f999f6 --- /dev/null +++ b/libhbalinux-1.0.13-conf.patch @@ -0,0 +1,28 @@ +diff --git a/Makefile.am b/Makefile.am +index 1349e7b..7c5ac14 100644 +--- a/Makefile.am ++++ b/Makefile.am +@@ -12,23 +12,3 @@ pkgconfigdir = $(libdir)/pkgconfig + pkgconfig_DATA = libhbalinux.pc + + dist_noinst_DATA = README COPYING INSTALL libhbalinux.pc.in libhbalinux.spec +- +-install-data-hook: libhbalinux.la +- . $${PWD}/$<; \ +- ORG=org.open-fcoe.libhbalinux; \ +- LIB=${libdir}/$${dlname}; \ +- STR="$$ORG $$LIB"; \ +- CONF=${sysconfdir}/hba.conf; \ +- if test -f $$CONF; then \ +- grep -E -q ^[[:space:]]*$$ORG[[:space:]]+$$LIB $$CONF; \ +- if test $$? -ne 0; then \ +- echo $$STR >> $$CONF; \ +- else \ +- echo "** $$CONF already configured"; \ +- echo "** system configuration not updated"; \ +- fi; \ +- else \ +- echo "** WARNING: $$CONF does not exist"; \ +- echo "** system configuration not updated"; \ +- fi +- diff --git a/libhbalinux-1.0.17.tar.gz b/libhbalinux-1.0.17.tar.gz new file mode 100644 index 0000000000000000000000000000000000000000..ba5c2c4a6f96033ef35581321f12647d2e804403 GIT binary patch literal 42628 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 literal 0 HcmV?d00001 diff --git a/libhbalinux-fix-non-pci-netdev.patch b/libhbalinux-fix-non-pci-netdev.patch new file mode 100644 index 0000000..afb6f5b --- /dev/null +++ b/libhbalinux-fix-non-pci-netdev.patch @@ -0,0 +1,719 @@ +diff --git a/Makefile.am b/Makefile.am +index 1349e7b..068dc10 100644 +--- a/Makefile.am ++++ b/Makefile.am +@@ -1,12 +1,12 @@ +-AM_CFLAGS = $(HBAAPI_CFLAGS) $(PCIACCESS_CFLAGS) +-AM_LDFLAGS= $(PCIACCESS_LIBS) ++AM_CFLAGS = $(HBAAPI_CFLAGS) $(PCIACCESS_CFLAGS) $(LIBUDEV_CFLAGS) ++AM_LDFLAGS= $(PCIACCESS_LIBS) $(LIBUDEV_LIBS) + + lib_LTLIBRARIES = libhbalinux.la + libhbalinux_la_SOURCES = adapt.c adapt_impl.h api_lib.h bind.c bind_impl.h \ + fc_scsi.h fc_types.h lib.c lport.c net_types.h pci.c rport.c scsi.c sg.c \ + utils.c utils.h + libhbalinux_la_LDFLAGS = -version-info 2:2:0 +-libhbalinux_la_LIBADD = $(PCIACCESS_LIBS) ++libhbalinux_la_LIBADD = $(PCIACCESS_LIBS) $(LIBUDEV_LIBS) + + pkgconfigdir = $(libdir)/pkgconfig + pkgconfig_DATA = libhbalinux.pc +diff --git a/adapt_impl.h b/adapt_impl.h +index d86c2f8..9d9a347 100644 +--- a/adapt_impl.h ++++ b/adapt_impl.h +@@ -151,7 +151,7 @@ HBA_STATUS scsi_report_luns_v2(HBA_HANDLE, HBA_WWN, HBA_WWN, + HBA_STATUS sg_issue_inquiry(const char *, HBA_UINT8, HBA_UINT8, + void *, HBA_UINT32 *, HBA_UINT8 *, void *, HBA_UINT32 *); + +-void adapter_init(void); ++int adapter_init(void); + void adapter_shutdown(void); + + /* struct port_stats; */ +diff --git a/configure.ac b/configure.ac +index 8dadf29..758cadb 100644 +--- a/configure.ac ++++ b/configure.ac +@@ -13,6 +13,10 @@ AC_SUBST(PCIACCESS_LIBS) + PKG_CHECK_MODULES(HBAAPI, HBAAPI) + AC_SUBST(HBAAPI_CFLAGS) + ++PKG_CHECK_MODULES(LIBUDEV, libudev) ++AC_SUBST(LIBUDEV_CFLAGS) ++AC_SUBST(LIBUDEV_LIBS) ++ + AC_CONFIG_FILES([Makefile libhbalinux.spec libhbalinux.pc]) + AC_OUTPUT + +diff --git a/libhbalinux.spec.in b/libhbalinux.spec.in +index 344c166..4690da9 100644 +--- a/libhbalinux.spec.in ++++ b/libhbalinux.spec.in +@@ -9,7 +9,7 @@ URL: http://www.open-fcoe.org + Source0: http://www.open-fcoe.org/openfc/%{name}-%{version}.tar.gz + BuildRoot: %{_tmppath}/%{name}-%{version}-%{release}-root-%(%{__id_u} -n) + +-BuildRequires: libHBAAPI-devel libpciaccess-devel ++BuildRequires: libHBAAPI-devel libpciaccess-devel systemd-devel + Requires: libHBAAPI + + %description +diff --git a/lport.c b/lport.c +index bc34078..695bdc6 100644 +--- a/lport.c ++++ b/lport.c +@@ -20,6 +20,8 @@ + #include "api_lib.h" + #include "adapt_impl.h" + ++#include ++ + #ifndef HBA_STATUS_ERROR_ILLEGAL_FCID + #define HBA_STATUS_ERROR_ILLEGAL_FCID 33 /* defined after HBA-API 2.2 */ + #endif +@@ -88,18 +90,16 @@ struct sa_nameval port_speeds_table[] = { + * and convert them to bitmasks for the HBA_PORTSPEED supported + * Format expected: "1 Gbit[, 10 Gbit]", etc. + */ +-static int sys_read_speed(const char *dir, const char *file, char *buf, +- size_t buflen, HBA_PORTSPEED *speeds) ++static int sys_read_speed(const char *speedstr, HBA_PORTSPEED *speeds) + { + int rc = 0; + u_int32_t val = 0; + int len = 0; +- char *cp; ++ const char *cp; + struct sa_nameval *tp = port_speeds_table; + +- rc = sa_sys_read_line(dir, file, buf, buflen); +- if (rc == 0 && strstr(buf, "Unknown") == NULL) { +- for (cp = buf; *cp != '\0';) { ++ if (rc == 0 && strstr(speedstr, "Unknown") == NULL) { ++ for (cp = speedstr; *cp != '\0';) { + for (; tp->nv_name != NULL; tp++) { + len = strlen(tp->nv_name); + if (strncasecmp(tp->nv_name, cp, len) == 0) { +@@ -140,69 +140,189 @@ counting_rports(struct dirent *dp, void *arg) + return HBA_STATUS_OK; + } + +-static int +-check_ifindex(struct dirent *dp, void *arg) ++static void ++sysfs_scan_pci(struct udev_device *pci, ++ struct hba_info *hba_info, ++ HBA_ADAPTERATTRIBUTES *atp ++ ) + { +- char *ifindex = (char *)arg; +- char hba_dir[256]; ++ const char *attr; ++ const char *hba_dir; + char buf[256]; +- int rc; +- +- snprintf(hba_dir, sizeof(hba_dir), +- SYSFS_HBA_DIR "/%s", dp->d_name); +- memset(buf, 0, sizeof(buf)); +- rc = sa_sys_read_line(hba_dir, "ifindex", buf, sizeof(buf) - 1); +- if (rc) +- return 0; +- if (!strncmp(ifindex, buf, sizeof(buf))) { +- strcpy(arg, dp->d_name); +- return 1; ++ char *saveptr; /* for strtok_r */ ++ ++ /* Get vendor_id */ ++ attr = udev_device_get_sysattr_value(pci, "vendor"); ++ hba_info->vendor_id = strtoul(attr, NULL, 0); ++ ++ /* Get device_id */ ++ attr = udev_device_get_sysattr_value(pci, "device"); ++ hba_info->device_id = strtoul(attr, NULL, 0); ++ ++ /* Get subsystem_vendor_id */ ++ attr = udev_device_get_sysattr_value(pci, "subsystem_vendor"); ++ hba_info->subsystem_vendor_id = strtoul(attr, NULL, 0); ++ ++ /* Get subsystem_device_id */ ++ attr = udev_device_get_sysattr_value(pci, "subsystem_device"); ++ hba_info->subsystem_device_id = strtoul(attr, NULL, 0); ++ ++ /* Get device_class */ ++ attr = udev_device_get_sysattr_value(pci, "class"); ++ hba_info->device_class = strtoul(attr, NULL, 0); ++ hba_info->device_class = hba_info->device_class>>8; ++ ++ /* ++ * Get Hardware Information via PCI Library ++ */ ++ ++ sscanf(udev_device_get_sysname(pci), "%x:%x:%x:%x", ++ &hba_info->domain, &hba_info->bus, ++ &hba_info->dev, &hba_info->func); ++ (void) find_pci_device(hba_info); ++ ++ /* Get Number of Ports */ ++ atp->NumberOfPorts = hba_info->NumberOfPorts; ++ ++ /* Get Manufacturer */ ++ sa_strncpy_safe(atp->Manufacturer, sizeof(atp->Manufacturer), ++ hba_info->Manufacturer, sizeof(hba_info->Manufacturer)); ++ ++ /* Get SerialNumber */ ++ sa_strncpy_safe(atp->SerialNumber, sizeof(atp->SerialNumber), ++ hba_info->SerialNumber, sizeof(hba_info->SerialNumber)); ++ ++ ++ /* Get ModelDescription */ ++ sa_strncpy_safe(atp->ModelDescription, sizeof(atp->ModelDescription), ++ hba_info->ModelDescription, ++ sizeof(hba_info->ModelDescription)); ++ if (!strncmp(hba_info->ModelDescription, "Unknown", ++ sizeof(hba_info->ModelDescription))) { ++ snprintf(atp->ModelDescription, sizeof(atp->ModelDescription), ++ "[%04x:%04x]-[%04x:%04x]-(%04x)", ++ hba_info->vendor_id, hba_info->device_id, ++ hba_info->subsystem_vendor_id, ++ hba_info->subsystem_device_id, ++ hba_info->device_class); ++ /* ++ * Get Model ++ * ++ * If the device is a newly developed product, and ++ * the model description is not in pci.ids yet, use ++ * the model description constructed above as the ++ * model string. ++ */ ++ sa_strncpy_safe(atp->Model, sizeof(atp->Model), ++ atp->ModelDescription, ++ sizeof(atp->ModelDescription)); + } +- return 0; ++ ++ /* ++ * Get Model ++ * ++ * If the device name has already been added into ++ * the pci.ids file, use the first word of the model ++ * description as the model. If the space after the ++ * first word is not found (new product), use the ++ * model description as the model. ++ */ ++ sa_strncpy_safe(buf, sizeof(buf), atp->ModelDescription, ++ sizeof(atp->ModelDescription)); ++ if (strtok_r(buf, " ", &saveptr)) ++ sa_strncpy_safe(atp->Model, sizeof(atp->Model), ++ buf, strnlen(buf, sizeof(buf))); ++ else ++ sa_strncpy_safe(atp->Model, sizeof(atp->Model), ++ atp->ModelDescription, ++ sizeof(atp->ModelDescription)); ++ ++ /* Get HardwareVersion */ ++ sa_strncpy_safe(atp->HardwareVersion, sizeof(atp->HardwareVersion), ++ hba_info->HardwareVersion, ++ sizeof(hba_info->HardwareVersion)); ++ ++ /* Get OptionROMVersion (TODO) */ ++ sa_strncpy_safe(atp->OptionROMVersion, sizeof(atp->OptionROMVersion), ++ HBA_ROM_VERSION, sizeof(HBA_ROM_VERSION)); ++ ++ /* Get FirmwareVersion (TODO) */ ++ sa_strncpy_safe(atp->FirmwareVersion, sizeof(atp->FirmwareVersion), ++ HBA_FW_VERSION, sizeof(HBA_FW_VERSION)); ++ ++ /* Get VendorSpecificID (TODO) */ ++ atp->VendorSpecificID = HBA_VENDOR_SPECIFIC_ID; ++ ++ /* Get DriverVersion */ ++ hba_dir = udev_device_get_syspath(pci); ++ sa_sys_read_line(hba_dir, SYSFS_MODULE_VER, ++ atp->DriverVersion, sizeof(atp->DriverVersion)); + } + +-/* +- * find_phys_if - find the regular network interface name that +- * has the ifindex that matches the specified iflink. +- * This ifname will be used to find the PCI info +- * of a VLAN interface. +- * hba_dir: hba_dir of VLAN interface. +- * buf: returns ifname of regular network interface. +- */ +-static int +-find_phys_if(char *hba_dir, char *buf, size_t len) ++struct udev_device * ++find_netdev_by_ifindex(struct udev *udev, const char *ifindex) + { +- int rc; ++ struct udev_enumerate *ue; ++ struct udev_list_entry *head; ++ struct udev_device *newnet = NULL; + +- rc = sa_sys_read_line(hba_dir, "iflink", buf, len); +- if (rc) +- return 1; +- /* +- * Search for the regular network interface and +- * return the interface name in the buf. +- */ +- sa_dir_read(SYSFS_HBA_DIR, check_ifindex, buf); +- return 0; ++ ue = udev_enumerate_new(udev); ++ udev_enumerate_add_match_subsystem(ue, "net"); ++ udev_enumerate_add_match_sysattr(ue, "ifindex", ifindex); ++ udev_enumerate_scan_devices(ue); ++ /* enumerate returns a list, but there should only ever be one device ++ * with a given ifindex */ ++ head = udev_enumerate_get_list_entry(ue); ++ if (head) ++ newnet = udev_device_new_from_syspath(udev, udev_list_entry_get_name(head)); ++ udev_enumerate_unref(ue); ++ return newnet; ++} ++ ++struct udev_device * ++find_phys_if(struct udev_device *net) ++{ ++ const char *ifindex; ++ const char *iflink; ++ struct udev *udev; ++ struct udev_device *lower = NULL; ++ ++ ifindex = udev_device_get_sysattr_value(net, "ifindex"); ++ iflink = udev_device_get_sysattr_value(net, "iflink"); ++ if (strcmp(ifindex, iflink)) { ++ udev = udev_device_get_udev(net); ++ lower = find_netdev_by_ifindex(udev, iflink); ++ } ++ if (lower) { ++ return lower; ++ } else { ++ udev_device_ref(net); ++ return net; ++ } + } + + static int +-sysfs_scan(struct dirent *dp, void *arg) ++sysfs_scan(struct udev_device *fc_host) + { + HBA_ADAPTERATTRIBUTES *atp; + HBA_PORTATTRIBUTES *pap; +- HBA_WWN wwnn; ++ uint64_t wwnn; + struct hba_info hba_info; + struct adapter_info *ap; + struct port_info *pp; +- char host_dir[80], hba_dir[80], drv_dir[80]; +- char dev_dir[128]; ++ const char *hba_dir; ++ char drv_dir[80]; + char ifname[20], buf[256]; + char *driverName; + int data[32], rc, i; + char *cp; +- char *saveptr; /* for strtok_r */ +- unsigned int ifindex; +- unsigned int iflink; ++ ++ const char *sysname = udev_device_get_sysname(fc_host); ++ const char *syspath = udev_device_get_syspath(fc_host); ++ struct udev_device *pci; ++ struct udev_device *net; ++ const char *ptr = NULL; ++ const char *attr; + + memset(&hba_info, 0, sizeof(hba_info)); + +@@ -217,7 +337,7 @@ sysfs_scan(struct dirent *dp, void *arg) + return HBA_STATUS_ERROR; + } + memset(ap, 0, sizeof(*ap)); +- ap->ad_kern_index = atoi(dp->d_name + sizeof("host") - 1); ++ ap->ad_kern_index = atoi(sysname + sizeof("host") - 1); + ap->ad_port_count = 1; + + /* atp points to the HBA attributes structure */ +@@ -239,137 +359,76 @@ sysfs_scan(struct dirent *dp, void *arg) + memset(pp, 0, sizeof(*pp)); + pp->ap_adapt = ap; + pp->ap_index = ap->ad_port_count - 1; +- pp->ap_kern_hba = atoi(dp->d_name + sizeof("host") - 1); ++ pp->ap_kern_hba = atoi(sysname + sizeof("host") - 1); + + /* pap points to the local port attributes structure */ + pap = &pp->ap_attr; + +- /* Construct the host directory name from the input name */ +- snprintf(host_dir, sizeof(host_dir), +- SYSFS_HOST_DIR "/%s", dp->d_name); +- +- rc = sa_sys_read_line(host_dir, "symbolic_name", buf, sizeof(buf)); +- + /* Get PortSymbolicName */ ++ ptr = udev_device_get_sysattr_value(fc_host, "symbolic_name"); + sa_strncpy_safe(pap->PortSymbolicName, sizeof(pap->PortSymbolicName), +- buf, sizeof(buf)); ++ ptr, strlen(ptr)); + + /* Skip the HBA if it isn't OpenFC */ + cp = strstr(pap->PortSymbolicName, " over "); + if (!cp) + goto skip; + +- /* +- * See if /device is a PCI symlink. +- * If not, try it as a net device. +- */ +- snprintf(dev_dir, sizeof(dev_dir), "%s/device", host_dir); +- i = readlink(dev_dir, buf, sizeof(buf) - 1); +- if (i < 0) +- i = 0; +- buf[i] = '\0'; +- +- if (strstr(buf, "devices/pci") && !strstr(buf, "/net/")) { +- snprintf(hba_dir, sizeof(hba_dir), "%s/device/..", host_dir); +- } else { +- /* assume a net device */ +- cp += 6; +- sa_strncpy_safe(ifname, sizeof(ifname), cp, strlen(cp)); +- snprintf(hba_dir, sizeof(hba_dir), +- SYSFS_HBA_DIR "/%s", ifname); +- /* +- * Try as VLAN device or other virtual net device. +- * If this is the case, ifindex and iflink will be different. +- * iflink is the ifindex of the physical device. +- */ +- rc = sa_sys_read_u32(hba_dir, "ifindex", &ifindex); +- if (rc < 0) +- goto skip; +- rc = sa_sys_read_u32(hba_dir, "iflink", &iflink); +- if (rc < 0) +- goto skip; +- if (ifindex != iflink) { +- rc = find_phys_if(hba_dir, buf, sizeof(buf)); +- if (rc) +- goto skip; +- strncpy(ifname, buf, sizeof(ifname)); +- } +- +- snprintf(hba_dir, sizeof(hba_dir), +- SYSFS_HBA_DIR "/%s/device", ifname); +- i = readlink(hba_dir, buf, sizeof(buf) - 1); +- if (i < 0) +- goto skip; +- buf[i] = '\0'; ++ pci = udev_device_get_parent_with_subsystem_devtype(fc_host, "pci", NULL); ++ net = udev_device_get_parent_with_subsystem_devtype(fc_host, "net", NULL); ++ if (!pci && net) { ++ /* check for a vlan device, stacked on a real PCI network device */ ++ net = find_phys_if(net); ++ pci = udev_device_get_parent_with_subsystem_devtype(net, "pci", NULL); + } + + /* +- * Assume a PCI symlink value is in buf. +- * Back up to the last path component that looks like a PCI element. +- * A sample link value is like: +- * ../../devices/pci*.../0000:03:00.0 +- */ +- rc = 0; +- do { +- cp = strrchr(buf, '/'); +- if (!cp) +- break; +- rc = sscanf(cp + 1, "%x:%x:%x.%x", +- &hba_info.domain, &hba_info.bus, +- &hba_info.dev, &hba_info.func); +- if (rc == 4) +- break; +- *cp = '\0'; +- } while (cp && cp > buf); +- +- if (rc != 4) +- goto skip; +- +- /* + * Save the host directory and the hba directory + * in local port structure + */ + sa_strncpy_safe(pp->host_dir, sizeof(pp->host_dir), +- host_dir, sizeof(host_dir)); ++ syspath, strlen(syspath)); + + /* Get NodeWWN */ +- rc = sys_read_wwn(pp->host_dir, "node_name", &wwnn); +- memcpy(&pap->NodeWWN, &wwnn, sizeof(wwnn)); ++ attr = udev_device_get_sysattr_value(fc_host, "node_name"); ++ wwnn = strtoull(attr, NULL, 16); ++ copy_wwn(&pap->NodeWWN, wwnn); + + /* Get PortWWN */ +- rc = sys_read_wwn(pp->host_dir, "port_name", &pap->PortWWN); ++ attr = udev_device_get_sysattr_value(fc_host, "port_name"); ++ wwnn = strtoull(attr, NULL, 16); ++ copy_wwn(&pap->PortWWN, wwnn); + + /* Get PortFcId */ +- rc = sa_sys_read_u32(pp->host_dir, "port_id", &pap->PortFcId); ++ attr = udev_device_get_sysattr_value(fc_host, "port_id"); ++ pap->PortFcId = strtoul(attr, NULL, 0); + + /* Get PortType */ +- rc = sa_sys_read_line(pp->host_dir, "port_type", buf, sizeof(buf)); +- rc = sa_enum_encode(port_types_table, buf, &pap->PortType); ++ attr = udev_device_get_sysattr_value(fc_host, "port_type"); ++ rc = sa_enum_encode(port_types_table, attr, &pap->PortType); + + /* Get PortState */ +- rc = sa_sys_read_line(pp->host_dir, "port_state", buf, sizeof(buf)); +- rc = sa_enum_encode(port_states_table, buf, &pap->PortState); ++ attr = udev_device_get_sysattr_value(fc_host, "port_state"); ++ rc = sa_enum_encode(port_states_table, attr, &pap->PortState); + + /* Get PortSpeed */ +- rc = sys_read_speed(pp->host_dir, "speed", +- buf, sizeof(buf), +- &pap->PortSpeed); ++ attr = udev_device_get_sysattr_value(fc_host, "speed"); ++ rc = sys_read_speed(attr, &pap->PortSpeed); + + /* Get PortSupportedSpeed */ +- rc = sys_read_speed(pp->host_dir, "supported_speeds", +- buf, sizeof(buf), +- &pap->PortSupportedSpeed); ++ attr = udev_device_get_sysattr_value(fc_host, "supported_speeds"); ++ rc = sys_read_speed(attr, &pap->PortSupportedSpeed); + + /* Get PortMaxFrameSize */ +- rc = sa_sys_read_line(pp->host_dir, "maxframe_size", buf, sizeof(buf)); +- sscanf(buf, "%d", &pap->PortMaxFrameSize); ++ attr = udev_device_get_sysattr_value(fc_host, "maxframe_size"); ++ sscanf(attr, "%d", &pap->PortMaxFrameSize); + + /* Get PortSupportedFc4Types */ +- rc = sa_sys_read_line(pp->host_dir, "supported_fc4s", buf, sizeof(buf)); +- sscanf(buf, "0x%x 0x%x 0x%x 0x%x 0x%x 0x%x 0x%x 0x%x " +- "0x%x 0x%x 0x%x 0x%x 0x%x 0x%x 0x%x 0x%x " +- "0x%x 0x%x 0x%x 0x%x 0x%x 0x%x 0x%x 0x%x " +- "0x%x 0x%x 0x%x 0x%x 0x%x 0x%x 0x%x 0x%x", ++ attr = udev_device_get_sysattr_value(fc_host, "supported_fc4s"); ++ sscanf(attr, "0x%x 0x%x 0x%x 0x%x 0x%x 0x%x 0x%x 0x%x " ++ "0x%x 0x%x 0x%x 0x%x 0x%x 0x%x 0x%x 0x%x " ++ "0x%x 0x%x 0x%x 0x%x 0x%x 0x%x 0x%x 0x%x " ++ "0x%x 0x%x 0x%x 0x%x 0x%x 0x%x 0x%x 0x%x", + &data[0], &data[1], &data[2], &data[3], &data[4], &data[5], + &data[6], &data[7], &data[8], &data[9], &data[10], &data[11], + &data[12], &data[13], &data[14], &data[15], &data[16], +@@ -380,11 +439,11 @@ sysfs_scan(struct dirent *dp, void *arg) + pap->PortSupportedFc4Types.bits[i] = data[i]; + + /* Get PortActiveFc4Types */ +- rc = sa_sys_read_line(pp->host_dir, "active_fc4s", buf, sizeof(buf)); +- sscanf(buf, "0x%x 0x%x 0x%x 0x%x 0x%x 0x%x 0x%x 0x%x " +- "0x%x 0x%x 0x%x 0x%x 0x%x 0x%x 0x%x 0x%x " +- "0x%x 0x%x 0x%x 0x%x 0x%x 0x%x 0x%x 0x%x " +- "0x%x 0x%x 0x%x 0x%x 0x%x 0x%x 0x%x 0x%x", ++ attr = udev_device_get_sysattr_value(fc_host, "active_fc4s"); ++ sscanf(attr, "0x%x 0x%x 0x%x 0x%x 0x%x 0x%x 0x%x 0x%x " ++ "0x%x 0x%x 0x%x 0x%x 0x%x 0x%x 0x%x 0x%x " ++ "0x%x 0x%x 0x%x 0x%x 0x%x 0x%x 0x%x 0x%x " ++ "0x%x 0x%x 0x%x 0x%x 0x%x 0x%x 0x%x 0x%x", + &data[0], &data[1], &data[2], &data[3], &data[4], &data[5], + &data[6], &data[7], &data[8], &data[9], &data[10], &data[11], + &data[12], &data[13], &data[14], &data[15], &data[16], +@@ -395,19 +454,19 @@ sysfs_scan(struct dirent *dp, void *arg) + pap->PortActiveFc4Types.bits[i] = data[i]; + + /* Get FabricName */ +- rc = sys_read_wwn(pp->host_dir, "fabric_name", &pap->FabricName); ++ attr = udev_device_get_sysattr_value(fc_host, "fabric_name"); ++ wwnn = strtoull(attr, NULL, 16); ++ copy_wwn(&pap->FabricName, wwnn); + + /* Get PortSupportedClassofService */ +- rc = sa_sys_read_line(pp->host_dir, "supported_classes", +- buf, sizeof(buf)); +- +- cp = strstr(buf, "Class"); ++ attr = udev_device_get_sysattr_value(fc_host, "supported_classes"); ++ cp = strstr(attr, "Class"); + if (cp) + pap->PortSupportedClassofService = *(cp + 6) - '0'; + + /* Get OSDeviceName */ + sa_strncpy_safe(pap->OSDeviceName, sizeof(pap->OSDeviceName), +- dp->d_name, sizeof(dp->d_name)); ++ sysname, sizeof(sysname)); + + /* Get NumberofDiscoveredPorts */ + snprintf(buf, sizeof(buf), "%s/device", pp->host_dir); +@@ -428,104 +487,8 @@ sysfs_scan(struct dirent *dp, void *arg) + snprintf(buf, sizeof(buf), "fcoe:%s", ifname); + ap->ad_name = strdup(buf); + +- /* Get vendor_id */ +- rc = sa_sys_read_u32(hba_dir, "vendor", &hba_info.vendor_id); +- +- /* Get device_id */ +- rc = sa_sys_read_u32(hba_dir, "device", &hba_info.device_id); +- +- /* Get subsystem_vendor_id */ +- rc = sa_sys_read_u32(hba_dir, "subsystem_vendor", +- &hba_info.subsystem_vendor_id); +- +- /* Get subsystem_device_id */ +- rc = sa_sys_read_u32(hba_dir, "subsystem_device", +- &hba_info.subsystem_device_id); +- +- /* Get device_class */ +- rc = sa_sys_read_u32(hba_dir, "class", &hba_info.device_class); +- hba_info.device_class = hba_info.device_class>>8; +- +- /* +- * Get Hardware Information via PCI Library +- */ +- (void) find_pci_device(&hba_info); +- +- /* Get Number of Ports */ +- atp->NumberOfPorts = hba_info.NumberOfPorts; +- +- /* Get Manufacturer */ +- sa_strncpy_safe(atp->Manufacturer, sizeof(atp->Manufacturer), +- hba_info.Manufacturer, sizeof(hba_info.Manufacturer)); +- +- /* Get SerialNumber */ +- sa_strncpy_safe(atp->SerialNumber, sizeof(atp->SerialNumber), +- hba_info.SerialNumber, sizeof(hba_info.SerialNumber)); +- +- +- /* Get ModelDescription */ +- sa_strncpy_safe(atp->ModelDescription, sizeof(atp->ModelDescription), +- hba_info.ModelDescription, +- sizeof(hba_info.ModelDescription)); +- if (!strncmp(hba_info.ModelDescription, "Unknown", +- sizeof(hba_info.ModelDescription))) { +- snprintf(atp->ModelDescription, sizeof(atp->ModelDescription), +- "[%04x:%04x]-[%04x:%04x]-(%04x)", +- hba_info.vendor_id, hba_info.device_id, +- hba_info.subsystem_vendor_id, +- hba_info.subsystem_device_id, +- hba_info.device_class); +- /* +- * Get Model +- * +- * If the device is a newly developed product, and +- * the model description is not in pci.ids yet, use +- * the model description constructed above as the +- * model string. +- */ +- sa_strncpy_safe(atp->Model, sizeof(atp->Model), +- atp->ModelDescription, +- sizeof(atp->ModelDescription)); +- } +- +- /* +- * Get Model +- * +- * If the device name has already been added into +- * the pci.ids file, use the first word of the model +- * description as the model. If the space after the +- * first word is not found (new product), use the +- * model description as the model. +- */ +- sa_strncpy_safe(buf, sizeof(buf), atp->ModelDescription, +- sizeof(atp->ModelDescription)); +- if (strtok_r(buf, " ", &saveptr)) +- sa_strncpy_safe(atp->Model, sizeof(atp->Model), +- buf, strnlen(buf, sizeof(buf))); +- else +- sa_strncpy_safe(atp->Model, sizeof(atp->Model), +- atp->ModelDescription, +- sizeof(atp->ModelDescription)); +- +- /* Get HardwareVersion */ +- sa_strncpy_safe(atp->HardwareVersion, sizeof(atp->HardwareVersion), +- hba_info.HardwareVersion, +- sizeof(hba_info.HardwareVersion)); +- +- /* Get OptionROMVersion (TODO) */ +- sa_strncpy_safe(atp->OptionROMVersion, sizeof(atp->OptionROMVersion), +- HBA_ROM_VERSION, sizeof(HBA_ROM_VERSION)); +- +- /* Get FirmwareVersion (TODO) */ +- sa_strncpy_safe(atp->FirmwareVersion, sizeof(atp->FirmwareVersion), +- HBA_FW_VERSION, sizeof(HBA_FW_VERSION)); +- +- /* Get VendorSpecificID (TODO) */ +- atp->VendorSpecificID = HBA_VENDOR_SPECIFIC_ID; +- +- /* Get DriverVersion */ +- rc = sa_sys_read_line(hba_dir, SYSFS_MODULE_VER, +- atp->DriverVersion, sizeof(atp->DriverVersion)); ++ if (pci) ++ sysfs_scan_pci(pci, &hba_info, atp); + + /* Get NodeSymbolicName */ + sa_strncpy_safe(atp->NodeSymbolicName, sizeof(atp->NodeSymbolicName), +@@ -538,6 +501,7 @@ sysfs_scan(struct dirent *dp, void *arg) + sizeof(pap->NodeWWN)); + + /* Get DriverName */ ++ hba_dir = udev_device_get_syspath(pci); + snprintf(drv_dir, sizeof(drv_dir), "%s" SYSFS_MODULE , hba_dir); + i = readlink(drv_dir, buf, sizeof(buf)); + if (i < 0) +@@ -662,10 +626,48 @@ sysfs_get_port_fc4stats(char *dir, HBA_FC4STATISTICS *fc4sp) + /* + * Open device and read adapter info if available. + */ +-void ++int + adapter_init(void) + { +- sa_dir_read(SYSFS_HOST_DIR, sysfs_scan, NULL); ++ struct udev *udev; ++ struct udev_enumerate *ue; ++ struct udev_list_entry *head, *ul; ++ struct udev_device *fc_host; ++ const char *syspath; ++ int re = 0; ++ ++ udev = udev_new(); ++ if (!udev) { ++ return -ENOMEM; ++ } ++ ue = udev_enumerate_new(udev); ++ if (!ue) { ++ re = -ENOMEM; ++ goto err_enum_new; ++ } ++ re = udev_enumerate_add_match_subsystem(ue, "fc_host"); ++ if (re) { ++ goto err_add_match; ++ } ++ re = udev_enumerate_scan_devices(ue); ++ if (re) { ++ goto err_scan_devs; ++ } ++ head = udev_enumerate_get_list_entry(ue); ++ udev_list_entry_foreach(ul, head) { ++ syspath = udev_list_entry_get_name(ul); ++ fc_host = udev_device_new_from_syspath(udev, syspath); ++ if (!fc_host) ++ continue; ++ sysfs_scan(fc_host); ++ udev_device_unref(fc_host); ++ } ++err_scan_devs: ++err_add_match: ++ udev_enumerate_unref(ue); ++err_enum_new: ++ udev_unref(udev); ++ return re; + } + + void diff --git a/libhbalinux.spec b/libhbalinux.spec new file mode 100644 index 0000000..ffbc389 --- /dev/null +++ b/libhbalinux.spec @@ -0,0 +1,89 @@ +Name: libhbalinux +Version: 1.0.17 +Release: 1 +Summary: FC-HBAAPI implementation using scsi_transport_fc interfaces +License: LGPLv2 +URL: http://www.open-fcoe.org +Source0: %{name}-%{version}.tar.gz + +BuildRequires: libhbaapi-devel libpciaccess-devel libtool automake systemd-devel +Requires: libhbaapi +Requires(post): grep +Requires(postun): grep + +Patch0: libhbalinux-1.0.13-conf.patch +Patch1: libhbalinux-fix-non-pci-netdev.patch +======= +Name: libhbalinux +Version: 1.0.17 +Release: 11%{?dist} +Summary: FC-HBAAPI implementation using scsi_transport_fc interfaces +License: LGPLv2 +URL: http://www.open-fcoe.org +Source0: %{name}-%{version}.tar.gz +Patch0: libhbalinux-1.0.13-conf.patch +Patch1: libhbalinux-fix-non-pci-netdev.patch +BuildRequires: libhbaapi-devel >= 2.2.9 +BuildRequires: libpciaccess-devel libtool automake systemd-devel +Requires: libhbaapi >= 2.2.9-6 +Requires(post): grep +Requires(postun): grep + +%description +HBAAPI stands for Host Bus Adapter API (Applications Programming Interface). + +%package devel +Summary: Header files for libhbalinux +Requires: %{name} = %{version}-%{release} pkgconfig + +%description devel +Headerfilesforlibhbalinux + +%prep +%autosetup -n %{name}-%{version} -p1 + +%build +./bootstrap.sh +%configure --disable-static +%make_build + +%install +%make_install +%delete_la_and_a + +%post +/sbin/ldconfig +ORG=org.open-fcoe.libhbalinux +LIB=%{_libdir}/libhbalinux.so.2.0.2 +STR="$ORG $LIB" +CONF=%{_sysconfdir}/hba.conf +if test -f $CONF; then + grep -E -q ^[[:space:]]*$ORG[[:space:]]+$LIB $CONF + if test $? -ne 0; then + echo $STR >> $CONF; + fi +fi + +%postun +/sbin/ldconfig +ORG=org.open-fcoe.libhbalinux +CONF=%{_sysconfdir}/hba.conf +if test -f $CONF; then + grep -v $ORG $CONF > %{_sysconfdir}/hba.conf.new + mv %{_sysconfdir}/hba.conf.new %{_sysconfdir}/hba.conf +fi + +%files +%defattr(-,root,root) +%doc README +%license COPYING +%{_libdir}/%{name}.so.* + +%files devel +%defattr(-,root,root) +%{_libdir}/%{name}.so +%{_libdir}/pkgconfig/%{name}.pc + +%changelog +* Wed Feb 12 2020 openEuler Buildteam - 1.0.17-1 +- Package init \ No newline at end of file diff --git a/libhbalinux_bak.spec b/libhbalinux_bak.spec new file mode 100644 index 0000000..23a9238 --- /dev/null +++ b/libhbalinux_bak.spec @@ -0,0 +1,173 @@ +Name: libhbalinux +Version: 1.0.17 +Release: 11%{?dist} +Summary: FC-HBAAPI implementation using scsi_transport_fc interfaces +License: LGPLv2 +URL: http://www.open-fcoe.org +Source0: %{name}-%{version}.tar.gz +Patch0: libhbalinux-1.0.13-conf.patch +Patch1: libhbalinux-fix-non-pci-netdev.patch +BuildRequires: libhbaapi-devel >= 2.2.9-6 +BuildRequires: libpciaccess-devel libtool automake systemd-devel +Requires: libhbaapi >= 2.2.9-6 +Requires(post): grep +Requires(postun): grep + +%description +SNIA HBAAPI vendor library built on top of the scsi_transport_fc interfaces. + +%package devel +Summary: A file needed for libhbalinux application development +Requires: %{name}%{?_isa} = %{version}-%{release} +Requires: pkgconfig + +%description devel +The libhbalinux-devel package contains the library pkgconfig file. + +%prep +%autosetup -p1 + +%build +./bootstrap.sh +%configure --disable-static +make %{?_smp_mflags} + +%install +make install DESTDIR=%{buildroot} +find %{buildroot} -name '*.la' -exec rm -f {} ';' + +%post +/sbin/ldconfig +ORG=org.open-fcoe.libhbalinux +LIB=%{_libdir}/libhbalinux.so.2.0.2 +STR="$ORG $LIB" +CONF=%{_sysconfdir}/hba.conf +if test -f $CONF; then + grep -E -q ^[[:space:]]*$ORG[[:space:]]+$LIB $CONF + if test $? -ne 0; then + echo $STR >> $CONF; + fi +fi + +%postun +/sbin/ldconfig +ORG=org.open-fcoe.libhbalinux +CONF=%{_sysconfdir}/hba.conf +if test -f $CONF; then + grep -v $ORG $CONF > %{_sysconfdir}/hba.conf.new + mv %{_sysconfdir}/hba.conf.new %{_sysconfdir}/hba.conf +fi + +%files +%doc README COPYING +%{_libdir}/%{name}.so.* + +%files devel +%{_libdir}/pkgconfig/%{name}.pc +%{_libdir}/%{name}.so + +%changelog +* Wed Jan 29 2020 Fedora Release Engineering - 1.0.17-11 +- Rebuilt for https://fedoraproject.org/wiki/Fedora_32_Mass_Rebuild + +* Thu Jul 25 2019 Fedora Release Engineering - 1.0.17-10 +- Rebuilt for https://fedoraproject.org/wiki/Fedora_31_Mass_Rebuild + +* Fri Feb 01 2019 Fedora Release Engineering - 1.0.17-9 +- Rebuilt for https://fedoraproject.org/wiki/Fedora_30_Mass_Rebuild + +* Fri Jul 13 2018 Fedora Release Engineering - 1.0.17-8 +- Rebuilt for https://fedoraproject.org/wiki/Fedora_29_Mass_Rebuild + +* Wed Feb 07 2018 Fedora Release Engineering - 1.0.17-7 +- Rebuilt for https://fedoraproject.org/wiki/Fedora_28_Mass_Rebuild + +* Thu Aug 03 2017 Fedora Release Engineering - 1.0.17-6 +- Rebuilt for https://fedoraproject.org/wiki/Fedora_27_Binutils_Mass_Rebuild + +* Wed Jul 26 2017 Fedora Release Engineering - 1.0.17-5 +- Rebuilt for https://fedoraproject.org/wiki/Fedora_27_Mass_Rebuild + +* Fri Feb 10 2017 Fedora Release Engineering - 1.0.17-4 +- Rebuilt for https://fedoraproject.org/wiki/Fedora_26_Mass_Rebuild + +* Thu Feb 04 2016 Fedora Release Engineering - 1.0.17-3 +- Rebuilt for https://fedoraproject.org/wiki/Fedora_24_Mass_Rebuild + +* Mon Jul 06 2015 Chris Leech - 1.0.17-2 +- fix for non-PCI netdevs + +* Tue Jun 16 2015 Chris Leech - 1.0.17-1 +- rebase to upstream v1.0.17 + +* Tue Oct 07 2014 Chris Leech - 1.0.16-5 +- sync with upstream, extends portspeed support up to 40 Gbit + +* Sun Aug 17 2014 Fedora Release Engineering - 1.0.16-4 +- Rebuilt for https://fedoraproject.org/wiki/Fedora_21_22_Mass_Rebuild + +* Sat Jun 07 2014 Fedora Release Engineering - 1.0.16-3 +- Rebuilt for https://fedoraproject.org/wiki/Fedora_21_Mass_Rebuild + +* Fri Jul 26 2013 Petr Šabata - 1.0.16-2 +- Fix a bogus date in changelog + +* Tue Jun 04 2013 Petr Šabata - 1.0.16-1 +- 1.0.16 bump + +* Thu Feb 14 2013 Fedora Release Engineering - 1.0.14-5 +- Rebuilt for https://fedoraproject.org/wiki/Fedora_19_Mass_Rebuild + +* Wed Oct 03 2012 Petr Šabata - 1.0.14-4 +- Require grep for the post/postun scriptlets (#859397) + +* Thu Aug 16 2012 Petr Šabata - 1.0.14-3 +- Include the unversioned library in the devel subpackage. + +* Thu Jul 19 2012 Fedora Release Engineering - 1.0.14-2 +- Rebuilt for https://fedoraproject.org/wiki/Fedora_18_Mass_Rebuild + +* Mon Jun 25 2012 Petr Šabata - 1.0.14-1 +- 1.0.14 bump (really just a version bump, removing the need for + the previous patch) + +* Tue Jan 31 2012 Petr Šabata - 1.0.13-3 +- Set SerialNumber to "Unknown" if not found (47d8dca41) + +* Fri Jan 13 2012 Fedora Release Engineering - 1.0.13-2 +- Rebuilt for https://fedoraproject.org/wiki/Fedora_17_Mass_Rebuild + +* Thu Nov 24 2011 Petr Šabata - 1.0.13-1 +- 1.0.13 bump +- Creating the devel subpackage with a pkgconfig file + +* Thu Jul 07 2011 Petr Sabata - 1.0.12-1 +- 1.0.12 bump +- Remove now obsolete Buildroot and defattr + +* Tue Feb 08 2011 Fedora Release Engineering - 1.0.10-2 +- Rebuilt for https://fedoraproject.org/wiki/Fedora_15_Mass_Rebuild + +* Mon May 24 2010 Jan Zeleny - 1.0.10-1 +- rebased to 1.0.10, bugfix release (see git changelog for more info) + +* Fri Dec 04 2009 Jan Zeleny - 1.0.9-20091204git +- rebased to the latest version in upstream git + +* Thu Jul 30 2009 Jan Zeleny - 1.0.8-1 +- rebase of libhbalinux, spec file adjusted to match changes + +* Fri Jul 24 2009 Fedora Release Engineering - 1.0.7-4 +- Rebuilt for https://fedoraproject.org/wiki/Fedora_12_Mass_Rebuild + +* Wed Apr 01 2009 Jan Zeleny - 1.0.7-3 +- replaced unofficial 1.0.7 source tarball with official one +- update of Makefile, part of it moved to postinstall section + of spec file + +* Tue Mar 31 2009 Jan Zeleny - 1.0.7-2 +- minor changes in spec file + +* Mon Mar 2 2009 Chris Leech - 1.0.7-1 +- initial build + From d34041dd74818cec9f1ec818fcb7076cb6adf9f9 Mon Sep 17 00:00:00 2001 From: fengtao Date: Thu, 20 Feb 2020 16:57:35 +0800 Subject: [PATCH 2/2] init --- libhbalinux_bak.spec | 173 ------------------------------------------- 1 file changed, 173 deletions(-) delete mode 100644 libhbalinux_bak.spec diff --git a/libhbalinux_bak.spec b/libhbalinux_bak.spec deleted file mode 100644 index 23a9238..0000000 --- a/libhbalinux_bak.spec +++ /dev/null @@ -1,173 +0,0 @@ -Name: libhbalinux -Version: 1.0.17 -Release: 11%{?dist} -Summary: FC-HBAAPI implementation using scsi_transport_fc interfaces -License: LGPLv2 -URL: http://www.open-fcoe.org -Source0: %{name}-%{version}.tar.gz -Patch0: libhbalinux-1.0.13-conf.patch -Patch1: libhbalinux-fix-non-pci-netdev.patch -BuildRequires: libhbaapi-devel >= 2.2.9-6 -BuildRequires: libpciaccess-devel libtool automake systemd-devel -Requires: libhbaapi >= 2.2.9-6 -Requires(post): grep -Requires(postun): grep - -%description -SNIA HBAAPI vendor library built on top of the scsi_transport_fc interfaces. - -%package devel -Summary: A file needed for libhbalinux application development -Requires: %{name}%{?_isa} = %{version}-%{release} -Requires: pkgconfig - -%description devel -The libhbalinux-devel package contains the library pkgconfig file. - -%prep -%autosetup -p1 - -%build -./bootstrap.sh -%configure --disable-static -make %{?_smp_mflags} - -%install -make install DESTDIR=%{buildroot} -find %{buildroot} -name '*.la' -exec rm -f {} ';' - -%post -/sbin/ldconfig -ORG=org.open-fcoe.libhbalinux -LIB=%{_libdir}/libhbalinux.so.2.0.2 -STR="$ORG $LIB" -CONF=%{_sysconfdir}/hba.conf -if test -f $CONF; then - grep -E -q ^[[:space:]]*$ORG[[:space:]]+$LIB $CONF - if test $? -ne 0; then - echo $STR >> $CONF; - fi -fi - -%postun -/sbin/ldconfig -ORG=org.open-fcoe.libhbalinux -CONF=%{_sysconfdir}/hba.conf -if test -f $CONF; then - grep -v $ORG $CONF > %{_sysconfdir}/hba.conf.new - mv %{_sysconfdir}/hba.conf.new %{_sysconfdir}/hba.conf -fi - -%files -%doc README COPYING -%{_libdir}/%{name}.so.* - -%files devel -%{_libdir}/pkgconfig/%{name}.pc -%{_libdir}/%{name}.so - -%changelog -* Wed Jan 29 2020 Fedora Release Engineering - 1.0.17-11 -- Rebuilt for https://fedoraproject.org/wiki/Fedora_32_Mass_Rebuild - -* Thu Jul 25 2019 Fedora Release Engineering - 1.0.17-10 -- Rebuilt for https://fedoraproject.org/wiki/Fedora_31_Mass_Rebuild - -* Fri Feb 01 2019 Fedora Release Engineering - 1.0.17-9 -- Rebuilt for https://fedoraproject.org/wiki/Fedora_30_Mass_Rebuild - -* Fri Jul 13 2018 Fedora Release Engineering - 1.0.17-8 -- Rebuilt for https://fedoraproject.org/wiki/Fedora_29_Mass_Rebuild - -* Wed Feb 07 2018 Fedora Release Engineering - 1.0.17-7 -- Rebuilt for https://fedoraproject.org/wiki/Fedora_28_Mass_Rebuild - -* Thu Aug 03 2017 Fedora Release Engineering - 1.0.17-6 -- Rebuilt for https://fedoraproject.org/wiki/Fedora_27_Binutils_Mass_Rebuild - -* Wed Jul 26 2017 Fedora Release Engineering - 1.0.17-5 -- Rebuilt for https://fedoraproject.org/wiki/Fedora_27_Mass_Rebuild - -* Fri Feb 10 2017 Fedora Release Engineering - 1.0.17-4 -- Rebuilt for https://fedoraproject.org/wiki/Fedora_26_Mass_Rebuild - -* Thu Feb 04 2016 Fedora Release Engineering - 1.0.17-3 -- Rebuilt for https://fedoraproject.org/wiki/Fedora_24_Mass_Rebuild - -* Mon Jul 06 2015 Chris Leech - 1.0.17-2 -- fix for non-PCI netdevs - -* Tue Jun 16 2015 Chris Leech - 1.0.17-1 -- rebase to upstream v1.0.17 - -* Tue Oct 07 2014 Chris Leech - 1.0.16-5 -- sync with upstream, extends portspeed support up to 40 Gbit - -* Sun Aug 17 2014 Fedora Release Engineering - 1.0.16-4 -- Rebuilt for https://fedoraproject.org/wiki/Fedora_21_22_Mass_Rebuild - -* Sat Jun 07 2014 Fedora Release Engineering - 1.0.16-3 -- Rebuilt for https://fedoraproject.org/wiki/Fedora_21_Mass_Rebuild - -* Fri Jul 26 2013 Petr Šabata - 1.0.16-2 -- Fix a bogus date in changelog - -* Tue Jun 04 2013 Petr Šabata - 1.0.16-1 -- 1.0.16 bump - -* Thu Feb 14 2013 Fedora Release Engineering - 1.0.14-5 -- Rebuilt for https://fedoraproject.org/wiki/Fedora_19_Mass_Rebuild - -* Wed Oct 03 2012 Petr Šabata - 1.0.14-4 -- Require grep for the post/postun scriptlets (#859397) - -* Thu Aug 16 2012 Petr Šabata - 1.0.14-3 -- Include the unversioned library in the devel subpackage. - -* Thu Jul 19 2012 Fedora Release Engineering - 1.0.14-2 -- Rebuilt for https://fedoraproject.org/wiki/Fedora_18_Mass_Rebuild - -* Mon Jun 25 2012 Petr Šabata - 1.0.14-1 -- 1.0.14 bump (really just a version bump, removing the need for - the previous patch) - -* Tue Jan 31 2012 Petr Šabata - 1.0.13-3 -- Set SerialNumber to "Unknown" if not found (47d8dca41) - -* Fri Jan 13 2012 Fedora Release Engineering - 1.0.13-2 -- Rebuilt for https://fedoraproject.org/wiki/Fedora_17_Mass_Rebuild - -* Thu Nov 24 2011 Petr Šabata - 1.0.13-1 -- 1.0.13 bump -- Creating the devel subpackage with a pkgconfig file - -* Thu Jul 07 2011 Petr Sabata - 1.0.12-1 -- 1.0.12 bump -- Remove now obsolete Buildroot and defattr - -* Tue Feb 08 2011 Fedora Release Engineering - 1.0.10-2 -- Rebuilt for https://fedoraproject.org/wiki/Fedora_15_Mass_Rebuild - -* Mon May 24 2010 Jan Zeleny - 1.0.10-1 -- rebased to 1.0.10, bugfix release (see git changelog for more info) - -* Fri Dec 04 2009 Jan Zeleny - 1.0.9-20091204git -- rebased to the latest version in upstream git - -* Thu Jul 30 2009 Jan Zeleny - 1.0.8-1 -- rebase of libhbalinux, spec file adjusted to match changes - -* Fri Jul 24 2009 Fedora Release Engineering - 1.0.7-4 -- Rebuilt for https://fedoraproject.org/wiki/Fedora_12_Mass_Rebuild - -* Wed Apr 01 2009 Jan Zeleny - 1.0.7-3 -- replaced unofficial 1.0.7 source tarball with official one -- update of Makefile, part of it moved to postinstall section - of spec file - -* Tue Mar 31 2009 Jan Zeleny - 1.0.7-2 -- minor changes in spec file - -* Mon Mar 2 2009 Chris Leech - 1.0.7-1 -- initial build -