aboutsummaryrefslogtreecommitdiff
path: root/src/files.c
diff options
context:
space:
mode:
authordacctal <donotcontactmevia@email.invalid>2026-08-17 13:31:42 +0000
committerdacctal <donotcontactmevia@email.invalid>2026-08-17 13:31:42 +0000
commit7db56ed3f9d1fcb8b6780b7c30ad93904625a0a3 (patch)
tree91c6e60d239c89ce29ea23b1dd9b8fcf66ce16d7 /src/files.c
parent536b651f4086fe01d0bd1f743f54ef650524b122 (diff)
fundamentals are working and beautiful
Diffstat (limited to 'src/files.c')
-rw-r--r--src/files.c52
1 files changed, 49 insertions, 3 deletions
diff --git a/src/files.c b/src/files.c
index 5eaa459..67a327a 100644
--- a/src/files.c
+++ b/src/files.c
@@ -4,8 +4,7 @@
Copyright (C) 2026 dacctal
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 2 of the License, or
+ it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 2 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
@@ -18,9 +17,18 @@
*/
+#define _XOPEN_SOURCE 500
+#include <stdio.h>
+#include <ftw.h>
+#include <unistd.h>
+
#include <stdbool.h>
#include <sys/stat.h>
+#include "log.h"
+#include "state.h"
+#include "str.h"
+
bool file_exists(const char *path) {
struct stat buffer;
return (stat(path, &buffer) == 0);
@@ -30,4 +38,42 @@ bool is_directory(const char *path) {
struct stat statbuf;
if (stat(path, &statbuf) != 0) return false;
return S_ISDIR(statbuf.st_mode);
-} \ No newline at end of file
+}
+
+bool file_write(str *content, str *path) {
+ FILE *fileptr = fopen(path->data, "a");
+ str_write_to_file(content, fileptr);
+ fclose(fileptr);
+ if (!file_exists(path->data)) {
+// if (!flags.quiet) log_error(
+// "could not write file: '%.*s'", str_fmt(path));
+ return false;
+ }
+ return true;
+}
+
+str file_read(str *path) {
+ if (!file_exists(path->data)) {
+// if (!flags.quiet) log_error(
+// "could not open file: '%.*s'", str_fmt(path));
+ return str_new();
+ }
+ FILE *fileptr = fopen(path->data, "r");
+ str content = str_read_entire_file(fileptr);
+ fclose(fileptr);
+ return content;
+}
+
+static int unlink_cb(const char *fpath, const struct stat *sb,
+int typeflag, struct FTW *ftwbuf) {
+ (void)sb;
+ (void)typeflag;
+ (void)ftwbuf;
+ int rv = remove(fpath);
+ if (rv) perror(fpath);
+ return rv;
+}
+
+bool rmrf(str *path) {
+ return nftw(path->data, unlink_cb, 64, FTW_DEPTH | FTW_PHYS) == 0;
+}