Home | History | Annotate | Line # | Download | only in systat
cmds.c revision 1.21.2.1
      1  1.21.2.1       ad /*	$NetBSD: cmds.c,v 1.21.2.1 2000/09/01 16:36:04 ad Exp $	*/
      2       1.2      jtc 
      3       1.1      jtc /*-
      4       1.1      jtc  * Copyright (c) 1980, 1992, 1993
      5       1.1      jtc  *	The Regents of the University of California.  All rights reserved.
      6       1.1      jtc  *
      7       1.1      jtc  * Redistribution and use in source and binary forms, with or without
      8       1.1      jtc  * modification, are permitted provided that the following conditions
      9       1.1      jtc  * are met:
     10       1.1      jtc  * 1. Redistributions of source code must retain the above copyright
     11       1.1      jtc  *    notice, this list of conditions and the following disclaimer.
     12       1.1      jtc  * 2. Redistributions in binary form must reproduce the above copyright
     13       1.1      jtc  *    notice, this list of conditions and the following disclaimer in the
     14       1.1      jtc  *    documentation and/or other materials provided with the distribution.
     15       1.1      jtc  * 3. All advertising materials mentioning features or use of this software
     16       1.1      jtc  *    must display the following acknowledgement:
     17       1.1      jtc  *	This product includes software developed by the University of
     18       1.1      jtc  *	California, Berkeley and its contributors.
     19       1.1      jtc  * 4. Neither the name of the University nor the names of its contributors
     20       1.1      jtc  *    may be used to endorse or promote products derived from this software
     21       1.1      jtc  *    without specific prior written permission.
     22       1.1      jtc  *
     23       1.1      jtc  * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
     24       1.1      jtc  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
     25       1.1      jtc  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
     26       1.1      jtc  * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
     27       1.1      jtc  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
     28       1.1      jtc  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
     29       1.1      jtc  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
     30       1.1      jtc  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
     31       1.1      jtc  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
     32       1.1      jtc  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
     33       1.1      jtc  * SUCH DAMAGE.
     34       1.1      jtc  */
     35       1.1      jtc 
     36       1.7      mrg #include <sys/cdefs.h>
     37       1.1      jtc #ifndef lint
     38       1.2      jtc #if 0
     39       1.3      jtc static char sccsid[] = "@(#)cmds.c	8.2 (Berkeley) 4/29/95";
     40       1.2      jtc #endif
     41  1.21.2.1       ad __RCSID("$NetBSD: cmds.c,v 1.21.2.1 2000/09/01 16:36:04 ad Exp $");
     42       1.1      jtc #endif /* not lint */
     43       1.1      jtc 
     44       1.1      jtc #include <stdlib.h>
     45       1.1      jtc #include <unistd.h>
     46       1.1      jtc #include <signal.h>
     47       1.1      jtc #include <ctype.h>
     48       1.1      jtc #include <string.h>
     49       1.1      jtc #include "systat.h"
     50       1.1      jtc #include "extern.h"
     51       1.1      jtc 
     52  1.21.2.1       ad void	switch_mode(struct mode *p);
     53      1.13    jwise 
     54       1.1      jtc void
     55  1.21.2.1       ad command(char *cmd)
     56       1.1      jtc {
     57      1.11    jwise 	struct command *c;
     58      1.11    jwise 	struct mode *p;
     59      1.16    jwise 	char *args;
     60       1.5   scottr 	sigset_t set;
     61       1.5   scottr 
     62       1.5   scottr 	sigemptyset(&set);
     63       1.5   scottr 	sigaddset(&set, SIGALRM);
     64       1.5   scottr 	sigprocmask(SIG_BLOCK, &set, NULL);
     65      1.16    jwise 
     66      1.21  mycroft 	args = cmd;
     67      1.21  mycroft 	cmd = strsep(&args, " \t");
     68       1.1      jtc 
     69      1.14    jwise 	if (curmode->c_commands) {
     70      1.14    jwise 		for (c = curmode->c_commands; c->c_name; c++) {
     71      1.20    jwise 			if (strstr(c->c_name, cmd) == c->c_name) {
     72      1.16    jwise 				(c->c_cmd)(args);
     73      1.14    jwise 				goto done;
     74      1.14    jwise 			}
     75      1.14    jwise 		}
     76      1.14    jwise 	}
     77      1.14    jwise 
     78      1.11    jwise 	for (c = global_commands; c->c_name; c++) {
     79      1.20    jwise 		if (strstr(c->c_name, cmd) == c->c_name) {
     80      1.16    jwise 			(c->c_cmd)(args);
     81      1.11    jwise 			goto done;
     82       1.1      jtc 		}
     83       1.1      jtc 	}
     84      1.11    jwise 
     85      1.13    jwise 	for (p = modes; p->c_name; p++) {
     86      1.20    jwise 		if (strstr(p->c_name, cmd) == p->c_name) {
     87      1.13    jwise 			switch_mode(p);
     88       1.1      jtc 			goto done;
     89       1.1      jtc 		}
     90      1.16    jwise 	}
     91      1.16    jwise 
     92      1.16    jwise 	if (isdigit(cmd[0])) {
     93      1.16    jwise 		global_interval(cmd);
     94      1.16    jwise 		goto done;
     95       1.5   scottr 	}
     96      1.13    jwise 
     97      1.14    jwise 	error("%s: Unknown command.", cmd);
     98       1.1      jtc done:
     99       1.5   scottr 	sigprocmask(SIG_UNBLOCK, &set, NULL);
    100       1.1      jtc }
    101       1.1      jtc 
    102      1.13    jwise void
    103  1.21.2.1       ad switch_mode(struct mode *p)
    104       1.1      jtc {
    105      1.19   itojun 	int switchfail;
    106      1.19   itojun 
    107      1.19   itojun 	switchfail = 0;
    108      1.19   itojun 
    109      1.13    jwise 	if (curmode == p)
    110      1.13    jwise 		return;
    111      1.13    jwise 
    112      1.13    jwise 	alarm(0);
    113      1.13    jwise 	(*curmode->c_close)(wnd);
    114      1.13    jwise 	wnd = (*p->c_open)();
    115      1.13    jwise 	if (wnd == 0) {
    116      1.13    jwise 		wnd = (*curmode->c_open)();
    117      1.13    jwise 		if (wnd == 0) {
    118      1.13    jwise 			error("Couldn't change back to previous mode");
    119      1.18    jwise 			die(0);
    120       1.1      jtc 		}
    121      1.13    jwise 
    122      1.13    jwise 		p = curmode;
    123      1.19   itojun 		switchfail++;
    124       1.1      jtc 	}
    125      1.13    jwise 
    126      1.13    jwise 	if ((p->c_flags & CF_INIT) == 0) {
    127      1.13    jwise 		if ((*p->c_init)())
    128      1.13    jwise 			p->c_flags |= CF_INIT;
    129      1.19   itojun 		else {
    130      1.19   itojun 			(*p->c_close)(wnd);
    131      1.19   itojun 			wnd = (*curmode->c_open)();
    132      1.19   itojun 			p = curmode;
    133      1.19   itojun 			switchfail++;
    134      1.19   itojun 		}
    135      1.13    jwise 	}
    136      1.13    jwise 
    137      1.13    jwise 	curmode = p;
    138      1.13    jwise 	labels();
    139      1.13    jwise 	display(0);
    140      1.19   itojun 	if (switchfail)
    141      1.19   itojun 		error("Couldn't switch mode, back to %s", curmode->c_name);
    142      1.19   itojun 	else
    143      1.19   itojun 		status();
    144       1.1      jtc }
    145       1.1      jtc 
    146       1.1      jtc void
    147  1.21.2.1       ad status(void)
    148       1.1      jtc {
    149      1.11    jwise 	error("Showing %s, refresh every %d seconds.", curmode->c_name, naptime);
    150       1.1      jtc }
    151