diff --git a/configure.ac.in b/configure.ac.in index bf8a618d..75b424c7 100644 --- a/configure.ac.in +++ b/configure.ac.in @@ -196,6 +196,20 @@ if test x$want_rss = xyes; then AC_DEFINE(RSS, 1, [Define if you want rss support]) fi +dnl +dnl Wireless extensions +dnl + +AC_ARG_ENABLE([wlan], + AC_HELP_STRING([--enable-wlan], [enable if you want wireless support @<:@default=no@:>@]), + [want_wlan="$enableval"], [want_wlan=no]) +# +AM_CONDITIONAL(BUILD_RSS, test x$want_wlan = xyes) +if test x$want_wlan = xyes; then + LIBS="$LIBS -liw" + AC_DEFINE(HAVE_IWLIB, 1, [Define if you want wireless support]) +fi + dnl dnl IMLIB2 dnl @@ -543,4 +557,5 @@ $PACKAGE $VERSION configured successfully: hddtemp: $want_hddtemp portmon: $want_portmon RSS: $want_rss + wireless: $want_wlan EOF diff --git a/src/conky.c b/src/conky.c index 876bc276..34a24b23 100644 --- a/src/conky.c +++ b/src/conky.c @@ -1001,6 +1001,13 @@ enum text_object_type { OBJ_pb_battery, OBJ_voltage_mv, OBJ_voltage_v, + OBJ_wireless_essid, + OBJ_wireless_mode, + OBJ_wireless_bitrate, + OBJ_wireless_link_qual, + OBJ_wireless_link_qual_max, + OBJ_wireless_link_bar, + OBJ_wireless_ap, #endif /* __linux__ */ OBJ_if_empty, OBJ_if_existing, @@ -2165,6 +2172,46 @@ static struct text_object *construct_text_object(const char *s, const char *arg, obj->data.cpu_index=atoi(&arg[0]); } obj->a = 1; + +#ifdef HAVE_IWLIB + END OBJ(wireless_essid, INFO_NET) + if(arg) + obj->data.net = get_net_stat(arg); + else + CRIT_ERR("wireless_essid: needs an argument"); + END OBJ(wireless_mode, INFO_NET) + if(arg) + obj->data.net = get_net_stat(arg); + else + CRIT_ERR("wireless_mode: needs an argument"); + END OBJ(wireless_ap, INFO_NET) + if(arg) + obj->data.net = get_net_stat(arg); + else + CRIT_ERR("wireless_ap: needs an argument"); + END OBJ(wireless_bitrate, INFO_NET) + if(arg) + obj->data.net = get_net_stat(arg); + else + CRIT_ERR("wireless_bitrate: needs an argument"); + END OBJ(wireless_link_qual, INFO_NET) + if(arg) + obj->data.net = get_net_stat(arg); + else + CRIT_ERR("wireless_link_qual: needs an argument"); + END OBJ(wireless_link_qual_max, INFO_NET) + if(arg) + obj->data.net = get_net_stat(arg); + else + CRIT_ERR("wireless_link_qual_max: needs an argument"); + END OBJ(wireless_link_bar, INFO_NET) + if(arg) { + arg = scan_bar(arg, &obj->a, &obj->b); + obj->data.net = get_net_stat(arg); + } else + CRIT_ERR("wireless_link_bar: needs an argument"); +#endif /* HAVE_IWLIB */ + #endif /* __linux__ */ END OBJ(freq_dyn, 0); END OBJ(freq_dyn_g, 0); @@ -3482,6 +3529,30 @@ static void generate_text_internal(char *p, int p_max_size, struct text_object * obj->a = get_voltage(p, p_max_size, "%'.3f", 1000, obj->data.cpu_index); } } +#ifdef HAVE_IWLIB + OBJ(wireless_essid) { + snprintf(p, p_max_size, "%s", obj->data.net->essid); + } + OBJ(wireless_mode) { + snprintf(p, p_max_size, "%s", obj->data.net->mode); + } + OBJ(wireless_bitrate) { + snprintf(p, p_max_size, "%s", obj->data.net->bitrate); + } + OBJ(wireless_ap) { + snprintf(p, p_max_size, "%s", obj->data.net->ap); + } + OBJ(wireless_link_qual) { + snprintf(p, p_max_size, "%d", obj->data.net->link_qual); + } + OBJ(wireless_link_qual_max) { + snprintf(p, p_max_size, "%d", obj->data.net->link_qual_max); + } + OBJ(wireless_link_bar) { + new_bar(p, obj->a, obj->b, ((double)obj->data.net->link_qual/obj->data.net->link_qual_max)*255.0); + } +#endif /* HAVE_IWLIB */ + #endif /* __linux__ */ OBJ(freq_dyn) { diff --git a/src/conky.h b/src/conky.h index ddaca569..d941121d 100644 --- a/src/conky.h +++ b/src/conky.h @@ -101,6 +101,13 @@ struct net_stat { struct sockaddr addr; int linkstatus; double net_rec[15], net_trans[15]; + // wireless extensions + char essid[32]; + char bitrate[16]; + char mode[16]; + char ap[18]; + int link_qual; + int link_qual_max; }; unsigned int diskio_value; diff --git a/src/linux.c b/src/linux.c index e440a26b..acb7f662 100644 --- a/src/linux.c +++ b/src/linux.c @@ -32,6 +32,10 @@ #include #include +#ifdef HAVE_IWLIB +#include +#endif + #define SHORTSTAT_TEMPL "%*s %llu %llu %llu" #define LONGSTAT_TEMPL "%*s %llu %llu %llu " @@ -154,6 +158,13 @@ inline void update_net_stats() char buf[256]; double delta; +#ifdef HAVE_IWLIB + // wireless info variables + int skfd, has_bitrate = 0, link_qual = 0, link_qual_max = 0; + struct wireless_info *winfo; + struct iwreq wrq; +#endif + /* get delta */ delta = current_update_time - last_update_time; if (delta <= 0.0001) @@ -264,6 +275,57 @@ inline void update_net_stats() } } +#ifdef HAVE_IWLIB + /* update wireless info */ + winfo = malloc(sizeof(struct wireless_info)); + memset(winfo, 0, sizeof(struct wireless_info)); + + skfd = iw_sockets_open(); + if(iw_get_basic_config(skfd, s, &(winfo->b)) > -1) { + + // set present winfo variables + if(iw_get_stats(skfd, s, &(winfo->stats), &winfo->range, winfo->has_range) >= 0) + winfo->has_stats = 1; + if(iw_get_range_info(skfd, s, &(winfo->range)) >= 0) + winfo->has_range = 1; + if(iw_get_ext(skfd, s, SIOCGIWAP, &wrq) >= 0) { + winfo->has_ap_addr = 1; + memcpy(&(winfo->ap_addr), &(wrq.u.ap_addr), sizeof (sockaddr)); + } + + // get bitrate + if(iw_get_ext(skfd, s, SIOCGIWRATE, &wrq) >= 0) { + memcpy(&(winfo->bitrate), &(wrq.u.bitrate), sizeof(iwparam)); + iw_print_bitrate(ns->bitrate, 16, winfo->bitrate.value); + has_bitrate = 1; + } + + // get link quality + if(winfo->has_range && winfo->has_stats && ((winfo->stats.qual.level != 0) || (winfo->stats.qual.updated & IW_QUAL_DBM))) { + if(!(winfo->stats.qual.updated & IW_QUAL_QUAL_INVALID)) { + ns->link_qual = winfo->stats.qual.qual; + ns->link_qual_max = winfo->range.max_qual.qual; + } + } + + // get ap mac + if(winfo->has_ap_addr) { + iw_sawap_ntop(&winfo->ap_addr, ns->ap); + } + + // get essid + if(winfo->b.has_essid) { + if(winfo->b.essid_on) + snprintf(ns->essid, 32, "%s", winfo->b.essid); + else + snprintf(ns->essid, 32, "off/any"); + } + + snprintf(ns->mode, 16, "%s", iw_operation_mode[winfo->b.mode]); + } + iw_sockets_close(skfd); + free(winfo); +#endif } fclose(net_dev_fp); @@ -314,7 +376,6 @@ inline void update_wifi_stats() sscanf(p, "%*d %d. %d. %d", &l, &m, &n); ns->linkstatus = (int) (log(MIN(MAX(l,1),92)) / log(92) * 100); - } /*** end wireless patch ***/ diff --git a/src/prss.c b/src/prss.c index 66c8114f..6a375312 100644 --- a/src/prss.c +++ b/src/prss.c @@ -15,6 +15,8 @@ * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */ +#ifdef RSS + #include #include #include @@ -213,3 +215,5 @@ PRSS* prss_parse_doc(xmlDocPtr doc) free(result); return NULL; } + +#endif diff --git a/src/rss.c b/src/rss.c index 8edb0ba7..191f09a5 100644 --- a/src/rss.c +++ b/src/rss.c @@ -6,6 +6,8 @@ * new rss.c written by hifi (Toni Spets) */ +#ifdef RSS + #include #include #include @@ -154,3 +156,5 @@ get_rss_info(char *uri, int delay) return curdata; } + +#endif