[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[PATCH 03/16] file indexing, stat, hash map tree insert
[Thread Prev] | [Thread Next]
- Subject: [PATCH 03/16] file indexing, stat, hash map tree insert
- From: arf20 <arf20@xxxxxxxxx>
- Reply-to: development@xxxxxxxxx
- Date: Tue, 9 Dec 2025 00:00:07 +0100
- To: development@xxxxxxxxx
- Cc: arf20 <aruizfernandez05@xxxxxxxxx>
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
From: arf20 <aruizfernandez05@xxxxxxxxx>
---
Makefile | 4 +-
README.md | 2 +-
config.c | 11 +++-
config.h | 1 +
index.c | 181 +++++++++++++++++++++++++++++++++++++++++++++++++++++
index.h | 51 +++++++++++++++
main.c | 9 +++
search | Bin 29760 -> 35488 bytes
search.cfg | 2 +
9 files changed, 257 insertions(+), 4 deletions(-)
create mode 100644 index.c
create mode 100644 index.h
diff --git a/Makefile b/Makefile
index aba1197..2f28169 100644
--- a/Makefile
+++ b/Makefile
@@ -1,9 +1,9 @@
CC = gcc
CFLAGS = -g -Wall -pedantic
-LDFLAGS = -lmicrohttpd
+LDFLAGS = -lmicrohttpd -lmagic
BIN = search
-SRC = main.c config.c
+SRC = main.c config.c index.c
$(BIN): $(SRC)
$(CC) -o $@ $(CFLAGS) $^ $(LDFLAGS)
diff --git a/README.md b/README.md
index 9a7cc16..bc7838c 100644
--- a/README.md
+++ b/README.md
@@ -22,7 +22,7 @@ ARFNET Fast file index and search
## Building
-Depends on libmicrohttpd
+Depends on libmicrohttpd, libmagic
```
make
diff --git a/config.c b/config.c
index 1235a6b..bc9eed6 100644
--- a/config.c
+++ b/config.c
@@ -28,7 +28,7 @@
#include <errno.h>
unsigned short port = 0;
-char *tmpl_path = NULL;
+char *tmpl_path = NULL, *root = NULL;
int
config_load(const char *conf_path)
@@ -71,6 +71,10 @@ config_load(const char *conf_path)
value[strlen(value) - 1] = '\0';
tmpl_path = strdup(value);
printf("\ttemplate: %s\n", tmpl_path);
+ } else if (strcmp(line, "root") == 0) {
+ value[strlen(value) - 1] = '\0';
+ root = strdup(value);
+ printf("\troot: %s\n", root);
} else {
fprintf(stderr, "[config] unknown key: %s\n", line);
continue;
@@ -89,6 +93,11 @@ config_load(const char *conf_path)
tmpl_path = DEFAULT_TMPL_PATH;
}
+ if (!root) {
+ fprintf(stderr, "[config] E: no root given\n");
+ return -1;
+ }
+
return 0;
}
diff --git a/config.h b/config.h
index 07f2df5..16e1ca5 100644
--- a/config.h
+++ b/config.h
@@ -23,6 +23,7 @@
#define BUFF_SIZE 65535
#define INIT_VEC_CAPACITY 256
+#define INIT_MAP_CAPACITY 1024 /* index directory initial size */
#define CONFIG_PATH "search.cfg"
#define DEFAULT_PORT 8888
diff --git a/index.c b/index.c
new file mode 100644
index 0000000..c4ea178
--- /dev/null
+++ b/index.c
@@ -0,0 +1,181 @@
+/*
+
+ arfnet2-search: Fast file indexer and search
+ Copyright (C) 2023 arf20 (Ã?ngel Ruiz Fernandez)
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation, either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see <https://www.gnu.org/licenses/>.
+
+ index.c: Efficient fast file index
+
+*/
+
+#include "index.h"
+
+#include <sys/types.h>
+#include <dirent.h>
+#include <errno.h>
+#include <string.h>
+#include <stdlib.h>
+#include <stdio.h>
+
+#include <magic.h>
+
+
+typedef struct map_s {
+ struct node_s *map;
+ size_t size, capacity;
+} map_t;
+
+struct node_s {
+ node_data_t *data;
+ struct node_s *next;
+ map_t *child;
+};
+
+
+static magic_t magic_cookie = NULL;
+
+
+size_t
+hash(const char *s, int mod)
+{
+ size_t hash = 0;
+ if (!s)
+ return 0;
+ while (*s)
+ hash = hash * 31 + *s++;
+ return hash % mod;
+}
+
+map_t *
+map_new(size_t icapacity)
+{
+ map_t *map = malloc(sizeof(map_t));
+
+ map->map = malloc(sizeof(struct node_s) * icapacity);
+ memset(map->map, 0, sizeof(struct node_s) * icapacity);
+ map->capacity = icapacity;
+ map->size = 0;
+ return map;
+}
+
+void
+map_insert(map_t *map, const char *key, node_data_t *data, map_t *child)
+{
+ struct node_s *node = &map->map[hash(key, map->capacity)];
+
+ if (node->data) {
+ for (; node->next; node = node->next);
+
+ node->next = malloc(sizeof(struct node_s));
+ node->next->data = data;
+ node->next->child = child;
+ node->next->next = NULL;
+ } else {
+ node->data = data;
+ node->child = child;
+ }
+}
+
+int
+index_init()
+{
+ magic_cookie = magic_open(MAGIC_MIME);
+ if (!magic_cookie) {
+ fprintf(stderr, "[index] error magic_open()\n");
+ return -1;
+ }
+ if (magic_load(magic_cookie, NULL) < 0) {
+ fprintf(stderr, "[index] error magic_load(): %s\n",
+ magic_error(magic_cookie));
+ return -1;
+ }
+ return 0;
+}
+
+void
+index_deinit()
+{
+ magic_close(magic_cookie);
+}
+
+map_t *
+index_new(size_t icapacity, const char *dir, int examine)
+{
+ DIR *dirp = opendir(dir);
+ if (!dirp) {
+ fprintf(stderr, "[index] error opening directory %s: %s\n", dir,
+ strerror(errno));
+ return NULL;
+ }
+
+ map_t *map = map_new(icapacity);
+
+ char path[4096];
+ struct dirent *de = NULL;
+ while ((de = readdir(dirp))) {
+ if (de->d_name[0] == '.') {
+ if (de->d_name[1] == '\0')
+ continue;
+ else if (de->d_name[1] == '.')
+ if (de->d_name[2] == '\0')
+ continue;
+ }
+
+ snprintf(path, 4096, "%s/%s", dir, de->d_name);
+
+ /* stat it */
+ node_data_t *data = malloc(sizeof(node_data_t));
+ data->name = strdup(de->d_name);
+ if (stat(path, &data->stat) < 0) {
+ fprintf(stderr, "[index] error stat() %s: %s\n", path,
+ strerror(errno));
+ free(data);
+ data = NULL;
+ }
+
+ /* examine */
+ if (examine) {
+ data->mime = magic_file(magic_cookie, path);
+ if (!data->mime)
+ fprintf(stderr, "[index] error magic_file() %s: %s\n", path,
+ magic_error(magic_cookie));
+ }
+
+ /* recurse */
+ map_t *child = NULL;
+ if (de->d_type == DT_DIR) {
+ index_new(icapacity, path);
+ }
+
+ map_insert(map, de->d_name, data, child);
+ }
+
+ return map;
+}
+
+int
+index_lookup(index_t index, lookup_type_t type, const char *query,
+ const node_data_t **results)
+{
+
+}
+
+void
+index_destroy(index_t index)
+{
+
+}
+
+
diff --git a/index.h b/index.h
new file mode 100644
index 0000000..7ae54c9
--- /dev/null
+++ b/index.h
@@ -0,0 +1,51 @@
+/*
+
+ arfnet2-search: Fast file indexer and search
+ Copyright (C) 2023 arf20 (Ã?ngel Ruiz Fernandez)
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation, either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see <https://www.gnu.org/licenses/>.
+
+ index.c: Efficient fast file index
+
+*/
+
+#ifndef _INDEX_H
+#define _INDEX_H
+
+#include <sys/stat.h>
+#include <stddef.h>
+
+typedef enum {
+ LOOKUP_SUBSTR,
+ LOOKUP_SUBSTR_NOCASE,
+ LOOKUP_REGEX
+} lookup_type_t;
+
+typedef struct {
+ char *name;
+ struct stat stat;
+ const char *mime;
+} node_data_t;
+
+typedef struct map_s *index_t;
+
+int index_init();
+void index_deinit();
+index_t index_new(size_t icapacity, const char *root);
+int index_lookup(index_t index, lookup_type_t type, const char *query,
+ const node_data_t **results);
+void index_destroy(index_t index);
+
+#endif /* _INDEX_H */
+
diff --git a/main.c b/main.c
index 2de3c9b..e4924d8 100644
--- a/main.c
+++ b/main.c
@@ -35,6 +35,7 @@
#include <microhttpd.h>
#include "config.h"
+#include "index.h"
static char *index_format_template = NULL;
@@ -119,6 +120,14 @@ int main() {
return 1;
}
+ /* begin indexing */
+ if (index_init() < 0)
+ return 1;
+
+ index_t index = index_new(INIT_MAP_CAPACITY, root);
+
+ printf("[index] indexed\n");
+
while (1) {
sleep(1000);
}
diff --git a/search b/search
index 4fd2bdff4ab48d70f3377b4056968516b6466a92..0b5001eefabf5da80a22090c9065c1d5e2e34e66 100755
GIT binary patch
literal 35488
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
fb-(`>6>j}c%0Ddw|5*-fxZZCRRbZmr8npfovGjgR
delta 9250
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
diff --git a/search.cfg b/search.cfg
index bb7e8ef..b8110dd 100644
--- a/search.cfg
+++ b/search.cfg
@@ -6,4 +6,6 @@ port=8888
# html template path
template=index.htm.tmpl
+# root
+root=/home/arf20/projects/arfminesweeper
--
2.47.3
| [arfnet2-search PATCH 00/16] Pre-release deployment | arf20 <arf20@xxxxxxxxx> |