]> CyberLeo.Net >> Repos - FreeBSD/releng/10.0.git/blob - sbin/kldunload/kldunload.c
- Copy stable/10 (r259064) to releng/10.0 as part of the
[FreeBSD/releng/10.0.git] / sbin / kldunload / kldunload.c
1 /*-
2  * Copyright (c) 1997 Doug Rabson
3  * All rights reserved.
4  *
5  * Redistribution and use in source and binary forms, with or without
6  * modification, are permitted provided that the following conditions
7  * are met:
8  * 1. Redistributions of source code must retain the above copyright
9  *    notice, this list of conditions and the following disclaimer.
10  * 2. Redistributions in binary form must reproduce the above copyright
11  *    notice, this list of conditions and the following disclaimer in the
12  *    documentation and/or other materials provided with the distribution.
13  *
14  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
15  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
16  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
17  * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
18  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
19  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
20  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
21  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
22  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
23  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
24  * SUCH DAMAGE.
25  */
26
27 #include <sys/cdefs.h>
28 __FBSDID("$FreeBSD$");
29
30 #include <sys/param.h>
31 #include <sys/linker.h>
32
33 #include <err.h>
34 #include <stdio.h>
35 #include <stdlib.h>
36 #include <sysexits.h>
37 #include <unistd.h>
38
39 static void
40 usage(void)
41 {
42         fprintf(stderr, "usage: kldunload [-fv] -i id ...\n");
43         fprintf(stderr, "       kldunload [-fv] [-n] name ...\n");
44         exit(EX_USAGE);
45 }
46
47 #define OPT_NULL        0x00
48 #define OPT_ID          0x01
49 #define OPT_VERBOSE     0x02
50 #define OPT_FORCE       0x04
51
52 int
53 main(int argc, char** argv)
54 {
55         struct kld_file_stat stat;
56         int c, fileid, force, opt;
57         char *filename;
58
59         filename = NULL;
60         opt = OPT_NULL;
61
62         while ((c = getopt(argc, argv, "finv")) != -1) {
63                 switch (c) {
64                 case 'f':
65                         opt |= OPT_FORCE;
66                         break;
67                 case 'i':
68                         opt |= OPT_ID;
69                         break;
70                 case 'n':
71                         /* 
72                          * XXX: For backward compatibility. Currently does
73                          * nothing
74                          */
75                         break;
76                 case 'v':
77                         opt |= OPT_VERBOSE;
78                         break;
79                 default:
80                         usage();
81                 }
82         }
83
84         argc -= optind;
85         argv += optind;
86
87         if (argc == 0)
88                 usage();
89
90         while ((filename = *argv++) != NULL) {
91                 if (opt & OPT_ID) {
92                         fileid = atoi(filename);
93                         if (fileid < 0)
94                                 errx(EXIT_FAILURE, "Invalid ID %s", optarg);
95                 } else {
96                         if ((fileid = kldfind(filename)) < 0)
97                                 errx(EXIT_FAILURE, "can't find file %s",
98                                     filename);
99                 }
100                 if (opt & OPT_VERBOSE) {
101                         stat.version = sizeof(stat);
102                         if (kldstat(fileid, &stat) < 0)
103                                 err(EXIT_FAILURE, "can't stat file");
104                         (void) printf("Unloading %s, id=%d\n", stat.name,
105                             fileid);
106                 }
107                 if (opt & OPT_FORCE)
108                         force = LINKER_UNLOAD_FORCE;
109                 else
110                         force = LINKER_UNLOAD_NORMAL;
111
112                 if (kldunloadf(fileid, force) < 0)
113                         err(EXIT_FAILURE, "can't unload file");
114         }
115
116         return (EXIT_SUCCESS);
117 }