]> CyberLeo.Net >> Repos - FreeBSD/FreeBSD.git/blob - usr.bin/systat/sysput.c
unbound: Vendor import 1.13.2
[FreeBSD/FreeBSD.git] / usr.bin / systat / sysput.c
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 }