diff options
author | pjha <none@none> | 2006-08-21 20:11:18 -0700 |
---|---|---|
committer | pjha <none@none> | 2006-08-21 20:11:18 -0700 |
commit | 3c4226f98775d47a05fa88f9f72479f1a250eaa5 (patch) | |
tree | 2268348f795a468ab405cce9cd8121f280ba5a7b /usr/src/lib/libdevinfo | |
parent | 3247dfed200428da80007948dc664da0d2b81bac (diff) | |
download | illumos-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.com | 4 | ||||
-rw-r--r-- | usr/src/lib/libdevinfo/devinfo_dli.c | 158 | ||||
-rw-r--r-- | usr/src/lib/libdevinfo/libdevinfo.h | 17 | ||||
-rw-r--r-- | usr/src/lib/libdevinfo/mapfile-vers | 4 |
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: *; }; |