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