summaryrefslogtreecommitdiff
path: root/usr/src/lib/libdevinfo
diff options
context:
space:
mode:
authorpjha <none@none>2006-08-21 20:11:18 -0700
committerpjha <none@none>2006-08-21 20:11:18 -0700
commit3c4226f98775d47a05fa88f9f72479f1a250eaa5 (patch)
tree2268348f795a468ab405cce9cd8121f280ba5a7b /usr/src/lib/libdevinfo
parent3247dfed200428da80007948dc664da0d2b81bac (diff)
downloadillumos-joyent-3c4226f98775d47a05fa88f9f72479f1a250eaa5.tar.gz
6425514 Invalid slot number message on FF2 could be hardware programming issue
6436776 Link Up/Down events should be expected events during Oberon hotplug operations 6439953 Identical Slot names in different segments can cause a breakage in ApId scheme 6460150 Booting OPL system with build 46 panics w/ MONDO 62 for DMC/PEC 6460200 OPL Hotplug should use existing PCI Cap Library 6460204 PCI Cap Library should avoid name space collision for pci_config_size_t
Diffstat (limited to 'usr/src/lib/libdevinfo')
-rw-r--r--usr/src/lib/libdevinfo/Makefile.com4
-rw-r--r--usr/src/lib/libdevinfo/devinfo_dli.c158
-rw-r--r--usr/src/lib/libdevinfo/libdevinfo.h17
-rw-r--r--usr/src/lib/libdevinfo/mapfile-vers4
4 files changed, 177 insertions, 6 deletions
diff --git a/usr/src/lib/libdevinfo/Makefile.com b/usr/src/lib/libdevinfo/Makefile.com
index d071f6a304..048c28653f 100644
--- a/usr/src/lib/libdevinfo/Makefile.com
+++ b/usr/src/lib/libdevinfo/Makefile.com
@@ -29,13 +29,13 @@ LIBRARY= libdevinfo.a
VERS= .1
OBJECTS= devfsinfo.o devinfo.o devinfo_prop_decode.o devinfo_devlink.o \
- devinfo_devperm.o devfsmap.o
+ devinfo_devperm.o devfsmap.o devinfo_dli.o
include ../../Makefile.lib
include ../../Makefile.rootfs
LIBS = $(DYNLIB) $(LINTLIB)
-LDLIBS += -lnvpair -lsec -lc
+LDLIBS += -lnvpair -lsec -lc -lgen
$(LINTLIB) := SRCS = $(SRCDIR)/$(LINTSRC)
CFLAGS += $(CCVERBOSE)
diff --git a/usr/src/lib/libdevinfo/devinfo_dli.c b/usr/src/lib/libdevinfo/devinfo_dli.c
new file mode 100644
index 0000000000..a0120027ee
--- /dev/null
+++ b/usr/src/lib/libdevinfo/devinfo_dli.c
@@ -0,0 +1,158 @@
+/*
+ * CDDL HEADER START
+ *
+ * The contents of this file are subject to the terms of the
+ * Common Development and Distribution License (the "License").
+ * You may not use this file except in compliance with the License.
+ *
+ * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
+ * or http://www.opensolaris.org/os/licensing.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ *
+ * When distributing Covered Code, include this CDDL HEADER in each
+ * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
+ * If applicable, add the following below this CDDL HEADER, with the
+ * fields enclosed by brackets "[]" replaced with your own identifying
+ * information: Portions Copyright [yyyy] [name of copyright owner]
+ *
+ * CDDL HEADER END
+ */
+
+/*
+ * Copyright 2006 Sun Microsystems, Inc. All rights reserved.
+ * Use is subject to license terms.
+ */
+
+#pragma ident "%Z%%M% %I% %E% SMI"
+
+/*
+ * Interfaces for getting device configuration data from kernel
+ * through the devinfo driver.
+ */
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <strings.h>
+#include <fcntl.h>
+#include <unistd.h>
+#include <sys/stat.h>
+#include <sys/types.h>
+#include <stdarg.h>
+#include <unistd.h>
+#include <libgen.h>
+#include "libdevinfo.h"
+
+/* Function Prototypes */
+static int di_dli_open(char *, int, short, int);
+
+#define DLI_NAME 0x1
+
+/*
+ * Private hotplug interfaces to be used between cfgadm pci plugin and
+ * devfsadm link generator.
+ */
+
+
+/*
+ * returns a devlink info file name derived from <path>
+ * callers need to free the returned string
+ */
+char *
+di_dli_name(char *path)
+{
+#define dliroot "/etc/devices/dli/info."
+#define dliroot_len (sizeof (dliroot) - 1)
+
+ char *dlipath;
+ int dlipathsz;
+ char *basep;
+
+ basep = basename(path);
+ dlipathsz = strlen(basep) + dliroot_len + 1;
+ dlipath = malloc(sizeof (char) * dlipathsz);
+
+ (void) snprintf(dlipath, dlipathsz, "%s%s", dliroot, basep);
+ dlipath[dlipathsz - 1] = '\0';
+ return (dlipath);
+
+#undef dlipre
+#undef dlipre_len
+#undef dliroot
+#undef dliroot_len
+}
+
+
+static int
+di_dli_open(char *path, int oflag, short l_type, int flags)
+{
+ int fd;
+ char *dlipath, *dlipath_dir, *dlipath_dup;
+ struct stat statbuf;
+ int mode = S_IRUSR | S_IWUSR | S_IRGRP | S_IROTH;
+ flock_t lock;
+
+ dlipath = (flags & DLI_NAME) ? di_dli_name(path) : (char *)path;
+ dlipath_dup = strdup(dlipath);
+ dlipath_dir = dirname(dlipath_dup);
+
+ if (stat(dlipath_dir, &statbuf) < 0) {
+ if (mkdirp(dlipath_dir,
+ S_IRWXU | S_IRGRP | S_IXGRP | S_IROTH | S_IXOTH) < 0) {
+ fd = -1;
+ goto OUT;
+ }
+ }
+
+ fd = open(dlipath, oflag, mode);
+ if (fd < 0)
+ goto OUT;
+
+ if (fchmod(fd, mode) < 0) {
+ (void) close(fd);
+ fd = -1;
+ goto OUT;
+ }
+
+ bzero(&lock, sizeof (lock));
+ lock.l_type = l_type;
+ if (fcntl(fd, F_SETLKW, &lock) < 0) {
+ (void) close(fd);
+ fd = -1;
+ }
+OUT:
+ free(dlipath_dup);
+ if (flags & DLI_NAME)
+ free(dlipath);
+ return (fd);
+}
+
+
+int
+di_dli_openr(char *path)
+{
+ return (di_dli_open(path, O_RDONLY, F_RDLCK, DLI_NAME));
+}
+
+
+int
+di_dli_openw(char *path)
+{
+ return (di_dli_open(path, O_RDWR | O_SYNC | O_TRUNC | O_CREAT,
+ F_WRLCK, DLI_NAME));
+}
+
+
+void
+di_dli_close(int fd)
+{
+ flock_t lock;
+ if (fd < 0)
+ return;
+
+ bzero(&lock, sizeof (lock));
+ lock.l_type = F_UNLCK;
+ (void) fcntl(fd, F_SETLK, &lock);
+ (void) close(fd);
+}
diff --git a/usr/src/lib/libdevinfo/libdevinfo.h b/usr/src/lib/libdevinfo/libdevinfo.h
index 195eee4e55..62fa27bcb2 100644
--- a/usr/src/lib/libdevinfo/libdevinfo.h
+++ b/usr/src/lib/libdevinfo/libdevinfo.h
@@ -2,9 +2,8 @@
* CDDL HEADER START
*
* The contents of this file are subject to the terms of the
- * Common Development and Distribution License, Version 1.0 only
- * (the "License"). You may not use this file except in compliance
- * with the License.
+ * Common Development and Distribution License (the "License").
+ * You may not use this file except in compliance with the License.
*
* You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
* or http://www.opensolaris.org/os/licensing.
@@ -20,7 +19,7 @@
* CDDL HEADER END
*/
/*
- * Copyright 2005 Sun Microsystems, Inc. All rights reserved.
+ * Copyright 2006 Sun Microsystems, Inc. All rights reserved.
* Use is subject to license terms.
*/
@@ -385,6 +384,16 @@ extern int di_devperm_logout(const char *);
*/
extern di_node_t di_lookup_node(di_node_t root, char *path);
+
+/*
+ * Private hotplug interfaces to be used between cfgadm pci plugin and
+ * devfsadm link generator.
+ */
+extern char *di_dli_name(char *);
+extern int di_dli_openr(char *);
+extern int di_dli_openw(char *);
+extern void di_dli_close(int);
+
#ifdef __cplusplus
}
#endif
diff --git a/usr/src/lib/libdevinfo/mapfile-vers b/usr/src/lib/libdevinfo/mapfile-vers
index 7ddb19dae3..6e84e1bee1 100644
--- a/usr/src/lib/libdevinfo/mapfile-vers
+++ b/usr/src/lib/libdevinfo/mapfile-vers
@@ -180,6 +180,10 @@ SUNWprivate_1.1 {
di_prop_sys_next;
di_vhci_first_node;
di_vhci_next_node;
+ di_dli_name;
+ di_dli_openr;
+ di_dli_openw;
+ di_dli_close;
local:
*;
};