2 * Copyright (c) 2004 Teodor Sigaev <teodor@sigaev.ru>
5 * Redistribution and use in source and binary forms, with or without
6 * modification, are permitted provided that the following conditions
8 * 1. Redistributions of source code must retain the above copyright
9 * notice, this list of conditions and the following disclaimer.
10 * 2. Redistributions in binary form must reproduce the above copyright
11 * notice, this list of conditions and the following disclaimer in the
12 * documentation and/or other materials provided with the distribution.
13 * 3. Neither the name of the author nor the names of any co-contributors
14 * may be used to endorse or promote products derived from this software
15 * without specific prior written permission.
17 * THIS SOFTWARE IS PROVIDED BY CONTRIBUTORS ``AS IS'' AND ANY EXPRESS
18 * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
19 * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
20 * ARE DISCLAIMED. IN NO EVENT SHALL CONTRIBUTORS BE LIABLE FOR ANY
21 * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
22 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE
23 * GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
24 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER
25 * IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
26 * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
27 * IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
36 #include <sys/sysctl.h>
40 #include "connection.h"
47 getsysctl(char *name, void *ptr, size_t len) {
49 if (sysctlbyname(name, ptr, &nlen, NULL, 0) == -1) {
50 tlog(TL_ALARM, "sysctl(%s...) failed: %s\n", name,
55 tlog(TL_ALARM, "sysctl(%s...) expected %lu, got %lu\n", name,
56 (unsigned long)len, (unsigned long)nlen);
63 #define GETSYSCTL(name, var) getsysctl(name, &(var), sizeof(var))
66 fillMsgTop(TCMsgTop *m) {
70 memset(m,0,sizeof(TCMsgTop));
71 if ( getloadavg(lll,3) >= NITEM+1 )
77 if ( GETSYSCTL("vm.stats.vm.v_inactive_count", memory_tmp) == 0 )
78 m->freemem += memory_tmp;
81 if ( m->freemem>=0 && GETSYSCTL("vm.stats.vm.v_cache_count", memory_tmp) == 0 )
82 m->freemem += memory_tmp;
85 if ( m->freemem>=0 && GETSYSCTL("vm.stats.vm.v_free_count", memory_tmp) == 0 )
86 m->freemem += memory_tmp;
91 m->freemem *= getpagesize();
94 if ( GETSYSCTL("hw.usermem", memory_tmp) == 0 )
95 m->usermem = memory_tmp;
97 tlog( TL_DEBUG, "Sended topdata: %.2f load, %d free, %d total", m->load, m->freemem, m->usermem);
105 int msglen = TCMSGHDRSZ + sizeof(TCMsgTop);
106 pmsg = (TCMsg*)tmalloc(msglen);
108 pmsg->type=TOPMSGTYPE;
114 fillMsgTop( (TCMsgTop*)(pmsg->data) );
116 return TC_sendMsg(msg);
122 main( int argc, char *argv[] ) {
125 int debug=0, child=0;
128 msg.port = TOPD_SERVER_DEFAULT_PORT;
129 msg.host = "127.0.0.1";
133 while( (ch=getopt(argc, argv, "h:p:s:D"))!=-1) {
136 msg.host = strdup(optarg);
139 msg.port = atoi(optarg);
142 period = atoi(optarg);
152 signal(SIGCHLD, SIG_IGN);
155 opentlog( TL_OPEN_STDERR, TL_DEBUG, NULL);
157 opentlog( TL_OPEN_SYSLOG, TL_INFO, NULL);
159 if ( debug || (child = fork()) == 0 ) {
168 tlog(TL_CRIT|TL_EXIT, "Can't start child process: %s", strerror(errno));