2 * ion/utils/ion-statusd/ion-statusd.c
4 * Copyright (c) Tuomo Valkonen 2004-2009.
6 * See the included file LICENSE for details.
11 #include <sys/types.h>
14 #include <libtu/util.h>
15 #include <libtu/optparser.h>
16 #include <libtu/errorlog.h>
17 #include <libtu/locale.h>
18 #include <libtu/misc.h>
19 #include <libtu/prefix.h>
20 #include <libextl/readconfig.h>
21 #include <libmainloop/select.h>
22 #include <libmainloop/signal.h>
23 #include <libmainloop/defer.h>
29 #include "../../version.h"
32 static OptParserOpt ion_opts[]={
33 /*{OPT_ID('d'), "display", OPT_ARG, "host:dpy.scr",
34 DUMMY_TR("X display to use")},*/
36 {'c', "conffile", OPT_ARG, "config_file",
37 DUMMY_TR("Configuration file")},
39 {'s', "searchdir", OPT_ARG, "dir",
40 DUMMY_TR("Add directory to search path")},
42 /*{OPT_ID('s'), "session", OPT_ARG, "session_name",
43 DUMMY_TR("Name of session (affects savefiles)")},*/
45 {'h', "help", 0, NULL,
46 DUMMY_TR("Show this help")},
48 {'V', "version", 0, NULL,
49 DUMMY_TR("Show program version")},
51 {OPT_ID('a'), "about", 0, NULL,
52 DUMMY_TR("Show about text")},
54 {'q', "quiet", 0, NULL,
55 DUMMY_TR("Quiet mode")},
57 {'m', "meter", OPT_ARG, "meter_module",
58 DUMMY_TR("Load a meter module")},
64 static const char statusd_copy[]=
65 "Ion-statusd " ION_VERSION ", copyright (c) Tuomo Valkonen 2004-2009.";
68 static const char statusd_license[]=DUMMY_TR(
69 "This software is licensed under the GNU Lesser General Public License\n"
70 "(LGPL), version 2.1, extended with terms applying to the use of the name\n"
71 "of the project, Ion(tm), unless otherwise indicated in components taken\n"
72 "from elsewhere. For details, see the file LICENSE that you should have\n"
73 "received with this software.\n"
75 "This program is distributed in the hope that it will be useful,\n"
76 "but WITHOUT ANY WARRANTY; without even the implied warranty of\n"
77 "MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\n");
80 /* new_informs=TRUE because we should always print period when
81 * initialisation is done.
83 static bool new_informs=TRUE;
84 static ExtlTab configtab;
89 printf(TR("Usage: %s [options]\n\n"), libtu_progname());
90 for(i=0; ion_opts[i].descr!=NULL; i++)
91 ion_opts[i].descr=TR(ion_opts[i].descr);
92 optparser_printhelp(OPTP_MIDLONG, ion_opts);
97 static void flush_informs()
107 static void mainloop()
111 sigemptyset(&trapset);
112 sigaddset(&trapset, SIGALRM);
113 sigaddset(&trapset, SIGCHLD);
114 mainloop_trap_signals(&trapset);
117 int kill_sig=mainloop_check_signals();
118 if(kill_sig!=0 && kill_sig!=SIGUSR1){
119 if(kill_sig==SIGTERM)
122 kill(getpid(), kill_sig);
125 mainloop_execute_deferred();
134 extern bool statusd_register_exports();
135 extern void statusd_unregister_exports();
138 static void stdout_closed(int fd, void *data)
144 int main(int argc, char*argv[])
146 const char *mod=NULL;
153 if(setlocale(LC_ALL, "")==NULL)
154 warn("setlocale() call failed.");
157 configtab=extl_table_none();
161 #ifdef CF_RELOCATABLE_BIN_LOCATION
162 prefix_set(argv[0], CF_RELOCATABLE_BIN_LOCATION);
167 if(!statusd_register_exports())
170 prefix_wrap_simple(extl_add_searchdir, EXTRABINDIR);
171 prefix_wrap_simple(extl_add_searchdir, MODULEDIR);
172 prefix_wrap_simple(extl_add_searchdir, ETCDIR);
173 prefix_wrap_simple(extl_add_searchdir, SHAREDIR);
174 prefix_wrap_simple(extl_add_searchdir, LCDIR);
175 extl_set_userdirs("ion3");
177 optparser_init(argc, argv, OPTP_MIDLONG, ion_opts);
179 extl_read_config("ioncore_luaext", NULL, TRUE);
181 while((opt=optparser_get_opt())){
184 display=optparser_get_arg();
187 extl_add_searchdir(optparser_get_arg());
190 extl_set_sessiondir(optparser_get_arg());
196 printf("%s\n", ION_VERSION);
199 printf("%s\n\n%s", statusd_copy, TR(statusd_license));
204 const char *f=optparser_get_arg();
205 if(extl_read_savefile(f, &t)){
206 extl_unref_table(configtab);
209 warn(TR("Unable to load configuration file %s"), f);
217 mod=optparser_get_arg();
218 if(strchr(mod, '/')==NULL && strchr(mod, '.')==NULL){
219 mod2=scat("statusd_", mod);
224 if(extl_read_config(mod, NULL, !quiet))
230 warn(TR("Invalid command line."));
236 if(loaded==0 && !quiet){
237 warn(TR("No meters loaded."));
248 * Inform that meter \var{name} has value \var{value}.
251 void statusd_inform(const char *name, const char *value)
253 printf("%s: %s\n", name, value);
259 * Get configuration table for module \var{name}
262 ExtlTab statusd_get_config(const char *name)
265 return extl_ref_table(configtab);
268 if(extl_table_gets_t(configtab, name, &t))
271 return extl_create_table();
277 * Get last file modification time.
280 double statusd_last_modified(const char *fname)
287 if(stat(fname, &st)!=0){
288 /*warn_err_obj(fname);*/
292 return (double)(st.st_mtime>st.st_ctime ? st.st_mtime : st.st_ctime);
297 ExtlTab statusd_getloadavg()
299 ExtlTab t=extl_create_table();
300 #ifndef CF_NO_GETLOADAVG
307 extl_table_sets_d(t, "1min", l[0]);
309 extl_table_sets_d(t, "5min", l[1]);
311 extl_table_sets_d(t, "15min", l[2]);