More code movement
Client can also now talk to the daemon, though still very rough
This commit is contained in:
8
Makefile
8
Makefile
@@ -1,10 +1,10 @@
|
|||||||
.POSIX:
|
.POSIX:
|
||||||
hdb: src/db.c src/hdb.c
|
hdb: src/hdb.c
|
||||||
gcc -ansi -O2 -pipe -o build/hdb src/hdb.c src/db.c -lsqlite3
|
gcc -ansi -O2 -pipe -o build/hdb src/hdb.c
|
||||||
strip build/hdb
|
strip build/hdb
|
||||||
|
|
||||||
hdbd: src/db.c src/hdbd.c
|
hdbd: src/hdbd.c
|
||||||
gcc -ansi -O2 -pipe -o build/hdbd src/hdbd.c src/db.c -lsqlite3
|
gcc -ansi -O2 -pipe -o build/hdbd src/hdbd.c -lsqlite3
|
||||||
strip build/hdbd
|
strip build/hdbd
|
||||||
|
|
||||||
.PHONY: install uninstall
|
.PHONY: install uninstall
|
||||||
|
|||||||
138
src/db.c
138
src/db.c
@@ -1,43 +1,3 @@
|
|||||||
#include "db.h"
|
|
||||||
#include <stdio.h>
|
|
||||||
#include <stdlib.h>
|
|
||||||
#include <string.h>
|
|
||||||
#include <sqlite3.h>
|
|
||||||
|
|
||||||
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) {
|
static int fprintf_callback(void *fptr, int argc, char **argv, char **col_name) {
|
||||||
if (fptr == NULL) {
|
if (fptr == NULL) {
|
||||||
fprintf(stderr, "fptr is NULL\n");
|
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;
|
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) {
|
int h_db_add(char *db_row, const char *url) {
|
||||||
char *sql = malloc(10000);
|
char *sql = malloc(10000);
|
||||||
int result;
|
int result;
|
||||||
|
|||||||
189
src/hdb.c
189
src/hdb.c
@@ -1,63 +1,176 @@
|
|||||||
#define _POSIX_C_SOURCE 200112L /* needed for struct addrinfo */
|
|
||||||
|
|
||||||
#include "db.h"
|
|
||||||
#include <netdb.h>
|
#include <netdb.h>
|
||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
#include <unistd.h>
|
|
||||||
#include <sys/types.h>
|
|
||||||
#include <sys/wait.h>
|
|
||||||
#include <sys/socket.h>
|
#include <sys/socket.h>
|
||||||
#include <sys/stat.h>
|
#include <sys/un.h>
|
||||||
#include <errno.h>
|
#include <errno.h>
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
int main(int argc, char **argv) {
|
int main(int argc, char **argv) {
|
||||||
int ret;
|
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) {
|
if (argc < 2) {
|
||||||
fprintf(stderr, "Incorrect amount of arguments\n");
|
fprintf(stderr, "Incorrect amount of arguments\n");
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
ret = h_db_open("HDB.db");
|
client_sock = socket(AF_UNIX, SOCK_STREAM, 0);
|
||||||
if (ret != 0) {
|
if (client_sock == -1) {
|
||||||
|
perror("Failed to init socket");
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (strcmp(argv[1], "add") == 0) {
|
remote.sun_family = AF_UNIX;
|
||||||
char *db_row = malloc(strlen(argv[2]) * 2);
|
strcpy(remote.sun_path, "/tmp/test_sock");
|
||||||
memset(db_row, 0, strlen(argv[2]));
|
sock_len = strlen(remote.sun_path) + sizeof(remote.sun_family);
|
||||||
|
|
||||||
if (argc == 3) {
|
if (connect(client_sock, (struct sockaddr*)&remote, sock_len) == -1) {
|
||||||
ret = h_db_add(db_row, argv[2]);
|
perror("Failed to connect to socket");
|
||||||
if (ret != 0) {
|
return 1;
|
||||||
h_db_close();
|
}
|
||||||
return 1;
|
printf("Connected to daemon.\n");
|
||||||
}
|
|
||||||
} else if (argc == 4) {
|
/* hdb add https://example.com optional_custom_name */
|
||||||
ret = h_db_add_custom_name(db_row, argv[2], argv[3]);
|
if (strcmp(argv[1], "add") == 0) {
|
||||||
if (ret != 0) {
|
char website_name[1000] = {0};
|
||||||
h_db_close();
|
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;
|
return 1;
|
||||||
}
|
}
|
||||||
} else {
|
|
||||||
h_db_close();
|
size_t name_length = strlen(argv[2]) - offset;
|
||||||
fprintf(stderr, "Incorrect amount of arguments\n");
|
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;
|
return 1;
|
||||||
}
|
}
|
||||||
printf("Successfully added to DB\n");
|
|
||||||
ret = h_download(db_row, config);
|
data_length = read(client_sock, receive_buf, sizeof receive_buf);
|
||||||
free(db_row);
|
if (data_length <= 0) {
|
||||||
if (ret != 0) {
|
fprintf(stderr, "Received no response from daemon.\n");
|
||||||
printf("Failed download\n");
|
close(client_sock);
|
||||||
h_db_close();
|
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
printf("Succesfully downladed\n");
|
printf("Response from daemon: %s\n", data_length, receive_buf);
|
||||||
} else if (strcmp(argv[1], "download_website") == 0) {
|
|
||||||
|
} /*else if (strcmp(argv[1], "download_website") == 0) {
|
||||||
if (argc != 3) {
|
if (argc != 3) {
|
||||||
fprintf(stderr, "Incorrect amount of arguments\n");
|
fprintf(stderr, "Incorrect amount of arguments\n");
|
||||||
h_db_close();
|
h_db_close();
|
||||||
@@ -99,12 +212,12 @@ int main(int argc, char **argv) {
|
|||||||
free(line);
|
free(line);
|
||||||
fclose(fptr);
|
fclose(fptr);
|
||||||
free(file_name);
|
free(file_name);
|
||||||
} else {
|
}*/ else {
|
||||||
fprintf(stderr, "Invalid argument\n");
|
fprintf(stderr, "Invalid argument\n");
|
||||||
h_db_close();
|
close(client_sock);
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
h_db_close();
|
close(client_sock);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|||||||
22
src/hdbd.c
22
src/hdbd.c
@@ -8,6 +8,7 @@
|
|||||||
#include <sys/socket.h>
|
#include <sys/socket.h>
|
||||||
#include <sys/un.h>
|
#include <sys/un.h>
|
||||||
#include <syslog.h>
|
#include <syslog.h>
|
||||||
|
#include <sqlite3.h>
|
||||||
|
|
||||||
pid_t pid, sid;
|
pid_t pid, sid;
|
||||||
int server_sock;
|
int server_sock;
|
||||||
@@ -19,6 +20,8 @@ struct {
|
|||||||
char *gallery_dl_conf;
|
char *gallery_dl_conf;
|
||||||
char *yt_dlp_conf;
|
char *yt_dlp_conf;
|
||||||
} config;
|
} config;
|
||||||
|
sqlite3 *db;
|
||||||
|
char *sql_err;
|
||||||
|
|
||||||
int config_parser() {
|
int config_parser() {
|
||||||
char config_location[1000] = {0};
|
char config_location[1000] = {0};
|
||||||
@@ -211,6 +214,23 @@ int main() {
|
|||||||
|
|
||||||
syslog(LOG_NOTICE, "Unix Socket up and running.");
|
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 */
|
/* Actual program */
|
||||||
int client_sock;
|
int client_sock;
|
||||||
int data_length = 0;
|
int data_length = 0;
|
||||||
@@ -238,8 +258,6 @@ int main() {
|
|||||||
data_length = read(client_sock, receive_buf, sizeof receive_buf);
|
data_length = read(client_sock, receive_buf, sizeof receive_buf);
|
||||||
if (data_length <= 0) {
|
if (data_length <= 0) {
|
||||||
syslog(LOG_WARNING, "Received no data from client.");
|
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);
|
close(client_sock);
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user