Changed to eliminate the upper limit of command length displayed

by "-a" and expand to match terminal width

Reviewed by:	eadler
Approved by:	gnn (mentor)
Differential Revision:	https://reviews.freebsd.org/D16083
This commit is contained in:
Daichi GOTO 2018-07-06 12:07:06 +00:00
parent ae1dac06a2
commit 0a59db87e3
Notes: svn2git 2020-12-20 02:59:44 +00:00
svn path=/head/; revision=336028
4 changed files with 84 additions and 46 deletions

View File

@ -57,9 +57,8 @@ FILE *debug;
static int lmpid = 0;
static int last_hi = 0; /* used in u_process and u_endscreen */
static int lastline = 0;
static int display_width = MAX_COLS;
#define lineindex(l) ((l)*display_width)
#define lineindex(l) ((l)*screen_width)
/* things initialized by display_init and used thruout */
@ -94,6 +93,9 @@ static enum { OFF, ON, ERASE } header_status = ON;
static void summary_format(char *, int *, const char * const *);
static void line_update(char *, char *, int, int);
static int setup_buffer_bufsiz = 0;
static char * setup_buffer(char *, int);
int x_lastpid = 10;
int y_lastpid = 0;
int x_loadave = 33;
@ -138,17 +140,9 @@ display_resize(void)
if (lines < 0)
lines = 0;
/* we don't want more than MAX_COLS columns, since the machine-dependent
modules make static allocations based on MAX_COLS and we don't want
to run off the end of their buffers */
display_width = screen_width;
if (display_width >= MAX_COLS)
{
display_width = MAX_COLS - 1;
}
/* now, allocate space for the screen buffer */
screenbuf = calloc(lines, display_width);
screenbuf = calloc(lines, screen_width);
if (screenbuf == NULL)
{
/* oops! */
@ -336,7 +330,7 @@ i_timeofday(time_t *tod)
}
static int ltotal = 0;
static char procstates_buffer[MAX_COLS];
static char *procstates_buffer = NULL;
/*
* *_procstates(total, brkdn, names) - print the process summary line
@ -350,6 +344,8 @@ i_procstates(int total, int *brkdn)
{
int i;
procstates_buffer = setup_buffer(procstates_buffer, 0);
/* write current number of processes and remember the value */
printf("%d %s:", total, (ps.thread) ? "threads" :"processes");
ltotal = total;
@ -372,9 +368,11 @@ i_procstates(int total, int *brkdn)
void
u_procstates(int total, int *brkdn)
{
static char new[MAX_COLS];
static char *new = NULL;
int i;
new = setup_buffer(new, 0);
/* update number of processes only if it has changed */
if (ltotal != total)
{
@ -551,11 +549,13 @@ z_cpustates(void)
* for i_memory ONLY: cursor is on the previous line
*/
static char memory_buffer[MAX_COLS];
static char *memory_buffer = NULL;
void
i_memory(int *stats)
{
memory_buffer = setup_buffer(memory_buffer, 0);
fputs("\nMem: ", stdout);
lastline++;
@ -567,7 +567,9 @@ i_memory(int *stats)
void
u_memory(int *stats)
{
static char new[MAX_COLS];
static char *new = NULL;
new = setup_buffer(new, 0);
/* format the new line */
summary_format(new, stats, memory_names);
@ -580,11 +582,13 @@ u_memory(int *stats)
* Assumptions: cursor is on "lastline"
* for i_arc ONLY: cursor is on the previous line
*/
static char arc_buffer[MAX_COLS];
static char *arc_buffer = NULL;
void
i_arc(int *stats)
{
arc_buffer = setup_buffer(arc_buffer, 0);
if (arc_names == NULL)
return;
@ -599,7 +603,9 @@ i_arc(int *stats)
void
u_arc(int *stats)
{
static char new[MAX_COLS];
static char *new = NULL;
new = setup_buffer(new, 0);
if (arc_names == NULL)
return;
@ -616,11 +622,13 @@ u_arc(int *stats)
* Assumptions: cursor is on "lastline"
* for i_carc ONLY: cursor is on the previous line
*/
static char carc_buffer[MAX_COLS];
static char *carc_buffer = NULL;
void
i_carc(int *stats)
{
carc_buffer = setup_buffer(carc_buffer, 0);
if (carc_names == NULL)
return;
@ -635,7 +643,9 @@ i_carc(int *stats)
void
u_carc(int *stats)
{
static char new[MAX_COLS];
static char *new = NULL;
new = setup_buffer(new, 0);
if (carc_names == NULL)
return;
@ -652,11 +662,13 @@ u_carc(int *stats)
* for i_swap ONLY: cursor is on the previous line
*/
static char swap_buffer[MAX_COLS];
static char *swap_buffer = NULL;
void
i_swap(int *stats)
{
swap_buffer = setup_buffer(swap_buffer, 0);
fputs("\nSwap: ", stdout);
lastline++;
@ -668,7 +680,9 @@ i_swap(int *stats)
void
u_swap(int *stats)
{
static char new[MAX_COLS];
static char *new = NULL;
new = setup_buffer(new, 0);
/* format the new line */
summary_format(new, stats, swap_names);
@ -689,7 +703,7 @@ u_swap(int *stats)
* respect to screen updates).
*/
static char next_msg[MAX_COLS + 5];
static char *next_msg = NULL;
static int msglen = 0;
/* Invariant: msglen is always the length of the message currently displayed
on the screen (even when next_msg doesn't contain that message). */
@ -697,6 +711,7 @@ static int msglen = 0;
void
i_message(void)
{
next_msg = setup_buffer(next_msg, 5);
while (lastline < y_message)
{
@ -736,7 +751,7 @@ trim_header(const char *text)
int width;
s = NULL;
width = display_width;
width = screen_width;
header_length = strlen(text);
if (header_length >= width) {
s = strndup(text, width);
@ -807,7 +822,7 @@ i_process(int line, char *thisline)
}
/* truncate the line to conform to our current screen width */
thisline[display_width] = '\0';
thisline[screen_width] = '\0';
/* write the line out */
fputs(thisline, stdout);
@ -817,7 +832,7 @@ i_process(int line, char *thisline)
p = stpcpy(base, thisline);
/* zero fill the rest of it */
memset(p, 0, display_width - (p - base));
memset(p, 0, screen_width - (p - base));
}
void
@ -831,7 +846,7 @@ u_process(int line, char *newline)
bufferline = &screenbuf[lineindex(line)];
/* truncate the line to conform to our current screen width */
newline[display_width] = '\0';
newline[screen_width] = '\0';
/* is line higher than we went on the last display? */
if (line >= last_hi)
@ -856,7 +871,7 @@ u_process(int line, char *newline)
optr = stpcpy(bufferline, newline);
/* zero fill the rest of it */
memset(optr, 0, display_width - (optr - bufferline));
memset(optr, 0, screen_width - (optr - bufferline));
}
else
{
@ -1235,7 +1250,7 @@ line_update(char *old, char *new, int start, int line)
} while (ch != '\0');
/* zero out the rest of the line buffer -- MUST BE DONE! */
diff = display_width - newcol;
diff = screen_width - newcol;
if (diff > 0)
{
memset(old, 0, diff);
@ -1327,3 +1342,31 @@ i_uptime(struct timeval *bt, time_t *tod)
printf(" up %d+%02d:%02d:%02d", days, hrs, mins, secs);
}
}
static char *
setup_buffer(char *buffer, int addlen)
{
char *b = NULL;
if (NULL == buffer) {
setup_buffer_bufsiz = screen_width;
b = calloc(setup_buffer_bufsiz + addlen, sizeof(char));
} else {
if (screen_width > setup_buffer_bufsiz) {
setup_buffer_bufsiz = screen_width;
free(buffer);
b = calloc(setup_buffer_bufsiz + addlen,
sizeof(char));
} else {
b = buffer;
}
}
if (NULL == b) {
fprintf(stderr, "%s: can't allocate sufficient memory\n",
myname);
exit(4);
}
return b;
}

View File

@ -870,7 +870,6 @@ format_next_process(struct handle * xhandle, char *(*get_userid)(int), int flags
long p_tot, s_tot;
char *cmdbuf = NULL;
char **args;
const int cmdlen = 256;
static struct sbuf* procbuf = NULL;
/* clean up from last time. */
@ -935,31 +934,31 @@ format_next_process(struct handle * xhandle, char *(*get_userid)(int), int flags
break;
}
cmdbuf = calloc(cmdlen + 1, 1);
cmdbuf = calloc(screen_width + 1, 1);
if (cmdbuf == NULL) {
warn("calloc(%d)", cmdlen + 1);
warn("calloc(%d)", screen_width + 1);
return NULL;
}
if (!(flags & FMT_SHOWARGS)) {
if (ps.thread && pp->ki_flag & P_HADTHREADS &&
pp->ki_tdname[0]) {
snprintf(cmdbuf, cmdlen, "%s{%s%s}", pp->ki_comm,
snprintf(cmdbuf, screen_width, "%s{%s%s}", pp->ki_comm,
pp->ki_tdname, pp->ki_moretdname);
} else {
snprintf(cmdbuf, cmdlen, "%s", pp->ki_comm);
snprintf(cmdbuf, screen_width, "%s", pp->ki_comm);
}
} else {
if (pp->ki_flag & P_SYSTEM ||
(args = kvm_getargv(kd, pp, cmdlen)) == NULL ||
(args = kvm_getargv(kd, pp, screen_width)) == NULL ||
!(*args)) {
if (ps.thread && pp->ki_flag & P_HADTHREADS &&
pp->ki_tdname[0]) {
snprintf(cmdbuf, cmdlen,
snprintf(cmdbuf, screen_width,
"[%s{%s%s}]", pp->ki_comm, pp->ki_tdname,
pp->ki_moretdname);
} else {
snprintf(cmdbuf, cmdlen,
snprintf(cmdbuf, screen_width,
"[%s]", pp->ki_comm);
}
} else {
@ -969,7 +968,7 @@ format_next_process(struct handle * xhandle, char *(*get_userid)(int), int flags
size_t argbuflen;
size_t len;
argbuflen = cmdlen * 4;
argbuflen = screen_width * 4;
argbuf = calloc(argbuflen + 1, 1);
if (argbuf == NULL) {
warn("calloc(%zu)", argbuflen + 1);
@ -1005,21 +1004,21 @@ format_next_process(struct handle * xhandle, char *(*get_userid)(int), int flags
if (strcmp(cmd, pp->ki_comm) != 0) {
if (ps.thread && pp->ki_flag & P_HADTHREADS &&
pp->ki_tdname[0])
snprintf(cmdbuf, cmdlen,
snprintf(cmdbuf, screen_width,
"%s (%s){%s%s}", argbuf,
pp->ki_comm, pp->ki_tdname,
pp->ki_moretdname);
else
snprintf(cmdbuf, cmdlen,
snprintf(cmdbuf, screen_width,
"%s (%s)", argbuf, pp->ki_comm);
} else {
if (ps.thread && pp->ki_flag & P_HADTHREADS &&
pp->ki_tdname[0])
snprintf(cmdbuf, cmdlen,
snprintf(cmdbuf, screen_width,
"%s{%s%s}", argbuf, pp->ki_tdname,
pp->ki_moretdname);
else
strlcpy(cmdbuf, argbuf, cmdlen);
strlcpy(cmdbuf, argbuf, screen_width);
}
free(argbuf);
}

View File

@ -62,8 +62,7 @@ init_termcap(bool interactive)
char *term_name;
int status;
/* set defaults in case we aren't smart */
screen_width = MAX_COLS;
screen_width = 0;
screen_length = 0;
if (!interactive)

View File

@ -13,9 +13,6 @@
/* Number of lines of header information on the standard screen */
extern int Header_lines;
/* Maximum number of columns allowed for display */
#define MAX_COLS 512
/* Special atoi routine returns either a non-negative number or one of: */
#define Infinity -1
#define Invalid -2