1 /* 2 * Copyright (c) 1980, 1993 3 * The Regents of the University of California. 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 * 3. Neither the name of the University nor the names of its contributors 14 * may be used to endorse or promote products derived from this software 15 * without specific prior written permission. 16 * 17 * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND 18 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 19 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 20 * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE 21 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 22 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 23 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 24 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 25 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 26 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 27 * SUCH DAMAGE. 28 * 29 * @(#)swapon.c 8.1 (Berkeley) 6/5/93 30 * $FreeBSD: src/sbin/dumpon/dumpon.c,v 1.10.2.2 2001/07/30 10:30:05 dd Exp $ 31 */ 32 33 #include <err.h> 34 #include <stdio.h> 35 #include <stdlib.h> 36 #include <stdbool.h> 37 #include <string.h> 38 #include <unistd.h> 39 #include <fstab.h> 40 #include <sys/param.h> 41 #include <sys/sysctl.h> 42 #include <sys/stat.h> 43 #include <sysexits.h> 44 45 static const char *sc_name = "kern.dumpdev"; 46 47 static struct stat *get_dumpdev(void); 48 static void usage(void) __dead2; 49 50 int 51 main(int argc, char **argv) 52 { 53 int ch; 54 struct stat stab; 55 struct stat *stab_old; 56 char *path, *p; 57 bool is_dumpoff; 58 59 if (strstr((p = strrchr(argv[0], '/')) ? p+1 : argv[0], 60 "dumpoff") != 0) { 61 is_dumpoff = true; 62 } else { 63 is_dumpoff = false; 64 } 65 66 while ((ch = getopt(argc, argv, "v")) != -1) { 67 switch (ch) { 68 case 'v': 69 /* backward compatibility only */ 70 break; 71 case '?': 72 default: 73 usage(); 74 } 75 } 76 argc -= optind; 77 argv += optind; 78 79 if ((is_dumpoff && argc != 0) || (!is_dumpoff && argc != 1)) 80 usage(); 81 82 path = argv[0]; 83 if (is_dumpoff || strcmp(path, "off") == 0) { 84 stab.st_rdev = NODEV; 85 } else { 86 path = getdevpath(path, 0); 87 if (stat(path, &stab) != 0) 88 err(EX_OSFILE, "%s", path); 89 90 if (!S_ISCHR(stab.st_mode)) { 91 errx(EX_USAGE, 92 "%s: must specify a character disk device", 93 path); 94 } 95 } 96 97 stab_old = get_dumpdev(); 98 99 if (stab.st_rdev == stab_old->st_rdev) { 100 if (stab.st_rdev == NODEV) { 101 printf("dumpon: crash dumps already disabled.\n"); 102 } else { 103 printf("dumpon: crash dumps already configured " 104 "to the given device.\n"); 105 } 106 } else if (stab.st_rdev == NODEV || stab_old->st_rdev == NODEV) { 107 if (sysctlbyname(sc_name, NULL, NULL, 108 &stab.st_rdev, sizeof stab.st_rdev) != 0) { 109 err(EX_OSERR, "sysctl: %s", sc_name); 110 } 111 if (stab.st_rdev == NODEV) { 112 printf("dumpon: crash dumps disabled\n"); 113 } else { 114 printf("dumpon: crash dumps to %s (%lu, %#lx)\n", 115 path, 116 (unsigned long)major(stab.st_rdev), 117 (unsigned long)minor(stab.st_rdev)); 118 } 119 } else { 120 warnx("crash dumps already configured " 121 "to another device (%lu, %#lx)", 122 (unsigned long)major(stab.st_rdev), 123 (unsigned long)minor(stab.st_rdev)); 124 errx(EX_USAGE, "you need to run 'dumpoff' first."); 125 } 126 127 return 0; 128 } 129 130 131 static struct stat * 132 get_dumpdev(void) 133 { 134 struct stat *stab; 135 size_t len; 136 137 if ((stab = malloc(sizeof(*stab))) == NULL) 138 err(EX_OSERR, "malloc"); 139 140 memset(stab, 0, sizeof(*stab)); 141 len = sizeof(stab->st_rdev); 142 if (sysctlbyname(sc_name, &stab->st_rdev, &len, NULL, 0) != 0) 143 err(EX_OSERR, "sysctl: %s", sc_name); 144 145 return stab; 146 } 147 148 static void 149 usage(void) 150 { 151 fprintf(stderr, 152 "usage: dumpon [-v] special_file\n" 153 " dumpon [-v] off\n" 154 " dumpoff [-v]\n"); 155 exit(EX_USAGE); 156 } 157