deviceid.c revision 169303
1169303Spjd/*- 2169303Spjd * Copyright (c) 2007 Pawel Jakub Dawidek <pjd@FreeBSD.org> 3169303Spjd * All rights reserved. 4169303Spjd * 5169303Spjd * Redistribution and use in source and binary forms, with or without 6169303Spjd * modification, are permitted provided that the following conditions 7169303Spjd * are met: 8169303Spjd * 1. Redistributions of source code must retain the above copyright 9169303Spjd * notice, this list of conditions and the following disclaimer. 10169303Spjd * 2. Redistributions in binary form must reproduce the above copyright 11169303Spjd * notice, this list of conditions and the following disclaimer in the 12169303Spjd * documentation and/or other materials provided with the distribution. 13169303Spjd * 14169303Spjd * THIS SOFTWARE IS PROVIDED BY THE AUTHORS AND CONTRIBUTORS ``AS IS'' AND 15169303Spjd * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 16169303Spjd * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 17169303Spjd * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS OR CONTRIBUTORS BE LIABLE 18169303Spjd * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 19169303Spjd * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 20169303Spjd * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 21169303Spjd * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 22169303Spjd * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 23169303Spjd * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 24169303Spjd * SUCH DAMAGE. 25169303Spjd */ 26169303Spjd 27169303Spjd#include <sys/cdefs.h> 28169303Spjd__FBSDID("$FreeBSD: head/cddl/compat/opensolaris/misc/deviceid.c 169303 2007-05-06 01:39:39Z pjd $"); 29169303Spjd 30169303Spjd#include <sys/param.h> 31169303Spjd#include <sys/ioctl.h> 32169303Spjd#include <stdio.h> 33169303Spjd#include <unistd.h> 34169303Spjd#include <string.h> 35169303Spjd#include <errno.h> 36169303Spjd#include <libgeom.h> 37169303Spjd#include <devid.h> 38169303Spjd 39169303Spjdint 40169303Spjddevid_str_decode(char *devidstr, ddi_devid_t *retdevid, char **retminor_name) 41169303Spjd{ 42169303Spjd 43169303Spjd if (strlcpy(retdevid->devid, devidstr, sizeof(retdevid->devid)) >= 44169303Spjd sizeof(retdevid->devid)) { 45169303Spjd return (EINVAL); 46169303Spjd } 47169303Spjd *retminor_name = strdup(""); 48169303Spjd if (*retminor_name == NULL); 49169303Spjd return (ENOMEM); 50169303Spjd return (0); 51169303Spjd} 52169303Spjd 53169303Spjdint 54169303Spjddevid_deviceid_to_nmlist(char *search_path, ddi_devid_t devid, char *minor_name, 55169303Spjd devid_nmlist_t **retlist) 56169303Spjd{ 57169303Spjd char path[MAXPATHLEN]; 58169303Spjd char *dst; 59169303Spjd 60169303Spjd if (g_get_name(devid.devid, path, sizeof(path)) == -1) 61169303Spjd return (errno); 62169303Spjd *retlist = malloc(sizeof(**retlist)); 63169303Spjd if (*retlist == NULL) 64169303Spjd return (ENOMEM); 65169303Spjd if (strlcpy((*retlist)[0].devname, path, 66169303Spjd sizeof((*retlist)[0].devname)) >= sizeof((*retlist)[0].devname)) { 67169303Spjd free(*retlist); 68169303Spjd return (ENAMETOOLONG); 69169303Spjd } 70169303Spjd return (0); 71169303Spjd} 72169303Spjd 73169303Spjdvoid 74169303Spjddevid_str_free(char *str) 75169303Spjd{ 76169303Spjd 77169303Spjd free(str); 78169303Spjd} 79169303Spjd 80169303Spjdvoid 81169303Spjddevid_free(ddi_devid_t devid) 82169303Spjd{ 83169303Spjd /* Do nothing. */ 84169303Spjd} 85169303Spjd 86169303Spjdvoid 87169303Spjddevid_free_nmlist(devid_nmlist_t *list) 88169303Spjd{ 89169303Spjd 90169303Spjd free(list); 91169303Spjd} 92169303Spjd 93169303Spjdint 94169303Spjddevid_get(int fd, ddi_devid_t *retdevid) 95169303Spjd{ 96169303Spjd 97169303Spjd if (ioctl(fd, DIOCGIDENT, retdevid->devid) == -1) 98169303Spjd return (errno); 99169303Spjd if (retdevid->devid[0] == '\0') 100169303Spjd return (ENOENT); 101169303Spjd return (0); 102169303Spjd} 103169303Spjd 104169303Spjdint 105169303Spjddevid_get_minor_name(int fd, char **retminor_name) 106169303Spjd{ 107169303Spjd 108169303Spjd *retminor_name = strdup(""); 109169303Spjd if (*retminor_name == NULL) 110169303Spjd return (ENOMEM); 111169303Spjd return (0); 112169303Spjd} 113169303Spjd 114169303Spjdchar * 115169303Spjddevid_str_encode(ddi_devid_t devid, char *minor_name) 116169303Spjd{ 117169303Spjd 118169303Spjd return (strdup(devid.devid)); 119169303Spjd} 120