summaryrefslogtreecommitdiff
path: root/usr/src/cmd/devfsadm/devfsadm.c
diff options
context:
space:
mode:
authorJerry Gilliam <Jerry.Gilliam@Sun.COM>2009-02-16 12:06:27 -0800
committerJerry Gilliam <Jerry.Gilliam@Sun.COM>2009-02-16 12:06:27 -0800
commit6532b9600e063234d62bca681503353c01abad20 (patch)
tree0635e04a2713cfe39a3bcf0eb7396722060a76ff /usr/src/cmd/devfsadm/devfsadm.c
parentd35886f1bd1fe7bb59fc0efda96f064aba885f75 (diff)
downloadillumos-joyent-6532b9600e063234d62bca681503353c01abad20.tar.gz
4854243 update_drv -d requires reboot
Diffstat (limited to 'usr/src/cmd/devfsadm/devfsadm.c')
-rw-r--r--usr/src/cmd/devfsadm/devfsadm.c43
1 files changed, 30 insertions, 13 deletions
diff --git a/usr/src/cmd/devfsadm/devfsadm.c b/usr/src/cmd/devfsadm/devfsadm.c
index 662f5de021..03e512a3f4 100644
--- a/usr/src/cmd/devfsadm/devfsadm.c
+++ b/usr/src/cmd/devfsadm/devfsadm.c
@@ -516,12 +516,16 @@ parse_args(int argc, char *argv[])
int num_aliases = 0;
int len;
int retval;
- int add_bind = FALSE;
+ int config = TRUE;
+ int bind = FALSE;
+ int force_flag = FALSE;
struct aliases *ap = NULL;
struct aliases *a_head = NULL;
struct aliases *a_tail = NULL;
struct modconfig mc;
+ (void) bzero(&mc, sizeof (mc));
+
if (strcmp(prog, DISKS) == 0) {
compat_class = "disk";
get_linkcompat_opts = TRUE;
@@ -596,7 +600,7 @@ parse_args(int argc, char *argv[])
build_dev = FALSE;
while ((opt =
- getopt(argc, argv, "a:bdc:i:m:np:R:r:svV:")) != EOF) {
+ getopt(argc, argv, "a:bcd:fi:m:np:R:r:suvV:")) != EOF) {
switch (opt) {
case 'a':
ap = calloc(sizeof (struct aliases), 1);
@@ -616,10 +620,10 @@ parse_args(int argc, char *argv[])
}
a_tail = ap;
num_aliases++;
- add_bind = TRUE;
+ bind = TRUE;
break;
case 'b':
- add_bind = TRUE;
+ bind = TRUE;
break;
case 'c':
(void) strcpy(mc.drvclass, optarg);
@@ -630,6 +634,9 @@ parse_args(int argc, char *argv[])
* do nothing.
*/
break;
+ case 'f':
+ force_flag = TRUE;
+ break;
case 'i':
single_drv = TRUE;
(void) strcpy(mc.drvname, optarg);
@@ -672,6 +679,14 @@ parse_args(int argc, char *argv[])
file_mods = FALSE;
flush_path_to_inst_enable = FALSE;
break;
+ case 'u':
+ /*
+ * Invoked via update_drv(1m) to update
+ * the kernel's driver/alias binding
+ * when removing one or more aliases.
+ */
+ config = FALSE;
+ break;
case 'v':
/* documented verbose flag */
add_verbose_id(VERBOSE_MID);
@@ -689,18 +704,20 @@ parse_args(int argc, char *argv[])
usage();
}
- if ((add_bind == TRUE) && (mc.major == -1 ||
- mc.drvname[0] == NULL)) {
- err_print(MAJOR_AND_B_FLAG);
- devfsadm_exit(1);
- /*NOTREACHED*/
- }
- if (add_bind == TRUE) {
+ if (bind == TRUE) {
+ if ((mc.major == -1) || (mc.drvname[0] == NULL)) {
+ err_print(MAJOR_AND_B_FLAG);
+ devfsadm_exit(1);
+ /*NOTREACHED*/
+ }
+ mc.flags = (force_flag) ? MOD_UNBIND_OVERRIDE : 0;
mc.num_aliases = num_aliases;
mc.ap = a_head;
- retval = modctl(MODADDMAJBIND, NULL, (caddr_t)&mc);
+ retval = modctl((config == TRUE) ? MODADDMAJBIND :
+ MODREMDRVALIAS, NULL, (caddr_t)&mc);
if (retval < 0) {
- err_print(MODCTL_ADDMAJBIND);
+ err_print((config == TRUE) ? MODCTL_ADDMAJBIND :
+ MODCTL_REMMAJBIND);
}
devfsadm_exit(retval);
/*NOTREACHED*/