1*7c478bd9Sstevel@tonic-gate /* 2*7c478bd9Sstevel@tonic-gate * CDDL HEADER START 3*7c478bd9Sstevel@tonic-gate * 4*7c478bd9Sstevel@tonic-gate * The contents of this file are subject to the terms of the 5*7c478bd9Sstevel@tonic-gate * Common Development and Distribution License, Version 1.0 only 6*7c478bd9Sstevel@tonic-gate * (the "License"). You may not use this file except in compliance 7*7c478bd9Sstevel@tonic-gate * with the License. 8*7c478bd9Sstevel@tonic-gate * 9*7c478bd9Sstevel@tonic-gate * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE 10*7c478bd9Sstevel@tonic-gate * or http://www.opensolaris.org/os/licensing. 11*7c478bd9Sstevel@tonic-gate * See the License for the specific language governing permissions 12*7c478bd9Sstevel@tonic-gate * and limitations under the License. 13*7c478bd9Sstevel@tonic-gate * 14*7c478bd9Sstevel@tonic-gate * When distributing Covered Code, include this CDDL HEADER in each 15*7c478bd9Sstevel@tonic-gate * file and include the License file at usr/src/OPENSOLARIS.LICENSE. 16*7c478bd9Sstevel@tonic-gate * If applicable, add the following below this CDDL HEADER, with the 17*7c478bd9Sstevel@tonic-gate * fields enclosed by brackets "[]" replaced with your own identifying 18*7c478bd9Sstevel@tonic-gate * information: Portions Copyright [yyyy] [name of copyright owner] 19*7c478bd9Sstevel@tonic-gate * 20*7c478bd9Sstevel@tonic-gate * CDDL HEADER END 21*7c478bd9Sstevel@tonic-gate */ 22*7c478bd9Sstevel@tonic-gate /* 23*7c478bd9Sstevel@tonic-gate * Copyright 2004 Sun Microsystems, Inc. All rights reserved. 24*7c478bd9Sstevel@tonic-gate * Use is subject to license terms. 25*7c478bd9Sstevel@tonic-gate */ 26*7c478bd9Sstevel@tonic-gate 27*7c478bd9Sstevel@tonic-gate /* Copyright (c) 1984, 1986, 1987, 1988, 1989 AT&T */ 28*7c478bd9Sstevel@tonic-gate /* All Rights Reserved */ 29*7c478bd9Sstevel@tonic-gate 30*7c478bd9Sstevel@tonic-gate #pragma ident "%Z%%M% %I% %E% SMI" 31*7c478bd9Sstevel@tonic-gate 32*7c478bd9Sstevel@tonic-gate #include <stdio.h> 33*7c478bd9Sstevel@tonic-gate #include <stdlib.h> 34*7c478bd9Sstevel@tonic-gate #include <string.h> 35*7c478bd9Sstevel@tonic-gate #include <unistd.h> 36*7c478bd9Sstevel@tonic-gate #include <errno.h> 37*7c478bd9Sstevel@tonic-gate #include <sys/types.h> 38*7c478bd9Sstevel@tonic-gate #include <sys/priocntl.h> 39*7c478bd9Sstevel@tonic-gate #include <sys/iapriocntl.h> 40*7c478bd9Sstevel@tonic-gate #include <sys/param.h> 41*7c478bd9Sstevel@tonic-gate #include <sys/ia.h> 42*7c478bd9Sstevel@tonic-gate 43*7c478bd9Sstevel@tonic-gate #include "dispadmin.h" 44*7c478bd9Sstevel@tonic-gate 45*7c478bd9Sstevel@tonic-gate /* 46*7c478bd9Sstevel@tonic-gate * This file contains the class specific code implementing 47*7c478bd9Sstevel@tonic-gate * the interactive dispadmin sub-command. 48*7c478bd9Sstevel@tonic-gate */ 49*7c478bd9Sstevel@tonic-gate 50*7c478bd9Sstevel@tonic-gate #define BASENMSZ 16 51*7c478bd9Sstevel@tonic-gate 52*7c478bd9Sstevel@tonic-gate extern char *basename(); 53*7c478bd9Sstevel@tonic-gate 54*7c478bd9Sstevel@tonic-gate static void get_iadptbl(), set_iadptbl(); 55*7c478bd9Sstevel@tonic-gate 56*7c478bd9Sstevel@tonic-gate static char usage[] = 57*7c478bd9Sstevel@tonic-gate "usage: dispadmin -l\n\ 58*7c478bd9Sstevel@tonic-gate dispadmin -c IA -g [-r res]\n\ 59*7c478bd9Sstevel@tonic-gate dispadmin -c IA -s infile\n"; 60*7c478bd9Sstevel@tonic-gate 61*7c478bd9Sstevel@tonic-gate static char basenm[BASENMSZ]; 62*7c478bd9Sstevel@tonic-gate static char cmdpath[256]; 63*7c478bd9Sstevel@tonic-gate 64*7c478bd9Sstevel@tonic-gate 65*7c478bd9Sstevel@tonic-gate int 66*7c478bd9Sstevel@tonic-gate main(int argc, char **argv) 67*7c478bd9Sstevel@tonic-gate { 68*7c478bd9Sstevel@tonic-gate extern char *optarg; 69*7c478bd9Sstevel@tonic-gate 70*7c478bd9Sstevel@tonic-gate int c; 71*7c478bd9Sstevel@tonic-gate int lflag, gflag, rflag, sflag; 72*7c478bd9Sstevel@tonic-gate ulong_t res; 73*7c478bd9Sstevel@tonic-gate char *infile; 74*7c478bd9Sstevel@tonic-gate 75*7c478bd9Sstevel@tonic-gate (void) strcpy(cmdpath, argv[0]); 76*7c478bd9Sstevel@tonic-gate (void) strcpy(basenm, basename(argv[0])); 77*7c478bd9Sstevel@tonic-gate lflag = gflag = rflag = sflag = 0; 78*7c478bd9Sstevel@tonic-gate while ((c = getopt(argc, argv, "lc:gr:s:")) != -1) { 79*7c478bd9Sstevel@tonic-gate switch (c) { 80*7c478bd9Sstevel@tonic-gate 81*7c478bd9Sstevel@tonic-gate case 'l': 82*7c478bd9Sstevel@tonic-gate lflag++; 83*7c478bd9Sstevel@tonic-gate break; 84*7c478bd9Sstevel@tonic-gate 85*7c478bd9Sstevel@tonic-gate case 'c': 86*7c478bd9Sstevel@tonic-gate if (strcmp(optarg, "IA") != 0) 87*7c478bd9Sstevel@tonic-gate fatalerr("error: %s executed for %s class, " 88*7c478bd9Sstevel@tonic-gate "%s is actually sub-command for IA class\n", 89*7c478bd9Sstevel@tonic-gate cmdpath, optarg, cmdpath); 90*7c478bd9Sstevel@tonic-gate break; 91*7c478bd9Sstevel@tonic-gate 92*7c478bd9Sstevel@tonic-gate case 'g': 93*7c478bd9Sstevel@tonic-gate gflag++; 94*7c478bd9Sstevel@tonic-gate break; 95*7c478bd9Sstevel@tonic-gate 96*7c478bd9Sstevel@tonic-gate case 'r': 97*7c478bd9Sstevel@tonic-gate rflag++; 98*7c478bd9Sstevel@tonic-gate res = strtoul(optarg, (char **)NULL, 10); 99*7c478bd9Sstevel@tonic-gate break; 100*7c478bd9Sstevel@tonic-gate 101*7c478bd9Sstevel@tonic-gate case 's': 102*7c478bd9Sstevel@tonic-gate sflag++; 103*7c478bd9Sstevel@tonic-gate infile = optarg; 104*7c478bd9Sstevel@tonic-gate break; 105*7c478bd9Sstevel@tonic-gate 106*7c478bd9Sstevel@tonic-gate case '?': 107*7c478bd9Sstevel@tonic-gate fatalerr(usage); 108*7c478bd9Sstevel@tonic-gate 109*7c478bd9Sstevel@tonic-gate default: 110*7c478bd9Sstevel@tonic-gate break; 111*7c478bd9Sstevel@tonic-gate } 112*7c478bd9Sstevel@tonic-gate } 113*7c478bd9Sstevel@tonic-gate 114*7c478bd9Sstevel@tonic-gate if (lflag) { 115*7c478bd9Sstevel@tonic-gate if (gflag || rflag || sflag) 116*7c478bd9Sstevel@tonic-gate fatalerr(usage); 117*7c478bd9Sstevel@tonic-gate 118*7c478bd9Sstevel@tonic-gate (void) printf("IA\t(Interactive)\n"); 119*7c478bd9Sstevel@tonic-gate return (0); 120*7c478bd9Sstevel@tonic-gate 121*7c478bd9Sstevel@tonic-gate } else if (gflag) { 122*7c478bd9Sstevel@tonic-gate if (lflag || sflag) 123*7c478bd9Sstevel@tonic-gate fatalerr(usage); 124*7c478bd9Sstevel@tonic-gate 125*7c478bd9Sstevel@tonic-gate if (rflag == 0) 126*7c478bd9Sstevel@tonic-gate res = 1000; 127*7c478bd9Sstevel@tonic-gate 128*7c478bd9Sstevel@tonic-gate get_iadptbl(res); 129*7c478bd9Sstevel@tonic-gate return (0); 130*7c478bd9Sstevel@tonic-gate 131*7c478bd9Sstevel@tonic-gate } else if (sflag) { 132*7c478bd9Sstevel@tonic-gate if (lflag || gflag || rflag) 133*7c478bd9Sstevel@tonic-gate fatalerr(usage); 134*7c478bd9Sstevel@tonic-gate 135*7c478bd9Sstevel@tonic-gate set_iadptbl(infile); 136*7c478bd9Sstevel@tonic-gate return (0); 137*7c478bd9Sstevel@tonic-gate 138*7c478bd9Sstevel@tonic-gate } else { 139*7c478bd9Sstevel@tonic-gate fatalerr(usage); 140*7c478bd9Sstevel@tonic-gate } 141*7c478bd9Sstevel@tonic-gate return (1); 142*7c478bd9Sstevel@tonic-gate } 143*7c478bd9Sstevel@tonic-gate 144*7c478bd9Sstevel@tonic-gate 145*7c478bd9Sstevel@tonic-gate /* 146*7c478bd9Sstevel@tonic-gate * Retrieve the current ia_dptbl from memory, convert the time quantum 147*7c478bd9Sstevel@tonic-gate * values to the resolution specified by res and write the table to stdout. 148*7c478bd9Sstevel@tonic-gate */ 149*7c478bd9Sstevel@tonic-gate static void 150*7c478bd9Sstevel@tonic-gate get_iadptbl(ulong_t res) 151*7c478bd9Sstevel@tonic-gate { 152*7c478bd9Sstevel@tonic-gate int i; 153*7c478bd9Sstevel@tonic-gate int iadpsz; 154*7c478bd9Sstevel@tonic-gate pcinfo_t pcinfo; 155*7c478bd9Sstevel@tonic-gate pcadmin_t pcadmin; 156*7c478bd9Sstevel@tonic-gate iaadmin_t iaadmin; 157*7c478bd9Sstevel@tonic-gate iadpent_t *ia_dptbl; 158*7c478bd9Sstevel@tonic-gate hrtimer_t hrtime; 159*7c478bd9Sstevel@tonic-gate 160*7c478bd9Sstevel@tonic-gate (void) strcpy(pcinfo.pc_clname, "IA"); 161*7c478bd9Sstevel@tonic-gate if (priocntl(0, 0, PC_GETCID, (caddr_t)&pcinfo) == -1) 162*7c478bd9Sstevel@tonic-gate fatalerr("%s: Can't get IA class ID, priocntl system " 163*7c478bd9Sstevel@tonic-gate "call failed with errno %d\n", 164*7c478bd9Sstevel@tonic-gate basenm, errno); 165*7c478bd9Sstevel@tonic-gate 166*7c478bd9Sstevel@tonic-gate pcadmin.pc_cid = pcinfo.pc_cid; 167*7c478bd9Sstevel@tonic-gate pcadmin.pc_cladmin = (char *)&iaadmin; 168*7c478bd9Sstevel@tonic-gate iaadmin.ia_cmd = IA_GETDPSIZE; 169*7c478bd9Sstevel@tonic-gate 170*7c478bd9Sstevel@tonic-gate if (priocntl(0, 0, PC_ADMIN, (caddr_t)&pcadmin) == -1) 171*7c478bd9Sstevel@tonic-gate fatalerr("%s: Can't get ia_dptbl size, priocntl system " 172*7c478bd9Sstevel@tonic-gate "call failed with errno %d\n", 173*7c478bd9Sstevel@tonic-gate basenm, errno); 174*7c478bd9Sstevel@tonic-gate 175*7c478bd9Sstevel@tonic-gate iadpsz = iaadmin.ia_ndpents * sizeof (iadpent_t); 176*7c478bd9Sstevel@tonic-gate if ((ia_dptbl = (iadpent_t *)malloc(iadpsz)) == NULL) 177*7c478bd9Sstevel@tonic-gate fatalerr("%s: Can't allocate memory for ia_dptbl\n", basenm); 178*7c478bd9Sstevel@tonic-gate 179*7c478bd9Sstevel@tonic-gate iaadmin.ia_dpents = ia_dptbl; 180*7c478bd9Sstevel@tonic-gate 181*7c478bd9Sstevel@tonic-gate iaadmin.ia_cmd = IA_GETDPTBL; 182*7c478bd9Sstevel@tonic-gate if (priocntl(0, 0, PC_ADMIN, (caddr_t)&pcadmin) == -1) 183*7c478bd9Sstevel@tonic-gate fatalerr("%s: Can't get ia_dptbl, priocntl system call " 184*7c478bd9Sstevel@tonic-gate "call failed with errno %d\n", 185*7c478bd9Sstevel@tonic-gate basenm, errno); 186*7c478bd9Sstevel@tonic-gate 187*7c478bd9Sstevel@tonic-gate (void) printf("# Interactive Dispatcher Configuration\n"); 188*7c478bd9Sstevel@tonic-gate (void) printf("RES=%ld\n\n", res); 189*7c478bd9Sstevel@tonic-gate (void) printf("# ia_quantum ia_tqexp ia_slpret ia_maxwait ia_lwait \ 190*7c478bd9Sstevel@tonic-gate PRIORITY LEVEL\n"); 191*7c478bd9Sstevel@tonic-gate 192*7c478bd9Sstevel@tonic-gate for (i = 0; i < iaadmin.ia_ndpents; i++) { 193*7c478bd9Sstevel@tonic-gate if (res != HZ) { 194*7c478bd9Sstevel@tonic-gate hrtime.hrt_secs = 0; 195*7c478bd9Sstevel@tonic-gate hrtime.hrt_rem = ia_dptbl[i].ia_quantum; 196*7c478bd9Sstevel@tonic-gate hrtime.hrt_res = HZ; 197*7c478bd9Sstevel@tonic-gate if (_hrtnewres(&hrtime, res, HRT_RNDUP) == -1) 198*7c478bd9Sstevel@tonic-gate fatalerr("%s: Can't convert to requested " 199*7c478bd9Sstevel@tonic-gate "resolution\n", basenm); 200*7c478bd9Sstevel@tonic-gate if ((ia_dptbl[i].ia_quantum = hrtconvert(&hrtime)) 201*7c478bd9Sstevel@tonic-gate == -1) 202*7c478bd9Sstevel@tonic-gate fatalerr("%s: Can't express time quantum in " 203*7c478bd9Sstevel@tonic-gate "requested resolution,\n" 204*7c478bd9Sstevel@tonic-gate "try coarser resolution\n", 205*7c478bd9Sstevel@tonic-gate basenm); 206*7c478bd9Sstevel@tonic-gate } 207*7c478bd9Sstevel@tonic-gate (void) printf("%10ld%10d%10d%12d%10d # %3d\n", 208*7c478bd9Sstevel@tonic-gate ia_dptbl[i].ia_quantum, ia_dptbl[i].ia_tqexp, 209*7c478bd9Sstevel@tonic-gate ia_dptbl[i].ia_slpret, ia_dptbl[i].ia_maxwait, 210*7c478bd9Sstevel@tonic-gate ia_dptbl[i].ia_lwait, i); 211*7c478bd9Sstevel@tonic-gate } 212*7c478bd9Sstevel@tonic-gate } 213*7c478bd9Sstevel@tonic-gate 214*7c478bd9Sstevel@tonic-gate 215*7c478bd9Sstevel@tonic-gate /* 216*7c478bd9Sstevel@tonic-gate * Read the ia_dptbl values from infile, convert the time quantum values 217*7c478bd9Sstevel@tonic-gate * to HZ resolution, do a little sanity checking and overwrite the table 218*7c478bd9Sstevel@tonic-gate * in memory with the values from the file. 219*7c478bd9Sstevel@tonic-gate */ 220*7c478bd9Sstevel@tonic-gate static void 221*7c478bd9Sstevel@tonic-gate set_iadptbl(infile) 222*7c478bd9Sstevel@tonic-gate char *infile; 223*7c478bd9Sstevel@tonic-gate { 224*7c478bd9Sstevel@tonic-gate int i; 225*7c478bd9Sstevel@tonic-gate int niadpents; 226*7c478bd9Sstevel@tonic-gate char *tokp; 227*7c478bd9Sstevel@tonic-gate pcinfo_t pcinfo; 228*7c478bd9Sstevel@tonic-gate pcadmin_t pcadmin; 229*7c478bd9Sstevel@tonic-gate iaadmin_t iaadmin; 230*7c478bd9Sstevel@tonic-gate iadpent_t *ia_dptbl; 231*7c478bd9Sstevel@tonic-gate int linenum; 232*7c478bd9Sstevel@tonic-gate ulong_t res; 233*7c478bd9Sstevel@tonic-gate hrtimer_t hrtime; 234*7c478bd9Sstevel@tonic-gate FILE *fp; 235*7c478bd9Sstevel@tonic-gate char buf[512]; 236*7c478bd9Sstevel@tonic-gate int wslength; 237*7c478bd9Sstevel@tonic-gate 238*7c478bd9Sstevel@tonic-gate (void) strcpy(pcinfo.pc_clname, "IA"); 239*7c478bd9Sstevel@tonic-gate if (priocntl(0, 0, PC_GETCID, (caddr_t)&pcinfo) == -1) 240*7c478bd9Sstevel@tonic-gate fatalerr("%s: Can't get IA class ID, priocntl system " 241*7c478bd9Sstevel@tonic-gate "call failed with errno %d\n", basenm, errno); 242*7c478bd9Sstevel@tonic-gate 243*7c478bd9Sstevel@tonic-gate pcadmin.pc_cid = pcinfo.pc_cid; 244*7c478bd9Sstevel@tonic-gate pcadmin.pc_cladmin = (char *)&iaadmin; 245*7c478bd9Sstevel@tonic-gate iaadmin.ia_cmd = IA_GETDPSIZE; 246*7c478bd9Sstevel@tonic-gate 247*7c478bd9Sstevel@tonic-gate if (priocntl(0, 0, PC_ADMIN, (caddr_t)&pcadmin) == -1) 248*7c478bd9Sstevel@tonic-gate fatalerr("%s: Can't get ia_dptbl size, priocntl system " 249*7c478bd9Sstevel@tonic-gate "call failed with errno %d\n", basenm, errno); 250*7c478bd9Sstevel@tonic-gate 251*7c478bd9Sstevel@tonic-gate niadpents = iaadmin.ia_ndpents; 252*7c478bd9Sstevel@tonic-gate if ((ia_dptbl = 253*7c478bd9Sstevel@tonic-gate (iadpent_t *)malloc(niadpents * sizeof (iadpent_t))) == NULL) 254*7c478bd9Sstevel@tonic-gate fatalerr("%s: Can't allocate memory for ia_dptbl\n", basenm); 255*7c478bd9Sstevel@tonic-gate 256*7c478bd9Sstevel@tonic-gate if ((fp = fopen(infile, "r")) == NULL) 257*7c478bd9Sstevel@tonic-gate fatalerr("%s: Can't open %s for input\n", basenm, infile); 258*7c478bd9Sstevel@tonic-gate 259*7c478bd9Sstevel@tonic-gate linenum = 0; 260*7c478bd9Sstevel@tonic-gate 261*7c478bd9Sstevel@tonic-gate /* 262*7c478bd9Sstevel@tonic-gate * Find the first non-blank, non-comment line. A comment line 263*7c478bd9Sstevel@tonic-gate * is any line with '#' as the first non-white-space character. 264*7c478bd9Sstevel@tonic-gate */ 265*7c478bd9Sstevel@tonic-gate do { 266*7c478bd9Sstevel@tonic-gate if (fgets(buf, sizeof (buf), fp) == NULL) 267*7c478bd9Sstevel@tonic-gate fatalerr("%s: Too few lines in input table\n", basenm); 268*7c478bd9Sstevel@tonic-gate linenum++; 269*7c478bd9Sstevel@tonic-gate } while (buf[0] == '#' || buf[0] == '\0' || 270*7c478bd9Sstevel@tonic-gate (wslength = strspn(buf, " \t\n")) == strlen(buf) || 271*7c478bd9Sstevel@tonic-gate strchr(buf, '#') == buf + wslength); 272*7c478bd9Sstevel@tonic-gate 273*7c478bd9Sstevel@tonic-gate if ((tokp = strtok(buf, " \t")) == NULL) 274*7c478bd9Sstevel@tonic-gate fatalerr("%s: Bad RES specification, line %d of input file\n", 275*7c478bd9Sstevel@tonic-gate basenm, linenum); 276*7c478bd9Sstevel@tonic-gate if ((int)strlen(tokp) > 4) { 277*7c478bd9Sstevel@tonic-gate if (strncmp(tokp, "RES=", 4) != 0) 278*7c478bd9Sstevel@tonic-gate fatalerr("%s: Bad RES specification, \ 279*7c478bd9Sstevel@tonic-gate line %d of input file\n", basenm, linenum); 280*7c478bd9Sstevel@tonic-gate if (tokp[4] == '-') 281*7c478bd9Sstevel@tonic-gate fatalerr("%s: Bad RES specification, \ 282*7c478bd9Sstevel@tonic-gate line %d of input file\n", basenm, linenum); 283*7c478bd9Sstevel@tonic-gate res = strtoul(&tokp[4], (char **)NULL, 10); 284*7c478bd9Sstevel@tonic-gate } else if (strlen(tokp) == 4) { 285*7c478bd9Sstevel@tonic-gate if (strcmp(tokp, "RES=") != 0) 286*7c478bd9Sstevel@tonic-gate fatalerr("%s: Bad RES specification, \ 287*7c478bd9Sstevel@tonic-gate line %d of input file\n", basenm, linenum); 288*7c478bd9Sstevel@tonic-gate if ((tokp = strtok(NULL, " \t")) == NULL) 289*7c478bd9Sstevel@tonic-gate fatalerr("%s: Bad RES specification, \ 290*7c478bd9Sstevel@tonic-gate line %d of input file\n", basenm, linenum); 291*7c478bd9Sstevel@tonic-gate if (tokp[0] == '-') 292*7c478bd9Sstevel@tonic-gate fatalerr("%s: Bad RES specification, \ 293*7c478bd9Sstevel@tonic-gate line %d of input file\n", basenm, linenum); 294*7c478bd9Sstevel@tonic-gate res = strtoul(tokp, (char **)NULL, 10); 295*7c478bd9Sstevel@tonic-gate } else if (strlen(tokp) == 3) { 296*7c478bd9Sstevel@tonic-gate if (strcmp(tokp, "RES") != 0) 297*7c478bd9Sstevel@tonic-gate fatalerr("%s: Bad RES specification, \ 298*7c478bd9Sstevel@tonic-gate line %d of input file\n", basenm, linenum); 299*7c478bd9Sstevel@tonic-gate if ((tokp = strtok(NULL, " \t")) == NULL) 300*7c478bd9Sstevel@tonic-gate fatalerr("%s: Bad RES specification, \ 301*7c478bd9Sstevel@tonic-gate line %d of input file\n", basenm, linenum); 302*7c478bd9Sstevel@tonic-gate if ((int)strlen(tokp) > 1) { 303*7c478bd9Sstevel@tonic-gate if (strncmp(tokp, "=", 1) != 0) 304*7c478bd9Sstevel@tonic-gate fatalerr("%s: Bad RES specification, \ 305*7c478bd9Sstevel@tonic-gate line %d of input file\n", basenm, linenum); 306*7c478bd9Sstevel@tonic-gate if (tokp[1] == '-') 307*7c478bd9Sstevel@tonic-gate fatalerr("%s: Bad RES specification, \ 308*7c478bd9Sstevel@tonic-gate line %d of input file\n", basenm, linenum); 309*7c478bd9Sstevel@tonic-gate res = strtoul(&tokp[1], (char **)NULL, 10); 310*7c478bd9Sstevel@tonic-gate } else if (strlen(tokp) == 1) { 311*7c478bd9Sstevel@tonic-gate if ((tokp = strtok(NULL, " \t")) == NULL) 312*7c478bd9Sstevel@tonic-gate fatalerr("%s: Bad RES specification, \ 313*7c478bd9Sstevel@tonic-gate line %d of input file\n", basenm, linenum); 314*7c478bd9Sstevel@tonic-gate if (tokp[0] == '-') 315*7c478bd9Sstevel@tonic-gate fatalerr("%s: Bad RES specification, \ 316*7c478bd9Sstevel@tonic-gate line %d of input file\n", basenm, linenum); 317*7c478bd9Sstevel@tonic-gate res = strtoul(tokp, (char **)NULL, 10); 318*7c478bd9Sstevel@tonic-gate } 319*7c478bd9Sstevel@tonic-gate } else { 320*7c478bd9Sstevel@tonic-gate fatalerr("%s: Bad RES specification, line %d of input file\n", 321*7c478bd9Sstevel@tonic-gate basenm, linenum); 322*7c478bd9Sstevel@tonic-gate } 323*7c478bd9Sstevel@tonic-gate 324*7c478bd9Sstevel@tonic-gate /* 325*7c478bd9Sstevel@tonic-gate * The remainder of the input file should contain exactly enough 326*7c478bd9Sstevel@tonic-gate * non-blank, non-comment lines to fill the table (ia_ndpents lines). 327*7c478bd9Sstevel@tonic-gate * We assume that any non-blank, non-comment line is data for the 328*7c478bd9Sstevel@tonic-gate * table and fail if we find more or less than we need. 329*7c478bd9Sstevel@tonic-gate */ 330*7c478bd9Sstevel@tonic-gate for (i = 0; i < iaadmin.ia_ndpents; i++) { 331*7c478bd9Sstevel@tonic-gate 332*7c478bd9Sstevel@tonic-gate /* 333*7c478bd9Sstevel@tonic-gate * Get the next non-blank, non-comment line. 334*7c478bd9Sstevel@tonic-gate */ 335*7c478bd9Sstevel@tonic-gate do { 336*7c478bd9Sstevel@tonic-gate if (fgets(buf, sizeof (buf), fp) == NULL) 337*7c478bd9Sstevel@tonic-gate fatalerr("%s: Too few lines in input table\n", 338*7c478bd9Sstevel@tonic-gate basenm); 339*7c478bd9Sstevel@tonic-gate linenum++; 340*7c478bd9Sstevel@tonic-gate } while (buf[0] == '#' || buf[0] == '\0' || 341*7c478bd9Sstevel@tonic-gate (wslength = strspn(buf, " \t\n")) == strlen(buf) || 342*7c478bd9Sstevel@tonic-gate strchr(buf, '#') == buf + wslength); 343*7c478bd9Sstevel@tonic-gate 344*7c478bd9Sstevel@tonic-gate if ((tokp = strtok(buf, " \t")) == NULL) 345*7c478bd9Sstevel@tonic-gate fatalerr("%s: Too few values, line %d of input file\n", 346*7c478bd9Sstevel@tonic-gate basenm, linenum); 347*7c478bd9Sstevel@tonic-gate 348*7c478bd9Sstevel@tonic-gate if (res != HZ) { 349*7c478bd9Sstevel@tonic-gate hrtime.hrt_secs = 0; 350*7c478bd9Sstevel@tonic-gate hrtime.hrt_rem = atol(tokp); 351*7c478bd9Sstevel@tonic-gate hrtime.hrt_res = res; 352*7c478bd9Sstevel@tonic-gate if (_hrtnewres(&hrtime, HZ, HRT_RNDUP) == -1) 353*7c478bd9Sstevel@tonic-gate fatalerr("%s: Can't convert specified \ 354*7c478bd9Sstevel@tonic-gate resolution to ticks\n", basenm); 355*7c478bd9Sstevel@tonic-gate if ((ia_dptbl[i].ia_quantum = hrtconvert(&hrtime)) 356*7c478bd9Sstevel@tonic-gate == -1) 357*7c478bd9Sstevel@tonic-gate fatalerr("%s: ia_quantum value out of " 358*7c478bd9Sstevel@tonic-gate "valid range; line %d of input,\n" 359*7c478bd9Sstevel@tonic-gate "table not overwritten\n", 360*7c478bd9Sstevel@tonic-gate basenm, linenum); 361*7c478bd9Sstevel@tonic-gate } else { 362*7c478bd9Sstevel@tonic-gate ia_dptbl[i].ia_quantum = atol(tokp); 363*7c478bd9Sstevel@tonic-gate } 364*7c478bd9Sstevel@tonic-gate if (ia_dptbl[i].ia_quantum <= 0) 365*7c478bd9Sstevel@tonic-gate fatalerr("%s: ia_quantum value out of valid range; " 366*7c478bd9Sstevel@tonic-gate "line %d of input,\ntable not overwritten\n", 367*7c478bd9Sstevel@tonic-gate basenm, linenum); 368*7c478bd9Sstevel@tonic-gate 369*7c478bd9Sstevel@tonic-gate if ((tokp = strtok(NULL, " \t")) == NULL || tokp[0] == '#') 370*7c478bd9Sstevel@tonic-gate fatalerr("%s: Too few values, line %d of input file\n", 371*7c478bd9Sstevel@tonic-gate basenm, linenum); 372*7c478bd9Sstevel@tonic-gate ia_dptbl[i].ia_tqexp = (short)atoi(tokp); 373*7c478bd9Sstevel@tonic-gate if (ia_dptbl[i].ia_tqexp < 0 || 374*7c478bd9Sstevel@tonic-gate ia_dptbl[i].ia_tqexp > iaadmin.ia_ndpents) 375*7c478bd9Sstevel@tonic-gate fatalerr("%s: ia_tqexp value out of valid range; " 376*7c478bd9Sstevel@tonic-gate "line %d of input,\ntable not overwritten\n", 377*7c478bd9Sstevel@tonic-gate basenm, linenum); 378*7c478bd9Sstevel@tonic-gate 379*7c478bd9Sstevel@tonic-gate if ((tokp = strtok(NULL, " \t")) == NULL || tokp[0] == '#') 380*7c478bd9Sstevel@tonic-gate fatalerr("%s: Too few values, line %d of input file\n", 381*7c478bd9Sstevel@tonic-gate basenm, linenum); 382*7c478bd9Sstevel@tonic-gate ia_dptbl[i].ia_slpret = (short)atoi(tokp); 383*7c478bd9Sstevel@tonic-gate if (ia_dptbl[i].ia_slpret < 0 || 384*7c478bd9Sstevel@tonic-gate ia_dptbl[i].ia_slpret > iaadmin.ia_ndpents) 385*7c478bd9Sstevel@tonic-gate fatalerr("%s: ia_slpret value out of valid range; " 386*7c478bd9Sstevel@tonic-gate "line %d of input,\ntable not overwritten\n", 387*7c478bd9Sstevel@tonic-gate basenm, linenum); 388*7c478bd9Sstevel@tonic-gate 389*7c478bd9Sstevel@tonic-gate if ((tokp = strtok(NULL, " \t")) == NULL || tokp[0] == '#') 390*7c478bd9Sstevel@tonic-gate fatalerr("%s: Too few values, line %d of input file\n", 391*7c478bd9Sstevel@tonic-gate basenm, linenum); 392*7c478bd9Sstevel@tonic-gate ia_dptbl[i].ia_maxwait = (short)atoi(tokp); 393*7c478bd9Sstevel@tonic-gate if (ia_dptbl[i].ia_maxwait < 0) 394*7c478bd9Sstevel@tonic-gate fatalerr("%s: ia_maxwait value out of valid range; " 395*7c478bd9Sstevel@tonic-gate "line %d of input,\ntable not overwritten\n", 396*7c478bd9Sstevel@tonic-gate basenm, linenum); 397*7c478bd9Sstevel@tonic-gate 398*7c478bd9Sstevel@tonic-gate if ((tokp = strtok(NULL, " \t")) == NULL || tokp[0] == '#') 399*7c478bd9Sstevel@tonic-gate fatalerr("%s: Too few values, line %d of input file\n", 400*7c478bd9Sstevel@tonic-gate basenm, linenum); 401*7c478bd9Sstevel@tonic-gate ia_dptbl[i].ia_lwait = (short)atoi(tokp); 402*7c478bd9Sstevel@tonic-gate if (ia_dptbl[i].ia_lwait < 0 || 403*7c478bd9Sstevel@tonic-gate ia_dptbl[i].ia_lwait > iaadmin.ia_ndpents) 404*7c478bd9Sstevel@tonic-gate fatalerr("%s: ia_lwait value out of valid range; " 405*7c478bd9Sstevel@tonic-gate "line %d of input,\ntable not overwritten\n", 406*7c478bd9Sstevel@tonic-gate basenm, linenum); 407*7c478bd9Sstevel@tonic-gate 408*7c478bd9Sstevel@tonic-gate if ((tokp = strtok(NULL, " \t")) != NULL && tokp[0] != '#') 409*7c478bd9Sstevel@tonic-gate fatalerr("%s: Too many values, line %d of input file\n", 410*7c478bd9Sstevel@tonic-gate basenm, linenum); 411*7c478bd9Sstevel@tonic-gate } 412*7c478bd9Sstevel@tonic-gate 413*7c478bd9Sstevel@tonic-gate /* 414*7c478bd9Sstevel@tonic-gate * We've read enough lines to fill the table. We fail 415*7c478bd9Sstevel@tonic-gate * if the input file contains any more. 416*7c478bd9Sstevel@tonic-gate */ 417*7c478bd9Sstevel@tonic-gate while (fgets(buf, sizeof (buf), fp) != NULL) { 418*7c478bd9Sstevel@tonic-gate if (buf[0] != '#' && buf[0] != '\0' && 419*7c478bd9Sstevel@tonic-gate (wslength = strspn(buf, " \t\n")) != strlen(buf) && 420*7c478bd9Sstevel@tonic-gate strchr(buf, '#') != buf + wslength) 421*7c478bd9Sstevel@tonic-gate fatalerr("%s: Too many lines in input table\n", 422*7c478bd9Sstevel@tonic-gate basenm); 423*7c478bd9Sstevel@tonic-gate } 424*7c478bd9Sstevel@tonic-gate 425*7c478bd9Sstevel@tonic-gate iaadmin.ia_dpents = ia_dptbl; 426*7c478bd9Sstevel@tonic-gate iaadmin.ia_cmd = IA_SETDPTBL; 427*7c478bd9Sstevel@tonic-gate if (priocntl(0, 0, PC_ADMIN, (caddr_t)&pcadmin) == -1) 428*7c478bd9Sstevel@tonic-gate fatalerr("%s: Can't set ia_dptbl, priocntl system call \ 429*7c478bd9Sstevel@tonic-gate failed with errno %d\n", basenm, errno); 430*7c478bd9Sstevel@tonic-gate } 431