aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorRafael G. Martins <rafael@rafaelmartins.eng.br>2016-04-27 01:30:12 +0200
committerRafael G. Martins <rafael@rafaelmartins.eng.br>2016-04-27 01:30:12 +0200
commit25c2e03228e00f577fac4a52079c601010df4f15 (patch)
tree7ac888aa635be14d39e93aa6688dd816b9d4a723
parent9b2a563b4931ca39cd6dd14bf85cda627714a4b2 (diff)
downloadblogc-25c2e03228e00f577fac4a52079c601010df4f15.tar.gz
blogc-25c2e03228e00f577fac4a52079c601010df4f15.tar.bz2
blogc-25c2e03228e00f577fac4a52079c601010df4f15.zip
Revert "main: loader: use file utils from squareball"
This reverts commit c7b4bc4d64a3ce669e54b7c7dae87527d9ee3123.
-rw-r--r--configure.ac2
-rw-r--r--src/file.c26
-rw-r--r--src/main.c52
3 files changed, 62 insertions, 18 deletions
diff --git a/configure.ac b/configure.ac
index 16f141f..0bc1e19 100644
--- a/configure.ac
+++ b/configure.ac
@@ -119,7 +119,7 @@ AS_IF([test "x$have_cmocka" = "xyes"], , [
])
AM_CONDITIONAL([USE_CMOCKA], [test "x$have_cmocka" = "xyes"])
-AC_CHECK_HEADERS([sys/types.h sys/stat.h time.h libgen.h])
+AC_CHECK_HEADERS([sys/types.h sys/stat.h time.h])
LT_LIB_M
diff --git a/src/file.c b/src/file.c
index a12fbc2..972f433 100644
--- a/src/file.c
+++ b/src/file.c
@@ -10,8 +10,10 @@
#include <config.h>
#endif /* HAVE_CONFIG_H */
+#include <errno.h>
#include <stdarg.h>
#include <stdio.h>
+#include <string.h>
#include <squareball.h>
#include "file.h"
#include "error.h"
@@ -23,7 +25,29 @@
char*
blogc_file_get_contents(const char *path, size_t *len, sb_error_t **err)
{
- return sb_file_get_contents(path, len, err);
+ if (path == NULL || err == NULL || *err != NULL)
+ return NULL;
+
+ *len = 0;
+ FILE *fp = fopen(path, "r");
+
+ if (fp == NULL) {
+ int tmp_errno = errno;
+ *err = sb_error_new_printf(BLOGC_ERROR_LOADER,
+ "Failed to open file (%s): %s", path, strerror(tmp_errno));
+ return NULL;
+ }
+
+ sb_string_t *str = sb_string_new();
+ char buffer[BLOGC_FILE_CHUNK_SIZE];
+
+ while (!feof(fp)) {
+ size_t read_len = fread(buffer, sizeof(char), BLOGC_FILE_CHUNK_SIZE, fp);
+ *len += read_len;
+ sb_string_append_len(str, buffer, read_len);
+ }
+ fclose(fp);
+ return sb_string_free(str, false);
}
diff --git a/src/main.c b/src/main.c
index 1f5c76c..709b37e 100644
--- a/src/main.c
+++ b/src/main.c
@@ -18,10 +18,6 @@
#include <sys/types.h>
#endif /* HAVE_SYS_TYPES_H */
-#ifdef HAVE_LIBGEN_H
-#include <libgen.h>
-#endif /* HAVE_LIBGEN_H */
-
#include <errno.h>
#include <locale.h>
#include <stdbool.h>
@@ -72,6 +68,41 @@ blogc_print_usage(void)
}
+static void
+blogc_mkdir_recursive(const char *filename)
+{
+ char *fname = sb_strdup(filename);
+ for (char *tmp = fname; *tmp != '\0'; tmp++) {
+ if (*tmp != '/' && *tmp != '\\')
+ continue;
+#if defined(HAVE_SYS_STAT_H) && defined(HAVE_SYS_TYPES_H)
+ char bkp = *tmp;
+ *tmp = '\0';
+ if ((strlen(fname) > 0) &&
+#if defined(WIN32) || defined(_WIN32)
+ (-1 == mkdir(fname)) &&
+#else
+ (-1 == mkdir(fname, 0777)) &&
+#endif
+ (errno != EEXIST))
+ {
+ fprintf(stderr, "blogc: error: failed to create output "
+ "directory (%s): %s\n", fname, strerror(errno));
+ free(fname);
+ exit(2);
+ }
+ *tmp = bkp;
+#else
+ // FIXME: show this warning only if actually trying to create a directory.
+ fprintf(stderr, "blogc: warning: can't create output directories "
+ "for your platform. please create the directories yourself.\n");
+ break;
+#endif
+ }
+ free(fname);
+}
+
+
int
main(int argc, char **argv)
{
@@ -221,18 +252,7 @@ main(int argc, char **argv)
FILE *fp = stdout;
if (!write_to_stdout) {
-
-#ifdef HAVE_LIBGEN_H
- char *_output = sb_strdup(output);
- sb_mkdir_recursive(dirname(_output), &err);
- free(_output);
- if (err != NULL) {
- blogc_error_print(err);
- rv = 2;
- goto cleanup4;
- }
-#endif
-
+ blogc_mkdir_recursive(output);
fp = fopen(output, "w");
if (fp == NULL) {
fprintf(stderr, "blogc: error: failed to open output file (%s): %s\n",