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 31*7c478bd9Sstevel@tonic-gate #pragma ident "%Z%%M% %I% %E% SMI" 32*7c478bd9Sstevel@tonic-gate 33*7c478bd9Sstevel@tonic-gate #include <stdio.h> 34*7c478bd9Sstevel@tonic-gate #include <stdlib.h> 35*7c478bd9Sstevel@tonic-gate #include <string.h> 36*7c478bd9Sstevel@tonic-gate #include <unistd.h> 37*7c478bd9Sstevel@tonic-gate #include <errno.h> 38*7c478bd9Sstevel@tonic-gate #include <sys/types.h> 39*7c478bd9Sstevel@tonic-gate #include <sys/priocntl.h> 40*7c478bd9Sstevel@tonic-gate #include <sys/rtpriocntl.h> 41*7c478bd9Sstevel@tonic-gate #include <sys/param.h> 42*7c478bd9Sstevel@tonic-gate #include <sys/rt.h> 43*7c478bd9Sstevel@tonic-gate 44*7c478bd9Sstevel@tonic-gate #include "dispadmin.h" 45*7c478bd9Sstevel@tonic-gate 46*7c478bd9Sstevel@tonic-gate /* 47*7c478bd9Sstevel@tonic-gate * This file contains the class specific code implementing 48*7c478bd9Sstevel@tonic-gate * the real-time dispadmin sub-command. 49*7c478bd9Sstevel@tonic-gate */ 50*7c478bd9Sstevel@tonic-gate 51*7c478bd9Sstevel@tonic-gate #define BASENMSZ 16 52*7c478bd9Sstevel@tonic-gate 53*7c478bd9Sstevel@tonic-gate extern char *basename(); 54*7c478bd9Sstevel@tonic-gate 55*7c478bd9Sstevel@tonic-gate static void get_rtdptbl(), set_rtdptbl(); 56*7c478bd9Sstevel@tonic-gate 57*7c478bd9Sstevel@tonic-gate static char usage[] = "usage: dispadmin -l\n" 58*7c478bd9Sstevel@tonic-gate "dispadmin -c RT -g [-r res]\n" 59*7c478bd9Sstevel@tonic-gate "dispadmin -c RT -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, "RT") != 0) 87*7c478bd9Sstevel@tonic-gate fatalerr("error: %s executed for %s class, " 88*7c478bd9Sstevel@tonic-gate "%s is actually sub-command for RT 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("RT\t(Real Time)\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_rtdptbl(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_rtdptbl(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 rt_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_rtdptbl(ulong_t res) 151*7c478bd9Sstevel@tonic-gate { 152*7c478bd9Sstevel@tonic-gate int i; 153*7c478bd9Sstevel@tonic-gate int rtdpsz; 154*7c478bd9Sstevel@tonic-gate pcinfo_t pcinfo; 155*7c478bd9Sstevel@tonic-gate pcadmin_t pcadmin; 156*7c478bd9Sstevel@tonic-gate rtadmin_t rtadmin; 157*7c478bd9Sstevel@tonic-gate rtdpent_t *rt_dptbl; 158*7c478bd9Sstevel@tonic-gate hrtimer_t hrtime; 159*7c478bd9Sstevel@tonic-gate 160*7c478bd9Sstevel@tonic-gate (void) strcpy(pcinfo.pc_clname, "RT"); 161*7c478bd9Sstevel@tonic-gate if (priocntl(0, 0, PC_GETCID, (caddr_t)&pcinfo) == -1) 162*7c478bd9Sstevel@tonic-gate fatalerr("%s: Can't get RT class ID, priocntl system call " 163*7c478bd9Sstevel@tonic-gate "failed with errno %d\n", basenm, errno); 164*7c478bd9Sstevel@tonic-gate 165*7c478bd9Sstevel@tonic-gate pcadmin.pc_cid = pcinfo.pc_cid; 166*7c478bd9Sstevel@tonic-gate pcadmin.pc_cladmin = (char *)&rtadmin; 167*7c478bd9Sstevel@tonic-gate rtadmin.rt_cmd = RT_GETDPSIZE; 168*7c478bd9Sstevel@tonic-gate 169*7c478bd9Sstevel@tonic-gate if (priocntl(0, 0, PC_ADMIN, (caddr_t)&pcadmin) == -1) 170*7c478bd9Sstevel@tonic-gate fatalerr("%s: Can't get rt_dptbl size, priocntl system call " 171*7c478bd9Sstevel@tonic-gate "failed with errno %d\n", basenm, errno); 172*7c478bd9Sstevel@tonic-gate 173*7c478bd9Sstevel@tonic-gate rtdpsz = rtadmin.rt_ndpents * sizeof (rtdpent_t); 174*7c478bd9Sstevel@tonic-gate if ((rt_dptbl = (rtdpent_t *)malloc(rtdpsz)) == NULL) 175*7c478bd9Sstevel@tonic-gate fatalerr("%s: Can't allocate memory for rt_dptbl\n", basenm); 176*7c478bd9Sstevel@tonic-gate 177*7c478bd9Sstevel@tonic-gate rtadmin.rt_dpents = rt_dptbl; 178*7c478bd9Sstevel@tonic-gate 179*7c478bd9Sstevel@tonic-gate rtadmin.rt_cmd = RT_GETDPTBL; 180*7c478bd9Sstevel@tonic-gate if (priocntl(0, 0, PC_ADMIN, (caddr_t)&pcadmin) == -1) 181*7c478bd9Sstevel@tonic-gate fatalerr("%s: Can't get rt_dptbl, priocntl system call " 182*7c478bd9Sstevel@tonic-gate "failed with errno %d\n", basenm, errno); 183*7c478bd9Sstevel@tonic-gate 184*7c478bd9Sstevel@tonic-gate (void) printf("# Real Time Dispatcher Configuration\n"); 185*7c478bd9Sstevel@tonic-gate (void) printf("RES=%ld\n\n", res); 186*7c478bd9Sstevel@tonic-gate (void) printf("# TIME QUANTUM PRIORITY\n"); 187*7c478bd9Sstevel@tonic-gate (void) printf("# (rt_quantum) LEVEL\n"); 188*7c478bd9Sstevel@tonic-gate 189*7c478bd9Sstevel@tonic-gate for (i = 0; i < rtadmin.rt_ndpents; i++) { 190*7c478bd9Sstevel@tonic-gate if (res != HZ && rt_dptbl[i].rt_quantum != RT_TQINF) { 191*7c478bd9Sstevel@tonic-gate hrtime.hrt_secs = 0; 192*7c478bd9Sstevel@tonic-gate hrtime.hrt_rem = rt_dptbl[i].rt_quantum; 193*7c478bd9Sstevel@tonic-gate hrtime.hrt_res = HZ; 194*7c478bd9Sstevel@tonic-gate if (_hrtnewres(&hrtime, res, HRT_RNDUP) == -1) 195*7c478bd9Sstevel@tonic-gate fatalerr("%s: Can't convert to requested " 196*7c478bd9Sstevel@tonic-gate "resolution\n", basenm); 197*7c478bd9Sstevel@tonic-gate if ((rt_dptbl[i].rt_quantum = 198*7c478bd9Sstevel@tonic-gate hrtconvert(&hrtime)) == -1) 199*7c478bd9Sstevel@tonic-gate fatalerr("%s: Can't express time quantum in " 200*7c478bd9Sstevel@tonic-gate "requested resolution,\n" 201*7c478bd9Sstevel@tonic-gate "try coarser resolution\n", basenm); 202*7c478bd9Sstevel@tonic-gate } 203*7c478bd9Sstevel@tonic-gate (void) printf("%10d # %3d\n", 204*7c478bd9Sstevel@tonic-gate rt_dptbl[i].rt_quantum, i); 205*7c478bd9Sstevel@tonic-gate } 206*7c478bd9Sstevel@tonic-gate } 207*7c478bd9Sstevel@tonic-gate 208*7c478bd9Sstevel@tonic-gate 209*7c478bd9Sstevel@tonic-gate /* 210*7c478bd9Sstevel@tonic-gate * Read the rt_dptbl values from infile, convert the time quantum values 211*7c478bd9Sstevel@tonic-gate * to HZ resolution, do a little sanity checking and overwrite the table 212*7c478bd9Sstevel@tonic-gate * in memory with the values from the file. 213*7c478bd9Sstevel@tonic-gate */ 214*7c478bd9Sstevel@tonic-gate static void 215*7c478bd9Sstevel@tonic-gate set_rtdptbl(infile) 216*7c478bd9Sstevel@tonic-gate char *infile; 217*7c478bd9Sstevel@tonic-gate { 218*7c478bd9Sstevel@tonic-gate int i; 219*7c478bd9Sstevel@tonic-gate int nrtdpents; 220*7c478bd9Sstevel@tonic-gate char *tokp; 221*7c478bd9Sstevel@tonic-gate pcinfo_t pcinfo; 222*7c478bd9Sstevel@tonic-gate pcadmin_t pcadmin; 223*7c478bd9Sstevel@tonic-gate rtadmin_t rtadmin; 224*7c478bd9Sstevel@tonic-gate rtdpent_t *rt_dptbl; 225*7c478bd9Sstevel@tonic-gate int linenum; 226*7c478bd9Sstevel@tonic-gate ulong_t res; 227*7c478bd9Sstevel@tonic-gate hrtimer_t hrtime; 228*7c478bd9Sstevel@tonic-gate FILE *fp; 229*7c478bd9Sstevel@tonic-gate char buf[512]; 230*7c478bd9Sstevel@tonic-gate int wslength; 231*7c478bd9Sstevel@tonic-gate 232*7c478bd9Sstevel@tonic-gate (void) strcpy(pcinfo.pc_clname, "RT"); 233*7c478bd9Sstevel@tonic-gate if (priocntl(0, 0, PC_GETCID, (caddr_t)&pcinfo) == -1) 234*7c478bd9Sstevel@tonic-gate fatalerr("%s: Can't get RT class ID, priocntl system call " 235*7c478bd9Sstevel@tonic-gate "failed with errno %d\n", basenm, errno); 236*7c478bd9Sstevel@tonic-gate 237*7c478bd9Sstevel@tonic-gate pcadmin.pc_cid = pcinfo.pc_cid; 238*7c478bd9Sstevel@tonic-gate pcadmin.pc_cladmin = (char *)&rtadmin; 239*7c478bd9Sstevel@tonic-gate rtadmin.rt_cmd = RT_GETDPSIZE; 240*7c478bd9Sstevel@tonic-gate 241*7c478bd9Sstevel@tonic-gate if (priocntl(0, 0, PC_ADMIN, (caddr_t)&pcadmin) == -1) 242*7c478bd9Sstevel@tonic-gate fatalerr("%s: Can't get rt_dptbl size, priocntl system call " 243*7c478bd9Sstevel@tonic-gate "failed with errno %d\n", basenm, errno); 244*7c478bd9Sstevel@tonic-gate 245*7c478bd9Sstevel@tonic-gate nrtdpents = rtadmin.rt_ndpents; 246*7c478bd9Sstevel@tonic-gate if ((rt_dptbl = 247*7c478bd9Sstevel@tonic-gate (rtdpent_t *)malloc(nrtdpents * sizeof (rtdpent_t))) == NULL) 248*7c478bd9Sstevel@tonic-gate fatalerr("%s: Can't allocate memory for rt_dptbl\n", basenm); 249*7c478bd9Sstevel@tonic-gate 250*7c478bd9Sstevel@tonic-gate if ((fp = fopen(infile, "r")) == NULL) 251*7c478bd9Sstevel@tonic-gate fatalerr("%s: Can't open %s for input\n", basenm, infile); 252*7c478bd9Sstevel@tonic-gate 253*7c478bd9Sstevel@tonic-gate linenum = 0; 254*7c478bd9Sstevel@tonic-gate 255*7c478bd9Sstevel@tonic-gate /* 256*7c478bd9Sstevel@tonic-gate * Find the first non-blank, non-comment line. A comment line 257*7c478bd9Sstevel@tonic-gate * is any line with '#' as the first non-white-space character. 258*7c478bd9Sstevel@tonic-gate */ 259*7c478bd9Sstevel@tonic-gate do { 260*7c478bd9Sstevel@tonic-gate if (fgets(buf, sizeof (buf), fp) == NULL) 261*7c478bd9Sstevel@tonic-gate fatalerr("%s: Too few lines in input table\n", basenm); 262*7c478bd9Sstevel@tonic-gate linenum++; 263*7c478bd9Sstevel@tonic-gate } while (buf[0] == '#' || buf[0] == '\0' || 264*7c478bd9Sstevel@tonic-gate (wslength = strspn(buf, " \t\n")) == strlen(buf) || 265*7c478bd9Sstevel@tonic-gate strchr(buf, '#') == buf + wslength); 266*7c478bd9Sstevel@tonic-gate 267*7c478bd9Sstevel@tonic-gate if ((tokp = strtok(buf, " \t")) == NULL) 268*7c478bd9Sstevel@tonic-gate fatalerr("%s: Bad RES specification, line %d of input file\n", 269*7c478bd9Sstevel@tonic-gate basenm, linenum); 270*7c478bd9Sstevel@tonic-gate if ((int)strlen(tokp) > 4) { 271*7c478bd9Sstevel@tonic-gate if (strncmp(tokp, "RES=", 4) != 0) 272*7c478bd9Sstevel@tonic-gate fatalerr("%s: Bad RES specification, " 273*7c478bd9Sstevel@tonic-gate "line %d of input file\n", basenm, linenum); 274*7c478bd9Sstevel@tonic-gate if (tokp[4] == '-') 275*7c478bd9Sstevel@tonic-gate fatalerr("%s: Bad RES specification, " 276*7c478bd9Sstevel@tonic-gate "line %d of input file\n", basenm, linenum); 277*7c478bd9Sstevel@tonic-gate res = strtoul(&tokp[4], (char **)NULL, 10); 278*7c478bd9Sstevel@tonic-gate } else if (strlen(tokp) == 4) { 279*7c478bd9Sstevel@tonic-gate if (strcmp(tokp, "RES=") != 0) 280*7c478bd9Sstevel@tonic-gate fatalerr("%s: Bad RES specification, " 281*7c478bd9Sstevel@tonic-gate "line %d of input file\n", basenm, linenum); 282*7c478bd9Sstevel@tonic-gate if ((tokp = strtok(NULL, " \t")) == NULL) 283*7c478bd9Sstevel@tonic-gate fatalerr("%s: Bad RES specification, " 284*7c478bd9Sstevel@tonic-gate "line %d of input file\n", basenm, linenum); 285*7c478bd9Sstevel@tonic-gate if (tokp[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 res = strtoul(tokp, (char **)NULL, 10); 289*7c478bd9Sstevel@tonic-gate } else if (strlen(tokp) == 3) { 290*7c478bd9Sstevel@tonic-gate if (strcmp(tokp, "RES") != 0) 291*7c478bd9Sstevel@tonic-gate fatalerr("%s: Bad RES specification, " 292*7c478bd9Sstevel@tonic-gate "line %d of input file\n", basenm, linenum); 293*7c478bd9Sstevel@tonic-gate if ((tokp = strtok(NULL, " \t")) == NULL) 294*7c478bd9Sstevel@tonic-gate fatalerr("%s: Bad RES specification, " 295*7c478bd9Sstevel@tonic-gate "line %d of input file\n", basenm, linenum); 296*7c478bd9Sstevel@tonic-gate if ((int)strlen(tokp) > 1) { 297*7c478bd9Sstevel@tonic-gate if (strncmp(tokp, "=", 1) != 0) 298*7c478bd9Sstevel@tonic-gate fatalerr("%s: Bad RES specification, " 299*7c478bd9Sstevel@tonic-gate "line %d of input file\n", basenm, linenum); 300*7c478bd9Sstevel@tonic-gate if (tokp[1] == '-') 301*7c478bd9Sstevel@tonic-gate fatalerr("%s: Bad RES specification, " 302*7c478bd9Sstevel@tonic-gate "line %d of input file\n", basenm, linenum); 303*7c478bd9Sstevel@tonic-gate res = strtoul(&tokp[1], (char **)NULL, 10); 304*7c478bd9Sstevel@tonic-gate } else if (strlen(tokp) == 1) { 305*7c478bd9Sstevel@tonic-gate if ((tokp = strtok(NULL, " \t")) == NULL) 306*7c478bd9Sstevel@tonic-gate fatalerr("%s: Bad RES specification, " 307*7c478bd9Sstevel@tonic-gate "line %d of input file\n", basenm, linenum); 308*7c478bd9Sstevel@tonic-gate if (tokp[0] == '-') 309*7c478bd9Sstevel@tonic-gate fatalerr("%s: Bad RES specification, " 310*7c478bd9Sstevel@tonic-gate "line %d of input file\n", basenm, linenum); 311*7c478bd9Sstevel@tonic-gate res = strtoul(tokp, (char **)NULL, 10); 312*7c478bd9Sstevel@tonic-gate } 313*7c478bd9Sstevel@tonic-gate } else { 314*7c478bd9Sstevel@tonic-gate fatalerr("%s: Bad RES specification, line %d of input file\n", 315*7c478bd9Sstevel@tonic-gate basenm, linenum); 316*7c478bd9Sstevel@tonic-gate } 317*7c478bd9Sstevel@tonic-gate 318*7c478bd9Sstevel@tonic-gate /* 319*7c478bd9Sstevel@tonic-gate * The remainder of the input file should contain exactly enough 320*7c478bd9Sstevel@tonic-gate * non-blank, non-comment lines to fill the table (rt_ndpents lines). 321*7c478bd9Sstevel@tonic-gate * We assume that any non-blank, non-comment line is data for the 322*7c478bd9Sstevel@tonic-gate * table and fail if we find more or less than we need. 323*7c478bd9Sstevel@tonic-gate */ 324*7c478bd9Sstevel@tonic-gate for (i = 0; i < rtadmin.rt_ndpents; i++) { 325*7c478bd9Sstevel@tonic-gate 326*7c478bd9Sstevel@tonic-gate /* 327*7c478bd9Sstevel@tonic-gate * Get the next non-blank, non-comment line. 328*7c478bd9Sstevel@tonic-gate */ 329*7c478bd9Sstevel@tonic-gate do { 330*7c478bd9Sstevel@tonic-gate if (fgets(buf, sizeof (buf), fp) == NULL) 331*7c478bd9Sstevel@tonic-gate fatalerr("%s: Too few lines in input table\n", 332*7c478bd9Sstevel@tonic-gate basenm); 333*7c478bd9Sstevel@tonic-gate linenum++; 334*7c478bd9Sstevel@tonic-gate } while (buf[0] == '#' || buf[0] == '\0' || 335*7c478bd9Sstevel@tonic-gate (wslength = strspn(buf, " \t\n")) == strlen(buf) || 336*7c478bd9Sstevel@tonic-gate strchr(buf, '#') == buf + wslength); 337*7c478bd9Sstevel@tonic-gate 338*7c478bd9Sstevel@tonic-gate if ((tokp = strtok(buf, " \t")) == NULL) 339*7c478bd9Sstevel@tonic-gate fatalerr("%s: Too few values, line %d of input file\n", 340*7c478bd9Sstevel@tonic-gate basenm, linenum); 341*7c478bd9Sstevel@tonic-gate 342*7c478bd9Sstevel@tonic-gate rt_dptbl[i].rt_quantum = atol(tokp); 343*7c478bd9Sstevel@tonic-gate if (rt_dptbl[i].rt_quantum <= 0) { 344*7c478bd9Sstevel@tonic-gate if (rt_dptbl[i].rt_quantum != RT_TQINF) 345*7c478bd9Sstevel@tonic-gate fatalerr("%s: rt_quantum value out of " 346*7c478bd9Sstevel@tonic-gate "valid range; line %d of input,\n" 347*7c478bd9Sstevel@tonic-gate "table not overwritten\n", basenm, linenum); 348*7c478bd9Sstevel@tonic-gate } else if (res != HZ) { 349*7c478bd9Sstevel@tonic-gate hrtime.hrt_secs = 0; 350*7c478bd9Sstevel@tonic-gate hrtime.hrt_rem = rt_dptbl[i].rt_quantum; 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 ((rt_dptbl[i].rt_quantum = 356*7c478bd9Sstevel@tonic-gate hrtconvert(&hrtime)) == -1) 357*7c478bd9Sstevel@tonic-gate fatalerr("%s: rt_quantum value out of " 358*7c478bd9Sstevel@tonic-gate "valid range; line %d of input,\n" 359*7c478bd9Sstevel@tonic-gate "table not overwritten\n", basenm, linenum); 360*7c478bd9Sstevel@tonic-gate } 361*7c478bd9Sstevel@tonic-gate 362*7c478bd9Sstevel@tonic-gate if ((tokp = strtok(NULL, " \t")) != NULL && tokp[0] != '#') 363*7c478bd9Sstevel@tonic-gate fatalerr("%s: Too many values, line %d of input file\n", 364*7c478bd9Sstevel@tonic-gate basenm, linenum); 365*7c478bd9Sstevel@tonic-gate } 366*7c478bd9Sstevel@tonic-gate 367*7c478bd9Sstevel@tonic-gate /* 368*7c478bd9Sstevel@tonic-gate * We've read enough lines to fill the table. We fail 369*7c478bd9Sstevel@tonic-gate * if the input file contains any more. 370*7c478bd9Sstevel@tonic-gate */ 371*7c478bd9Sstevel@tonic-gate while (fgets(buf, sizeof (buf), fp) != NULL) { 372*7c478bd9Sstevel@tonic-gate if (buf[0] != '#' && buf[0] != '\0' && 373*7c478bd9Sstevel@tonic-gate (wslength = strspn(buf, " \t\n")) != strlen(buf) && 374*7c478bd9Sstevel@tonic-gate strchr(buf, '#') != buf + wslength) 375*7c478bd9Sstevel@tonic-gate fatalerr("%s: Too many lines in input table\n", 376*7c478bd9Sstevel@tonic-gate basenm); 377*7c478bd9Sstevel@tonic-gate } 378*7c478bd9Sstevel@tonic-gate 379*7c478bd9Sstevel@tonic-gate rtadmin.rt_dpents = rt_dptbl; 380*7c478bd9Sstevel@tonic-gate rtadmin.rt_cmd = RT_SETDPTBL; 381*7c478bd9Sstevel@tonic-gate if (priocntl(0, 0, PC_ADMIN, (caddr_t)&pcadmin) == -1) 382*7c478bd9Sstevel@tonic-gate fatalerr("%s: Can't set rt_dptbl, priocntl system call failed " 383*7c478bd9Sstevel@tonic-gate "with errno %d\n", basenm, errno); 384*7c478bd9Sstevel@tonic-gate } 385