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 static void stdout_closed(int fd
, void *data
)
145 int main(int argc
, char*argv
[])
147 const char *mod
=NULL
;
154 if(setlocale(LC_ALL
, "")==NULL
)
155 warn("setlocale() call failed.");
158 configtab
=extl_table_none();
162 #ifdef CF_RELOCATABLE_BIN_LOCATION
163 prefix_set(argv
[0], CF_RELOCATABLE_BIN_LOCATION
);
168 if(!statusd_register_exports())
171 prefix_wrap_simple(extl_add_searchdir
, EXTRABINDIR
);
172 prefix_wrap_simple(extl_add_searchdir
, MODULEDIR
);
173 prefix_wrap_simple(extl_add_searchdir
, ETCDIR
);
174 prefix_wrap_simple(extl_add_searchdir
, SHAREDIR
);
175 prefix_wrap_simple(extl_add_searchdir
, LCDIR
);
176 extl_set_userdirs(CF_ION_EXECUTABLE
);
178 optparser_init(argc
, argv
, OPTP_MIDLONG
, ion_opts
);
180 extl_read_config("ioncore_luaext", NULL
, TRUE
);
182 while((opt
=optparser_get_opt())){
185 display=optparser_get_arg();
188 extl_add_searchdir(optparser_get_arg());
191 extl_set_sessiondir(optparser_get_arg());
197 printf("%s\n", ION_VERSION
);
200 printf("%s\n\n%s", statusd_copy
, TR(statusd_license
));
205 const char *f
=optparser_get_arg();
206 if(extl_read_savefile(f
, &t
)){
207 extl_unref_table(configtab
);
210 warn(TR("Unable to load configuration file %s"), f
);
218 mod
=optparser_get_arg();
219 if(strchr(mod
, '/')==NULL
&& strchr(mod
, '.')==NULL
){
220 mod2
=scat("statusd_", mod
);
225 if(extl_read_config(mod
, NULL
, !quiet
))
231 warn(TR("Invalid command line."));
237 if(loaded
==0 && !quiet
){
238 warn(TR("No meters loaded."));
249 * Inform that meter \var{name} has value \var{value}.
252 void statusd_inform(const char *name
, const char *value
)
254 printf("%s: %s\n", name
, value
);
260 * Get configuration table for module \var{name}
263 ExtlTab
statusd_get_config(const char *name
)
266 return extl_ref_table(configtab
);
269 if(extl_table_gets_t(configtab
, name
, &t
))
272 return extl_create_table();
278 * Get last file modification time.
281 double statusd_last_modified(const char *fname
)
288 if(stat(fname
, &st
)!=0){
289 /*warn_err_obj(fname);*/
293 return (double)(st
.st_mtime
>st
.st_ctime
? st
.st_mtime
: st
.st_ctime
);
298 ExtlTab
statusd_getloadavg()
300 ExtlTab t
=extl_create_table();
301 #ifndef CF_NO_GETLOADAVG
308 extl_table_sets_d(t
, "1min", l
[0]);
310 extl_table_sets_d(t
, "5min", l
[1]);
312 extl_table_sets_d(t
, "15min", l
[2]);