Allow in top(1) to specify refresh time in parts of second. Minimal time is

0.5s for user, and 0.1s for superuser.

OK by <christos>.
This commit is contained in:
rmind 2008-05-25 21:49:33 +00:00
parent b135c75eab
commit 5c6ac26f4d
3 changed files with 23 additions and 19 deletions

View File

@ -1,4 +1,4 @@
/* $NetBSD: display.c,v 1.18 2008/04/10 20:41:42 oster Exp $ */
/* $NetBSD: display.c,v 1.19 2008/05/25 21:49:33 rmind Exp $ */
/*
* Top users/processes display for Unix
@ -47,7 +47,7 @@
#include <sys/cdefs.h>
#ifndef lint
__RCSID("$NetBSD: display.c,v 1.18 2008/04/10 20:41:42 oster Exp $");
__RCSID("$NetBSD: display.c,v 1.19 2008/05/25 21:49:33 rmind Exp $");
#endif
#include "os.h"
@ -935,7 +935,7 @@ clear_message()
}
}
int
double
readline(buffer, size, numeric)
char *buffer;
@ -944,9 +944,7 @@ int numeric;
{
char *ptr = buffer;
int ch;
int cnt = 0;
int maxcnt = 0;
int ch, dotfound = 0, cnt = 0, maxcnt = 0;
/* allow room for null terminator */
size -= 1;
@ -990,14 +988,18 @@ int numeric;
}
}
/* check for character validity and buffer overflow */
else if (cnt == size || (numeric && !isdigit(ch)) ||
!isprint(ch))
else if (cnt == size || (numeric && !isdigit(ch) &&
(dotfound || ch != '.')) || !isprint(ch))
{
/* not legal */
putchar('\7');
}
else
{
/* if float - there could be only one dot */
if (ch == '.') {
dotfound = 1;
}
/* echo it and store it in the buffer */
putchar(ch);
ptr++;
@ -1018,7 +1020,7 @@ int numeric;
/* return either inputted number or string length */
putchar('\r');
return(cnt == 0 ? -1 : numeric ? atoi(buffer) : cnt);
return(cnt == 0 ? -1 : numeric ? atof(buffer) : cnt);
}
/* internal support routines */

View File

@ -1,4 +1,4 @@
/* $NetBSD: display.h,v 1.8 2007/05/24 20:04:04 ad Exp $ */
/* $NetBSD: display.h,v 1.9 2008/05/25 21:49:33 rmind Exp $ */
/*
* Top users/processes display for Unix
@ -62,5 +62,5 @@ void display_header __P((int));
void new_message __P((int, const char *, ...))
__attribute__((__format__(__printf__, 2, 3)));
void clear_message __P((void));
int readline __P((char *, int, int));
double readline __P((char *, int, int));
char *printable __P((char *));

View File

@ -1,4 +1,4 @@
/* $NetBSD: top.c,v 1.26 2007/05/24 20:04:04 ad Exp $ */
/* $NetBSD: top.c,v 1.27 2008/05/25 21:49:33 rmind Exp $ */
const char copyright[] = "Copyright (c) 1984 through 1996, William LeFebvre";
@ -49,7 +49,7 @@ const char copyright[] = "Copyright (c) 1984 through 1996, William LeFebvre";
#include <sys/cdefs.h>
#ifndef lint
__RCSID("$NetBSD: top.c,v 1.26 2007/05/24 20:04:04 ad Exp $");
__RCSID("$NetBSD: top.c,v 1.27 2008/05/25 21:49:33 rmind Exp $");
#endif
#include "os.h"
@ -124,7 +124,7 @@ char *argv[];
static char tempbuf2[50];
int old_sigmask; /* only used for BSD-style signals */
int topn = Default_TOPN;
int delay = Default_DELAY;
double delay = Default_DELAY, t;
int displays = 0; /* indicates unspecified */
time_t curr_time;
char *(*get_userid) __P((int)) = username;
@ -288,7 +288,8 @@ char *argv[];
break;
case 's':
if ((delay = atoi(optarg)) < 0 || (delay == 0 && getuid() != 0))
delay = atof(optarg);
if (delay < 0.1 || (delay < 0.5 && getuid() != 0))
{
fprintf(stderr,
"%s: warning: seconds delay should be positive -- using default\n",
@ -640,7 +641,7 @@ Usage: %s [-bIinqSuv] [-d count] [-o field] [-s time] [-U username] [number]\n",
set[0].events = POLLIN;
/* wait for either input or the end of the delay period */
if (poll(set, 1, delay * 1000) > 0)
if (poll(set, 1, (int)(delay * 1000)) > 0)
{
int newval;
char *errmsg;
@ -758,11 +759,12 @@ Usage: %s [-bIinqSuv] [-d count] [-o field] [-s time] [-U username] [number]\n",
case CMD_delay: /* new seconds delay */
new_message(MT_standout, "Seconds to delay: ");
if ((i = readline(tempbuf1, 8, Yes)) > -1)
if ((t = readline(tempbuf1, 8, Yes)) > -1)
{
if ((delay = i) == 0 && getuid() != 0)
delay = t;
if (t < 0.1 || (t < 0.5 && getuid() != 0))
{
delay = 1;
delay = 0.5;
}
}
clear_message();