1501092bbSDag-Erling Smørgrav /*- 2501092bbSDag-Erling Smørgrav * Copyright (c) 2006 Dag-Erling Co�dan Sm�rgrav 3501092bbSDag-Erling Smørgrav * All rights reserved. 4501092bbSDag-Erling Smørgrav * 5501092bbSDag-Erling Smørgrav * Redistribution and use in source and binary forms, with or without 6501092bbSDag-Erling Smørgrav * modification, are permitted provided that the following conditions 7501092bbSDag-Erling Smørgrav * are met: 8501092bbSDag-Erling Smørgrav * 1. Redistributions of source code must retain the above copyright 9501092bbSDag-Erling Smørgrav * notice, this list of conditions and the following disclaimer 10501092bbSDag-Erling Smørgrav * in this position and unchanged. 11501092bbSDag-Erling Smørgrav * 2. Redistributions in binary form must reproduce the above copyright 12501092bbSDag-Erling Smørgrav * notice, this list of conditions and the following disclaimer in the 13501092bbSDag-Erling Smørgrav * documentation and/or other materials provided with the distribution. 14501092bbSDag-Erling Smørgrav * 15501092bbSDag-Erling Smørgrav * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND 16501092bbSDag-Erling Smørgrav * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 17501092bbSDag-Erling Smørgrav * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 18501092bbSDag-Erling Smørgrav * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE 19501092bbSDag-Erling Smørgrav * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 20501092bbSDag-Erling Smørgrav * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 21501092bbSDag-Erling Smørgrav * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 22501092bbSDag-Erling Smørgrav * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 23501092bbSDag-Erling Smørgrav * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 24501092bbSDag-Erling Smørgrav * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 25501092bbSDag-Erling Smørgrav * SUCH DAMAGE. 26501092bbSDag-Erling Smørgrav * 27501092bbSDag-Erling Smørgrav * $FreeBSD$ 28501092bbSDag-Erling Smørgrav */ 29501092bbSDag-Erling Smørgrav 30501092bbSDag-Erling Smørgrav #include <sys/param.h> 31501092bbSDag-Erling Smørgrav #include <sys/linker.h> 32501092bbSDag-Erling Smørgrav #include <sys/module.h> 33501092bbSDag-Erling Smørgrav 34501092bbSDag-Erling Smørgrav #include <errno.h> 35aa5c5263SXin LI #include <libutil.h> 36aa5c5263SXin LI #include <string.h> 37501092bbSDag-Erling Smørgrav 38501092bbSDag-Erling Smørgrav int 39501092bbSDag-Erling Smørgrav kld_isloaded(const char *name) 40501092bbSDag-Erling Smørgrav { 41501092bbSDag-Erling Smørgrav struct kld_file_stat fstat; 42501092bbSDag-Erling Smørgrav struct module_stat mstat; 43501092bbSDag-Erling Smørgrav const char *ko; 44501092bbSDag-Erling Smørgrav int fid, mid; 45501092bbSDag-Erling Smørgrav 46501092bbSDag-Erling Smørgrav for (fid = kldnext(0); fid > 0; fid = kldnext(fid)) { 47501092bbSDag-Erling Smørgrav fstat.version = sizeof(fstat); 48501092bbSDag-Erling Smørgrav if (kldstat(fid, &fstat) != 0) 49501092bbSDag-Erling Smørgrav continue; 50501092bbSDag-Erling Smørgrav /* check if the file name matches the supplied name */ 51501092bbSDag-Erling Smørgrav if (strcmp(fstat.name, name) == 0) 52501092bbSDag-Erling Smørgrav return (1); 53501092bbSDag-Erling Smørgrav /* strip .ko and try again */ 54501092bbSDag-Erling Smørgrav if ((ko = strstr(fstat.name, ".ko")) != NULL && 55aa5c5263SXin LI strlen(name) == (size_t)(ko - fstat.name) && 56501092bbSDag-Erling Smørgrav strncmp(fstat.name, name, ko - fstat.name) == 0) 57501092bbSDag-Erling Smørgrav return (1); 58501092bbSDag-Erling Smørgrav /* look for a matching module within the file */ 59501092bbSDag-Erling Smørgrav for (mid = kldfirstmod(fid); mid > 0; mid = modfnext(mid)) { 60501092bbSDag-Erling Smørgrav mstat.version = sizeof(mstat); 61501092bbSDag-Erling Smørgrav if (modstat(mid, &mstat) != 0) 62501092bbSDag-Erling Smørgrav continue; 63501092bbSDag-Erling Smørgrav if (strcmp(mstat.name, name) == 0) 64501092bbSDag-Erling Smørgrav return (1); 65501092bbSDag-Erling Smørgrav } 66501092bbSDag-Erling Smørgrav } 67501092bbSDag-Erling Smørgrav return (0); 68501092bbSDag-Erling Smørgrav } 69501092bbSDag-Erling Smørgrav 70501092bbSDag-Erling Smørgrav int 71501092bbSDag-Erling Smørgrav kld_load(const char *name) 72501092bbSDag-Erling Smørgrav { 73501092bbSDag-Erling Smørgrav if (kldload(name) == -1 && errno != EEXIST) 74501092bbSDag-Erling Smørgrav return (-1); 75501092bbSDag-Erling Smørgrav return (0); 76501092bbSDag-Erling Smørgrav } 77