diff options
author | cflip <cflip@cflip.net> | 2023-05-27 12:08:00 -0600 |
---|---|---|
committer | cflip <cflip@cflip.net> | 2023-05-27 12:08:00 -0600 |
commit | beb8db73aadbd7d0464f1530ef86c961bc1aa2a0 (patch) | |
tree | f23f25ac01c23435a51c5b296240a918678ace51 /file.c | |
parent | b0f6f511e23117965e80c1c3516dee2402b81dc5 (diff) |
Split cfws.c into multiple files
Diffstat (limited to 'file.c')
-rw-r--r-- | file.c | 47 |
1 files changed, 47 insertions, 0 deletions
@@ -0,0 +1,47 @@ +#include "file.h" + +#include <errno.h> +#include <linux/limits.h> +#include <stdio.h> +#include <stdlib.h> +#include <string.h> +#include <sys/stat.h> +#include <unistd.h> + +size_t file_read(const char *uri_path, char **buffer) +{ + FILE *fp; + struct stat statbuf; + char path[PATH_MAX]; + long len; + + /* Prepend the current working directory to the uri path */ + getcwd(path, PATH_MAX); + strncat(path, uri_path, PATH_MAX - 1); + + /* Append 'index.html' to directory paths. */ + stat(path, &statbuf); + if (S_ISDIR(statbuf.st_mode)) + strcat(path, "index.html"); + + fp = fopen(path, "rb"); + if (fp == NULL) { + /* + * File not found is a very common and harmless error, so + * there's no need to print it out every time. + */ + if (errno != ENOENT) + perror("Failed to open file"); + return 0; + } + + fseek(fp, 0, SEEK_END); + len = ftell(fp); + fseek(fp, 0, SEEK_SET); + + *buffer = malloc(len); + fread(*buffer, 1, len, fp); + + fclose(fp); + return len; +} |