From e0352ad73b636bc48e79251035662298b3aad4ef Mon Sep 17 00:00:00 2001 From: AustrianToast Date: Thu, 25 Sep 2025 21:10:17 +0200 Subject: [PATCH] More code movement Client can also now talk to the daemon, though still very rough --- Makefile | 8 +-- src/db.c | 138 -------------------------------------- src/hdb.c | 189 ++++++++++++++++++++++++++++++++++++++++++----------- src/hdbd.c | 22 ++++++- 4 files changed, 175 insertions(+), 182 deletions(-) diff --git a/Makefile b/Makefile index c5aaa7e..ed9782d 100644 --- a/Makefile +++ b/Makefile @@ -1,10 +1,10 @@ .POSIX: -hdb: src/db.c src/hdb.c - gcc -ansi -O2 -pipe -o build/hdb src/hdb.c src/db.c -lsqlite3 +hdb: src/hdb.c + gcc -ansi -O2 -pipe -o build/hdb src/hdb.c strip build/hdb -hdbd: src/db.c src/hdbd.c - gcc -ansi -O2 -pipe -o build/hdbd src/hdbd.c src/db.c -lsqlite3 +hdbd: src/hdbd.c + gcc -ansi -O2 -pipe -o build/hdbd src/hdbd.c -lsqlite3 strip build/hdbd .PHONY: install uninstall diff --git a/src/db.c b/src/db.c index aeeeace..e5c52ba 100644 --- a/src/db.c +++ b/src/db.c @@ -1,43 +1,3 @@ -#include "db.h" -#include -#include -#include -#include - -sqlite3 *db; - -int h_db_open(const char *db_name) { - int ret; - char *err_msg; - - if (db != NULL) { - fprintf(stderr, "There is already a sqlite db open\n"); - return 1; - } - - ret = sqlite3_open(db_name, &db); - if (ret != SQLITE_OK) { - fprintf(stderr, "%s\n", sqlite3_errmsg(db)); - h_db_close(); - return 1; - } - - char *sql = "CREATE TABLE IF NOT EXISTS hentai (url TEXT PRIMARY KEY NOT NULL, artist_name TEXT NOT NULL, website_name TEXT NOT NULL) STRICT;"; - ret = sqlite3_exec(db, sql, NULL, 0, &err_msg); - if (ret != SQLITE_OK) { - fprintf(stderr, "SQL error: %s\n", err_msg); - sqlite3_free(err_msg); - h_db_close(); - return 1; - } - - return 0; -} - -void h_db_close() { - sqlite3_close(db); -} - static int fprintf_callback(void *fptr, int argc, char **argv, char **col_name) { if (fptr == NULL) { fprintf(stderr, "fptr is NULL\n"); @@ -60,104 +20,6 @@ static int db_row_callback(void *db_row, int argc, char **argv, char **col_name) return 0; } -char* get_website_from_url(const char *url) { - if (strstr(url, "rule34.xxx") != NULL) { - return "Rule34"; - } else if (strstr(url, "iwara.tv") != NULL) { - return "Iwara"; - } else { - return NULL; - } -} - -char* get_artist_from_url(const char *url, const char *website_name) { - size_t offset = 0; - if (strcmp(website_name, "Rule34") == 0) { - offset = 51; - } else if (strcmp(website_name, "Gelbooru") == 0) { - offset = 53; - } else if (strcmp(website_name, "ATF") == 0) { - offset = 42; - } else { - return NULL; - } - - size_t name_length = strlen(url) - offset; - size_t char_count = name_length; - char *tmp_name = malloc(name_length + 1); - memcpy(tmp_name, url + offset, name_length); - tmp_name[name_length] = '\0'; - - size_t i; - size_t j = 0; - for (i = 0; i < strlen(tmp_name); i++) { - if (tmp_name[i] == '%') { - char url_encoded[4]; - url_encoded[0] = tmp_name[i]; - url_encoded[1] = tmp_name[i + 1]; - url_encoded[2] = tmp_name[i + 2]; - url_encoded[3] = '\0'; - if (strstr("%20%21%22%23%24%26%27%28%29%2A%2C%2E%2F%3B%3C%3E%3F%5B%5C%5D%5E%60%7B%7C%7D%7E", url_encoded) != NULL) { - tmp_name[i] = ' '; - char_count -= 1; - } else if (strcmp(url_encoded, "%25") == 0) { - tmp_name[i] = '%'; - } else if (strcmp(url_encoded, "%2B") == 0) { - tmp_name[i] = '+'; - } else if (strcmp(url_encoded, "%2D") == 0) { - tmp_name[i] = '-'; - } else if (strcmp(url_encoded, "%2E") == 0) { - tmp_name[i] = '.'; - } else if (strcmp(url_encoded, "%2F") == 0) { - tmp_name[i] = '/'; - } else if (strcmp(url_encoded, "%3A") == 0) { - tmp_name[i] = ':'; - } else if (strcmp(url_encoded, "%3D") == 0) { - tmp_name[i] = '='; - } else if (strcmp(url_encoded, "%40") == 0) { - tmp_name[i] = '@'; - } else if (strcmp(url_encoded, "%5F") == 0) { - tmp_name[i] = '_'; - } else { - return NULL; - } - tmp_name[i += 1] = ' '; - tmp_name[i += 1] = ' '; - char_count -= 2; - } - } - - char *artist_name = malloc(char_count + 1); - memset(artist_name, 0, char_count + 1); - for (i = 0; i < name_length; i++) { - if (tmp_name[i] == ' ') { - continue; - } - artist_name[j] = tmp_name[i]; - j++; - } - artist_name[char_count] = '\0'; - - j = strlen(artist_name) - strlen("artist"); - if (strcmp(artist_name + j, "artist") == 0) { - for (; j < strlen(artist_name); j++) { - artist_name[j] = '\0'; - } - } - - j = strlen(artist_name) - 1; - while (artist_name[j] == '_') { - artist_name[j] = '\0'; - j--; - } - - if (strlen(artist_name) < 2) { - return NULL; - } - - return artist_name; -} - int h_db_add(char *db_row, const char *url) { char *sql = malloc(10000); int result; diff --git a/src/hdb.c b/src/hdb.c index 58c62d5..267caa0 100644 --- a/src/hdb.c +++ b/src/hdb.c @@ -1,63 +1,176 @@ -#define _POSIX_C_SOURCE 200112L /* needed for struct addrinfo */ - -#include "db.h" #include #include #include #include -#include -#include -#include #include -#include +#include #include - - int main(int argc, char **argv) { int ret; + int client_sock; + struct sockaddr_un remote; + int sock_len; + int data_length; + char send_buf[1000] = {0}; + char receive_buf[1000] = {0}; if (argc < 2) { fprintf(stderr, "Incorrect amount of arguments\n"); return 1; } - ret = h_db_open("HDB.db"); - if (ret != 0) { + client_sock = socket(AF_UNIX, SOCK_STREAM, 0); + if (client_sock == -1) { + perror("Failed to init socket"); return 1; } - if (strcmp(argv[1], "add") == 0) { - char *db_row = malloc(strlen(argv[2]) * 2); - memset(db_row, 0, strlen(argv[2])); + remote.sun_family = AF_UNIX; + strcpy(remote.sun_path, "/tmp/test_sock"); + sock_len = strlen(remote.sun_path) + sizeof(remote.sun_family); - if (argc == 3) { - ret = h_db_add(db_row, argv[2]); - if (ret != 0) { - h_db_close(); - return 1; - } - } else if (argc == 4) { - ret = h_db_add_custom_name(db_row, argv[2], argv[3]); - if (ret != 0) { - h_db_close(); + if (connect(client_sock, (struct sockaddr*)&remote, sock_len) == -1) { + perror("Failed to connect to socket"); + return 1; + } + printf("Connected to daemon.\n"); + + /* hdb add https://example.com optional_custom_name */ + if (strcmp(argv[1], "add") == 0) { + char website_name[1000] = {0}; + char artist_name[1000] = {0}; + + if (argc < 3) { + fprintf(stderr, "Incorrect amount of arguments\n"); + close(client_sock); + return 1; + } + + /* Get website name from url */ + if (strstr(argv[2], "rule34.xxx") != NULL) { + strcpy(website_name, "Rule34"); + } else if (strstr(argv[2], "iwara.tv") != NULL) { + strcpy(website_name, "Iwara"); + } else { + fprintf(stderr, "url not supported.\n"); + close(client_sock); + return 1; + } + + if (argc == 3) { /* Get artist_name from url */ + /* TODO: Refactor */ + size_t offset = 0; + if (strcmp(website_name, "Rule34") == 0) { + offset = 51; + } else if (strcmp(website_name, "Gelbooru") == 0) { + offset = 53; + } else if (strcmp(website_name, "ATF") == 0) { + offset = 42; + } else { + fprintf(stderr, "Cannot get artist name from url.\n"); + close(client_sock); return 1; } - } else { - h_db_close(); - fprintf(stderr, "Incorrect amount of arguments\n"); + + size_t name_length = strlen(argv[2]) - offset; + size_t char_count = name_length; + char *tmp_name = malloc(name_length + 1); + memcpy(tmp_name, argv[2] + offset, name_length); + tmp_name[name_length] = '\0'; + + size_t i; + size_t j = 0; + for (i = 0; i < strlen(tmp_name); i++) { + if (tmp_name[i] == '%') { + char url_encoded[4]; + url_encoded[0] = tmp_name[i]; + url_encoded[1] = tmp_name[i + 1]; + url_encoded[2] = tmp_name[i + 2]; + url_encoded[3] = '\0'; + if (strstr("%20%21%22%23%24%26%27%28%29%2A%2C%2E%2F%3B%3C%3E%3F%5B%5C%5D%5E%60%7B%7C%7D%7E", url_encoded) != NULL) { + tmp_name[i] = ' '; + char_count -= 1; + } else if (strcmp(url_encoded, "%25") == 0) { + tmp_name[i] = '%'; + } else if (strcmp(url_encoded, "%2B") == 0) { + tmp_name[i] = '+'; + } else if (strcmp(url_encoded, "%2D") == 0) { + tmp_name[i] = '-'; + } else if (strcmp(url_encoded, "%2E") == 0) { + tmp_name[i] = '.'; + } else if (strcmp(url_encoded, "%2F") == 0) { + tmp_name[i] = '/'; + } else if (strcmp(url_encoded, "%3A") == 0) { + tmp_name[i] = ':'; + } else if (strcmp(url_encoded, "%3D") == 0) { + tmp_name[i] = '='; + } else if (strcmp(url_encoded, "%40") == 0) { + tmp_name[i] = '@'; + } else if (strcmp(url_encoded, "%5F") == 0) { + tmp_name[i] = '_'; + } else { + printf("I don't know why this exists."); + close(client_sock); + return 1; + } + tmp_name[i += 1] = ' '; + tmp_name[i += 1] = ' '; + char_count -= 2; + } + } + + char *artist_name = malloc(char_count + 1); + memset(artist_name, 0, char_count + 1); + for (i = 0; i < name_length; i++) { + if (tmp_name[i] == ' ') { + continue; + } + artist_name[j] = tmp_name[i]; + j++; + } + artist_name[char_count] = '\0'; + + j = strlen(artist_name) - strlen("artist"); + if (strcmp(artist_name + j, "artist") == 0) { + for (; j < strlen(artist_name); j++) { + artist_name[j] = '\0'; + } + } + + j = strlen(artist_name) - 1; + while (artist_name[j] == '_') { + artist_name[j] = '\0'; + j--; + } + + if (strlen(artist_name) < 2) { + fprintf(stderr, "Artist name unusable after cleanup. Result: '%s'\n", artist_name); + close(client_sock); + return 1; + } + + sprintf(send_buf, "add %s %s %s", argv[2], website_name, artist_name); + + } else if (argc > 3) { /* artist_name provided */ + sprintf(send_buf, "add %s %s %s", argv[2], website_name, argv[3]); + } + + if (write(client_sock, send_buf, strlen(send_buf)) == -1) { + perror("Failed to write to socket"); + close(client_sock); return 1; } - printf("Successfully added to DB\n"); - ret = h_download(db_row, config); - free(db_row); - if (ret != 0) { - printf("Failed download\n"); - h_db_close(); + + data_length = read(client_sock, receive_buf, sizeof receive_buf); + if (data_length <= 0) { + fprintf(stderr, "Received no response from daemon.\n"); + close(client_sock); return 1; } - printf("Succesfully downladed\n"); - } else if (strcmp(argv[1], "download_website") == 0) { + printf("Response from daemon: %s\n", data_length, receive_buf); + + } /*else if (strcmp(argv[1], "download_website") == 0) { if (argc != 3) { fprintf(stderr, "Incorrect amount of arguments\n"); h_db_close(); @@ -99,12 +212,12 @@ int main(int argc, char **argv) { free(line); fclose(fptr); free(file_name); - } else { + }*/ else { fprintf(stderr, "Invalid argument\n"); - h_db_close(); + close(client_sock); return 1; } - h_db_close(); + close(client_sock); return 0; } diff --git a/src/hdbd.c b/src/hdbd.c index 327ffab..b253301 100644 --- a/src/hdbd.c +++ b/src/hdbd.c @@ -8,6 +8,7 @@ #include #include #include +#include pid_t pid, sid; int server_sock; @@ -19,6 +20,8 @@ struct { char *gallery_dl_conf; char *yt_dlp_conf; } config; +sqlite3 *db; +char *sql_err; int config_parser() { char config_location[1000] = {0}; @@ -211,6 +214,23 @@ int main() { syslog(LOG_NOTICE, "Unix Socket up and running."); + /* Setup DB */ + if (sqlite3_open("/tmp/hdbd.db", &db) != SQLITE_OK) { + syslog(LOG_ERR, "Failed to open the db. Error: %s\nProceeding to shutdown", sqlite3_errmsg(db)); + sqlite3_close(db); + close(server_sock); + return 1; + } + + char *sql = "CREATE TABLE IF NOT EXISTS hentai (url TEXT PRIMARY KEY NOT NULL, artist_name TEXT NOT NULL, website_name TEXT NOT NULL) STRICT;"; + if (sqlite3_exec(db, sql, NULL, 0, &sql_err) != SQLITE_OK) { + syslog(LOG_ERR, "CREATE TABLE failed. Error: %s\nProceeding to shutdown", sql_err); + sqlite3_free(sql_err); + sqlite3_close(db); + close(server_sock); + return 1; + } + /* Actual program */ int client_sock; int data_length = 0; @@ -238,8 +258,6 @@ int main() { data_length = read(client_sock, receive_buf, sizeof receive_buf); if (data_length <= 0) { syslog(LOG_WARNING, "Received no data from client."); - strcpy(send_buf, "Failed to receive any data."); - send(client_sock, send_buf, strlen(send_buf), 0); close(client_sock); continue; }