diff options
author | grog <grog@FreeBSD.org> | 1999-03-02 07:00:57 +0000 |
---|---|---|
committer | grog <grog@FreeBSD.org> | 1999-03-02 07:00:57 +0000 |
commit | c7982bfad01c8bfa5b2fd94bce28e35c4247d975 (patch) | |
tree | 7c1cdcbc04e51d0d117e3a4663b873403d26c514 /sbin/vinum/commands.c | |
parent | 4913dff128dc2f34657efb86945036a4e02fc82a (diff) | |
download | FreeBSD-src-c7982bfad01c8bfa5b2fd94bce28e35c4247d975.zip FreeBSD-src-c7982bfad01c8bfa5b2fd94bce28e35c4247d975.tar.gz |
resetconfig: don't log the "obliterated" message, the kernel does that
for us.
Rebuild the (almost empty) /dev/vinum directory.
vinum_start: remove superflous "read" parameter when starting with no
parameters.
vinum_stop: without an argument, stop Vinum and remove the kld if
it's idle.
vinum_saveconfig: New command to save configuration.
Diffstat (limited to 'sbin/vinum/commands.c')
-rw-r--r-- | sbin/vinum/commands.c | 58 |
1 files changed, 47 insertions, 11 deletions
diff --git a/sbin/vinum/commands.c b/sbin/vinum/commands.c index b0f593a..6083347 100644 --- a/sbin/vinum/commands.c +++ b/sbin/vinum/commands.c @@ -54,6 +54,8 @@ #include <dev/vinum/vinumhdr.h> #include "vext.h" #include <sys/types.h> +#include <sys/linker.h> +#include <sys/module.h> #include <sys/wait.h> #include <readline/history.h> #include <readline/readline.h> @@ -68,6 +70,7 @@ vinum_create(int argc, char *argv[], char *arg0[]) FILE *dfd; /* file descriptor for the config file */ char buffer[BUFSIZE]; /* read config file in here */ struct _ioctl_reply *reply; + int ioctltype; /* for ioctl call */ if (argc != 1) { /* wrong arg count */ fprintf(stderr, "Expecting 1 parameter, not %d\n", argc); @@ -109,7 +112,8 @@ vinum_create(int argc, char *argv[], char *arg0[]) } } fclose(dfd); /* done with the config file */ - error = ioctl(superdev, VINUM_SAVECONFIG, NULL); /* save the config to disk */ + ioctltype = 0; /* saveconfig after update */ + error = ioctl(superdev, VINUM_SAVECONFIG, &ioctltype); /* save the config to disk */ if (error != 0) perror("Can't save Vinum config"); make_devices(); @@ -304,9 +308,8 @@ vinum_resetconfig(int argc, char *argv[], char *arg0[]) else perror("Can't find vinum config"); } else { + make_devices(); /* recreate the /dev/vinum hierarchy */ printf("\b Vinum configuration obliterated\n"); - system("rm -rf " VINUM_DIR "/" "*"); /* remove the old /dev/vinum */ - syslog(LOG_NOTICE | LOG_KERN, "configuration obliterated"); start_daemon(); /* then restart the daemon */ } } @@ -448,10 +451,11 @@ vinum_start(int argc, char *argv[], char *arg0[]) fprintf(stderr, "Can't allocate memory for drive list\n"); return; } - token[0] = "read"; /* make a read command of this mess */ - tokens = 1; /* so far, it's the only token */ - - getdevs(&statinfo); /* find out what devices we have */ + tokens = 0; /* no tokens yet */ + if (getdevs(&statinfo) < 0) { /* find out what devices we have */ + perror("Can't get device list"); + return; + } namelist[0] = '\0'; /* start with empty namelist */ enamelist = namelist; /* point to the end of the list */ @@ -459,7 +463,7 @@ vinum_start(int argc, char *argv[], char *arg0[]) struct devstat *stat = &statinfo.dinfo->devices[i]; if (((stat->device_type & DEVSTAT_TYPE_MASK) == DEVSTAT_TYPE_DIRECT) /* disk device */ - &&((stat->device_type & DEVSTAT_TYPE_PASS) == 0) /* and not passthrough */ +&&((stat->device_type & DEVSTAT_TYPE_PASS) == 0) /* and not passthrough */ &&((stat->device_name[0] != '\0'))) { /* and it has a name */ sprintf(enamelist, "/dev/%s%d", stat->device_name, stat->unit_number); token[tokens] = enamelist; /* point to it */ @@ -511,9 +515,26 @@ vinum_stop(int argc, char *argv[], char *arg0[]) struct vinum_ioctl_msg *message = (struct vinum_ioctl_msg *) &reply; message->force = force; /* should we force the transition? */ - if (argc == 0) /* stop everything */ - fprintf(stderr, "stop must have an argument\n"); - else { /* stop specified objects */ + if (argc == 0) { /* stop vinum */ + int fileid = 0; /* ID of Vinum kld */ + + close(superdev); /* we can't stop if we have vinum open */ + fileid = kldfind(VINUMMOD); + if ((fileid < 0) /* no go */ + ||(kldunload(fileid) < 0)) + perror("Can't unload " VINUMMOD); + else { + fprintf(stderr, VINUMMOD " unloaded\n"); + exit(0); + } + + /* If we got here, the stop failed. Reopen the superdevice. */ + superdev = open(VINUM_SUPERDEV_NAME, O_RDWR); /* reopen vinum superdevice */ + if (superdev < 0) { + perror("Can't reopen Vinum superdevice"); + exit(1); + } + } else { /* stop specified objects */ int i; enum objecttype type; @@ -1102,3 +1123,18 @@ vinum_setdaemon(int argc, char *argv[], char *argv0[]) fprintf(stderr, "Usage: \tsetdaemon [<bitmask>]\n"); } } + +/* Save config info */ +void +vinum_saveconfig(int argc, char *argv[], char *argv0[]) +{ + int ioctltype; + + if (argc != 0) { + printf("Usage: saveconfig\n"); + return; + } + ioctltype = 1; /* user saveconfig */ + if (ioctl(superdev, VINUM_SAVECONFIG, &ioctltype) < 0) + fprintf(stderr, "Can't set daemon options: %s (%d)\n", strerror(errno), errno); +} |