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