Changeset View
Changeset View
Standalone View
Standalone View
contrib/top/top.c
Show First 20 Lines • Show All 128 Lines • ▼ Show 20 Lines | |||||
void (*d_carc)(int *stats) = i_carc; | void (*d_carc)(int *stats) = i_carc; | ||||
void (*d_swap)(int *stats) = i_swap; | void (*d_swap)(int *stats) = i_swap; | ||||
void (*d_message)(void) = i_message; | void (*d_message)(void) = i_message; | ||||
void (*d_header)(char *text) = i_header; | void (*d_header)(char *text) = i_header; | ||||
void (*d_process)(int line, char *thisline) = i_process; | void (*d_process)(int line, char *thisline) = i_process; | ||||
void reset_display(void); | void reset_display(void); | ||||
static void | |||||
reset_uids() | |||||
{ | |||||
for (size_t i = 0; i < TOP_MAX_UIDS; ++i) | |||||
ps.uid[i] = -1; | |||||
} | |||||
static int | |||||
add_uid(int uid) | |||||
{ | |||||
size_t i = 0; | |||||
/* Add the uid if there's room */ | |||||
for (; i < TOP_MAX_UIDS; ++i) | |||||
{ | |||||
if (ps.uid[i] == -1 || ps.uid[i] == uid) | |||||
{ | |||||
ps.uid[i] = uid; | |||||
break; | |||||
} | |||||
} | |||||
return (i == TOP_MAX_UIDS); | |||||
} | |||||
static void | |||||
rem_uid(int uid) | |||||
{ | |||||
size_t i = 0; | |||||
size_t where = TOP_MAX_UIDS; | |||||
/* Look for the user to remove - no problem if it's not there */ | |||||
for (; i < TOP_MAX_UIDS; ++i) | |||||
{ | |||||
if (ps.uid[i] == -1) | |||||
break; | |||||
if (ps.uid[i] == uid) | |||||
where = i; | |||||
} | |||||
/* Make sure we don't leave a hole in the middle */ | |||||
if (where != TOP_MAX_UIDS) | |||||
{ | |||||
ps.uid[where] = ps.uid[i-1]; | |||||
ps.uid[i-1] = -1; | |||||
} | |||||
} | |||||
static int | |||||
handle_user(char *buf, size_t buflen) | |||||
{ | |||||
int rc = 0; | |||||
int uid = -1; | |||||
char *buf2 = buf; | |||||
new_message(MT_standout, "Username to show (+ for all): "); | |||||
if (readline(buf, buflen, No) <= 0) | |||||
{ | |||||
clear_message(); | |||||
return rc; | |||||
} | |||||
if (buf[0] == '+' || buf[0] == '-') | |||||
{ | |||||
if (buf[1] == '\0') | |||||
{ | |||||
reset_uids(); | |||||
goto end; | |||||
} | |||||
else | |||||
++buf2; | |||||
} | |||||
if ((uid = userid(buf2)) == -1) | |||||
{ | |||||
new_message(MT_standout, " %s: unknown user", buf2); | |||||
rc = 1; | |||||
goto end; | |||||
} | |||||
if (buf2 == buf) | |||||
{ | |||||
reset_uids(); | |||||
ps.uid[0] = uid; | |||||
goto end; | |||||
} | |||||
if (buf[0] == '+') | |||||
{ | |||||
if (add_uid(uid)) | |||||
{ | |||||
new_message(MT_standout, " too many users, reset with '+'"); | |||||
rc = 1; | |||||
goto end; | |||||
} | |||||
} | |||||
else | |||||
rem_uid(uid); | |||||
end: | |||||
putchar('\r'); | |||||
return rc; | |||||
} | |||||
int | int | ||||
main(argc, argv) | main(argc, argv) | ||||
int argc; | int argc; | ||||
char *argv[]; | char *argv[]; | ||||
{ | { | ||||
register int i; | register int i; | ||||
▲ Show 20 Lines • Show All 101 Lines • ▼ Show 20 Lines | else | ||||
myname++; | myname++; | ||||
} | } | ||||
} | } | ||||
/* initialize some selection options */ | /* initialize some selection options */ | ||||
ps.idle = Yes; | ps.idle = Yes; | ||||
ps.self = -1; | ps.self = -1; | ||||
ps.system = No; | ps.system = No; | ||||
ps.uid = -1; | reset_uids(); | ||||
ps.thread = No; | ps.thread = No; | ||||
ps.wcpu = 1; | ps.wcpu = 1; | ||||
ps.jid = -1; | ps.jid = -1; | ||||
ps.jail = No; | ps.jail = No; | ||||
ps.swap = No; | ps.swap = No; | ||||
ps.kidle = Yes; | ps.kidle = Yes; | ||||
ps.command = NULL; | ps.command = NULL; | ||||
Show All 30 Lines | while ((i = getopt(ac, av, "CSIHPabijJ:nquvzs:d:U:m:o:tw")) != EOF) | ||||
exit(1); | exit(1); | ||||
break; | break; | ||||
case 'u': /* toggle uid/username display */ | case 'u': /* toggle uid/username display */ | ||||
do_unames = !do_unames; | do_unames = !do_unames; | ||||
break; | break; | ||||
case 'U': /* display only username's processes */ | case 'U': /* display only username's processes */ | ||||
if ((ps.uid = userid(optarg)) == -1) | if ((ps.uid[0] = userid(optarg)) == -1) | ||||
{ | { | ||||
fprintf(stderr, "%s: unknown user\n", optarg); | fprintf(stderr, "%s: unknown user\n", optarg); | ||||
exit(1); | exit(1); | ||||
} | } | ||||
break; | break; | ||||
case 'S': /* show system processes */ | case 'S': /* show system processes */ | ||||
ps.system = !ps.system; | ps.system = !ps.system; | ||||
▲ Show 20 Lines • Show All 688 Lines • ▼ Show 20 Lines | if (sel_ret > 0) | ||||
ps.self = (ps.self == -1) ? getpid() : -1; | ps.self = (ps.self == -1) ? getpid() : -1; | ||||
new_message(MT_standout | MT_delayed, | new_message(MT_standout | MT_delayed, | ||||
" %sisplaying self.", | " %sisplaying self.", | ||||
(ps.self == -1) ? "D" : "Not d"); | (ps.self == -1) ? "D" : "Not d"); | ||||
putchar('\r'); | putchar('\r'); | ||||
break; | break; | ||||
case CMD_user: | case CMD_user: | ||||
new_message(MT_standout, | if (handle_user(tempbuf2, sizeof(tempbuf2))) | ||||
"Username to show (+ for all): "); | |||||
if (readline(tempbuf2, sizeof(tempbuf2), No) > 0) | |||||
{ | |||||
if (tempbuf2[0] == '+' && | |||||
tempbuf2[1] == '\0') | |||||
{ | |||||
ps.uid = -1; | |||||
} | |||||
else if ((i = userid(tempbuf2)) == -1) | |||||
{ | |||||
new_message(MT_standout, | |||||
" %s: unknown user", tempbuf2); | |||||
no_command = Yes; | no_command = Yes; | ||||
} | |||||
else | |||||
{ | |||||
ps.uid = i; | |||||
} | |||||
putchar('\r'); | |||||
} | |||||
else | |||||
{ | |||||
clear_message(); | |||||
} | |||||
break; | break; | ||||
case CMD_thrtog: | case CMD_thrtog: | ||||
ps.thread = !ps.thread; | ps.thread = !ps.thread; | ||||
new_message(MT_standout | MT_delayed, | new_message(MT_standout | MT_delayed, | ||||
" Displaying threads %s", | " Displaying threads %s", | ||||
ps.thread ? "separately" : "as a count"); | ps.thread ? "separately" : "as a count"); | ||||
header_text = format_header(uname_field); | header_text = format_header(uname_field); | ||||
▲ Show 20 Lines • Show All 201 Lines • Show Last 20 Lines |