diff options
Diffstat (limited to 'gopher.c')
-rw-r--r-- | gopher.c | 113 |
1 files changed, 93 insertions, 20 deletions
@@ -1,23 +1,18 @@ -#define _POSIX_C_SOURCE 200112L - #include <sys/socket.h> +#include <sys/types.h> +#include <dirent.h> #include <stdio.h> #include <string.h> +#include <stdlib.h> #include "log.h" -static char *res = "1Entry 1 /entry1 localhost 3000\r\n\ -1Entry 2 /entry2 localhost 3000\r\n\ -1Entry 3 /entry3 localhost 3000\r\n\ -."; - -static char *res1 = "0SubEntry 1 /entry1 localhost 3000\r\n\ -0SubEntry 2 /entry2 localhost 3000\r\n\ -0SubEntry 3 /entry3 localhost 3000\r\n\ -."; +#define GOPHERROOT "/tmp/gopherroot" +#define GOPHERHOST "localhost" +#define GOPHERPORT "70" -static int +static int sendall(int fd, const char *buf, size_t len) { size_t sent = 0; @@ -35,22 +30,100 @@ sendall(int fd, const char *buf, size_t len) return 0; } -int +static int +print_indexfile(int fd, const char *path) +{ + FILE *f; + char buf[512]; + + f = fopen(path, "r"); + if (f == NULL) { + perror("fopen"); + return -1; + } + while (!feof(f)) { + if (fgets(buf, sizeof(buf), f) == NULL) + continue; + if (sendall(fd, buf, strlen(buf)) == -1) { + logmsg(LOG_INFO, "failed to send data"); + return -1; + fclose(f); + } + } + + fclose(f); + return 0; +} + +static int +print_dir(int fd, const char *path) +{ + DIR *root; + struct dirent *node; + char *buf; + int type; + size_t buflen; + + root = opendir(path); + if (root == NULL) { + perror("opendir"); + return -1; + } + while ((node = readdir(root)) != NULL) { + buflen = sizeof(type) + strlen(node->d_name) + + strlen(GOPHERROOT) + strlen(GOPHERHOST) + + strlen(GOPHERPORT) + 6; + if ((buf = malloc(buflen)) == NULL) { + perror("malloc"); + return -1; + } + + switch (node->d_type) { + case 4: + type = 1; + break; + case 8: + type = 0; + break; + } + + sprintf(buf, "%d%s %s %s %s\r\n", + type, node->d_name, GOPHERROOT, "localhost", "3000"); + if (sendall(fd, buf, buflen) == -1) { + logmsg(LOG_INFO, "failed to send data"); + free(buf); + return -1; + } + free(buf); + } + + closedir(root); + + return 0; +} + +int handle_path(int fd, const char *path) { const char *data; if (strcmp(path, "") == 0 || strcmp(path, "/") == 0) { - data = res; - } else if (strcmp(path, "/entry1") == 0) { - data = res1; + if (print_indexfile(fd, "index.gph") == -1) { + logmsg(LOG_INFO, "failed to send data"); + return -1; + } + } else if (strcmp(path, "/list") == 0) { + if (print_dir(fd, GOPHERROOT) == -1) { + logmsg(LOG_INFO, "failed to send data"); + return -1; + } } else { data = ""; + if (sendall(fd, data, strlen(data)) == -1) { + logmsg(LOG_INFO, "failed to send data"); + return -1; + } } - if (sendall(fd, data, strlen(data)) == -1) { - logmsg(LOG_INFO, "failed to send data"); - return -1; - } return 0; } |