add hoodselector respondd c file #789
This commit is contained in:
parent
16d7eafdf3
commit
9a32ecb0d7
119
package/ffnw-hoodselector/src/respondd.c
Normal file
119
package/ffnw-hoodselector/src/respondd.c
Normal file
@ -0,0 +1,119 @@
|
||||
#include <respondd.h>
|
||||
#include <json-c/json.h>
|
||||
#include <libgluonutil.h>
|
||||
#include <uci.h>
|
||||
#include <string.h>
|
||||
#include <net/if.h>
|
||||
|
||||
#define _STRINGIFY(s) #s
|
||||
#define STRINGIFY(s) _STRINGIFY(s)
|
||||
|
||||
bool strstw(const char *pre, const char *str) {
|
||||
size_t lenpre = strlen(pre);
|
||||
return strlen(str) < lenpre ? false : strncmp(pre, str, lenpre) == 0;
|
||||
}
|
||||
|
||||
bool strrmbs(char *line, int begin, int end) { // <- ist es hier sinvoller pointer auf die ints zu setzen??
|
||||
size_t len = strlen(line);
|
||||
if (len < begin)
|
||||
return false;
|
||||
|
||||
memmove(line, line+begin, len - begin + 1);
|
||||
if (len < end)
|
||||
return false;
|
||||
|
||||
line[len-end] = 0; //remove val of end characters on the end
|
||||
return true;
|
||||
}
|
||||
|
||||
// extract hood informations
|
||||
static struct json_object * get_hoodselector(void) {
|
||||
FILE *f = fopen("/tmp/.hoodselector", "r");
|
||||
if (!f)
|
||||
return NULL;
|
||||
|
||||
struct json_object *ret = json_object_new_object();
|
||||
char *line = NULL;
|
||||
size_t len = 0;
|
||||
while (getline(&line, &len, f) >= 0) {
|
||||
//1. Get md5 hash from current selected hood.
|
||||
if (strstw("\"md5hash\": ",line)) {
|
||||
if (!strrmbs(line, 12, 14))
|
||||
continue;
|
||||
|
||||
json_object_object_add(ret, "md5hash", gluonutil_wrap_string(line));
|
||||
}
|
||||
//2. Get true or false string for VPN Router.
|
||||
if (strstw("\"vpnrouter\": ",line)) {
|
||||
if (!strrmbs(line, 14, 16))
|
||||
continue;
|
||||
|
||||
json_object_object_add(ret, "vpnrouter", gluonutil_wrap_string(line));
|
||||
}
|
||||
//3. Get hoodname
|
||||
if (strstw("\"hoodname\": ",line)) {
|
||||
if (!strrmbs(line, 13, 15))
|
||||
continue;
|
||||
|
||||
json_object_object_add(ret, "hoodname", gluonutil_wrap_string(line));
|
||||
}
|
||||
}
|
||||
free(line);
|
||||
fclose(f);
|
||||
return ret;
|
||||
}
|
||||
|
||||
//Get currend selected BSSID
|
||||
static struct json_object * get_current_selected_bssid(void){
|
||||
struct uci_context *ctx = uci_alloc_context();
|
||||
ctx->flags &= ~UCI_FLAG_STRICT;
|
||||
struct uci_package *p;
|
||||
|
||||
if (uci_load(ctx, "wireless", &p))
|
||||
goto end;
|
||||
|
||||
struct uci_element *e;
|
||||
uci_foreach_element(&p->sections, e) {
|
||||
struct uci_section *s = uci_to_section(e);
|
||||
if (strcmp(s->type, "wifi-iface"))
|
||||
continue;
|
||||
|
||||
if (strncmp(e->name, "ibss_", 5))
|
||||
continue;
|
||||
|
||||
const char *bssid = uci_lookup_option_string(ctx, s, "bssid");
|
||||
if (!bssid)
|
||||
continue;
|
||||
|
||||
struct json_object *ret = json_object_new_object();
|
||||
json_object_object_add(ret, "bssid", gluonutil_wrap_string(bssid));
|
||||
free(bssid);
|
||||
uci_free_context(ctx);
|
||||
return ret;
|
||||
}
|
||||
end:
|
||||
uci_free_context(ctx);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
|
||||
// create final obj with logical structure
|
||||
static struct json_object * respondd_provider_hoodselector(void) {
|
||||
struct json_object *ret = json_object_new_object();
|
||||
|
||||
struct json_object *hoodinfo = get_hoodselector();
|
||||
if(hoodinfo)
|
||||
json_object_object_add(ret, "hoodinfo", hoodinfo);
|
||||
|
||||
struct json_object *selectedbssid = get_current_selected_bssid();
|
||||
if(selectedbssid)
|
||||
json_object_object_add(ret, "selectedbssid", selectedbssid);
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
// related to respondd_provider_hoodselector
|
||||
const struct respondd_provider_info respondd_providers[] = {
|
||||
{"hoodselector", respondd_provider_hoodselector},
|
||||
{}
|
||||
};
|
Loading…
Reference in New Issue
Block a user