xref: /freebsd/usr.bin/systat/sysput.c (revision 8b959dd6a3921c35395bef4a6d7ad2426a3bd88e)
1 /*-
2  * SPDX-License-Identifier: BSD-2-Clause-FreeBSD
3  *
4  * Copyright (c) 2019, 2020 Yoshihiro Ota
5  *
6  * Redistribution and use in source and binary forms, with or without
7  * modification, are permitted provided that the following conditions
8  * are met:
9  * 1. Redistributions of source code must retain the above copyright
10  *    notice, this list of conditions and the following disclaimer.
11  * 2. Redistributions in binary form must reproduce the above copyright
12  *    notice, this list of conditions and the following disclaimer in the
13  *    documentation and/or other materials provided with the distribution.
14  *
15  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
16  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
17  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
18  * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
19  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
20  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
21  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
22  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
23  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
24  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
25  * SUCH DAMAGE.
26  */
27 
28 #include <sys/cdefs.h>
29 __FBSDID("$FreeBSD$");
30 
31 #include <sys/types.h>
32 #include <sys/sysctl.h>
33 
34 #include <inttypes.h>
35 #include <string.h>
36 #include <err.h>
37 #include <libutil.h>
38 
39 #include "systat.h"
40 #include "extern.h"
41 
42 void
43 sysputspaces(WINDOW *wd, int row, int col, int width)
44 {
45 	static char str60[] = "                    "
46 	    "                                        ";
47 
48 	mvwaddstr(wd, row, col, str60 + sizeof(str60) - width - 1);
49 }
50 
51 void
52 sysputstrs(WINDOW *wd, int row, int col, int width)
53 {
54 	static char str60[] = "********************"
55 	    "****************************************";
56 
57 	mvwaddstr(wnd, row, col, str60 + sizeof(str60) - width - 1);
58 }
59 
60 void
61 sysputXs(WINDOW *wd, int row, int col, int width)
62 {
63 	static char str60[] = "XXXXXXXXXXXXXXXXXXXX"
64 	    "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX";
65 
66 	mvwaddstr(wnd, row, col, str60 + sizeof(str60) - width - 1);
67 }
68 
69 void
70 sysputuint64(WINDOW *wd, int row, int col, int width, uint64_t val, int flags)
71 {
72 	char unit, *ptr, *start, wrtbuf[width + width + 1];
73 	int len;
74 
75 	unit = 0;
76 	start = wrtbuf;
77 	flags |= HN_NOSPACE;
78 
79 	if (val > INT64_MAX)
80 		goto error;
81 	else
82 		len = humanize_number(&wrtbuf[width], width + 1, val, "",
83 			HN_AUTOSCALE, flags);
84 	if (len < 0)
85 		goto error;
86 	else if (len < width)
87 		memset(wrtbuf + len, ' ', width - len);
88 	start += len;
89 
90 	mvwaddstr(wd, row, col, start);
91 	return;
92 
93 error:
94 	sysputstrs(wd, row, col, width);
95 }
96 
97 void
98 sysputwuint64(WINDOW *wd, int row, int col, int width, uint64_t val, int flags)
99 {
100 	if(val == 0)
101 		sysputspaces(wd, row, col, width);
102 	else
103 		sysputuint64(wd, row, col, width, val, flags);
104 }
105 
106 static int
107 calc_page_shift()
108 {
109 	u_int page_size;
110 	int shifts;
111 
112 	shifts = 0;
113 	GETSYSCTL("vm.stats.vm.v_page_size", page_size);
114 	for(; page_size > 1; page_size >>= 1)
115 		shifts++;
116 	return shifts;
117 }
118 
119 void
120 sysputpage(WINDOW *wd, int row, int col, int width, uint64_t pages, int flags)
121 {
122 	static int shifts = 0;
123 
124 	if (shifts == 0)
125 		shifts = calc_page_shift();
126 	pages <<= shifts;
127 	sysputuint64(wd, row, col, width, pages, flags);
128 }
129