2 * ion/utils/ion-statusd/ion-statusd.c
4 * Copyright (c) Tuomo Valkonen 2004-2009.
6 * See the included file LICENSE for details.
12 #include <sys/types.h>
15 #include <libtu/util.h>
16 #include <libtu/optparser.h>
17 #include <libtu/errorlog.h>
18 #include <libtu/locale.h>
19 #include <libtu/misc.h>
20 #include <libtu/prefix.h>
21 #include <libextl/readconfig.h>
22 #include <libmainloop/select.h>
23 #include <libmainloop/signal.h>
24 #include <libmainloop/defer.h>
30 #include "../../version.h"
33 static OptParserOpt ion_opts
[]={
34 /*{OPT_ID('d'), "display", OPT_ARG, "host:dpy.scr",
35 DUMMY_TR("X display to use")},*/
37 {'c', "conffile", OPT_ARG
, "config_file",
38 DUMMY_TR("Configuration file")},
40 {'s', "searchdir", OPT_ARG
, "dir",
41 DUMMY_TR("Add directory to search path")},
43 /*{OPT_ID('s'), "session", OPT_ARG, "session_name",
44 DUMMY_TR("Name of session (affects savefiles)")},*/
46 {'h', "help", 0, NULL
,
47 DUMMY_TR("Show this help")},
49 {'V', "version", 0, NULL
,
50 DUMMY_TR("Show program version")},
52 {OPT_ID('a'), "about", 0, NULL
,
53 DUMMY_TR("Show about text")},
55 {'q', "quiet", 0, NULL
,
56 DUMMY_TR("Quiet mode")},
58 {'m', "meter", OPT_ARG
, "meter_module",
59 DUMMY_TR("Load a meter module")},
65 static const char statusd_copy
[]=
66 "Ion-statusd " ION_VERSION
", copyright (c) Tuomo Valkonen 2004-2009.";
69 static const char statusd_license
[]=DUMMY_TR(
70 "This software is licensed under the GNU Lesser General Public License\n"
71 "(LGPL), version 2.1, extended with terms applying to the use of the name\n"
72 "of the project, Ion(tm), unless otherwise indicated in components taken\n"
73 "from elsewhere. For details, see the file LICENSE that you should have\n"
74 "received with this software.\n"
76 "This program is distributed in the hope that it will be useful,\n"
77 "but WITHOUT ANY WARRANTY; without even the implied warranty of\n"
78 "MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\n");
81 /* new_informs=TRUE because we should always print period when
82 * initialisation is done.
84 static bool new_informs
=TRUE
;
85 static ExtlTab configtab
;
90 printf(TR("Usage: %s [options]\n\n"), libtu_progname());
91 for(i
=0; ion_opts
[i
].descr
!=NULL
; i
++)
92 ion_opts
[i
].descr
=TR(ion_opts
[i
].descr
);
93 optparser_printhelp(OPTP_MIDLONG
, ion_opts
);
98 static void flush_informs()
108 static void mainloop()
112 sigemptyset(&trapset
);
113 sigaddset(&trapset
, SIGALRM
);
114 sigaddset(&trapset
, SIGCHLD
);
115 mainloop_trap_signals(&trapset
);
118 int kill_sig
=mainloop_check_signals();
119 if(kill_sig
!=0 && kill_sig
!=SIGUSR1
){
120 if(kill_sig
==SIGTERM
)
123 kill(getpid(), kill_sig
);
126 mainloop_execute_deferred();
135 extern bool statusd_register_exports();
136 extern void statusd_unregister_exports();
139 int main(int argc
, char*argv
[])
141 const char *mod
=NULL
;
148 if(setlocale(LC_ALL
, "")==NULL
)
149 warn("setlocale() call failed.");
152 configtab
=extl_table_none();
156 #ifdef CF_RELOCATABLE_BIN_LOCATION
157 prefix_set(argv
[0], CF_RELOCATABLE_BIN_LOCATION
);
162 if(!statusd_register_exports())
165 prefix_wrap_simple(extl_add_searchdir
, EXTRABINDIR
);
166 prefix_wrap_simple(extl_add_searchdir
, MODULEDIR
);
167 prefix_wrap_simple(extl_add_searchdir
, ETCDIR
);
168 prefix_wrap_simple(extl_add_searchdir
, SHAREDIR
);
169 prefix_wrap_simple(extl_add_searchdir
, LCDIR
);
170 extl_set_userdirs(CF_ION_EXECUTABLE
);
172 optparser_init(argc
, argv
, OPTP_MIDLONG
, ion_opts
);
174 extl_read_config("ioncore_luaext", NULL
, TRUE
);
176 while((opt
=optparser_get_opt())){
179 display=optparser_get_arg();
182 extl_add_searchdir(optparser_get_arg());
185 extl_set_sessiondir(optparser_get_arg());
191 printf("%s\n", ION_VERSION
);
194 printf("%s\n\n%s", statusd_copy
, TR(statusd_license
));
199 const char *f
=optparser_get_arg();
200 if(extl_read_savefile(f
, &t
)){
201 extl_unref_table(configtab
);
204 warn(TR("Unable to load configuration file %s"), f
);
212 mod
=optparser_get_arg();
213 if(strchr(mod
, '/')==NULL
&& strchr(mod
, '.')==NULL
){
214 mod2
=scat("statusd_", mod
);
219 if(extl_read_config(mod
, NULL
, !quiet
))
225 warn(TR("Invalid command line."));
231 if(loaded
==0 && !quiet
){
232 warn(TR("No meters loaded."));
243 * Inform that meter \var{name} has value \var{value}.
246 void statusd_inform(const char *name
, const char *value
)
248 printf("%s: %s\n", name
, value
);
254 * Get configuration table for module \var{name}
257 ExtlTab
statusd_get_config(const char *name
)
260 return extl_ref_table(configtab
);
263 if(extl_table_gets_t(configtab
, name
, &t
))
266 return extl_create_table();
272 * Get last file modification time.
275 double statusd_last_modified(const char *fname
)
282 if(stat(fname
, &st
)!=0){
283 /*warn_err_obj(fname);*/
287 return (double)(st
.st_mtime
>st
.st_ctime
? st
.st_mtime
: st
.st_ctime
);
292 ExtlTab
statusd_getloadavg()
294 ExtlTab t
=extl_create_table();
295 #ifndef CF_NO_GETLOADAVG
302 extl_table_sets_d(t
, "1min", l
[0]);
304 extl_table_sets_d(t
, "5min", l
[1]);
306 extl_table_sets_d(t
, "15min", l
[2]);