#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];
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);
}
}
phase++;
+ incr = 0;
+ count = 0;
if(phase == 1) goto repeat;
free(d);
}
}
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);
_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);
free(svnpath);
return NULL;
}
+ if(bin) {
+ free(d);
+ return NULL;
+ }
return d;
}
}
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><DIR></td></tr>\n");
+ fcounter++;
+ free(query);
+ }
}
fcounter++;
add_data(&page, "<tr style=\"background-color: #");
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 {
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");