From 76018d282e3967cea7300d356708e711939da6f7 Mon Sep 17 00:00:00 2001 From: Christopher Desiniotis Date: Fri, 9 Jun 2023 16:06:32 -0700 Subject: [PATCH] Allow clients of the pciids API to set the pci.ids filepath Signed-off-by: Christopher Desiniotis --- pkg/pciids/pciids.go | 41 +++++++++++++++++++++++++++++++++-------- 1 file changed, 33 insertions(+), 8 deletions(-) diff --git a/pkg/pciids/pciids.go b/pkg/pciids/pciids.go index 8af94d9..7a446ab 100644 --- a/pkg/pciids/pciids.go +++ b/pkg/pciids/pciids.go @@ -172,24 +172,48 @@ type parser struct { } } +// Various locations of pci.ids for different distributions. These may be more +// up to date then the embedded pci.ids db +var defaultPCIdbPaths = []string{ + "/usr/share/misc/pci.ids", // Ubuntu + "/usr/local/share/pci.ids", // RHEL like with manual update + "/usr/share/hwdata/pci.ids", // RHEL like + "/usr/share/pci.ids", // SUSE +} + // This is a fallback if all of the locations fail //go:embed default_pci.ids var defaultPCIdb []byte // NewDB Parse the PCI DB in its default locations or use the default // builtin pci.ids db. -func NewDB() Interface { - // Various locations of pci.ids for differente distributions these may be more - // up to date then the embedded pci.ids db - pcidbs := []string{ - "/usr/share/misc/pci.ids", // Ubuntu - "/usr/local/share/pci.ids", // RHEL like with manual update - "/usr/share/hwdata/pci.ids", // RHEL like - "/usr/share/pci.ids", // SUSE +func NewDB(opts ...Option) Interface { + db := &pcidb{} + for _, opt := range opts { + opt(db) } + + pcidbs := defaultPCIdbPaths + if db.path != "" { + pcidbs = append([]string{db.path}, defaultPCIdbPaths...) + } + return newParser(pcidbs).parse() } +// Option defines a function for passing options to the NewDB() call +type Option func(*pcidb) + +// WithFilePath provides an Option to set the file path +// for the pciids database used by pciids interface. +// The file path provided takes precedence over all other +// paths. +func WithFilePath(path string) Option { + return func(db *pcidb) { + db.path = path + } +} + // newParser will attempt to read the db pci.ids from well known places or fall // back to an internal db func newParser(pcidbs []string) *parser { @@ -247,6 +271,7 @@ func (d *pcidb) GetClassName(classID uint32) string { type pcidb struct { vendors map[uint16]vendor classes map[uint32]class + path string } // vendor PCI vendors/devices/subVendors/SubDevices