From b4f3a8da0a592e19d8a460a600508421f46bbc92 Mon Sep 17 00:00:00 2001 From: Al Poole Date: Fri, 9 Dec 2016 11:00:50 -0600 Subject: [PATCH] Enlightenment: Factor all sysctl battery code for bsd into e_mod_sysctl.c This commit should now allow battery to support OpenBSD, FreeBSD, Dragonfly BSD, and NetBSD --- configure.ac | 10 + src/modules/Makefile_battery.mk | 14 +- src/modules/battery/batget.c | 229 +----------------- src/modules/battery/e_mod_main.c | 12 +- src/modules/battery/e_mod_main.h | 25 +- .../{e_mod_openbsd.c => e_mod_sysctl.c} | 164 +++++++++++-- 6 files changed, 190 insertions(+), 264 deletions(-) rename src/modules/battery/{e_mod_openbsd.c => e_mod_sysctl.c} (54%) diff --git a/configure.ac b/configure.ac index 533633cce..df69b29e7 100644 --- a/configure.ac +++ b/configure.ac @@ -597,6 +597,8 @@ AC_DEFINE(E_INTERNAL, 1, "This define can be used to wrap internal E stuff, as c have_openbsd="no" have_freebsd="no" +have_dragonfly="no" +have_netbsd="no" BATTERY_LDFLAGS= case "$host_os" in darwin*) @@ -606,15 +608,23 @@ case "$host_os" in openbsd*) have_openbsd="yes" ;; + netbsd*) + have_netbsd="yes" + ;; freebsd*) have_freebsd="yes" ;; + dragonfly*) + have_dragonfly="yes" + ;; esac AC_SUBST([BATTERY_CFLAGS]) AC_SUBST([BATTERY_LDFLAGS]) AM_CONDITIONAL([HAVE_OPENBSD], [test "x${have_openbsd}" = "xyes"]) +AM_CONDITIONAL([HAVE_NETBSD], [test "x${have_netbsd}" = "xyes"]) AM_CONDITIONAL([HAVE_FREEBSD], [test "x${have_freebsd}" = "xyes"]) +AM_CONDITIONAL([HAVE_DRAGONFLY], [test "x${have_dragonfly}" = "xyes"]) ##have_exchange=no ##AC_ARG_ENABLE(exchange, diff --git a/src/modules/Makefile_battery.mk b/src/modules/Makefile_battery.mk index 3a2954803..31e277580 100644 --- a/src/modules/Makefile_battery.mk +++ b/src/modules/Makefile_battery.mk @@ -18,11 +18,23 @@ if HAVE_EEZE src_modules_battery_module_la_SOURCES += src/modules/battery/e_mod_udev.c else if HAVE_OPENBSD -src_modules_battery_module_la_SOURCES += src/modules/battery/e_mod_openbsd.c +src_modules_battery_module_la_SOURCES += src/modules/battery/e_mod_sysctl.c +else +if HAVE_NETBSD +src_modules_battery_module_la_SOURCES += src/modules/battery/e_mod_sysctl.c +else +if HAVE_DRAGONFLY +src_modules_battery_module_la_SOURCES += src/modules/battery/e_mod_sysctl.c +else +if HAVE_FREEBSD +src_modules_battery_module_la_SOURCES += src/modules/battery/e_mod_sysctl.c else src_modules_battery_module_la_SOURCES += src/modules/battery/e_mod_upower.c endif endif +endif +endif +endif src_modules_battery_module_la_LIBADD = $(MOD_LIBS) src_modules_battery_module_la_LDFLAGS = $(MOD_LDFLAGS) diff --git a/src/modules/battery/batget.c b/src/modules/battery/batget.c index 6e921c376..3a6704a2e 100644 --- a/src/modules/battery/batget.c +++ b/src/modules/battery/batget.c @@ -1,12 +1,5 @@ #include "e.h" -#ifdef __FreeBSD__ -# include -# include -# ifdef __i386__ -# include -# endif -#endif #ifdef HAVE_CFBASE_H # include # include @@ -145,177 +138,7 @@ file_str_entry_get(FILE *f, return tmp; } -#ifdef __FreeBSD__ - -#define BATTERY_STATE_NONE 0 -#define BATTERY_STATE_DISCHARGING 1 -#define BATTERY_STATE_CHARGING 2 -#define BATTERY_STATE_REMOVED 7 - -/***---***/ -static void -bsd_acpi_init(void) -{ - /* nothing to do */ -} - -static void -bsd_acpi_check(void) -{ - int bat_val = 0; - int mib_state[4]; - int mib_life[4]; - int mib_time[4]; - int mib_units[4]; - size_t len; - int state = 0; - int level = 0; - int time_min = 0; - int life = 0; - int batteries = 0; - - time_left = -1; - battery_full = -1; - have_battery = 0; - have_power = 0; - - /* Read some information on first run. */ - len = 4; - sysctlnametomib("hw.acpi.battery.state", mib_state, &len); - len = sizeof(state); - if (sysctl(mib_state, 4, &state, &len, NULL, 0) == -1) - /* ERROR */ - state = -1; - - len = 4; - sysctlnametomib("hw.acpi.battery.life", mib_life, &len); - len = sizeof(life); - if (sysctl(mib_life, 4, &life, &len, NULL, 0) == -1) - /* ERROR */ - level = -1; - bat_val = life; - - len = 4; - sysctlnametomib("hw.acpi.battery.time", mib_time, &len); - len = sizeof(time); - if (sysctl(mib_time, 4, &time_min, &len, NULL, 0) == -1) - /* ERROR */ - time_min = -1; - - len = 4; - sysctlnametomib("hw.acpi.battery.units", mib_units, &len); - len = sizeof(batteries); - if (sysctl(mib_time, 4, &batteries, &len, NULL, 0) == -1) - /* ERROR */ - batteries = 1; - - if (time_min >= 0) time_left = time_min * 60; - - if (batteries == 1) /* hw.acpi.battery.units = 1 means NO BATTS */ - time_left = -1; - else if ((state == BATTERY_STATE_CHARGING) || - (state == BATTERY_STATE_DISCHARGING)) - { - have_battery = 1; - if (state == BATTERY_STATE_CHARGING) have_power = 1; - else if (state == BATTERY_STATE_DISCHARGING) - have_power = 0; - if (level == -1) time_left = -1; - else if (time_min == -1) - { - time_left = -1; - battery_full = bat_val; - } - else battery_full = bat_val; - } - else - { - have_battery = 1; - battery_full = 100; - time_left = -1; - have_power = 1; - } -} - -/***---***/ -# ifdef __i386__ -static void -bsd_apm_init(void) -{ - /* nothing to do */ -} - -static void -bsd_apm_check(void) -{ - int ac_stat, bat_stat, bat_val, time_val; - int apm_fd = -1; - struct apm_info info; - - time_left = -1; - battery_full = -1; - have_battery = 0; - have_power = 0; - - apm_fd = open("/dev/apm", O_RDONLY); - if ((apm_fd != -1) && (ioctl(apm_fd, APMIO_GETINFO, &info) != -1)) - { - /* set values */ - ac_stat = info.ai_acline; - bat_stat = info.ai_batt_stat; - bat_val = info.ai_batt_life; - time_val = info.ai_batt_time; - } - else - { - if (apm_fd != -1) close(apm_fd); - return; - } - - close(apm_fd); - if (info.ai_batteries == 1) /* ai_batteries == 1 means NO battery, - * ai_batteries == 2 means 1 battery */ - { - have_power = 1; - return; - } - - if (ac_stat) /* Wallpowered */ - { - have_power = 1; - have_battery = 1; - switch (bat_stat) /* On FreeBSD the time_val is -1 when AC ist plugged - * in. This means we don't know how long the battery - * will recharge */ - { - case 0: - battery_full = 100; - break; - - case 1: - battery_full = 50; - break; - - case 2: - battery_full = 25; - break; - - case 3: - battery_full = 100; - break; - } - } - else /* Running on battery */ - { - have_battery = 1; - battery_full = bat_val; - time_left = time_val; - } -} - -# endif - -#elif defined(HAVE_CFBASE_H) /* OS X */ +#if defined(HAVE_CFBASE_H) /* OS X */ /***---***/ static void darwin_init(void); static void darwin_check(void); @@ -1404,33 +1227,7 @@ dir_has_contents(const char *dir) static void init(void) { -#ifdef __FreeBSD__ - int acline; - size_t len; - - len = sizeof(acline); - if (!sysctlbyname("hw.acpi.acline", &acline, &len, NULL, 0)) - { - int acline_mib[3] = {-1}; - - len = 3; - if (!sysctlnametomib("hw.acpi.acline", acline_mib, &len)) - { - mode = CHECK_ACPI; - bsd_acpi_init(); - } - } - else - { -#ifdef __i386__ - if (ecore_file_exists("/dev/apm")) - { - mode = CHECK_APM; - bsd_apm_init(); - } -#endif - } -#elif defined(HAVE_CFBASE_H) /* OS X */ +#if defined(HAVE_CFBASE_H) /* OS X */ darwin_init(); #else if ((ecore_file_is_dir(sys_power_dir)) && (dir_has_contents(sys_power_dir))) @@ -1469,27 +1266,7 @@ poll_cb(void *data EINA_UNUSED) phave_battery = have_battery; phave_power = have_power; -#ifdef __FreeBSD__ - switch (mode) - { - case CHECK_ACPI: - bsd_acpi_check(); - break; - -#ifdef __i386__ - case CHECK_APM: - bsd_apm_check(); - break; - -#endif - default: - battery_full = -1; - time_left = -1; - have_battery = 0; - have_power = 0; - break; - } -#elif defined(HAVE_CFBASE_H) /* OS X */ +#if defined(HAVE_CFBASE_H) /* OS X */ darwin_check(); return ECORE_CALLBACK_RENEW; #else diff --git a/src/modules/battery/e_mod_main.c b/src/modules/battery/e_mod_main.c index 4bf08bbd6..fe5f1bc06 100644 --- a/src/modules/battery/e_mod_main.c +++ b/src/modules/battery/e_mod_main.c @@ -368,8 +368,8 @@ _battery_config_updated(void) { #ifdef HAVE_EEZE ok = _battery_udev_start(); -#elif defined __OpenBSD__ - ok = _battery_openbsd_start(); +#elif defined __OpenBSD__ || defined __DragonFly__ || defined __FreeBSD__ || defined __NetBSD__ + ok = _battery_sysctl_start(); #else ok = _battery_upower_start(); #endif @@ -738,7 +738,7 @@ e_modapi_init(E_Module *m) E_CONFIG_VAL(D, T, alert_timeout, INT); E_CONFIG_VAL(D, T, suspend_below, INT); E_CONFIG_VAL(D, T, force_mode, INT); -#if defined HAVE_EEZE || defined __OpenBSD__ +#if defined HAVE_EEZE || defined __OpenBSD__ || defined __NetBSD__ E_CONFIG_VAL(D, T, fuzzy, INT); #endif E_CONFIG_VAL(D, T, desktop_notifications, INT); @@ -753,7 +753,7 @@ e_modapi_init(E_Module *m) battery_config->alert_timeout = 0; battery_config->suspend_below = 0; battery_config->force_mode = 0; -#if defined HAVE_EEZE || defined __OpenBSD__ +#if defined HAVE_EEZE || defined __OpenBSD__ || defined __NetBSD__ battery_config->fuzzy = 0; #endif battery_config->desktop_notifications = 0; @@ -826,8 +826,8 @@ e_modapi_shutdown(E_Module *m EINA_UNUSED) #ifdef HAVE_EEZE _battery_udev_stop(); -#elif defined __OpenBSD__ - _battery_openbsd_stop(); +#elif defined __OpenBSD__ || defined __DragonFly__ || defined __FreeBSD__ || defined __NetBSD__ + _battery_sysctl_stop(); #else _battery_upower_stop(); #endif diff --git a/src/modules/battery/e_mod_main.h b/src/modules/battery/e_mod_main.h index 10980574d..8af3cb1c1 100644 --- a/src/modules/battery/e_mod_main.h +++ b/src/modules/battery/e_mod_main.h @@ -53,7 +53,7 @@ struct _Config Eeze_Udev_Watch *acwatch; Eeze_Udev_Watch *batwatch; #endif -#if defined HAVE_EEZE || defined __OpenBSD__ +#if defined HAVE_EEZE || defined __OpenBSD__ || defined __NetBSD__ Eina_Bool fuzzy; int fuzzcount; #endif @@ -65,12 +65,12 @@ typedef struct _Ac_Adapter Ac_Adapter; struct _Battery { const char *udi; -#if defined HAVE_EEZE || defined __OpenBSD__ +#if defined HAVE_EEZE || defined __OpenBSD__ || defined __DragonFly__ || defined __FreeBSD__ || defined __NetBSD__ Ecore_Poller *poll; #endif Eina_Bool present:1; Eina_Bool charging:1; -#if defined HAVE_EEZE || defined __OpenBSD__ +#if defined HAVE_EEZE || defined __OpenBSD__ || defined __DragonFly__ || defined __FreeBSD__ || defined __NetBSD__ double last_update; double percent; double current_charge; @@ -95,8 +95,13 @@ struct _Battery const char *vendor; Eina_Bool got_prop:1; Eldbus_Proxy *proxy; -#ifdef __OpenBSD__ int * mib; +#if defined(__FreeBSD__) || defined(__DragonFly__) + int * mib_state; + int * mib_units; + int * mib_time; + int batteries; + int time_min; #endif }; @@ -106,9 +111,7 @@ struct _Ac_Adapter Eina_Bool present:1; const char *product; Eldbus_Proxy *proxy; -#ifdef __OpenBSD__ int * mib; -#endif }; Battery *_battery_battery_find(const char *udi); @@ -119,16 +122,16 @@ void _battery_device_update(void); int _battery_udev_start(void); void _battery_udev_stop(void); /* end e_mod_udev.c */ -#elif !defined __OpenBSD__ +#elif !defined __OpenBSD__ && !defined __DragonFly__ && !defined __FreeBSD__ && !defined __NetBSD__ /* in e_mod_dbus.c */ int _battery_upower_start(void); void _battery_upower_stop(void); /* end e_mod_dbus.c */ #else -/* in e_mod_openbsd.c */ -int _battery_openbsd_start(void); -void _battery_openbsd_stop(void); -/* end e_mod_openbsd.c */ +/* in e_mod_sysctl.c */ +int _battery_sysctl_start(void); +void _battery_sysctl_stop(void); +/* end e_mod_sysctl.c */ #endif E_API extern E_Module_Api e_modapi; diff --git a/src/modules/battery/e_mod_openbsd.c b/src/modules/battery/e_mod_sysctl.c similarity index 54% rename from src/modules/battery/e_mod_openbsd.c rename to src/modules/battery/e_mod_sysctl.c index 8a85a653e..b149207c8 100644 --- a/src/modules/battery/e_mod_openbsd.c +++ b/src/modules/battery/e_mod_sysctl.c @@ -1,15 +1,18 @@ #include - -#include +#include #include + +#if defined(__OpenBSD__) || defined(__NetBSD__) +#include #include +#endif #include "e.h" #include "e_mod_main.h" -static Eina_Bool _battery_openbsd_battery_update_poll(void *data); -static void _battery_openbsd_battery_update(); +static Eina_Bool _battery_sysctl_battery_update_poll(void *data); +static int _battery_sysctl_battery_update(); extern Eina_List *device_batteries; extern Eina_List *device_ac_adapters; @@ -19,13 +22,19 @@ Ac_Adapter *ac = NULL; Battery *bat = NULL; int -_battery_openbsd_start(void) +_battery_sysctl_start(void) { +#if defined(__OpenBSD__) || defined(__NetBSD__) int mib[] = {CTL_HW, HW_SENSORS, 0, 0, 0}; int devn; struct sensordev snsrdev; size_t sdlen = sizeof(struct sensordev); +#elif defined(__FreeBSD__) || defined(__DragonFly__) + int result; + size_t len; +#endif +#if defined(__OpenBSD__) || defined(__NetBSD__) for (devn = 0;; devn++) { mib[2] = devn; if (sysctl(mib, 3, &snsrdev, &sdlen, NULL, 0) == -1) @@ -46,13 +55,12 @@ _battery_openbsd_start(void) bat->mib[0] = mib[0]; bat->mib[1] = mib[1]; bat->mib[2] = mib[2]; - bat->technology = eina_stringshare_add("Unknow"); - bat->model = eina_stringshare_add("Unknow"); - bat->vendor = eina_stringshare_add("Unknow"); - bat->last_update = ecore_time_get(); + bat->technology = eina_stringshare_add("Unknown"); + bat->model = eina_stringshare_add("Unknown"); + bat->vendor = eina_stringshare_add("Unknown"); bat->poll = ecore_poller_add(ECORE_POLLER_CORE, battery_config->poll_interval, - _battery_openbsd_battery_update_poll, NULL); + _battery_sysctl_battery_update_poll, NULL); device_batteries = eina_list_append(device_batteries, bat); } else if (!strcmp("acpiac0", snsrdev.xname)) @@ -68,17 +76,72 @@ _battery_openbsd_start(void) device_ac_adapters = eina_list_append(device_ac_adapters, ac); } } +#elif defined(__FreeBSD__) || defined(__DragonFly__) + if ((sysctlbyname("hw.acpi.battery.life", NULL, &len, NULL, 0)) != -1) + { + if (!(bat = E_NEW(Battery, 1))) + return 0; + + bat->mib = malloc(sizeof(int) * 4); + if (!bat->mib) return 0; + sysctlnametomib("hw.acpi.battery.life", bat->mib, &len); - _battery_openbsd_battery_update(); + bat->mib_state = malloc(sizeof(int) * 4); + if (!bat->mib_state) return 0; + sysctlnametomib("hw.acpi.battery.state", bat->mib_state, &len); + + bat->mib_time = malloc(sizeof(int) * 4); + if (!bat->mib_time) return 0; + sysctlnametomib("hw.acpi.battery.time", bat->mib_time, &len); + + bat->mib_units = malloc(sizeof(int) * 4); + if(!bat->mib_units) return 0; + sysctlnametomib("hw.acpi.battery.units", bat->mib_units, &len); + + bat->udi = eina_stringshare_add("hw.acpi.battery"); + bat->technology = eina_stringshare_add("Unknown"); + bat->model = eina_stringshare_add("Unknown"); + bat->vendor = eina_stringshare_add("Unknown"); + + bat->poll = ecore_poller_add(ECORE_POLLER_CORE, + battery_config->poll_interval, + _battery_sysctl_battery_update_poll, NULL); + + device_batteries = eina_list_append(device_batteries, bat); + } + + if ((sysctlbyname("hw.acpi.acline", NULL, &len, NULL, 0)) != -1) + { + if (!(ac = E_NEW(Ac_Adapter, 1))) + return 0; + + ac->mib = malloc(sizeof(int) * 3); + if (!ac->mib) return 0; + len = sizeof(ac->mib); + sysctlnametomib("hw.acpi.acline", ac->mib, &len); + + ac->udi = eina_stringshare_add("hw.acpi.acline"); + + device_ac_adapters = eina_list_append(device_ac_adapters, ac); + } +#endif + _battery_sysctl_battery_update(); + + bat->last_update = ecore_time_get(); - init_time = ecore_time_get(); return 1; } void -_battery_openbsd_stop(void) +_battery_sysctl_stop(void) { - free(ac); + if (ac) + { + eina_stringshare_del(ac->udi); + free(ac->mib); + free(ac); + } + if (bat) { eina_stringshare_del(bat->udi); @@ -86,31 +149,41 @@ _battery_openbsd_stop(void) eina_stringshare_del(bat->model); eina_stringshare_del(bat->vendor); ecore_poller_del(bat->poll); +#if defined(__FreeBSD__) || defined(__DragonFly__) + free(bat->mib_state); + free(bat->mib_time); + free(bat->mib_units); +#endif free(bat->mib); free(bat); } } static Eina_Bool -_battery_openbsd_battery_update_poll(void *data) +_battery_sysctl_battery_update_poll(void *data) { - _battery_openbsd_battery_update(); + _battery_sysctl_battery_update(); return EINA_TRUE; } -static void -_battery_openbsd_battery_update() +static int +_battery_sysctl_battery_update() { double _time, charge; +#if defined(__OpenBSD__) || defined(__NetBSD__) struct sensor s; size_t slen = sizeof(struct sensor); +#elif defined(__FreeBSD__) || defined(__DragonFly__) + int value; + size_t len; +#endif if (bat) { /* update the poller interval */ ecore_poller_poller_interval_set(bat->poll, battery_config->poll_interval); - +#if defined(__OpenBSD__) || defined(__NetBSD__) /* last full capacity */ bat->mib[3] = 7; bat->mib[4] = 0; @@ -191,20 +264,68 @@ _battery_openbsd_battery_update() else bat->charging = 0; } + +#elif defined(__FreeBSD__) || defined(__DragonFly__) + len = sizeof(value); + if ((sysctl(bat->mib, 4, &value, &len, NULL, 0)) == -1) + { + return 0; + } + + bat->percent = value; + + _time = ecore_time_get(); + bat->last_update = _time; + + len = sizeof(value); + if ((sysctl(bat->mib_state, 4, &value, &len, NULL, 0)) == -1) + { + return 0; + } + + bat->charging = !value; + bat->got_prop = 1; + + bat->time_full = -1; + bat->time_left = -1; + + len = sizeof(bat->time_min); + if ((sysctl(bat->mib_time, 4, &bat->time_min, &len, NULL, 0)) == -1) + { + bat->time_min = -1; + } + + len = sizeof(bat->batteries); + if ((sysctl(bat->mib_units, 4, &bat->batteries, &len, NULL, 0)) == -1) + { + bat->batteries = 1; + } + + if (bat->time_min >= 0) bat->time_left = bat->time_min * 60; + if (bat->batteries == 1) bat->time_left = -1; +#endif } if (ac) { +#if defined(__OpenBSD__) || defined(__NetBSD__) /* AC State */ ac->mib[3] = 9; ac->mib[4] = 0; - if (sysctl(ac->mib, 5, &s, &slen, NULL, 0) == -1) + if (sysctl(ac->mib, 5, &s, &slen, NULL, 0) != -1) { if (s.value) ac->present = 1; else ac->present = 0; } +#elif defined(__FreeBSD__) || defined(__DragonFly__) + len = sizeof(value); + if ((sysctl(ac->mib, 3, &value, &len, NULL, 0)) != -1) + { + ac->present = value; + } +#endif } if (bat) @@ -214,3 +335,6 @@ _battery_openbsd_battery_update() bat->got_prop = 1; } } + + +