]> git.armaanb.net Git - cdir.git/blob - cdir.c
Initial commit
[cdir.git] / cdir.c
1 #include <stdio.h>
2 #include <stdlib.h>
3 #include <string.h>
4 #include <sys/dir.h>
5
6 struct Directory {
7         struct dirent **items;
8         int num;
9 };
10
11 void
12 err(int code, char *msg)
13 {
14         printf("Status: %d\n", code);
15         printf("Content-Type: text/plain\n\n");
16         printf("%s", msg);
17         exit(code);
18 }
19
20 struct Directory
21 get_files(char *dirname) {
22         struct Directory outp;
23         outp.items = calloc(1, sizeof(struct dirent **));
24
25         DIR *d;
26         struct dirent *dir;
27         d = opendir(dirname);
28
29         if (!d) {
30                 err(500, "ERROR: Could not open directory.\n");
31         }
32
33         outp.num = 0;
34         while ((dir = readdir(d)) != NULL) {
35                 outp.items = realloc(outp.items, (outp.num + 1) * sizeof(struct dirent **));
36                 outp.items[outp.num] = dir;
37                 outp.num++;
38         }
39
40         closedir(d);
41         return outp;
42 }
43
44 int
45 main(void) {
46         char *url = getenv("PATH_INFO");
47
48         if (!url) {
49                 err(404, "ERROR: No path given.\n");
50                 return 1;
51         }
52
53         int len = strlen(url) + 2;
54         char *path = malloc(len);
55         snprintf(path, len, ".%s", url);
56         struct Directory files = get_files(path);
57         free(path);
58
59         printf("Content-Type: text/html\n\n");
60         printf("<!DOCTYPE html><html lang=\"en\"><head>");
61         printf("</head><body>");
62         printf("<p>%d files found.</p>\n", files.num);
63         printf("<table>");
64         for (int i = 0; i < files.num; i++) {
65                 printf("<tr>\n<td>");
66                 printf("<a href=\"%s\">%s</p>\n", files.items[i]->d_name,
67                                          files.items[i]->d_name);
68                 printf("</td>\n</tr>");
69         }
70         printf("</table>\n");
71         printf("</body></html>");
72         return 0;
73 }