#ifdef XOAP
#include <libxml/parser.h>
#endif /* XOAP */
+#ifdef HAVE_CURL
+#include <curl/curl.h>
+#endif
/* local headers */
#include "core.h"
#ifdef IOSTATS
int top_io;
#endif
-#ifdef __linux__
int top_running;
-#endif
int output_methods;
static int extra_newline;
enum x_initialiser_state x_initialised = NO;
#ifdef IMLIB2
" * Imlib2\n"
#endif /* IMLIB2 */
-#ifdef MIXER_IS_ALSA
- " * ALSA mixer support\n"
-#endif /* MIXER_IS_ALSA */
#ifdef APCUPSD
" * apcupsd\n"
#endif /* APCUPSD */
}
fclose(where);
} else {
- NORM_ERR("Could not open the file");
+ NORM_ERR("Could not open the file '%s'", f);
}
return ret;
}
char *ps, *pe;
int special_index = 0; /* specials index */
+ if(! b) return;
for (ps = b, pe = b; *pe; pe++) {
if (*pe == '\n') {
*pe = '\0';
buff_in[0] = 0;
#endif /* HAVE_ICONV */
+ if(! p) return;
+
p[0] = 0;
obj = root.next;
while (obj && p_max_size > 0) {
DO_JUMP;
} else if (spc) {
*spc = '\0';
- if (check_contains(obj->data.s, spc + 1))
+ if (!check_contains(obj->data.s, spc + 1))
DO_JUMP;
*spc = ' ';
}
OBJ(nodename) {
snprintf(p, p_max_size, "%s", cur->uname_s.nodename);
}
+ OBJ(nodename_short) {
+ char *pos;
+ pos = strstr(cur->uname_s.nodename, ".");
+ if(pos != NULL) {
+ snprintf(p, MIN(pos-cur->uname_s.nodename+1, p_max_size), "%s", cur->uname_s.nodename);
+ } else {
+ snprintf(p, p_max_size, "%s", cur->uname_s.nodename);
+ }
+ }
OBJ(outlinecolor) {
new_outline(p, obj->data.l);
}
/* we have four different types of top (top, top_mem,
* top_time and top_io). To avoid having almost-same code four
* times, we have this special handler. */
-#ifdef __linux__
break;
case OBJ_top:
case OBJ_top_mem:
case OBJ_top_io:
#endif
print_top(obj, p, p_max_size);
-#endif /* __linux__ */
OBJ(tail) {
print_tailhead("tail", obj, p, p_max_size);
}
}
#ifdef NVIDIA
OBJ(nvidia) {
- print_nvidia_value(obj, display, p, p_max_size);
+ print_nvidia_value(obj, p, p_max_size);
}
#endif /* NVIDIA */
#ifdef APCUPSD
#ifdef HAVE_ICONV
iconv_convert(&a, buff_in, p, p_max_size);
#endif /* HAVE_ICONV */
- if (obj->type != OBJ_text && obj->type != OBJ_execp && obj->type != OBJ_execpi
+ if (obj->type == OBJ_execp || obj->type == OBJ_execpi || obj->type
+ == OBJ_exec
#ifdef HAVE_LUA
- && obj->type != OBJ_lua && obj->type != OBJ_lua_parse
+ || obj->type == OBJ_lua || obj->type == OBJ_lua_parse
#endif /* HAVE_LUA */
) {
substitute_newlines(p, a - 2);
if (seconds != 0) {
timeunits = seconds / 86400; seconds %= 86400;
if (timeunits > 0) {
- asprintf(&tmp_day_str, "%dd", timeunits);
+ if (asprintf(&tmp_day_str, "%dd", timeunits) < 0) {
+ tmp_day_str = 0;
+ }
} else {
tmp_day_str = strdup("");
}
timeunits = seconds / 3600; seconds %= 3600;
if (timeunits > 0) {
- asprintf(&tmp_hour_str, "%dh", timeunits);
+ if (asprintf(&tmp_hour_str, "%dh", timeunits) < 0) {
+ tmp_day_str = 0;
+ }
} else {
tmp_hour_str = strdup("");
}
timeunits = seconds / 60; seconds %= 60;
if (timeunits > 0) {
- asprintf(&tmp_min_str, "%dm", timeunits);
+ if (asprintf(&tmp_min_str, "%dm", timeunits) < 0) {
+ tmp_min_str = 0;
+ }
} else {
tmp_min_str = strdup("");
}
if (seconds > 0) {
- asprintf(&tmp_sec_str, "%ds", seconds);
+ if (asprintf(&tmp_sec_str, "%ds", seconds) < 0) {
+ tmp_sec_str = 0;
+ }
} else {
tmp_sec_str = strdup("");
}
- asprintf(&tmp_str, "%s%s%s%s", tmp_day_str, tmp_hour_str, tmp_min_str, tmp_sec_str);
- free(tmp_day_str); free(tmp_hour_str); free(tmp_min_str); free(tmp_sec_str);
+ if (asprintf(&tmp_str, "%s%s%s%s", tmp_day_str,
+ tmp_hour_str, tmp_min_str, tmp_sec_str) < 0) {
+ tmp_str = 0;
+ }
+#define FREE(a) if ((a)) free((a));
+ FREE(tmp_day_str); FREE(tmp_hour_str); FREE(tmp_min_str); FREE(tmp_sec_str);
} else {
- asprintf(&tmp_str, "Range not possible"); // should never happen, but better safe then sorry
+ tmp_str = strdup("Range not possible"); /* should never happen, but better safe then sorry */
}
cur_x += (w / 2) - (font_ascent() * (strlen(tmp_str) / 2));
cur_y += font_h / 2;
draw_string(tmp_str);
- free(tmp_str);
+ FREE(tmp_str);
+#undef FREE
cur_x = tmp_x;
cur_y = tmp_y;
}
#endif /* HAVE_LUA */
g_signal_pending = 0;
}
- clean_up(NULL, NULL);
+ clean_up(current_mail_spool, NULL);
#ifdef HAVE_SYS_INOTIFY_H
if (inotify_fd != -1) {
initialisation(argc_copy, argv_copy);
}
-void clean_up(void *memtofree1, void* memtofree2)
+#ifdef X11
+void clean_up_x11(void)
{
- int i;
+ if(window_created == 1) {
+ XClearArea(display, window.window, text_start_x - window.border_inner_margin - window.border_outer_margin - window.border_width,
+ text_start_y - window.border_inner_margin - window.border_outer_margin - window.border_width,
+ text_width + window.border_inner_margin * 2 + window.border_outer_margin * 2 + window.border_width * 2,
+ text_height + window.border_inner_margin * 2 + window.border_outer_margin * 2 + window.border_width * 2, 0);
+ }
+ destroy_window();
+ free_fonts();
+ fonts = NULL;
+ if(x11_stuff.region) {
+ XDestroyRegion(x11_stuff.region);
+ x11_stuff.region = NULL;
+ }
+ if(display) {
+ XCloseDisplay(display);
+ display = NULL;
+ }
+ if(info.x11.desktop.all_names) {
+ free(info.x11.desktop.all_names);
+ info.x11.desktop.all_names = NULL;
+ }
+ if (info.x11.desktop.name) {
+ free(info.x11.desktop.name);
+ info.x11.desktop.name = NULL;
+ }
+ x_initialised = NO;
+}
+#endif
- free_update_callbacks();
+void clean_up_without_threads(void *memtofree1, void* memtofree2) {
+ int i;
#ifdef NCURSES
if(output_methods & TO_NCURSES) {
}
#ifdef X11
if (x_initialised == YES) {
- if(window_created == 1) {
- XClearArea(display, window.window, text_start_x - window.border_inner_margin - window.border_outer_margin - window.border_width,
- text_start_y - window.border_inner_margin - window.border_outer_margin - window.border_width,
- text_width + window.border_inner_margin * 2 + window.border_outer_margin * 2 + window.border_width * 2,
- text_height + window.border_inner_margin * 2 + window.border_outer_margin * 2 + window.border_width * 2, 0);
- }
- destroy_window();
- free_fonts();
- if(x11_stuff.region) {
- XDestroyRegion(x11_stuff.region);
- x11_stuff.region = NULL;
- }
- XCloseDisplay(display);
- display = NULL;
- if(info.x11.desktop.all_names) {
- free(info.x11.desktop.all_names);
- info.x11.desktop.all_names = NULL;
- }
- if (info.x11.desktop.name) {
- free(info.x11.desktop.name);
- info.x11.desktop.name = NULL;
- }
- x_initialised = NO;
+ clean_up_x11();
}else{
free(fonts); //in set_default_configurations a font is set but not loaded
font_count = -1;
}
+#ifdef NVIDIA
+ set_nvidia_display(NULL);
+#endif
#endif /* X11 */
free_templates();
}
}
+void clean_up(void *memtofree1, void* memtofree2)
+{
+ free_update_callbacks();
+ clean_up_without_threads(memtofree1, memtofree2);
+}
+
static int string_to_bool(const char *s)
{
if (!s) {
#ifdef IOSTATS
top_io = 0;
#endif
-#ifdef __linux__
top_running = 0;
-#endif
#ifdef MPD
mpd_env_host = getenv("MPD_HOST");
mpd_env_port = getenv("MPD_PORT");
output_methods = TO_STDOUT;
#endif
#ifdef X11
+#ifdef BUILD_XFT
+ use_xft = 0;
+#endif
show_graph_scale = 0;
show_graph_range = 0;
draw_shades = 1;
text_alignment = BOTTOM_LEFT;
info.x11.monitor.number = 1;
info.x11.monitor.current = 0;
- info.x11.desktop.current = 1;
+ info.x11.desktop.current = 1;
info.x11.desktop.number = 1;
info.x11.desktop.nitems = 0;
- info.x11.desktop.all_names = NULL;
- info.x11.desktop.name = NULL;
+ info.x11.desktop.all_names = NULL;
+ info.x11.desktop.name = NULL;
#endif /* X11 */
free_templates();
}
#ifdef X11
-void setalignment(int* text_alignment, unsigned int windowtype, const char* value, const char *f, int line, char setbyconffile) {
+void setalignment(int* ltext_alignment, unsigned int windowtype, const char* value, const char *f, int line, char setbyconffile) {
#ifdef OWN_WINDOW
if (windowtype == TYPE_DOCK) {
NORM_ERR("alignment is disabled when own_window_type is dock");
int a = string_to_alignment(value);
if (a <= 0) {
- if(setbyconffile == true) {
+ if (setbyconffile) {
CONF_ERR;
} else NORM_ERR("'%s' is not a alignment setting", value);
} else {
- *text_alignment = a;
+ *ltext_alignment = a;
}
- } else if(setbyconffile == true) {
+ } else if (setbyconffile) {
CONF_ERR;
}
}
#ifdef X11
CONF2("out_to_x") {
- /* don't listen if X is already initialised or
- * if we already know we don't want it */
- if(x_initialised != YES) {
- if (string_to_bool(value)) {
- output_methods &= TO_X;
- } else {
- output_methods &= ~TO_X;
- x_initialised = NEVER;
- }
+ if (string_to_bool(value)) {
+ output_methods &= TO_X;
+ } else {
+ clean_up_x11();
+ output_methods &= ~TO_X;
+ x_initialised = NEVER;
}
}
CONF("display") {
disp = strdup(value);
}
}
+#ifdef NVIDIA
+ CONF("nvidia_display") {
+ if(value)
+ set_nvidia_display(value);
+ }
+#endif
CONF("alignment") {
- setalignment(&text_alignment, window.type, value, f, line, true);
+ setalignment(&text_alignment, window.type, value, f, line, 1);
}
CONF("background") {
fork_to_background = string_to_bool(value);
CONF("border_width") {
if (value) {
window.border_width = strtol(value, 0, 0);
- if (window.border_width < 0) window.border_width = 0;
+ if (window.border_width < 1) window.border_width = 1;
} else {
CONF_ERR;
}
static const struct option longopts[] = {
{ "help", 0, NULL, 'h' },
{ "version", 0, NULL, 'V' },
+ { "quiet", 0, NULL, 'q' },
{ "debug", 0, NULL, 'D' },
{ "config", 1, NULL, 'c' },
#ifdef CONFIG_OUTPUT
{ "window-id", 1, NULL, 'w' },
#endif /* X11 */
{ "text", 1, NULL, 't' },
- { "interval", 0, NULL, 'u' },
- { "pause", 0, NULL, 'p' },
+ { "interval", 1, NULL, 'u' },
+ { "pause", 1, NULL, 'p' },
{ 0, 0, 0, 0 }
};
+void set_current_config(void);
+void set_current_config(void)
+{
+ /* check if specified config file is valid */
+ if (current_config) {
+ struct stat sb;
+ if (stat(current_config, &sb) ||
+ (!S_ISREG(sb.st_mode) && !S_ISLNK(sb.st_mode))) {
+ NORM_ERR("invalid configuration file '%s'\n", current_config);
+ free(current_config);
+ current_config = 0;
+ }
+ }
+
+ /* load current_config, CONFIG_FILE or SYSTEM_CONFIG_FILE */
+
+ if (!current_config) {
+ /* load default config file */
+ char buf[DEFAULT_TEXT_BUFFER_SIZE];
+ FILE *fp;
+
+ /* Try to use personal config file first */
+ to_real_path(buf, CONFIG_FILE);
+ if (buf[0] && (fp = fopen(buf, "r"))) {
+ current_config = strndup(buf, max_user_text);
+ fclose(fp);
+ }
+
+ /* Try to use system config file if personal config not readable */
+ if (!current_config && (fp = fopen(SYSTEM_CONFIG_FILE, "r"))) {
+ current_config = strndup(SYSTEM_CONFIG_FILE, max_user_text);
+ fclose(fp);
+ }
+
+ /* No readable config found */
+ if (!current_config) {
+#define NOCFGFILEFOUND "no readable personal or system-wide config file found"
+#ifdef BUILD_BUILTIN_CONFIG
+ current_config = strdup("==builtin==");
+ NORM_ERR(NOCFGFILEFOUND
+ ", using builtin default");
+#else
+ CRIT_ERR(NULL, NULL, NOCFGFILEFOUND);
+#endif /* ! CONF_OUTPUT */
+ }
+ }
+}
+
void initialisation(int argc, char **argv) {
struct sigaction act, oact;
set_default_configurations();
+ set_current_config();
load_config_file(current_config);
currentconffile = conftree_add(currentconffile, current_config);
set_first_font(optarg);
break;
case 'a':
- setalignment(&text_alignment, window.type, optarg, NULL, 0, false);
+ setalignment(&text_alignment, window.type, optarg, NULL, 0, 0);
break;
#ifdef OWN_WINDOW
tcp_portmon_set_max_connections(0);
#endif
+#ifdef HAVE_CURL
+ if(curl_global_init(CURL_GLOBAL_ALL))
+ NORM_ERR("curl_global_init() failed, you may not be able to use curl variables");
+#endif
+
/* handle command line parameters that don't change configs */
#ifdef X11
if (((s = getenv("LC_ALL")) && *s) || ((s = getenv("LC_CTYPE")) && *s)
current_config = strndup(optarg, max_user_text);
break;
case 'q':
- freopen("/dev/null", "w", stderr);
+ if (!freopen("/dev/null", "w", stderr)) {
+ NORM_ERR("unable to redirect stderr to /dev/null");
+ }
break;
case 'h':
print_help(argv[0]);
}
}
- /* check if specified config file is valid */
- if (current_config) {
- struct stat sb;
- if (stat(current_config, &sb) ||
- (!S_ISREG(sb.st_mode) && !S_ISLNK(sb.st_mode))) {
- NORM_ERR("invalid configuration file '%s'\n", current_config);
- free(current_config);
- current_config = 0;
- }
- }
-
- /* load current_config, CONFIG_FILE or SYSTEM_CONFIG_FILE */
-
- if (!current_config) {
- /* load default config file */
- char buf[DEFAULT_TEXT_BUFFER_SIZE];
- FILE *fp;
-
- /* Try to use personal config file first */
- to_real_path(buf, CONFIG_FILE);
- if (buf[0] && (fp = fopen(buf, "r"))) {
- current_config = strndup(buf, max_user_text);
- fclose(fp);
- }
-
- /* Try to use system config file if personal config not readable */
- if (!current_config && (fp = fopen(SYSTEM_CONFIG_FILE, "r"))) {
- current_config = strndup(SYSTEM_CONFIG_FILE, max_user_text);
- fclose(fp);
- }
-
- /* No readable config found */
- if (!current_config) {
-#ifdef CONFIG_OUTPUT
- current_config = strdup("==builtin==");
- NORM_ERR("no readable personal or system-wide config file found,"
- " using builtin default");
-#else
- CRIT_ERR(NULL, NULL, "no readable personal or system-wide config file found");
-#endif /* ! CONF_OUTPUT */
- }
- }
+ set_current_config();
#ifdef XOAP
/* Load xoap keys, if existing */
#endif /* XOAP */
#ifdef HAVE_SYS_INOTIFY_H
- inotify_fd = inotify_init1(IN_NONBLOCK);
+ inotify_fd = inotify_init();
+ if(inotify_fd != -1) {
+ int fl;
+
+ fl = fcntl(inotify_fd, F_GETFL);
+ fcntl(inotify_fd, F_SETFL, fl | O_NONBLOCK);
+ }
#endif /* HAVE_SYS_INOTIFY_H */
initialisation(argc, argv);
main_loop();
+#ifdef HAVE_CURL
+ curl_global_cleanup();
+#endif
+
#if defined(__FreeBSD__) || defined(__FreeBSD_kernel__)
kvm_close(kd);
#endif