From 4c7d1ccf98c07e1ebfc515d4e2ec761c6310bfee Mon Sep 17 00:00:00 2001
From: Jakob Olsson <jakobols@kth.se>
Date: Wed, 23 May 2018 11:44:40 +0200
Subject: [PATCH] update to get ip address from router.net
---
Makefile | 10 +++----
common.c | 7 +++--
common.h | 5 ++--
dongle_network.c | 75 +++++++++++++++++++++++++++++++++++++++++++++++-
4 files changed, 86 insertions(+), 11 deletions(-)
diff --git a/Makefile b/Makefile
index c22bcf8..130aee8 100644
--- a/Makefile
+++ b/Makefile
@@ -1,6 +1,6 @@
CC = gcc
CFLAGS = -g -Wall
-LIBS = -ljson-c -lubox -lubus -lcurl -lmobile
+LIBS = -ljson-c -lubox -lubus -lcurl -lmobile -lblobmsg_json
all: libmobile1 libmobile2 common dongle_apn dongle_pin dongle_network dongle
@@ -22,20 +22,20 @@ common: ${COBJS}
DAOBJS = dongle_apn.o
DASRCS = dongle_apn.c
dongle_apn: ${DAOBJS}
- ${CC} -c ${CFLAGS} ${DASRCS} ${COBJS} -o ${DAOBJS} -L . ${LIBS} #${MOBJS}
+ ${CC} -c ${CFLAGS} ${DASRCS} ${COBJS} -o ${DAOBJS} -L . ${LIBS}
DPOBJS = dongle_pin.o
DPSRCS = dongle_pin.c
dongle_pin: ${DPOBJS}
- ${CC} -c ${CFLAGS} ${DPSRCS} ${COBJS} -o ${DPOBJS} -L . ${LIBS} #${MOBJS}
+ ${CC} -c ${CFLAGS} ${DPSRCS} ${COBJS} -o ${DPOBJS} -L . ${LIBS}
DNOBJS = dongle_network.o
DNSRCS = dongle_network.c
dongle_network: ${DNOBJS}
- ${CC} -c ${CFLAGS} ${DNSRCS} ${COBJS} -o ${DNOBJS} -L . ${LIBS} #${MOBJS}
+ ${CC} -c ${CFLAGS} ${DNSRCS} ${COBJS} -o ${DNOBJS} -L . ${LIBS}
dongle: dongle.o
- ${CC} ${CFLAGS} dongle.o ${COBJS} ${DNOBJS} ${DPOBJS} ${DAOBJS} -o dongle -L . ${LIBS} #${MOBJS}
+ ${CC} ${CFLAGS} dongle.o ${COBJS} ${DNOBJS} ${DPOBJS} ${DAOBJS} -o dongle -L . ${LIBS}
clean:
rm -f dongle_apn dongle_pin dongle_network *.o *.so
diff --git a/common.c b/common.c
index 466a5ed..fa21ec1 100644
--- a/common.c
+++ b/common.c
@@ -12,17 +12,18 @@ TODO:
1. Implement by invoking ubus
*/
-int get_ip(char *if_name)
+char *get_ip(char *if_name)
{
char response[1024] = {0};
+ size_t filesize;
+ int rv;
FILE *fp = popen("ubus call router.net ipv4_routes | grep -B 7 \"usb0\" | grep \"flag.*H\" -B 4 | grep destination | cut -d ' ' -f2 | cut -d '\"' -f2", "r");
fscanf(fp, "%s", response);
pclose(fp);
printf("%s\n", response);
-
- return 0;
+ return strdup(response);
}
int print_to_ubus(struct json_object *parsed_response, struct ubus_context *ctx, struct ubus_request_data *req)
diff --git a/common.h b/common.h
index 8ff9ef7..e403bcc 100644
--- a/common.h
+++ b/common.h
@@ -16,7 +16,8 @@
#include "libmobile.h"
#include <json-c/json.h>
#include <string.h>
-#include <libubox/blobmsg.h>
+//#include <libubox/blobmsg.h>
+#include <libubox/blobmsg_json.h>
#include <libubus.h>
extern int debug;
@@ -27,7 +28,7 @@ extern int debug;
fprintf(stderr, __VA_ARGS__); \
} while (0)
-int get_ip(char *if_name);
+char *get_ip(char *if_name);
/**
* Function: print_to_ubus
*
diff --git a/dongle_network.c b/dongle_network.c
index afd37ee..bb0ef25 100644
--- a/dongle_network.c
+++ b/dongle_network.c
@@ -1,5 +1,7 @@
#include "dongle_network.h"
+char *dongle_ip;
+
static enum {
IP,
DEV,
@@ -217,6 +219,76 @@ int test_get_ip(struct ubus_context *ctx, struct ubus_object *obj,
return 0;
}
+static void parse_devices(struct ubus_request *req, int type, struct blob_attr *msg)
+{
+ char *json_str, *flags, *ip;
+ struct json_object *json_msg, *routes, *route, *json_ip, *json_flags;
+ int i;
+
+ json_str = blobmsg_format_json(msg, true);
+ if (!json_str)
+ return;
+
+ json_msg = json_tokener_parse(json_str);
+
+ if (!json_msg)
+ goto out_str;
+
+ if (!json_object_is_type(json_msg, json_type_object))
+ goto out_json;
+
+ json_object_object_get_ex(json_msg, "routes", &routes);
+ if (!routes)
+ goto out_json;
+
+ for (i = 0; i < json_object_array_length(routes); i++) {
+ route = json_object_array_get_idx(routes, i);
+ json_object_object_get_ex(route, "flags", &json_flags);
+ flags = json_object_get_string(json_flags);
+ if (!strchr(flags, 'H'))
+ continue;
+
+ json_object_object_get_ex(route, "destination", &json_ip);
+ ip = json_object_get_string(json_ip);
+ goto out;
+ }
+ goto out_json;
+
+out:
+ dongle_ip = strdup(ip);
+out_json:
+ json_object_put(json_msg);
+out_str:
+ free(json_str);
+}
+
+int get_ip_invoke(struct ubus_context *ctx, struct ubus_object *obj,
+ struct ubus_request_data *req, const char *method,
+ struct blob_attr *msg)
+{
+ struct blob_buf buf;
+ int obj_id, rv;
+
+ memset(&buf, 0, sizeof(buf));
+
+ if (!ctx) {
+ debug_print("No ubus context!\n");
+ goto fail;
+ }
+
+ ubus_lookup_id(ctx, "router.net", &obj_id);
+ if (!obj_id) {
+ debug_print("%s: ubus_lookup_id error\n", __func__);
+ goto fail;
+ }
+
+ rv = ubus_invoke(ctx, obj_id, "ipv4_routes", NULL, parse_devices, NULL, 5000);
+ if (rv > 0)
+ printf("ubus_invoke error code %d\n", rv);
+fail:
+ return 0;
+}
+
struct ubus_method network_object_methods[] = {
UBUS_METHOD("signal_strength", get_signal_strength, ip_policy),
UBUS_METHOD("connect", connect_network, ip_policy),
@@ -225,7 +297,8 @@ struct ubus_method network_object_methods[] = {
UBUS_METHOD("enable_roaming", enable_roaming, ip_policy),
UBUS_METHOD("disable_roaming", disable_roaming, ip_policy),
UBUS_METHOD("roam_status", roam_status, ip_policy),
- UBUS_METHOD("get_ip", test_get_ip, ip_policy)
+ UBUS_METHOD("get_ip", test_get_ip, ip_policy),
+ UBUS_METHOD_NOARG("get_ip_invoke", get_ip_invoke)
};
struct ubus_object_type network_object_type = UBUS_OBJECT_TYPE("dongle", network_object_methods);
--
GitLab