1 /*- 2 * Copyright (c) 1980, 1992 The Regents of the University of California. 3 * All rights reserved. 4 * 5 * %sccs.include.redist.c% 6 */ 7 8 #ifndef lint 9 static char sccsid[] = "@(#)disks.c 5.16 (Berkeley) 05/21/93"; 10 #endif /* not lint */ 11 12 #include <sys/types.h> 13 #include <sys/buf.h> 14 15 #include <nlist.h> 16 #include <ctype.h> 17 #include <paths.h> 18 #include <string.h> 19 #include <stdlib.h> 20 #include "systat.h" 21 #include "extern.h" 22 23 static void dkselect __P((char *, int, int [])); 24 static int read_names __P((void)); 25 26 static struct nlist namelist[] = { 27 #define X_DK_NDRIVE 0 28 { "_dk_ndrive" }, 29 #define X_DK_WPMS 1 30 { "_dk_wpms" }, 31 #ifdef vax 32 #define X_MBDINIT (X_DK_WPMS+1) 33 { "_mbdinit" }, 34 #define X_UBDINIT (X_DK_WPMS+2) 35 { "_ubdinit" }, 36 #endif 37 #ifdef sun 38 #define X_MBDINIT (X_DK_WPMS+1) 39 { "_mbdinit" }, 40 #endif 41 #ifdef tahoe 42 #define X_VBDINIT (X_DK_WPMS+1) 43 { "_vbdinit" }, 44 #endif 45 #if defined(hp300) || defined(luna68k) 46 #define X_HPDINIT (X_DK_WPMS+1) 47 { "_hp_dinit" }, 48 #endif 49 { "" }, 50 }; 51 52 float *dk_mspw; 53 int dk_ndrive, *dk_select; 54 char **dr_name; 55 56 #include "names.c" /* XXX */ 57 58 int 59 dkinit() 60 { 61 register int i; 62 register char *cp; 63 static int once = 0; 64 static char buf[1024]; 65 66 if (once) 67 return(1); 68 69 if (kvm_nlist(kd, namelist)) { 70 nlisterr(namelist); 71 return(0); 72 } 73 if (namelist[X_DK_NDRIVE].n_value == 0) { 74 error("dk_ndrive undefined in kernel"); 75 return(0); 76 } 77 NREAD(X_DK_NDRIVE, &dk_ndrive, LONG); 78 if (dk_ndrive <= 0) { 79 error("dk_ndrive=%d according to %s", dk_ndrive, _PATH_UNIX); 80 return(0); 81 } 82 dk_mspw = (float *)calloc(dk_ndrive, sizeof (float)); 83 { 84 long *wpms = (long *)calloc(dk_ndrive, sizeof(long)); 85 KREAD(NPTR(X_DK_WPMS), wpms, dk_ndrive * sizeof (long)); 86 for (i = 0; i < dk_ndrive; i++) 87 *(dk_mspw + i) = (*(wpms + i) == 0)? 0.0: 88 (float) 1.0 / *(wpms + i); 89 free(wpms); 90 } 91 dr_name = (char **)calloc(dk_ndrive, sizeof (char *)); 92 dk_select = (int *)calloc(dk_ndrive, sizeof (int)); 93 for (cp = buf, i = 0; i < dk_ndrive; i++) { 94 dr_name[i] = cp; 95 sprintf(dr_name[i], "dk%d", i); 96 cp += strlen(dr_name[i]) + 1; 97 if (dk_mspw[i] != 0.0) 98 dk_select[i] = 1; 99 } 100 if (!read_names()) { 101 free(dr_name); 102 free(dk_select); 103 free(dk_mspw); 104 return(0); 105 } 106 once = 1; 107 return(1); 108 } 109 110 int 111 dkcmd(cmd, args) 112 char *cmd, *args; 113 { 114 if (prefix(cmd, "display") || prefix(cmd, "add")) { 115 dkselect(args, 1, dk_select); 116 return (1); 117 } 118 if (prefix(cmd, "ignore") || prefix(cmd, "delete")) { 119 dkselect(args, 0, dk_select); 120 return (1); 121 } 122 if (prefix(cmd, "drives")) { 123 register int i; 124 125 move(CMDLINE, 0); clrtoeol(); 126 for (i = 0; i < dk_ndrive; i++) 127 if (dk_mspw[i] != 0.0) 128 printw("%s ", dr_name[i]); 129 return (1); 130 } 131 return (0); 132 } 133 134 static void 135 dkselect(args, truefalse, selections) 136 char *args; 137 int truefalse, selections[]; 138 { 139 register char *cp; 140 register int i; 141 char *index(); 142 143 cp = index(args, '\n'); 144 if (cp) 145 *cp = '\0'; 146 for (;;) { 147 for (cp = args; *cp && isspace(*cp); cp++) 148 ; 149 args = cp; 150 for (; *cp && !isspace(*cp); cp++) 151 ; 152 if (*cp) 153 *cp++ = '\0'; 154 if (cp - args == 0) 155 break; 156 for (i = 0; i < dk_ndrive; i++) 157 if (strcmp(args, dr_name[i]) == 0) { 158 if (dk_mspw[i] != 0.0) 159 selections[i] = truefalse; 160 else 161 error("%s: drive not configured", 162 dr_name[i]); 163 break; 164 } 165 if (i >= dk_ndrive) 166 error("%s: unknown drive", args); 167 args = cp; 168 } 169 } 170