aboutsummaryrefslogtreecommitdiff
path: root/src/files.c
diff options
context:
space:
mode:
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;
+}