From c1956bf5a8c68947466269dc826337ea7232899b Mon Sep 17 00:00:00 2001
From: Jakob Olsson <jakobols@kth.se>
Date: Mon, 4 Jun 2018 17:08:54 +0200
Subject: [PATCH] changes to dongle.c

---
 dongle.c                |  28 ++++-
 dongle.h                |  48 +++++++-
 dongle_infrastructure.c | 262 ----------------------------------------
 dongle_infrastructure.h |  15 +--
 4 files changed, 78 insertions(+), 275 deletions(-)

diff --git a/dongle.c b/dongle.c
index 43995bd..cabe268 100644
--- a/dongle.c
+++ b/dongle.c
@@ -1,7 +1,20 @@
 #include <getopt.h>
+#include <sys/types.h>
+#include <dirent.h>
+#include <sys/stat.h>
+#include <sys/types.h>
+#include <sys/socket.h>
+#include <sys/ioctl.h>
+#include <netinet/in.h>
+#include <net/if.h>
+#include <arpa/inet.h>
+#include <limits.h>
+#include <netdb.h>
+#include <ifaddrs.h>
 
 #include "common.h"
 #include "dongle_infrastructure.h"
+#include "dongle.h"
 
 
 struct ubus_context *global_ctx;
@@ -574,6 +587,19 @@ void init_ubus(void)
 	ubus_add_uloop(global_ctx);
 }
 
+int publish_object(struct ubus_context *ctx)
+{
+	int rv;
+
+	rv = ubus_add_object(ctx, &infrastructure_object);
+	if (rv) {
+		debug_print("failed to add dongle.pin to ubus!\n");
+		return -1;
+	}
+
+	return 0;
+}
+
 int main(int argc, char **argv)
 {
 	int rv;
@@ -587,7 +613,7 @@ int main(int argc, char **argv)
 	uloop_timeout_set(&timeout, 0);
 	uloop_timeout_add(&timeout);
 
-	rv = expose_infrastructure_object(global_ctx);
+	rv = publish_object(global_ctx);
 	if (rv < 0)
 		goto fail;
 	uloop_run();
diff --git a/dongle.h b/dongle.h
index 2fe217e..88e733d 100644
--- a/dongle.h
+++ b/dongle.h
@@ -1,6 +1,52 @@
 #ifndef DONGLE_H
 #define DONGLE_H
 
-void uloop_add_get_devices(struct uloop_timeout *t);
+struct USB {
+	char *product;
+	char *product_id;
+	char *vendor_id;
+	char *if_name;
+};
+
+struct device {
+	struct list_head list;
+	struct ubus_object *ubus_obj;
 
+	struct USB usb;
+	char *ip;
+	int missing; //counter
+	bool present;
+};
+
+void uloop_add_get_devices(struct uloop_timeout *t);
+int get_devices(void);
+int devices_status(struct uloop_timeout *t);
+int tag_missing_devices(void);
+int add_device(struct device *new_dev);
+int delete_all_devices(void);
+int delete_device_by_name(char *name);
+int delete_device(struct device *dev);
+void free_device(struct device *dev);
+void free_usb(struct USB *usb);
+struct device *search_list(char *name);
+char *lexer(char **input, char *delimiter);
+void remove_newline(char *input);
+char *get_usb_stat(char *path, char *dir, char *stat);
+char *get_device_name(char *dir_name);
+char *get_device_ip(char *device_name);
+int list_to_blob(void);
+int print_list(struct ubus_context *ctx, struct ubus_object *obj,
+			   struct ubus_request_data *req, const char *method,
+			   struct blob_attr *msg);
+int clear(struct ubus_context *ctx, struct ubus_object *obj,
+		  struct ubus_request_data *req, const char *method,
+		  struct blob_attr *msg);
+int test(struct ubus_context *ctx, struct ubus_object *obj,
+		 struct ubus_request_data *req, const char *method,
+		 struct blob_attr *msg);
+int remove_device(struct ubus_context *ctx, struct ubus_object *obj,
+				  struct ubus_request_data *req, const char *method,
+				  struct blob_attr *msg);
+void init_ubus(void);
+int publish_object(struct ubus_context *ctx);
 #endif
\ No newline at end of file
diff --git a/dongle_infrastructure.c b/dongle_infrastructure.c
index 7f0cc79..9ac7616 100644
--- a/dongle_infrastructure.c
+++ b/dongle_infrastructure.c
@@ -34,268 +34,6 @@ void free_device(struct device *dev);
 void free_usb(struct USB *usb);
 struct device *search_list(char *name);
 
-<<<<<<< HEAD
-
-const struct blobmsg_policy dev_policy[__DEV_MAX] = {
-	[DEV] = {.name = "dev", .type = BLOBMSG_TYPE_STRING},
-};
-
-LIST_HEAD(devices);
-LIST_HEAD(stack);
-LIST_HEAD(visited);
-
-int devices_status(struct uloop_timeout *t)
-{
-	get_devices();
-	tag_missing_devices();
-
-	uloop_add_get_devices(t);
-
-	return 0;
-}
-
-int tag_missing_devices(void)
-{
-	struct device *dev, *tmp;
-
-	list_for_each_entry_safe(dev, tmp, &devices, list) {
-		if (dev->present) {
-			dev->missing = 0;
-			dev->present = false;
-			continue;
-		}
-
-		dev->missing++;
-		if (dev->missing == 1)
-			delete_device(dev);
-	}
-
-	return 0;
-}
-
-int add_device(struct device *new_dev)
-{
-	struct device *dev;
-
-	dev = search_list(new_dev->usb.if_name);
-	if (dev) {
-		if (dev->ip)
-			free(dev->ip);
-		dev->ip = new_dev->ip;
-
-		dev->present = true;
-		goto already_present;
-	}
-
-	new_dev->present = true;
-	if (list_empty(&devices))
-		INIT_LIST_HEAD(&devices);
-
-	list_add_tail(&new_dev->list, &devices);
-	if (new_dev->ip) {
-		new_dev->ubus_obj = dongle_create_dynamic_object(new_dev);
-		if (new_dev->ubus_obj)
-			publish_ubus_object(global_ctx, new_dev->ubus_obj);
-	}
-
-	return 0;
-already_present:
-	return -1;
-}
-
-int delete_all_devices(void)
-{
-	struct device *dev, *tmp;
-
-	list_for_each_entry_safe(dev, tmp, &devices, list) {
-		delete_device(dev);
-	}
-
-	return 0;
-}
-
-int delete_device_by_name(char *name)
-{
-	struct device *dev, *tmp;
-
-	list_for_each_entry_safe(dev, tmp, &devices, list) {
-		if (strncmp(dev->usb.if_name, name, 128) != 0)
-			continue;
-
-		delete_device(dev);
-		return 0;
-	}
-
-	return -1;
-}
-
-int delete_device(struct device *dev)
-{
-	if (dev->ubus_obj)
-		unpublish_ubus_object(global_ctx, dev->ubus_obj);
-	// is it necessary to check if list contains this node?
-	list_del(&dev->list);
-	free_device(dev);
-	return 0;
-}
-
-void free_device(struct device *dev)
-{
-	if (!dev)
-		return;
-	free(dev->ip);
-	free(&(dev->usb));
-}
-
-void free_usb(struct USB *usb)
-{
-	if (!usb)
-		return;
-	free(usb->product);
-	free(usb->product_id);
-	free(usb->vendor_id);
-	free(usb->if_name);
-}
-
-struct device *search_list(char *name)
-{
-	struct device *dev;
-
-	list_for_each_entry(dev, &devices, list) {
-		if (strncmp(name, dev->usb.if_name, 128) == 0)
-			return dev;
-	}
-	return NULL;
-}
-
-char *lexer(char **input, char *delimiter)
-{
-	char *token, *substr;
-
-	if (strlen(*input) == 0) {
-		debug_print("empty input!\n");
-		return NULL;
-	} else if (strlen(delimiter) == 0) {
-		debug_print("empty delimiter!\n");
-		return NULL;
-	}
-
-	token = strstr(*input, delimiter);
-
-	if (token) {
-		*token = '\0';
-		substr = strdup(*input);
-		if (!substr) {
-			perror("strdup");
-			goto fail_strdup;
-		}
-
-		*input = token + strlen(delimiter);
-	} else {
-		substr = strdup(*input);
-		if (!substr) {
-			perror("strdup");
-			goto fail_strdup;
-		}
-
-		*input[0] = '\0';
-	}
-
-fail_strdup:
-	return substr;
-}
-
-void remove_newline(char *input)
-{
-	char *pos;
-
-	pos = strchr(input, '\n');
-	if (!pos)
-		return;
-
-	*pos = '\0';
-}
-
-char *get_usb_stat(char *path, char *dir, char *stat)
-{
-	char stat_path[PATH_MAX], contents[1024];
-	FILE *f;
-
-	snprintf(stat_path, PATH_MAX, "%s/%s/%s", path, dir, stat);
-	f = fopen(stat_path, "r");
-	if (!f) {
-		perror("fopen");
-		goto fail;
-	}
-
-	fgets(contents, 1024, f);
-	remove_newline(contents);
-	fclose(f);
-
-	return strdup(contents);
-fail:
-	return NULL;
-}
-
-char *get_device_name(char *dir_name)
-{
-	char path[PATH_MAX], *name = NULL;
-	struct directory *dr, *sub_dr;
-	struct dirent *de;
-	struct stat st;
-	DIR *dir;
-
-	dr = (struct directory *)malloc(sizeof(*dr));
-	if (!dr) {
-		perror("malloc");
-		goto fail_dr;
-	}
-
-	dr->path = strdup(dir_name);
-	if (!dr->path)
-		goto fail_path;
-
-	push(dr, &stack);
-
-	while (!list_empty(&stack) && !name) {
-		dr = pop(&stack);
-		dir = opendir(dr->path);
-		if (!dir)
-			continue;
-
-		push(dr, &visited);
-
-		while ((de = readdir(dir)) != NULL) {
-			if (strcmp(de->d_name, ".") == 0 || strcmp(de->d_name, "..") == 0)
-				continue;
-
-			if (fstatat(dirfd(dir), de->d_name, &st, AT_SYMLINK_NOFOLLOW) < 0) {
-				perror("fstatat");
-				continue;
-			}
-
-			if (!S_ISDIR(st.st_mode))
-				continue;
-
-			if (!strstr(dr->path, "net")) {
-				snprintf(path, PATH_MAX, "%s%s/", dr->path, de->d_name);
-
-				if (search(path, &visited))
-					continue;
-
-				sub_dr = (struct directory *)malloc(sizeof(*sub_dr));
-				if (!sub_dr) {
-					perror("malloc");
-					continue;
-				}
-
-				sub_dr->path = strdup(path);
-				if (!sub_dr->path) {
-					free(sub_dr);
-					continue;
-				}
-=======
->>>>>>> 7e47c50... refactor static dongle object from dongle_infrastructure to dongle.c
 
 
 
diff --git a/dongle_infrastructure.h b/dongle_infrastructure.h
index fc86897..4119b87 100644
--- a/dongle_infrastructure.h
+++ b/dongle_infrastructure.h
@@ -52,17 +52,10 @@ struct USB {
 	char *if_name;
 };
 
-struct device {
-	struct list_head list;
-	struct ubus_object *ubus_obj;
 
-	struct USB usb;
-	char *ip;
-	int missing; //counter
-	bool present;
-};
-
-int expose_infrastructure_object(struct ubus_context *ctx);
 int devices_status(struct uloop_timeout *t);
-
+struct ubus_object *dongle_create_dynamic_object(struct device *dev_instance);
+int publish_ubus_object(struct ubus_context *ctx, struct ubus_object *obj);
+int unpublish_ubus_object(struct ubus_context *ctx, struct ubus_object *obj);
+void dongle_destroy_dynamic_object(struct ubus_object *obj);
 #endif
-- 
GitLab