Updated with Tizen:Base source codes
[external/procps.git] / tload.c
1 /*
2  * tload.c      - terminal version of xload
3  *
4  * Options:
5  *      -s initial scaling exponent (default = 6)
6  *      -d delay
7  *
8  * Copyright (c) 1992 Branko Lankester
9  * /proc changes by David Engel (david@ods.com)
10  * Made a little more efficient by Michael K. Johnson (johnsonm@sunsite.unc.edu)
11  */
12 #include "proc/version.h"
13 #include "proc/sysinfo.h"
14 #include <stdio.h>
15 #include <stdlib.h>
16 #include <setjmp.h>
17 #include <signal.h>
18 #include <string.h>
19 #include <unistd.h>
20 #include <termios.h>
21 #include <fcntl.h>
22 #include <sys/ioctl.h>
23
24 static char *screen;
25
26 static int nrows = 25;
27 static int ncols = 80;
28 static int scr_size;
29 static int fd=1;
30 static int dly=5;
31 static jmp_buf jb;
32
33 extern int optind;
34 extern char *optarg;
35
36 static void alrm(int signo)
37 {
38     (void)signo;
39     signal(SIGALRM, alrm);
40     alarm(dly);
41 }
42
43 static void setsize(int i)
44 {
45     struct winsize win;
46
47     signal(SIGWINCH, setsize);
48     if (ioctl(fd, TIOCGWINSZ, &win) != -1) {
49         if (win.ws_col > 0)
50             ncols = win.ws_col;
51         if (win.ws_row > 0)
52             nrows = win.ws_row;
53     }
54     scr_size = nrows * ncols;
55     if (screen == NULL)
56         screen = (char *) malloc(scr_size);
57     else
58         screen = (char *) realloc(screen, scr_size);
59
60     if (screen == NULL) {
61         perror("");
62         exit(1);
63     }
64     memset(screen, ' ', scr_size-1);
65     *(screen + scr_size - 2) = '\0';
66     if (i)
67         longjmp(jb, 0);
68 }
69
70 int main(int argc, char **argv)
71 {
72     int lines, row, col=0;
73     int i, opt;
74     double av[3];
75     static double max_scale, scale_fact;
76     char *scale_arg = NULL;
77
78     while ((opt = getopt(argc, argv, "s:d:V")) != -1)
79         switch (opt) {
80             case 's': scale_arg = optarg; break;
81             case 'd': dly = atoi(optarg); break;
82             case 'V': display_version(); exit(0); break;
83             default:
84                 printf("usage: tload [-V] [-d delay] [-s scale] [tty]\n");
85                 exit(1);
86         }
87
88     if (argc > optind) {
89         if ((fd = open(argv[optind], 1)) == -1) {
90             perror(argv[optind]);
91             exit(1);
92         }
93     }
94
95     setsize(0);
96
97     if (scale_arg)
98       max_scale = atof(scale_arg);
99     else
100       max_scale = nrows;
101
102     scale_fact = max_scale;
103
104     setjmp(jb);
105     col = 0;
106     alrm(0);
107
108     while (1) {
109
110         if (scale_fact < max_scale)
111             scale_fact *= 2.0; /* help it drift back up. */
112
113         loadavg(&av[0], &av[1], &av[2]);
114
115     repeat:
116         lines = av[0] * scale_fact;
117         row = nrows-1;
118
119         while (--lines >= 0) {
120             *(screen + row * ncols + col) = '*';
121             if (--row < 0) {
122                 scale_fact /= 2.0;
123                 goto repeat;
124             }
125         }
126         while (row >= 0)
127             *(screen + row-- * ncols + col) = ' ';
128
129         for (i = 1; ; ++i) {
130             char *p;
131             row = nrows - (i * scale_fact);
132             if (row < 0)
133                 break;
134             if (*(p = screen + row * ncols + col) == ' ')
135                 *p = '-';
136             else
137                 *p = '=';
138         }
139
140         if (++col == ncols) {
141             --col;
142             memmove(screen, screen + 1, scr_size-1);
143
144             for(row = nrows-2; row >= 0; --row)
145                 *(screen + row * ncols + col) = ' ';
146         }
147         i = sprintf(screen, " %.2f, %.2f, %.2f",
148                 av[0], av[1], av[2]);
149         if (i>0)
150             screen[i] = ' ';
151
152         write(fd, "\033[H", 3);
153         write(fd, screen, scr_size - 1);
154         pause();
155     }
156 }