annotate usr/src/cmd/dumpadm/dconf.c @ 13967:92bec6d87f59

3557 dumpvp_size is not updated correctly when a dump zvol's size is changed 3558 setting the volsize on a dump device does not return back ENOSPC 3559 setting a volsize larger than the space available sometimes succeeds 3560 dumpadm should be able to remove a dump device Reviewed by: Adam Leventhal <ahl@delphix.com> Reviewed by: Matthew Ahrens <mahrens@delphix.com> Reviewed by: Christopher Siden <christopher.siden@delphix.com> Approved by: Albert Lee <trisk@nexenta.com>
author George Wilson <george.wilson@delphix.com>
date Wed, 20 Feb 2013 22:50:16 -0800
parents ab9ae749152f
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1 /*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
2 * CDDL HEADER START
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
3 *
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
4 * The contents of this file are subject to the terms of the
4801
5cd7916484a5 4687827 dumpadm should be more tolerant of a read-only /etc/dumpadm.conf
eschrock
parents: 767
diff changeset
5 * Common Development and Distribution License (the "License").
5cd7916484a5 4687827 dumpadm should be more tolerant of a read-only /etc/dumpadm.conf
eschrock
parents: 767
diff changeset
6 * You may not use this file except in compliance with the License.
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
7 *
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
8 * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
9 * or http://www.opensolaris.org/os/licensing.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
10 * See the License for the specific language governing permissions
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
11 * and limitations under the License.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
12 *
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
13 * When distributing Covered Code, include this CDDL HEADER in each
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
14 * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
15 * If applicable, add the following below this CDDL HEADER, with the
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
16 * fields enclosed by brackets "[]" replaced with your own identifying
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
17 * information: Portions Copyright [yyyy] [name of copyright owner]
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
18 *
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
19 * CDDL HEADER END
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
20 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
21 /*
12979
ab9ae749152f PSARC/2009/617 Software Events Notification Parameters CLI
Gavin Maltby <gavin.maltby@oracle.com>
parents: 10843
diff changeset
22 * Copyright (c) 1998, 2010, Oracle and/or its affiliates. All rights reserved.
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
23 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
24
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
25 #include <sys/types.h>
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
26 #include <sys/stat.h>
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
27 #include <sys/swap.h>
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
28 #include <sys/dumpadm.h>
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
29 #include <sys/utsname.h>
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
30
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
31 #include <unistd.h>
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
32 #include <string.h>
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
33 #include <stdlib.h>
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
34 #include <stdio.h>
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
35 #include <fcntl.h>
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
36 #include <errno.h>
767
0aa24dfb5d87 PSARC 2004/776 device checking for fs utilities
sjelinek
parents: 0
diff changeset
37 #include <libdiskmgt.h>
6423
437422a29d3a PSARC 2006/370 ZFS Boot Support
gw25295
parents: 4801
diff changeset
38 #include <libzfs.h>
12979
ab9ae749152f PSARC/2009/617 Software Events Notification Parameters CLI
Gavin Maltby <gavin.maltby@oracle.com>
parents: 10843
diff changeset
39 #include <uuid/uuid.h>
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
40
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
41 #include "dconf.h"
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
42 #include "minfree.h"
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
43 #include "utils.h"
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
44 #include "swap.h"
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
45
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
46 typedef struct dc_token {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
47 const char *tok_name;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
48 int (*tok_parse)(dumpconf_t *, char *);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
49 int (*tok_print)(const dumpconf_t *, FILE *);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
50 } dc_token_t;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
51
767
0aa24dfb5d87 PSARC 2004/776 device checking for fs utilities
sjelinek
parents: 0
diff changeset
52
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
53 static int print_device(const dumpconf_t *, FILE *);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
54 static int print_savdir(const dumpconf_t *, FILE *);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
55 static int print_content(const dumpconf_t *, FILE *);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
56 static int print_enable(const dumpconf_t *, FILE *);
10843
eb166ea6e74e 6828976 Fast Crash Dump
Dave Plauger <Dave.Plauger@Sun.COM>
parents: 6423
diff changeset
57 static int print_csave(const dumpconf_t *, FILE *);
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
58
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
59 static const dc_token_t tokens[] = {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
60 { "DUMPADM_DEVICE", dconf_str2device, print_device },
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
61 { "DUMPADM_SAVDIR", dconf_str2savdir, print_savdir },
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
62 { "DUMPADM_CONTENT", dconf_str2content, print_content },
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
63 { "DUMPADM_ENABLE", dconf_str2enable, print_enable },
10843
eb166ea6e74e 6828976 Fast Crash Dump
Dave Plauger <Dave.Plauger@Sun.COM>
parents: 6423
diff changeset
64 { "DUMPADM_CSAVE", dconf_str2csave, print_csave },
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
65 { NULL, NULL, NULL }
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
66 };
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
67
10843
eb166ea6e74e 6828976 Fast Crash Dump
Dave Plauger <Dave.Plauger@Sun.COM>
parents: 6423
diff changeset
68 static const char DC_STR_ON[] = "on"; /* On string */
eb166ea6e74e 6828976 Fast Crash Dump
Dave Plauger <Dave.Plauger@Sun.COM>
parents: 6423
diff changeset
69 static const char DC_STR_OFF[] = "off"; /* Off string */
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
70 static const char DC_STR_YES[] = "yes"; /* Enable on string */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
71 static const char DC_STR_NO[] = "no"; /* Enable off string */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
72 static const char DC_STR_SWAP[] = "swap"; /* Default dump device */
13967
92bec6d87f59 3557 dumpvp_size is not updated correctly when a dump zvol's size is changed
George Wilson <george.wilson@delphix.com>
parents: 12979
diff changeset
73 static const char DC_STR_NONE[] = "none";
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
74
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
75 /* The pages included in the dump */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
76 static const char DC_STR_KERNEL[] = "kernel"; /* Kernel only */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
77 static const char DC_STR_CURPROC[] = "curproc"; /* Kernel + current process */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
78 static const char DC_STR_ALL[] = "all"; /* All pages */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
79
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
80 /*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
81 * Permissions and ownership for the configuration file:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
82 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
83 #define DC_OWNER 0 /* Uid 0 (root) */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
84 #define DC_GROUP 1 /* Gid 1 (other) */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
85 #define DC_PERM (S_IRUSR | S_IWUSR | S_IRGRP | S_IROTH) /* Mode 0644 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
86
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
87 static void
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
88 dconf_init(dumpconf_t *dcp, int dcmode)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
89 {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
90 struct utsname ut;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
91
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
92 /*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
93 * Default device for dumps is 'swap' (appropriate swap device),
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
94 * and default savecore directory is /var/crash/`uname -n`,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
95 * which is compatible with pre-dumpadm behavior.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
96 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
97 (void) strcpy(dcp->dc_device, DC_STR_SWAP);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
98 (void) strcpy(dcp->dc_savdir, "/var/crash");
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
99
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
100 if (uname(&ut) != -1) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
101 (void) strcat(dcp->dc_savdir, "/");
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
102 (void) strcat(dcp->dc_savdir, ut.nodename);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
103 }
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
104
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
105 /*
10843
eb166ea6e74e 6828976 Fast Crash Dump
Dave Plauger <Dave.Plauger@Sun.COM>
parents: 6423
diff changeset
106 * Default is contents kernel, savecore enabled on reboot,
eb166ea6e74e 6828976 Fast Crash Dump
Dave Plauger <Dave.Plauger@Sun.COM>
parents: 6423
diff changeset
107 * savecore saves compressed core files.
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
108 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
109 dcp->dc_cflags = DUMP_KERNEL;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
110 dcp->dc_enable = DC_ON;
10843
eb166ea6e74e 6828976 Fast Crash Dump
Dave Plauger <Dave.Plauger@Sun.COM>
parents: 6423
diff changeset
111 dcp->dc_csave = DC_COMPRESSED;
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
112
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
113 dcp->dc_mode = dcmode;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
114 dcp->dc_conf_fp = NULL;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
115 dcp->dc_conf_fd = -1;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
116 dcp->dc_dump_fd = -1;
4801
5cd7916484a5 4687827 dumpadm should be more tolerant of a read-only /etc/dumpadm.conf
eschrock
parents: 767
diff changeset
117 dcp->dc_readonly = B_FALSE;
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
118 }
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
119
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
120 int
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
121 dconf_open(dumpconf_t *dcp, const char *dpath, const char *fpath, int dcmode)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
122 {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
123 char buf[BUFSIZ];
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
124 int line;
4801
5cd7916484a5 4687827 dumpadm should be more tolerant of a read-only /etc/dumpadm.conf
eschrock
parents: 767
diff changeset
125 const char *fpmode = "r+";
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
126
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
127 dconf_init(dcp, dcmode);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
128
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
129 if ((dcp->dc_dump_fd = open(dpath, O_RDWR)) == -1) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
130 warn(gettext("failed to open %s"), dpath);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
131 return (-1);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
132 }
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
133
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
134 if ((dcp->dc_conf_fd = open(fpath, O_RDWR | O_CREAT, DC_PERM)) == -1) {
4801
5cd7916484a5 4687827 dumpadm should be more tolerant of a read-only /etc/dumpadm.conf
eschrock
parents: 767
diff changeset
135 /*
5cd7916484a5 4687827 dumpadm should be more tolerant of a read-only /etc/dumpadm.conf
eschrock
parents: 767
diff changeset
136 * Attempt to open the file read-only.
5cd7916484a5 4687827 dumpadm should be more tolerant of a read-only /etc/dumpadm.conf
eschrock
parents: 767
diff changeset
137 */
5cd7916484a5 4687827 dumpadm should be more tolerant of a read-only /etc/dumpadm.conf
eschrock
parents: 767
diff changeset
138 if ((dcp->dc_conf_fd = open(fpath, O_RDONLY)) == -1) {
5cd7916484a5 4687827 dumpadm should be more tolerant of a read-only /etc/dumpadm.conf
eschrock
parents: 767
diff changeset
139 warn(gettext("failed to open %s"), fpath);
5cd7916484a5 4687827 dumpadm should be more tolerant of a read-only /etc/dumpadm.conf
eschrock
parents: 767
diff changeset
140 return (-1);
5cd7916484a5 4687827 dumpadm should be more tolerant of a read-only /etc/dumpadm.conf
eschrock
parents: 767
diff changeset
141 }
5cd7916484a5 4687827 dumpadm should be more tolerant of a read-only /etc/dumpadm.conf
eschrock
parents: 767
diff changeset
142
5cd7916484a5 4687827 dumpadm should be more tolerant of a read-only /etc/dumpadm.conf
eschrock
parents: 767
diff changeset
143 dcp->dc_readonly = B_TRUE;
5cd7916484a5 4687827 dumpadm should be more tolerant of a read-only /etc/dumpadm.conf
eschrock
parents: 767
diff changeset
144 fpmode = "r";
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
145 }
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
146
4801
5cd7916484a5 4687827 dumpadm should be more tolerant of a read-only /etc/dumpadm.conf
eschrock
parents: 767
diff changeset
147 if ((dcp->dc_conf_fp = fdopen(dcp->dc_conf_fd, fpmode)) == NULL) {
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
148 warn(gettext("failed to open stream for %s"), fpath);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
149 return (-1);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
150 }
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
151
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
152 /*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
153 * If we're in override mode, the current kernel settings override the
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
154 * default settings and anything invalid in the configuration file.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
155 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
156 if (dcmode == DC_OVERRIDE)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
157 (void) dconf_getdev(dcp);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
158
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
159 for (line = 1; fgets(buf, BUFSIZ, dcp->dc_conf_fp) != NULL; line++) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
160
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
161 char name[BUFSIZ], value[BUFSIZ];
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
162 const dc_token_t *tokp;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
163 int len;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
164
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
165 if (buf[0] == '#' || buf[0] == '\n')
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
166 continue;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
167
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
168 /*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
169 * Look for "name=value", with optional whitespace on either
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
170 * side, terminated by a newline, and consuming the whole line.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
171 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
172 /* LINTED - unbounded string specifier */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
173 if (sscanf(buf, " %[^=]=%s \n%n", name, value, &len) == 2 &&
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
174 name[0] != '\0' && value[0] != '\0' && len == strlen(buf)) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
175 /*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
176 * Locate a matching token in the tokens[] table,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
177 * and invoke its parsing function.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
178 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
179 for (tokp = tokens; tokp->tok_name != NULL; tokp++) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
180 if (strcmp(name, tokp->tok_name) == 0) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
181 if (tokp->tok_parse(dcp, value) == -1) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
182 warn(gettext("\"%s\", line %d: "
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
183 "warning: invalid %s\n"),
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
184 fpath, line, name);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
185 }
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
186 break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
187 }
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
188 }
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
189
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
190 /*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
191 * If we hit the end of the tokens[] table,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
192 * no matching token was found.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
193 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
194 if (tokp->tok_name == NULL) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
195 warn(gettext("\"%s\", line %d: warning: "
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
196 "invalid token: %s\n"), fpath, line, name);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
197 }
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
198
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
199 } else {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
200 warn(gettext("\"%s\", line %d: syntax error\n"),
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
201 fpath, line);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
202 }
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
203 }
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
204
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
205 /*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
206 * If we're not in override mode, the current kernel settings
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
207 * override the settings read from the configuration file.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
208 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
209 if (dcmode == DC_CURRENT)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
210 return (dconf_getdev(dcp));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
211
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
212 return (0);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
213 }
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
214
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
215 int
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
216 dconf_getdev(dumpconf_t *dcp)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
217 {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
218 int status = 0;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
219
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
220 if ((dcp->dc_cflags = ioctl(dcp->dc_dump_fd, DIOCGETCONF, 0)) == -1) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
221 warn(gettext("failed to get kernel dump settings"));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
222 status = -1;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
223 }
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
224
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
225 if (ioctl(dcp->dc_dump_fd, DIOCGETDEV, dcp->dc_device) == -1) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
226 if (errno != ENODEV) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
227 warn(gettext("failed to get dump device"));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
228 status = -1;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
229 } else
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
230 dcp->dc_device[0] = '\0';
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
231 }
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
232
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
233 return (status);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
234 }
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
235
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
236 int
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
237 dconf_close(dumpconf_t *dcp)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
238 {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
239 if (fclose(dcp->dc_conf_fp) == 0) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
240 (void) close(dcp->dc_dump_fd);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
241 return (0);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
242 }
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
243 return (-1);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
244 }
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
245
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
246 int
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
247 dconf_write(dumpconf_t *dcp)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
248 {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
249 const dc_token_t *tokp;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
250
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
251 if (fseeko(dcp->dc_conf_fp, (off_t)0, SEEK_SET) == -1) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
252 warn(gettext("failed to seek config file"));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
253 return (-1);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
254 }
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
255
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
256 if (ftruncate(dcp->dc_conf_fd, (off_t)0) == -1) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
257 warn(gettext("failed to truncate config file"));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
258 return (-1);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
259 }
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
260
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
261 (void) fputs("#\n# dumpadm.conf\n#\n"
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
262 "# Configuration parameters for system crash dump.\n"
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
263 "# Do NOT edit this file by hand -- use dumpadm(1m) instead.\n"
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
264 "#\n", dcp->dc_conf_fp);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
265
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
266 for (tokp = tokens; tokp->tok_name != NULL; tokp++) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
267 if (fprintf(dcp->dc_conf_fp, "%s=", tokp->tok_name) == -1 ||
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
268 tokp->tok_print(dcp, dcp->dc_conf_fp) == -1) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
269 warn(gettext("failed to write token"));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
270 return (-1);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
271 }
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
272 }
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
273
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
274 if (fflush(dcp->dc_conf_fp) != 0)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
275 warn(gettext("warning: failed to flush config file"));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
276
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
277 if (fsync(dcp->dc_conf_fd) == -1)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
278 warn(gettext("warning: failed to sync config file to disk"));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
279
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
280 if (fchmod(dcp->dc_conf_fd, DC_PERM) == -1)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
281 warn(gettext("warning: failed to reset mode on config file"));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
282
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
283 if (fchown(dcp->dc_conf_fd, DC_OWNER, DC_GROUP) == -1)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
284 warn(gettext("warning: failed to reset owner on config file"));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
285
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
286 return (0);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
287 }
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
288
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
289 static int
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
290 open_stat64(const char *path, struct stat64 *stp)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
291 {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
292 int fd = open64(path, O_RDONLY);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
293
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
294 if (fd >= 0) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
295 int status = fstat64(fd, stp);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
296 (void) close(fd);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
297 return (status);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
298 }
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
299
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
300 return (-1);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
301 }
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
302
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
303 static int
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
304 dconf_swap_compare(const swapent_t *s1, const swapent_t *s2)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
305 {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
306 struct stat64 st1, st2;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
307
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
308 int prefer_s1 = -1; /* Return value to move s1 left (s1 < s2) */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
309 int prefer_s2 = 1; /* Return value to move s2 left (s1 > s2) */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
310
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
311 /*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
312 * First try: open and fstat each swap entry. If either system
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
313 * call fails, arbitrarily prefer the other entry.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
314 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
315 if (open_stat64(s1->ste_path, &st1) == -1)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
316 return (prefer_s2);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
317
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
318 if (open_stat64(s2->ste_path, &st2) == -1)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
319 return (prefer_s1);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
320
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
321 /*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
322 * Second try: if both entries are block devices, or if
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
323 * neither is a block device, prefer the larger.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
324 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
325 if (S_ISBLK(st1.st_mode) == S_ISBLK(st2.st_mode)) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
326 if (st2.st_size > st1.st_size)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
327 return (prefer_s2);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
328 return (prefer_s1);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
329 }
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
330
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
331 /*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
332 * Third try: prefer the entry that is a block device.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
333 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
334 if (S_ISBLK(st2.st_mode))
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
335 return (prefer_s2);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
336 return (prefer_s1);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
337 }
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
338
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
339 static int
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
340 dconf_dev_ioctl(dumpconf_t *dcp, int cmd)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
341 {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
342 if (ioctl(dcp->dc_dump_fd, cmd, dcp->dc_device) == 0)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
343 return (0);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
344
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
345 switch (errno) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
346 case ENOTSUP:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
347 warn(gettext("dumps not supported on %s\n"), dcp->dc_device);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
348 break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
349 case EBUSY:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
350 warn(gettext("device %s is already in use\n"), dcp->dc_device);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
351 break;
6423
437422a29d3a PSARC 2006/370 ZFS Boot Support
gw25295
parents: 4801
diff changeset
352 case EBADR:
437422a29d3a PSARC 2006/370 ZFS Boot Support
gw25295
parents: 4801
diff changeset
353 /* ZFS pool is too fragmented to support a dump device */
437422a29d3a PSARC 2006/370 ZFS Boot Support
gw25295
parents: 4801
diff changeset
354 warn(gettext("device %s is too fragmented to be used as "
437422a29d3a PSARC 2006/370 ZFS Boot Support
gw25295
parents: 4801
diff changeset
355 "a dump device\n"), dcp->dc_device);
437422a29d3a PSARC 2006/370 ZFS Boot Support
gw25295
parents: 4801
diff changeset
356 break;
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
357 default:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
358 /*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
359 * NOTE: The stmsboot(1M) command's boot-up script parses this
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
360 * error to get the dump device name. If you change the format
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
361 * of this message, make sure that stmsboot(1M) is in sync.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
362 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
363 warn(gettext("cannot use %s as dump device"), dcp->dc_device);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
364 }
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
365 return (-1);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
366 }
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
367
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
368 int
767
0aa24dfb5d87 PSARC 2004/776 device checking for fs utilities
sjelinek
parents: 0
diff changeset
369 dconf_update(dumpconf_t *dcp, int checkinuse)
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
370 {
13967
92bec6d87f59 3557 dumpvp_size is not updated correctly when a dump zvol's size is changed
George Wilson <george.wilson@delphix.com>
parents: 12979
diff changeset
371 int oconf;
767
0aa24dfb5d87 PSARC 2004/776 device checking for fs utilities
sjelinek
parents: 0
diff changeset
372 int error;
0aa24dfb5d87 PSARC 2004/776 device checking for fs utilities
sjelinek
parents: 0
diff changeset
373 char *msg;
0aa24dfb5d87 PSARC 2004/776 device checking for fs utilities
sjelinek
parents: 0
diff changeset
374
0aa24dfb5d87 PSARC 2004/776 device checking for fs utilities
sjelinek
parents: 0
diff changeset
375 error = 0;
0aa24dfb5d87 PSARC 2004/776 device checking for fs utilities
sjelinek
parents: 0
diff changeset
376
0aa24dfb5d87 PSARC 2004/776 device checking for fs utilities
sjelinek
parents: 0
diff changeset
377 if (checkinuse && (dm_inuse(dcp->dc_device, &msg, DM_WHO_DUMP,
4801
5cd7916484a5 4687827 dumpadm should be more tolerant of a read-only /etc/dumpadm.conf
eschrock
parents: 767
diff changeset
378 &error) || error)) {
767
0aa24dfb5d87 PSARC 2004/776 device checking for fs utilities
sjelinek
parents: 0
diff changeset
379 if (error != 0) {
0aa24dfb5d87 PSARC 2004/776 device checking for fs utilities
sjelinek
parents: 0
diff changeset
380 warn(gettext("failed to determine if %s is"
0aa24dfb5d87 PSARC 2004/776 device checking for fs utilities
sjelinek
parents: 0
diff changeset
381 " in use"), dcp->dc_device);
0aa24dfb5d87 PSARC 2004/776 device checking for fs utilities
sjelinek
parents: 0
diff changeset
382 } else {
0aa24dfb5d87 PSARC 2004/776 device checking for fs utilities
sjelinek
parents: 0
diff changeset
383 warn(msg);
0aa24dfb5d87 PSARC 2004/776 device checking for fs utilities
sjelinek
parents: 0
diff changeset
384 free(msg);
0aa24dfb5d87 PSARC 2004/776 device checking for fs utilities
sjelinek
parents: 0
diff changeset
385 return (-1);
0aa24dfb5d87 PSARC 2004/776 device checking for fs utilities
sjelinek
parents: 0
diff changeset
386 }
0aa24dfb5d87 PSARC 2004/776 device checking for fs utilities
sjelinek
parents: 0
diff changeset
387 }
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
388
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
389 /*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
390 * Save the existing dump configuration in case something goes wrong.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
391 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
392 if ((oconf = ioctl(dcp->dc_dump_fd, DIOCGETCONF, 0)) == -1) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
393 warn(gettext("failed to get kernel dump configuration"));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
394 return (-1);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
395 }
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
396
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
397 oconf &= DUMP_CONTENT;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
398 dcp->dc_cflags &= DUMP_CONTENT;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
399
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
400 if (ioctl(dcp->dc_dump_fd, DIOCSETCONF, dcp->dc_cflags) == -1) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
401 warn(gettext("failed to update kernel dump configuration"));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
402 return (-1);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
403 }
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
404
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
405 if (strcmp(dcp->dc_device, DC_STR_SWAP) == 0) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
406 swaptbl_t *swt;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
407 int i;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
408
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
409 if ((swt = swap_list()) == NULL)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
410 goto err;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
411
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
412 if (swt->swt_n == 0) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
413 warn(gettext("no swap devices are available\n"));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
414 free(swt);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
415 goto err;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
416 }
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
417
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
418 qsort(&swt->swt_ent[0], swt->swt_n, sizeof (swapent_t),
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
419 (int (*)(const void *, const void *))dconf_swap_compare);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
420
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
421 /*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
422 * Iterate through the prioritized list of swap entries,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
423 * trying to configure one as the dump device.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
424 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
425 for (i = 0; i < swt->swt_n; i++) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
426 if (ioctl(dcp->dc_dump_fd, DIOCSETDEV,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
427 swt->swt_ent[i].ste_path) == 0) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
428 (void) strcpy(dcp->dc_device,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
429 swt->swt_ent[i].ste_path);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
430 break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
431 }
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
432 }
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
433
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
434 if (i == swt->swt_n) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
435 warn(gettext("no swap devices could be configured "
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
436 "as the dump device\n"));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
437 free(swt);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
438 goto err;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
439 }
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
440 free(swt);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
441
13967
92bec6d87f59 3557 dumpvp_size is not updated correctly when a dump zvol's size is changed
George Wilson <george.wilson@delphix.com>
parents: 12979
diff changeset
442 } else if (strcmp(dcp->dc_device, DC_STR_NONE) == 0) {
92bec6d87f59 3557 dumpvp_size is not updated correctly when a dump zvol's size is changed
George Wilson <george.wilson@delphix.com>
parents: 12979
diff changeset
443 if (ioctl(dcp->dc_dump_fd, DIOCRMDEV, NULL) == -1) {
92bec6d87f59 3557 dumpvp_size is not updated correctly when a dump zvol's size is changed
George Wilson <george.wilson@delphix.com>
parents: 12979
diff changeset
444 warn(gettext("failed to remove dump device"));
92bec6d87f59 3557 dumpvp_size is not updated correctly when a dump zvol's size is changed
George Wilson <george.wilson@delphix.com>
parents: 12979
diff changeset
445 return (-1);
92bec6d87f59 3557 dumpvp_size is not updated correctly when a dump zvol's size is changed
George Wilson <george.wilson@delphix.com>
parents: 12979
diff changeset
446 }
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
447 } else if (dcp->dc_device[0] != '\0') {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
448 /*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
449 * If we're not in forcible update mode, then fail the change
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
450 * if the selected device cannot be used as the dump device,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
451 * or if it is not big enough to hold the dump.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
452 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
453 if (dcp->dc_mode == DC_CURRENT) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
454 struct stat64 st;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
455 uint64_t d;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
456
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
457 if (dconf_dev_ioctl(dcp, DIOCTRYDEV) == -1)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
458 goto err;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
459
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
460 if (open_stat64(dcp->dc_device, &st) == -1) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
461 warn(gettext("failed to access %s"),
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
462 dcp->dc_device);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
463 goto err;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
464 }
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
465
6423
437422a29d3a PSARC 2006/370 ZFS Boot Support
gw25295
parents: 4801
diff changeset
466 if ((error = zvol_check_dump_config(
437422a29d3a PSARC 2006/370 ZFS Boot Support
gw25295
parents: 4801
diff changeset
467 dcp->dc_device)) > 0)
437422a29d3a PSARC 2006/370 ZFS Boot Support
gw25295
parents: 4801
diff changeset
468 goto err;
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
469 if (ioctl(dcp->dc_dump_fd, DIOCGETDUMPSIZE, &d) == -1) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
470 warn(gettext("failed to get kernel dump size"));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
471 goto err;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
472 }
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
473
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
474 if (st.st_size < d) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
475 warn(gettext("dump device %s is too small to "
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
476 "hold a system dump\ndump size %llu "
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
477 "bytes, device size %lld bytes\n"),
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
478 dcp->dc_device, d, st.st_size);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
479 goto err;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
480 }
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
481 }
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
482
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
483 if (dconf_dev_ioctl(dcp, DIOCSETDEV) == -1)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
484 goto err;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
485 }
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
486
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
487 /*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
488 * Now that we've updated the dump device, we need to issue another
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
489 * ioctl to re-read the config flags to determine whether we
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
490 * obtained DUMP_EXCL access on our dump device.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
491 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
492 if ((dcp->dc_cflags = ioctl(dcp->dc_dump_fd, DIOCGETCONF, 0)) == -1) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
493 warn(gettext("failed to re-read kernel dump configuration"));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
494 return (-1);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
495 }
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
496
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
497 return (0);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
498
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
499 err:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
500 (void) ioctl(dcp->dc_dump_fd, DIOCSETCONF, oconf);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
501 return (-1);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
502 }
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
503
12979
ab9ae749152f PSARC/2009/617 Software Events Notification Parameters CLI
Gavin Maltby <gavin.maltby@oracle.com>
parents: 10843
diff changeset
504 int
ab9ae749152f PSARC/2009/617 Software Events Notification Parameters CLI
Gavin Maltby <gavin.maltby@oracle.com>
parents: 10843
diff changeset
505 dconf_write_uuid(dumpconf_t *dcp)
ab9ae749152f PSARC/2009/617 Software Events Notification Parameters CLI
Gavin Maltby <gavin.maltby@oracle.com>
parents: 10843
diff changeset
506 {
ab9ae749152f PSARC/2009/617 Software Events Notification Parameters CLI
Gavin Maltby <gavin.maltby@oracle.com>
parents: 10843
diff changeset
507 char uuidstr[36 + 1];
ab9ae749152f PSARC/2009/617 Software Events Notification Parameters CLI
Gavin Maltby <gavin.maltby@oracle.com>
parents: 10843
diff changeset
508 uuid_t uu;
ab9ae749152f PSARC/2009/617 Software Events Notification Parameters CLI
Gavin Maltby <gavin.maltby@oracle.com>
parents: 10843
diff changeset
509 int err;
ab9ae749152f PSARC/2009/617 Software Events Notification Parameters CLI
Gavin Maltby <gavin.maltby@oracle.com>
parents: 10843
diff changeset
510
ab9ae749152f PSARC/2009/617 Software Events Notification Parameters CLI
Gavin Maltby <gavin.maltby@oracle.com>
parents: 10843
diff changeset
511 uuid_generate(uu);
ab9ae749152f PSARC/2009/617 Software Events Notification Parameters CLI
Gavin Maltby <gavin.maltby@oracle.com>
parents: 10843
diff changeset
512 uuid_unparse(uu, uuidstr);
ab9ae749152f PSARC/2009/617 Software Events Notification Parameters CLI
Gavin Maltby <gavin.maltby@oracle.com>
parents: 10843
diff changeset
513
ab9ae749152f PSARC/2009/617 Software Events Notification Parameters CLI
Gavin Maltby <gavin.maltby@oracle.com>
parents: 10843
diff changeset
514 err = ioctl(dcp->dc_dump_fd, DIOCSETUUID, uuidstr);
ab9ae749152f PSARC/2009/617 Software Events Notification Parameters CLI
Gavin Maltby <gavin.maltby@oracle.com>
parents: 10843
diff changeset
515
ab9ae749152f PSARC/2009/617 Software Events Notification Parameters CLI
Gavin Maltby <gavin.maltby@oracle.com>
parents: 10843
diff changeset
516 if (err)
ab9ae749152f PSARC/2009/617 Software Events Notification Parameters CLI
Gavin Maltby <gavin.maltby@oracle.com>
parents: 10843
diff changeset
517 warn(gettext("kernel image uuid write failed"));
ab9ae749152f PSARC/2009/617 Software Events Notification Parameters CLI
Gavin Maltby <gavin.maltby@oracle.com>
parents: 10843
diff changeset
518
ab9ae749152f PSARC/2009/617 Software Events Notification Parameters CLI
Gavin Maltby <gavin.maltby@oracle.com>
parents: 10843
diff changeset
519 return (err == 0);
ab9ae749152f PSARC/2009/617 Software Events Notification Parameters CLI
Gavin Maltby <gavin.maltby@oracle.com>
parents: 10843
diff changeset
520 }
ab9ae749152f PSARC/2009/617 Software Events Notification Parameters CLI
Gavin Maltby <gavin.maltby@oracle.com>
parents: 10843
diff changeset
521
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
522 void
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
523 dconf_print(dumpconf_t *dcp, FILE *fp)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
524 {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
525 u_longlong_t min;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
526 char *content;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
527
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
528 if (dcp->dc_cflags & DUMP_ALL)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
529 content = gettext("all");
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
530 else if (dcp->dc_cflags & DUMP_CURPROC)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
531 content = gettext("kernel and current process");
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
532 else
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
533 content = gettext("kernel");
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
534
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
535 (void) fprintf(fp, gettext(" Dump content: %s pages\n"), content);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
536
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
537 if (dcp->dc_device[0] != '\0') {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
538 (void) fprintf(fp, gettext(" Dump device: %s (%s)\n"),
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
539 dcp->dc_device, (dcp->dc_cflags & DUMP_EXCL) ?
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
540 gettext("dedicated") : gettext("swap"));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
541 } else {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
542 (void) fprintf(fp, gettext(" Dump device: none "
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
543 "(dumps disabled)\n"));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
544 }
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
545
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
546 (void) fprintf(fp, gettext("Savecore directory: %s"), dcp->dc_savdir);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
547
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
548 if (minfree_read(dcp->dc_savdir, &min) == 0) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
549 if (min < 1024 || (min % 1024) != 0)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
550 (void) fprintf(fp, gettext(" (minfree = %lluKB)"), min);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
551 else
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
552 (void) fprintf(fp, gettext(" (minfree = %lluMB)"),
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
553 min / 1024);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
554 }
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
555
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
556 (void) fprintf(fp, gettext("\n"));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
557
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
558 (void) fprintf(fp, gettext(" Savecore enabled: %s\n"),
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
559 (dcp->dc_enable == DC_OFF) ? gettext("no") : gettext("yes"));
10843
eb166ea6e74e 6828976 Fast Crash Dump
Dave Plauger <Dave.Plauger@Sun.COM>
parents: 6423
diff changeset
560 (void) fprintf(fp, gettext(" Save compressed: %s\n"),
eb166ea6e74e 6828976 Fast Crash Dump
Dave Plauger <Dave.Plauger@Sun.COM>
parents: 6423
diff changeset
561 (dcp->dc_csave == DC_UNCOMPRESSED) ? gettext("off") :
eb166ea6e74e 6828976 Fast Crash Dump
Dave Plauger <Dave.Plauger@Sun.COM>
parents: 6423
diff changeset
562 gettext("on"));
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
563 }
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
564
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
565 int
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
566 dconf_str2device(dumpconf_t *dcp, char *buf)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
567 {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
568 if (strcasecmp(buf, DC_STR_SWAP) == 0) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
569 (void) strcpy(dcp->dc_device, DC_STR_SWAP);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
570 return (0);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
571 }
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
572
13967
92bec6d87f59 3557 dumpvp_size is not updated correctly when a dump zvol's size is changed
George Wilson <george.wilson@delphix.com>
parents: 12979
diff changeset
573 if (strcasecmp(buf, DC_STR_NONE) == 0) {
92bec6d87f59 3557 dumpvp_size is not updated correctly when a dump zvol's size is changed
George Wilson <george.wilson@delphix.com>
parents: 12979
diff changeset
574 (void) strcpy(dcp->dc_device, DC_STR_NONE);
92bec6d87f59 3557 dumpvp_size is not updated correctly when a dump zvol's size is changed
George Wilson <george.wilson@delphix.com>
parents: 12979
diff changeset
575 return (0);
92bec6d87f59 3557 dumpvp_size is not updated correctly when a dump zvol's size is changed
George Wilson <george.wilson@delphix.com>
parents: 12979
diff changeset
576 }
92bec6d87f59 3557 dumpvp_size is not updated correctly when a dump zvol's size is changed
George Wilson <george.wilson@delphix.com>
parents: 12979
diff changeset
577
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
578 if (valid_abspath(buf)) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
579 (void) strcpy(dcp->dc_device, buf);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
580 return (0);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
581 }
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
582
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
583 return (-1);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
584 }
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
585
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
586 int
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
587 dconf_str2savdir(dumpconf_t *dcp, char *buf)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
588 {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
589 if (valid_abspath(buf)) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
590 (void) strcpy(dcp->dc_savdir, buf);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
591 return (0);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
592 }
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
593
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
594 return (-1);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
595 }
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
596
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
597 int
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
598 dconf_str2content(dumpconf_t *dcp, char *buf)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
599 {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
600 if (strcasecmp(buf, DC_STR_KERNEL) == 0) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
601 dcp->dc_cflags = (dcp->dc_cflags & ~DUMP_CONTENT) | DUMP_KERNEL;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
602 return (0);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
603 }
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
604
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
605 if (strcasecmp(buf, DC_STR_CURPROC) == 0) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
606 dcp->dc_cflags = (dcp->dc_cflags & ~DUMP_CONTENT) |
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
607 DUMP_CURPROC;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
608 return (0);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
609 }
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
610
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
611 if (strcasecmp(buf, DC_STR_ALL) == 0) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
612 dcp->dc_cflags = (dcp->dc_cflags & ~DUMP_CONTENT) | DUMP_ALL;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
613 return (0);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
614 }
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
615
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
616 warn(gettext("invalid dump content type -- %s\n"), buf);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
617 return (-1);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
618 }
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
619
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
620 int
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
621 dconf_str2enable(dumpconf_t *dcp, char *buf)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
622 {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
623 if (strcasecmp(buf, DC_STR_YES) == 0) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
624 dcp->dc_enable = DC_ON;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
625 return (0);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
626 }
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
627
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
628 if (strcasecmp(buf, DC_STR_NO) == 0) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
629 dcp->dc_enable = DC_OFF;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
630 return (0);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
631 }
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
632
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
633 warn(gettext("invalid enable value -- %s\n"), buf);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
634 return (-1);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
635 }
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
636
10843
eb166ea6e74e 6828976 Fast Crash Dump
Dave Plauger <Dave.Plauger@Sun.COM>
parents: 6423
diff changeset
637 int
eb166ea6e74e 6828976 Fast Crash Dump
Dave Plauger <Dave.Plauger@Sun.COM>
parents: 6423
diff changeset
638 dconf_str2csave(dumpconf_t *dcp, char *buf)
eb166ea6e74e 6828976 Fast Crash Dump
Dave Plauger <Dave.Plauger@Sun.COM>
parents: 6423
diff changeset
639 {
eb166ea6e74e 6828976 Fast Crash Dump
Dave Plauger <Dave.Plauger@Sun.COM>
parents: 6423
diff changeset
640 if (strcasecmp(buf, DC_STR_ON) == 0) {
eb166ea6e74e 6828976 Fast Crash Dump
Dave Plauger <Dave.Plauger@Sun.COM>
parents: 6423
diff changeset
641 dcp->dc_csave = DC_COMPRESSED;
eb166ea6e74e 6828976 Fast Crash Dump
Dave Plauger <Dave.Plauger@Sun.COM>
parents: 6423
diff changeset
642 return (0);
eb166ea6e74e 6828976 Fast Crash Dump
Dave Plauger <Dave.Plauger@Sun.COM>
parents: 6423
diff changeset
643 }
eb166ea6e74e 6828976 Fast Crash Dump
Dave Plauger <Dave.Plauger@Sun.COM>
parents: 6423
diff changeset
644
eb166ea6e74e 6828976 Fast Crash Dump
Dave Plauger <Dave.Plauger@Sun.COM>
parents: 6423
diff changeset
645 if (strcasecmp(buf, DC_STR_OFF) == 0) {
eb166ea6e74e 6828976 Fast Crash Dump
Dave Plauger <Dave.Plauger@Sun.COM>
parents: 6423
diff changeset
646 dcp->dc_csave = DC_UNCOMPRESSED;
eb166ea6e74e 6828976 Fast Crash Dump
Dave Plauger <Dave.Plauger@Sun.COM>
parents: 6423
diff changeset
647 return (0);
eb166ea6e74e 6828976 Fast Crash Dump
Dave Plauger <Dave.Plauger@Sun.COM>
parents: 6423
diff changeset
648 }
eb166ea6e74e 6828976 Fast Crash Dump
Dave Plauger <Dave.Plauger@Sun.COM>
parents: 6423
diff changeset
649
eb166ea6e74e 6828976 Fast Crash Dump
Dave Plauger <Dave.Plauger@Sun.COM>
parents: 6423
diff changeset
650 warn(gettext("invalid save compressed value -- %s\n"), buf);
eb166ea6e74e 6828976 Fast Crash Dump
Dave Plauger <Dave.Plauger@Sun.COM>
parents: 6423
diff changeset
651 return (-1);
eb166ea6e74e 6828976 Fast Crash Dump
Dave Plauger <Dave.Plauger@Sun.COM>
parents: 6423
diff changeset
652 }
eb166ea6e74e 6828976 Fast Crash Dump
Dave Plauger <Dave.Plauger@Sun.COM>
parents: 6423
diff changeset
653
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
654 static int
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
655 print_content(const dumpconf_t *dcp, FILE *fp)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
656 {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
657 const char *content;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
658
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
659 if (dcp->dc_cflags & DUMP_ALL)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
660 content = DC_STR_ALL;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
661 else if (dcp->dc_cflags & DUMP_CURPROC)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
662 content = DC_STR_CURPROC;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
663 else
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
664 content = DC_STR_KERNEL;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
665
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
666 return (fprintf(fp, "%s\n", content));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
667 }
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
668
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
669 static int
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
670 print_device(const dumpconf_t *dcp, FILE *fp)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
671 {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
672 return (fprintf(fp, "%s\n", (dcp->dc_device[0] != '\0') ?
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
673 dcp->dc_device : DC_STR_SWAP));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
674 }
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
675
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
676 static int
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
677 print_enable(const dumpconf_t *dcp, FILE *fp)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
678 {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
679 return (fprintf(fp, "%s\n", (dcp->dc_enable == DC_OFF) ?
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
680 DC_STR_NO : DC_STR_YES));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
681 }
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
682
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
683 static int
10843
eb166ea6e74e 6828976 Fast Crash Dump
Dave Plauger <Dave.Plauger@Sun.COM>
parents: 6423
diff changeset
684 print_csave(const dumpconf_t *dcp, FILE *fp)
eb166ea6e74e 6828976 Fast Crash Dump
Dave Plauger <Dave.Plauger@Sun.COM>
parents: 6423
diff changeset
685 {
eb166ea6e74e 6828976 Fast Crash Dump
Dave Plauger <Dave.Plauger@Sun.COM>
parents: 6423
diff changeset
686 return (fprintf(fp, "%s\n", (dcp->dc_csave == DC_COMPRESSED) ?
eb166ea6e74e 6828976 Fast Crash Dump
Dave Plauger <Dave.Plauger@Sun.COM>
parents: 6423
diff changeset
687 DC_STR_ON : DC_STR_OFF));
eb166ea6e74e 6828976 Fast Crash Dump
Dave Plauger <Dave.Plauger@Sun.COM>
parents: 6423
diff changeset
688 }
eb166ea6e74e 6828976 Fast Crash Dump
Dave Plauger <Dave.Plauger@Sun.COM>
parents: 6423
diff changeset
689
eb166ea6e74e 6828976 Fast Crash Dump
Dave Plauger <Dave.Plauger@Sun.COM>
parents: 6423
diff changeset
690 static int
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
691 print_savdir(const dumpconf_t *dcp, FILE *fp)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
692 {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
693 return (fprintf(fp, "%s\n", dcp->dc_savdir));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
694 }