summaryrefslogtreecommitdiff
path: root/file.c
diff options
context:
space:
mode:
Diffstat (limited to 'file.c')
-rw-r--r--file.c93
1 files changed, 47 insertions, 46 deletions
diff --git a/file.c b/file.c
index 98b5d50..b94c071 100644
--- a/file.c
+++ b/file.c
@@ -8,81 +8,82 @@
#include <sys/stat.h>
#include <unistd.h>
-int file_handle_request(struct http_request *req, int sockfd)
+const char *file_path_for_uri(const char *uri)
{
- if (strstr(req->uri, ".php") != 0) {
- return file_read_cgi(req->uri, sockfd);
- }
- return file_read(req->uri, sockfd);
-}
-
-int file_read(const char *uri_path, int sockfd)
-{
- /* TODO: Implement this again */
- return 1;
-
- FILE *fp;
struct stat statbuf;
char path[PATH_MAX];
- long len;
+ size_t result_len;
+ char *result;
- /* Prepend the current working directory to the uri path */
getcwd(path, PATH_MAX);
- strncat(path, uri_path, PATH_MAX - 1);
+ strncat(path, uri, PATH_MAX - 1);
- /* Append 'index.html' to directory paths. */
+ /* Append 'index.html' if this is a directory */
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;
+ /* Allocate a string with only the needed size */
+ result_len = strlen(path);
+ result = malloc(result_len + 1);
+ memcpy(result, path, result_len);
+ result[result_len] = '\0';
+ return result;
+}
+
+enum serve_method file_method_for_path(const char *filepath, enum http_res_code *code)
+{
+ if (access(filepath, F_OK) != 0) {
+ *code = HTTP_RESPONSE_NOTFOUND;
+ return SERVE_METHOD_ERROR;
}
- fseek(fp, 0, SEEK_END);
- len = ftell(fp);
- fseek(fp, 0, SEEK_SET);
+ *code = HTTP_RESPONSE_OK;
+ if (strstr(filepath, ".php") != 0)
+ return SERVE_METHOD_PHP;
+
+ return SERVE_METHOD_FILE;
+}
+
+int file_read(const char *filepath, int sockfd)
+{
+ FILE *fp;
+ char ch;
+
+ fp = fopen(filepath, "rb");
+ if (fp == NULL) {
+ perror("Failed to open file");
+ return 1;
+ }
- /*buffer = malloc(len);*/
- /*fread(*buffer, 1, len, fp);*/
+ write(sockfd, "Content-Type: text/html\r\n\r\n", 27);
+ /* TODO: Implement a buffered read from FILE* function */
+ while ((ch = fgetc(fp)) != EOF) {
+ write(sockfd, &ch, 1);
+ }
fclose(fp);
- return len;
+ return 0;
}
-int file_read_cgi(const char *uri_path, int sockfd)
+int file_read_php(const char *filepath, int sockfd)
{
- /* TODO: Lazy copy paste just to get it working */
FILE *fp;
- struct stat statbuf;
char cmdbuf[PATH_MAX];
- char path[PATH_MAX];
char ch;
- /* Prepend the current working directory to the uri path */
- getcwd(path, PATH_MAX);
- strncat(path, uri_path, PATH_MAX - 1);
-
- /* Append 'index.php' to directory paths. */
- stat(path, &statbuf);
- if (S_ISDIR(statbuf.st_mode))
- strcat(path, "index.php");
-
strcpy(cmdbuf, "php-cgi ");
- strcat(cmdbuf, path);
+ strcat(cmdbuf, filepath);
+
+ printf("r %s\n", cmdbuf);
fp = popen(cmdbuf, "r");
if (fp == NULL) {
+ perror("Failed to read command");
return 1;
}
+ /* TODO: Implement a buffered read from FILE* function */
while ((ch = fgetc(fp)) != EOF) {
write(sockfd, &ch, 1);
}