5 Commits

Author SHA1 Message Date
4d8fd7b98e still not making any progress 2025-07-21 22:39:42 +02:00
c776501adc new unix socket stuff
I can't get logfiles to work though
2025-07-19 23:47:34 +02:00
e0274fb6d5 add some TODOs 2025-06-30 22:30:06 +02:00
9d6fa83a43 sort generated file 2025-06-05 22:27:11 +02:00
31dc467165 setup daemon 2025-06-01 22:40:56 +02:00
5 changed files with 226 additions and 56 deletions

View File

@@ -6,6 +6,9 @@ hdb:
gcc -ansi -O2 -pipe -o build/hdb src/main.c src/db.c -lsqlite3
strip build/hdb
hdbd: src/db.c src/hdbd.c
gcc -ansi -o build/hdbd src/hdbd.c src/db.c -lsqlite3 -lstrops
.PHONY: install uninstall
install: hdb

View File

@@ -6,7 +6,7 @@
sqlite3 *db;
int db_open(const char *db_name) {
int h_db_open(const char *db_name) {
int ret;
char *err_msg;
@@ -18,7 +18,7 @@ int db_open(const char *db_name) {
ret = sqlite3_open(db_name, &db);
if (ret != SQLITE_OK) {
fprintf(stderr, "%s\n", sqlite3_errmsg(db));
db_close();
h_db_close();
return 1;
}
@@ -27,14 +27,14 @@ int db_open(const char *db_name) {
if (ret != SQLITE_OK) {
fprintf(stderr, "SQL error: %s\n", err_msg);
sqlite3_free(err_msg);
db_close();
h_db_close();
return 1;
}
return 0;
}
void db_close() {
void h_db_close() {
sqlite3_close(db);
}
@@ -158,7 +158,7 @@ char* get_artist_from_url(const char *url, const char *website_name) {
return artist_name;
}
int db_add(char *db_row, const char *url) {
int h_db_add(char *db_row, const char *url) {
char *sql = malloc(10000);
int result;
char *error_msg;
@@ -186,7 +186,7 @@ int db_add(char *db_row, const char *url) {
return 0;
}
int db_add_custom_name(char *db_row, const char *url, const char *custom_name) {
int h_db_add_custom_name(char *db_row, const char *url, const char *custom_name) {
char *sql = malloc(10000);
int result;
char *error_msg;
@@ -208,12 +208,12 @@ int db_add_custom_name(char *db_row, const char *url, const char *custom_name) {
return 0;
}
int db_generate_file(FILE *fptr, const char *website_name) {
int h_db_generate_file(FILE *fptr, const char *website_name) {
char *sql = malloc(10000);
int result;
char *error_msg;
sprintf(sql, "SELECT * FROM hentai WHERE website_name = '%s';", website_name);
sprintf(sql, "SELECT * FROM hentai WHERE website_name = '%s' ORDER BY url ASC;", website_name);
result = sqlite3_exec(db, sql, fprintf_callback, fptr, &error_msg);
free(sql);
if (result != SQLITE_OK) {
@@ -224,7 +224,7 @@ int db_generate_file(FILE *fptr, const char *website_name) {
return 0;
}
int db_update_artist_name(const char *url, const char *new_artist_name) {
int h_db_update_artist_name(const char *url, const char *new_artist_name) {
char *sql = malloc(10000);
int result;
char *error_msg;
@@ -240,7 +240,7 @@ int db_update_artist_name(const char *url, const char *new_artist_name) {
return 0;
}
int db_delete(const char *url) {
int h_db_delete(const char *url) {
char *sql = malloc(10000);
int result;
char *error_msg;

View File

@@ -3,12 +3,12 @@
#include <stdio.h>
int db_open(const char *db_name);
void db_close();
int db_add(char *db_row, const char *url);
int db_add_custom_name(char *db_row, const char *url, const char *artist_name);
int db_generate_file(FILE *fptr, const char *website_name);
int db_update_artist_name(const char *url, const char *new_artist_name);
int db_delete(const char *url);
int h_db_open(const char *db_name);
void h_db_close();
int h_db_add(char *db_row, const char *url);
int h_db_add_custom_name(char *db_row, const char *url, const char *artist_name);
int h_db_generate_file(FILE *fptr, const char *website_name);
int h_db_update_artist_name(const char *url, const char *new_artist_name);
int h_db_delete(const char *url);
#endif /* HENTAI_DB_H */

109
src/hdbd.c Normal file
View File

@@ -0,0 +1,109 @@
#include <strops.h>
#include <stdio.h>
#include <sys/types.h>
#include <unistd.h>
#include <string.h>
#include <sys/socket.h>
#include <sys/un.h>
pid_t pid, sid;
int server_sock;
struct sockaddr_un server;
int sockaddr_len;
int main() {
/*
Setup daemon
Used this for basic idea => https://en.wikipedia.org/wiki/Daemon_(computing)
*/
pid = fork();
if (pid == -1) {
fprintf(stderr, "Couldn't fork\n");
return 1;
} else if (pid != 0) {
printf("Pid of child is %d\n", pid);
return 0;
}
sid = setsid();
if (sid == -1) {
return 1;
}
if (chdir("/") == -1) {
return 1;
}
close(STDIN_FILENO);
close(STDOUT_FILENO);
close(STDERR_FILENO);
FILE *out_log;
FILE *err_log;
/* TODO: switch to mode 'a' later */
out_log = fopen("/tmp/out_log.txt", "w");
err_log = fopen("/tmp/err_log.txt", "w");
if (out_log == NULL || err_log == NULL) {
return 1;
}
fprintf(err_log, "Hello, World!\n");
/* Setup Unix Socket */
server_sock = socket(AF_UNIX, SOCK_STREAM, 0);
if (server_sock == -1) {
return 1;
}
server.sun_family = AF_UNIX;
strcpy(server.sun_path, "/tmp/test_sock");
unlink(server.sun_path);
sockaddr_len = strlen(server.sun_path) + sizeof(server.sun_family);
if (bind(server_sock, (struct sockaddr*)&server, sockaddr_len) == -1) {
return 1;
}
if (listen(server_sock, 3) == -1) {
return 1;
}
fprintf(out_log, "Listening on %s\n", server.sun_path);
/* Actual program */
int client_sock;
int data_length = 0;
char receive_buf[1000];
char send_buf[1000];
memset(receive_buf, 0, sizeof receive_buf);
memset(send_buf, 0, sizeof send_buf);
while(1) {
client_sock = accept(server_sock, NULL, NULL);
if (client_sock == -1) {
return 1;
}
data_length = recv(client_sock, receive_buf, sizeof receive_buf, 0);
if (data_length <= 0) {
strcpy(send_buf, "Failed to receive any data.");
send(client_sock, send_buf, strlen(send_buf), 0);
close(client_sock);
continue;
}
if (strstr(send_buf, "shutdown") != NULL) {
strcpy(send_buf, "Shutting down.");
send(client_sock, send_buf, strlen(send_buf), 0);
close(client_sock);
break;
}
close(client_sock);
}
fclose(out_log);
fclose(err_log);
close(server_sock);
return 0;
}

View File

@@ -19,7 +19,7 @@ typedef struct {
char *yt_dlp_conf;
} Config;
int config_parser(Config *config) {
int h_config_parser(Config *config) {
char *config_location = malloc(10000);
char *user_name = getenv("USER");
if (user_name == NULL) {
@@ -78,7 +78,54 @@ int config_parser(Config *config) {
return 0;
}
int download(char *line, Config config) {
int h_has_internet() {
int ret;
/* https://www.man7.org/linux/man-pages/man3/getaddrinfo.3.html */
struct addrinfo hints;
memset(&hints, 0, sizeof(hints));
hints.ai_family = AF_INET;
hints.ai_socktype = SOCK_STREAM;
hints.ai_flags = 0;
hints.ai_protocol = 0;
struct addrinfo *res, *rp;
ret = getaddrinfo("hopeless-cloud.xyz", "80", 0, &res);
if (ret != 0) {
return 1;
}
int sockfd;
for (rp = res; rp != NULL; rp = rp->ai_next) {
/* https://www.man7.org/linux/man-pages/man2/socket.2.html */
sockfd = socket(rp->ai_family, rp->ai_socktype, rp->ai_protocol);
if (sockfd == -1) { continue; }
/* https://www.man7.org/linux/man-pages/man2/connect.2.html */
if (connect(sockfd, rp->ai_addr, rp->ai_addrlen) == 0) { break; }
close(sockfd);
}
freeaddrinfo(res);
if (rp == NULL) {
return 1;
}
/* https://www.man7.org/linux/man-pages/man2/write.2.html */
char *req_msg = "GET / HTTP/1.1\r\n\r\n";
if (write(sockfd, req_msg, strlen(req_msg)) != strlen(req_msg)) {
return 1;
}
/* https://www.man7.org/linux/man-pages/man2/recv.2.html */
size_t count = 1000000;
char buf[count];
if (recv(sockfd, buf, count-1, MSG_WAITALL) == -1 ) {
return 1;
}
close(sockfd);
return 0;
}
int h_download(char *line, Config config) {
int ret;
char *url = malloc(strlen(line));
char *artist_name = malloc(strlen(line));
@@ -87,8 +134,8 @@ int download(char *line, Config config) {
char *args[7];
char *tmp = malloc(10000);
if (strstr(website_name, "Iwara") != NULL) {
sprintf(tmp, "%s/%s/%s/%%(id)s.%%(ext)s", config.data_dir, artist_name, website_name);
args[0] = "yt-dlp";
sprintf(tmp, "%s/%s/%s/%(id)s.%(ext)s", config.data_dir, artist_name, website_name);
args[0] = "yt-dlp_linux";
args[1] = "--config-locations";
args[2] = config.yt_dlp_conf;
args[3] = "-o";
@@ -106,28 +153,39 @@ int download(char *line, Config config) {
args[6] = NULL;
printf("Starting download using %s\n", args[0]);
/* Keep for later debugging or logging
size_t j;
for (j = 0; args[j] != NULL; j++) {
printf("args[%d] = %s\n", j, args[j]);
}
*/
size_t i;
for (i = 5; i > 0; i--) {
/* Keep for later debugging or logging
size_t j;
for (j = 0; args[j] != NULL; j++) {
printf("args[%d] = %s\n", j, args[j]);
}
*/
pid_t pid = fork();
pid_t pid = fork();
if (pid == -1) {
printf("Couldn't fork'\n");
return 1;
} else if (pid > 0) {
waitpid(pid, &ret, 0);
} else {
execvp(args[0], args);
}
if (pid == -1) {
printf("Couldn't fork'\n");
return 1;
} else if (pid > 0) {
waitpid(pid, &ret, 0);
} else {
execvp(args[0], args);
}
if (ret == 0) {
break;
}
if (ret != 0) {
fprintf(stderr, "Command exited with non-zero code. code = %d\n", ret);
}
/* TODO: move contents of h_has_internet here */
ret = h_has_internet();
if (ret != 0) {
fprintf(stderr, "No internet\n");
return 1;
}
}
free(url);
free(artist_name);
free(website_name);
@@ -140,7 +198,7 @@ int main(int argc, char **argv) {
Config config = { 0 };
config.tmp_dir = "/tmp/HDB";
ret = config_parser(&config);
ret = h_config_parser(&config);
if (ret != 0) {
fprintf(stderr, "Failed to parse config\n");
return 1;
@@ -156,7 +214,7 @@ int main(int argc, char **argv) {
return 1;
}
ret = open("HDB.db");
ret = h_db_open("HDB.db");
if (ret != 0) {
return 1;
}
@@ -166,35 +224,35 @@ int main(int argc, char **argv) {
memset(db_row, 0, strlen(argv[2]));
if (argc == 3) {
ret = db_add(db_row, argv[2]);
ret = h_db_add(db_row, argv[2]);
if (ret != 0) {
db_close();
h_db_close();
return 1;
}
} else if (argc == 4) {
ret = db_add_custom_name(db_row, argv[2], argv[3]);
ret = h_db_add_custom_name(db_row, argv[2], argv[3]);
if (ret != 0) {
db_close();
h_db_close();
return 1;
}
} else {
db_close();
h_db_close();
fprintf(stderr, "Incorrect amount of arguments\n");
return 1;
}
printf("Successfully added to DB\n");
ret = download(db_row, config);
ret = h_download(db_row, config);
free(db_row);
if (ret != 0) {
printf("Failed download\n");
db_close();
h_db_close();
return 1;
}
printf("Succesfully downladed\n");
} else if (strcmp(argv[1], "download_website") == 0) {
if (argc != 3) {
fprintf(stderr, "Incorrect amount of arguments\n");
db_close();
h_db_close();
return 1;
}
char *file_name = malloc(10000);
@@ -202,30 +260,30 @@ int main(int argc, char **argv) {
FILE *fptr = fopen(file_name, "w+");
if (fptr == NULL) {
fprintf(stderr, "Couldn't open file '%s'\n", file_name);
db_close();
h_db_close();
return 1;
}
ret = db_generate_file(fptr, argv[2]);
ret = h_db_generate_file(fptr, argv[2]);
fclose(fptr);
if (ret != 0) {
db_close();
h_db_close();
return 1;
}
fptr = fopen(file_name, "r");
if (fptr == NULL) {
fprintf(stderr, "Couldn't open file '%s'\n", file_name);
db_close();
h_db_close();
return 1;
}
char *line = malloc(10000);
printf("Ready to download\n");
while(fgets(line, 10000, fptr) != NULL) {
ret = download(line, config);
ret = h_download(line, config);
if (ret != 0) {
fclose(fptr);
db_close();
h_db_close();
return 1;
}
}
@@ -235,10 +293,10 @@ int main(int argc, char **argv) {
free(file_name);
} else {
fprintf(stderr, "Invalid argument\n");
db_close();
h_db_close();
return 1;
}
db_close();
h_db_close();
return 0;
}