diff --git a/dfs.c b/dfs.c
index b580cb54d7a23de8e0d1e629ed6d571a04677696..fafd1830a7ccb9b6e2b86db6b811ec76ccbcb62e 100644
--- a/dfs.c
+++ b/dfs.c
@@ -1,62 +1,59 @@
#include "dfs.h"
-void stack_enqueue(struct node *n, struct list_head *stack)
+void enqueue(struct directory *dr, struct list_head *stack)
{
if (list_empty(stack))
INIT_LIST_HEAD(stack);
- list_add(&n->list, stack);
+ list_add(&dr->list, stack);
}
-struct node *stack_dequeue(struct list_head *stack)
+struct directory *dequeue(struct list_head *stack)
{
- struct node *n;
+ struct directory *dr;
if (list_empty(stack))
return NULL;
- n = list_first_entry(stack, struct node, list);
- list_del(&n->list);
+ dr = list_first_entry(stack, struct directory, list);
+ list_del(&dr->list);
- return n;
+ return dr;
}
-void add_visited(struct node *n, struct list_head *visited)
+bool search(char *path, struct list_head *visited)
{
- if (list_empty(visited))
- INIT_LIST_HEAD(visited);
- list_add(&n->list, visited);
-}
-
-bool is_visited(char *path, struct list_head *visited) // just visited
-{
- struct node *tmp;
+ struct directory *dr;
- list_for_each_entry(tmp, visited, list) {
- if (strncmp(tmp->path, path, 1024) == 0)
+ list_for_each_entry(dr, visited, list) {
+ if (strncmp(dr->path, path, 1024) == 0)
return true;
}
return false;
}
-void clear_list(struct list_head *visited)
+void clear_list(struct list_head *list)
{
- struct node *n, *tmp;
+ struct directory *dr, *tmp;
+ print_list_dfs(list);
+
+ if (list_empty(list))
+ return;
- list_for_each_entry_safe(n, tmp, visited, list) {
- free(n->path);
- list_del(&n->list);
- free(n);
+ list_for_each_entry_safe(dr, tmp, list, list) {
+ free(dr->path);
+ list_del(&dr->list);
+ free(dr);
}
}
-void print_list_dfs(struct list_head *collection_of_nodes_and_stuff)
+void print_list_dfs(struct list_head *list)
{
- struct node *n;
+ struct directory *dr;
- if (list_empty(collection_of_nodes_and_stuff))
+ if (list_empty(list))
return;
- list_for_each_entry(n, collection_of_nodes_and_stuff, list) {
- printf("path: %s\n", n->path);
+ list_for_each_entry(dr, list, list) {
+ printf("path: %s\n", dr->path);
}
}
\ No newline at end of file
diff --git a/dfs.h b/dfs.h
index f6d72c7a6e91169e986c0f38c8c43109cf13786c..e37636fc725b5c4ca2018b5c1fc77cccb68dbc12 100644
--- a/dfs.h
+++ b/dfs.h
@@ -2,16 +2,14 @@
#define DFS_H
#include "common.h"
-struct node {
+struct directory {
struct list_head list;
- char path[PATH_MAX]; //inefficient space complexity with defined memory allocation?
- char *name;
+ char *path;
};
-void stack_enqueue(struct node *n, struct list_head *stack);
-struct node *stack_dequeue(struct list_head *stack);
-void add_visited(struct node *n, struct list_head *visited);
-bool is_visited(char *path, struct list_head *visited);
+void enqueue(struct directory *n, struct list_head *stack);
+struct directory *dequeue(struct list_head *stack);
+bool search(char *path, struct list_head *visited);
void clear_list(struct list_head *visited);
void print_list_dfs(struct list_head *collection_of_nodes_and_stuff);
#endif
\ No newline at end of file
diff --git a/dongle_infrastructure.c b/dongle_infrastructure.c
index e882fa931adbdaeeeade2932211c49796d026573..1992d63c89f0cb39f461557b2b21d46954116b9b 100644
--- a/dongle_infrastructure.c
+++ b/dongle_infrastructure.c
@@ -219,34 +219,39 @@ fail:
return NULL;
}
-char *dfs_get_path_name(char *folder_name)
+char *get_device_name(char *dir_name)
{
- char *path, *name, new_path[PATH_MAX];
- struct stat st;
+ char *path, *name, tmp_path[PATH_MAX];
+ struct directory *dr, *sub_dr;
struct dirent *de;
- DIR *dr;
- struct node *n, *new_n;
+ struct stat st;
+ int path_len;
+ DIR *dir;
- n = malloc(sizeof(struct node));
- snprintf(n->path, PATH_MAX, "%s", folder_name); //remain allocated?
- stack_enqueue(n, &stack);
+ dr = malloc(sizeof(struct directory));
+ if (!dr) {
+ perror("malloc");
+ goto fail;
+ }
+ dr->path = strdup(dir_name);
+ //snprintf(dr->path, PATH_MAX, "%s", dir_name); //remain allocated?
+ enqueue(dr, &stack);
while (!list_empty(&stack)) {
- n = stack_dequeue(&stack);
- path = n->path;
- dr = opendir(path);
- if (!dr) {
+ dr = dequeue(&stack);
+ dir = opendir(dr->path);
+ if (!dir) {
perror("opendir");
goto fail_opendir;
}
- if (!is_visited(path, &visited)) {
- add_visited(n, &visited);
- while ((de = readdir(dr)) != NULL) {
+ if (!search(dr->path, &visited)) {
+ enqueue(dr, &visited);
+ while ((de = readdir(dir)) != NULL) {
if (strcmp(de->d_name, ".") == 0 || strcmp(de->d_name, "..") == 0)
continue;
- if (fstatat(dirfd(dr), de->d_name, &st, AT_SYMLINK_NOFOLLOW) < 0) {
+ if (fstatat(dirfd(dir), de->d_name, &st, AT_SYMLINK_NOFOLLOW) < 0) {
perror("fstatat");
continue;
}
@@ -255,39 +260,61 @@ char *dfs_get_path_name(char *folder_name)
continue;
if (!strstr(de->d_name, "eth") && !strstr(de->d_name, "usb")) {
- snprintf(new_path, PATH_MAX, "%s/%s", path, de->d_name);
- if (!is_visited(new_path, &visited)) {
- new_n = malloc(sizeof(struct node));
- strncpy(new_n->path, new_path, (PATH_MAX-1));
- //new_n->path= strdup(path);
- stack_enqueue(new_n, &stack);
+ path_len = strlen(dr->path) + strlen(de->d_name)+2;
+ path = calloc(path_len, 1);
+ if (!path) {
+ perror("calloc");
+ goto fail_calloc;
}
+
+ snprintf(path, PATH_MAX, "%s%s/", dr->path, de->d_name);
+ if (!search(path, &visited)) {
+ sub_dr = malloc(sizeof(struct directory));
+ if (!sub_dr) {
+ perror("malloc");
+ goto fail_dir;
+ }
+ sub_dr->path = path;
+ enqueue(sub_dr, &stack);
+ } else
+ free(path);
continue;
}
- if (strcmp(reverse_lexer(&path, '/'), "net") == 0) {
+ if (strstr(dr->path, "net")) {
printf("de->d_name %s\n", de->d_name);
name = strdup(de->d_name);
goto success;
}
}
}
- closedir(dr);
+ closedir(dir);
}
+fail_dir:
+ //free(path);
+fail_calloc:
clear_list(&visited);
fail_opendir:
+ //clear_list(&stack);
+fail:
return NULL;
success:
- closedir(dr);
+ printf("name %s\n", name);
+ clear_list(&visited);
+ printf("name %s\n", name);
+ clear_list(&stack);
+ printf("name %s\n", name);
+ closedir(dir);
return name;
}
char *get_interface_name(char *usb_path, char *sub_dir_name)
{
- char path[PATH_MAX], *name;
+ char path[PATH_MAX];
snprintf(path, PATH_MAX, "%s/%s/", usb_path, sub_dir_name);
- return dfs_get_path_name(path);
+
+ return get_device_name(path);
}
int get_devices(void)
@@ -317,6 +344,7 @@ int get_devices(void)
continue;
}
name = get_interface_name(usb_path, de->d_name);
+ printf("returned name %s!\n", name);
if (!name)
continue;