]> Git repositories of Nishi - repoview.git/commitdiff
works
authorNishi <nishi@nishi.boats>
Wed, 21 Aug 2024 05:05:19 +0000 (05:05 +0000)
committerNishi <nishi@nishi.boats>
Wed, 21 Aug 2024 05:05:19 +0000 (05:05 +0000)
git-svn-id: file:///raid/svn-personal/repoview/trunk@12 7e8b2a19-8934-dd40-8cb3-db22cdd5a80f

CGI/repo.c
CGI/theme/modern.c

index d8024303c5271b6f90465e4fb6dc941d8ae272f2..7d323e5acf2c01aa0bc463a5b0b7199cfa6b17bf 100644 (file)
@@ -15,6 +15,7 @@
 #include <fcntl.h>
 #include <sys/stat.h>
 #include <sys/wait.h>
+#include <signal.h>
 
 char* rv_construct_repouser(const char* reponame, const char* username) {
        char cbuf[2];
@@ -209,7 +210,7 @@ bool rv_get_list(const char* repouser, const char* path, void (*handler)(const c
                                char oldc = d[i];
                                d[i] = 0;
                                count++;
-                               if(count > 1 && strlen(d + incr + 1) > 0 && d[incr] != 0) {
+                               if(count > 1 && d[incr] != 0 && strlen(d + incr + 1) > 0) {
                                        char* pathname = d + incr + 1;
                                        if(phase == 0 && pathname[strlen(pathname) - 1] == '/') {
                                                handler(d + incr + 1);
@@ -226,6 +227,8 @@ bool rv_get_list(const char* repouser, const char* path, void (*handler)(const c
                        }
                }
                phase++;
+               incr = 0;
+               count = 0;
                if(phase == 1) goto repeat;
                free(d);
        }
@@ -234,6 +237,7 @@ bool rv_get_list(const char* repouser, const char* path, void (*handler)(const c
 }
 
 char* rv_read_file(const char* repouser, char* path) {
+       if(rv_get_filesize(repouser, path) > 1024 * 128) return NULL;
        char* svnpath = rv_strcat3(SVN_ROOT, "/", repouser);
        int pipes[2];
        pipe(pipes);
@@ -246,16 +250,21 @@ char* rv_read_file(const char* repouser, char* path) {
                _exit(0);
        } else {
                close(pipes[1]);
-               char cbuf[2];
-               cbuf[1] = 0;
-               char* d = malloc(1);
-               d[0] = 0;
+               char cbuf[1024];
+               char* d = malloc(1024 * 128);
+               int incr = 0;
+               bool bin = false;
                while(1) {
-                       int n = read(pipes[0], cbuf, 1);
+                       int n = read(pipes[0], cbuf, 1024);
+                       if(cbuf[0] == 0) {
+                               bin = true;
+                               kill(pid, SIGKILL);
+                               break;
+                       }
                        if(n == 0) break;
-                       char* tmp = d;
-                       d = rv_strcat(tmp, cbuf);
-                       free(tmp);
+                       memcpy(d + incr, cbuf, n);
+                       d[incr + n] = 0;
+                       incr += n;
                }
                int status;
                waitpid(pid, &status, 0);
@@ -264,6 +273,10 @@ char* rv_read_file(const char* repouser, char* path) {
                        free(svnpath);
                        return NULL;
                }
+               if(bin) {
+                       free(d);
+                       return NULL;
+               }
                return d;
        }
 }
index b834646dcbdeb07fdb7d7cb4c1cf7c20c6fbe1b3..675b92612c1afbc4c141e4a6f1c46259818bc408 100644 (file)
@@ -116,6 +116,50 @@ void list_files(const char* pathname) {
                add_data(&nav, "<li><a href=\"#filelist\">File List</a></li>\n");
                add_data(&page, "<h2 id=\"filelist\">File List</h2>\n");
                add_data(&page, "<tr style=\"background-color: #D2E1F6;\"><th>Name</th><th>Size</th></tr>\n");
+               char* path = rv_get_query("path");
+               if(path == NULL) path = "/";
+               if(strcmp(path, "/") != 0) {
+                       char* query = rv_strdup("?page=repo&reponame=");
+                       char* esc;
+                       esc = url_escape(rv_get_query("reponame"));
+                       add_data(&query, esc);
+                       free(esc);
+                       add_data(&query, "&username=");
+                       esc = url_escape(user);
+                       add_data(&query, esc);
+                       free(esc);
+                       add_data(&query, "&path=");
+
+                       char* urlpath = rv_strdup(path);
+                       int i;
+                       int counter = 0;
+                       int rep = urlpath[strlen(urlpath) - 1] == '/' ? 2 : 1;
+                       for(i = strlen(urlpath) - 1; i >= 0; i--) {
+                               char oldc = urlpath[i];
+                               urlpath[i] = 0;
+                               if(oldc == '/') {
+                                       counter++;
+                                       if(counter == 2) {
+                                               break;
+                                       }
+                               }
+                       }
+
+                       if(strlen(urlpath) == 0) {
+                               free(urlpath);
+                               urlpath = rv_strdup("/");
+                       }
+
+                       esc = url_escape(urlpath);
+                       add_data(&query, esc);
+                       free(esc);
+
+                       add_data(&page, "<tr><td><a href=\"");
+                       add_data(&page, query);
+                       add_data(&page, "\">../</a></td><td>&lt;DIR&gt;</td></tr>\n");
+                       fcounter++;
+                       free(query);
+               }
        }
        fcounter++;
        add_data(&page, "<tr style=\"background-color: #");
@@ -380,10 +424,14 @@ void render_page(void) {
                                        add_data(&page, "<h2 id=\"filecontent\">Content</h2>\n");
                                        add_data(&page, "<pre class=\"codeblock\"><code>");
                                        char* data = rv_read_file(repouser, path);
-                                       char* esc = html_escape_nl_to_br(data);
-                                       add_data(&page, esc);
-                                       free(esc);
-                                       free(data);
+                                       if(data != NULL) {
+                                               char* esc = html_escape_nl_to_br(data);
+                                               add_data(&page, esc);
+                                               free(esc);
+                                               free(data);
+                                       } else {
+                                               add_data(&page, "Cannot open the file.\n");
+                                       }
                                        add_data(&page, "</code></pre>");
                                }
                        } else {
@@ -482,6 +530,8 @@ void render_stuff(void) {
        add_data(&buffer, "pre {\n");
        add_data(&buffer, "     background-color: #dddddd;\n");
        add_data(&buffer, "     border: solid 2px #bbbbbb;\n");
+       add_data(&buffer, "     padding: 8px;\n");
+       add_data(&buffer, "     overflow: scroll;\n");
        add_data(&buffer, "}\n");
        add_data(&buffer, "#index {\n");
        add_data(&buffer, "     list-style: none;\n");