aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authortenox7 <as@tenoware.com>2018-05-17 23:56:30 -0700
committertenox7 <as@tenoware.com>2018-05-17 23:56:30 -0700
commite9162d81ba9b19b5dedf96717ee6c24e81855919 (patch)
tree4d20af960bfd2852a34771ed122923f3a6204c2d
parent82fc7934b4ee4440e53e386bc39a542c097bd7d2 (diff)
downloadwfm-e9162d81ba9b19b5dedf96717ee6c24e81855919.tar.gz
large file set
-rw-r--r--dialogs.c12
-rw-r--r--fileio.c34
-rw-r--r--wfm.c62
-rw-r--r--wfm.h3
4 files changed, 107 insertions, 4 deletions
diff --git a/dialogs.c b/dialogs.c
index 3bddbe4..9afe7d4 100644
--- a/dialogs.c
+++ b/dialogs.c
@@ -8,6 +8,7 @@
void multiprompt_ui(char *m_action) {
int i;
int res;
+ int level;
char **responses;
struct stat fileinfo;
char M_action[64]={0};
@@ -70,8 +71,15 @@ void multiprompt_ui(char *m_action) {
// move needs a destination...
if(strcmp(m_action, "move")==0) {
- fprintf(cgiOut, "<P>Source: %s<P>Destination: <SELECT NAME=\"destination\"><OPTION VALUE=\"/\">/ - Root Directory</OPTION>\n", virt_dirname);
- re_dir_ui("/", 1);
+ fprintf(cgiOut, "<P>Source: %s<P>Destination: <SELECT NAME=\"destination\">\n", virt_dirname);
+ fprintf(cgiOut, "<OPTION VALUE=\"/\">/ - Root Directory</OPTION>\n");
+ if(largeset) {
+ level=re_dir_up(virt_dirname);
+ re_dir_ui(virt_dirname, level);
+ }
+ else {
+ re_dir_ui("/", 1);
+ }
fprintf(cgiOut, "</SELECT>\n<INPUT TYPE=\"HIDDEN\" NAME=\"absdst\" VALUE=\"1\">\n<P>\n");
}
diff --git a/fileio.c b/fileio.c
index 497adfa..eb8732a 100644
--- a/fileio.c
+++ b/fileio.c
@@ -453,10 +453,11 @@ void re_dir_ui(char *vdir, int level) {
for (n=0; n<(level-1); n++)
fprintf(cgiOut, "&nbsp;&nbsp;&nbsp;");
- fprintf(cgiOut, "%s&nbsp;%s</OPTION>\n", (js) ? "&lfloor;" : "-", direntry[e]->d_name);
+ fprintf(cgiOut, "%s&nbsp;%s</OPTION>\n", (js) ? "&boxvr;" : "-", direntry[e]->d_name);
// recurse
- re_dir_ui(child,level+1);
+ if(!largeset)
+ re_dir_ui(child,level+1);
}
free(direntry[e]);
}
@@ -464,6 +465,35 @@ void re_dir_ui(char *vdir, int level) {
}
//
+// Display directory up tree used for file move with large file set
+//
+int re_dir_up(char *vdir) {
+ int n,nn,m,len;
+ char **dirs;
+ char tmp[sizeof(virt_dirname)]={0};
+
+ strcpy(tmp, vdir);
+ len=strsplit(tmp, &dirs, "/.");
+ for(n=0; n<len; n++) {
+ fprintf(cgiOut, "<OPTION VALUE=\"/");
+
+ for(nn=0; nn<n+1; nn++)
+ fprintf(cgiOut, "%s/", dirs[nn]);
+
+ fprintf(cgiOut, "\">");
+
+ for(m=0; m<n; m++)
+ fprintf(cgiOut, "&nbsp;&nbsp;&nbsp;");
+
+ fprintf(cgiOut, "&boxvr; %s</OPTION>\n", dirs[n]);
+
+ }
+
+
+ return n+1;
+}
+
+//
// Scandir replacement function
//
int namesort(const void *d1, const void *d2) {
diff --git a/wfm.c b/wfm.c
index a57f84e..1b60937 100644
--- a/wfm.c
+++ b/wfm.c
@@ -327,6 +327,65 @@ int strip(char *str, int len, char *allow) {
return 0; //strlen(dst);
}
+
+// split string in to array of char[] with separators
+// Warning this function modifies src!
+// Written by Tomasz Nowak
+int strsplit(char *src, char ***dst, char *sep) {
+ char **arr;
+ char defsep[]=" \t\n\r\f";
+
+ if(!sep)
+ sep=defsep;
+
+ char *src_org = src;
+ char *c;
+ int n = 0;
+
+ while (c = strpbrk(src, sep)) {
+ while (c == src) {
+ src++;
+ c = strpbrk(src, sep);
+ }
+ if (c == NULL)
+ break;
+
+ src = c + 1;
+ n++;
+ }
+
+ int n_elem = n + 1;
+ arr = (char **)malloc(sizeof(char *) * n_elem);
+ memset(arr, 0, sizeof(char *) * n_elem);
+
+ src = src_org;
+ n = 0;
+
+ while (c = strpbrk(src, sep)) {
+ while (c == src) {
+ src++;
+ c = strpbrk(src, sep);
+ }
+ if (c == NULL)
+ break;
+
+ *c = 0;
+ arr[n] = src;
+
+ src = c + 1;
+ n++;
+ }
+
+ arr[n] = src;
+
+ *dst = arr;
+
+ if(!*arr[n])
+ return n_elem-1;
+ else
+ return n_elem;
+}
+
//
// Byte unit printf
//
@@ -412,6 +471,7 @@ int cgiMain(void) {
char c_editdef[]="txt-default-edit=true";
char c_editany[]="edit-any-file=true";
char c_du[]="recursive-du=true";
+ char c_largeset[]="large-file-set=true";
char c_access[]="access";
// early action - simple actions before cfg is read or access check performed (no security!)
@@ -446,6 +506,7 @@ int cgiMain(void) {
edit_by_default=0; // for .txt files
edit_any_file=0;
recursive_du=0;
+ largeset=0;
memset(HOMEDIR, 0, sizeof(HOMEDIR));
memset(HOMEURL, 0, sizeof(HOMEURL));
@@ -467,6 +528,7 @@ int cgiMain(void) {
else if(strncmp(cfgline, c_favicon, strlen(c_favicon))==0) strncpy(FAVICON, cfgline+strlen(c_favicon), sizeof(FAVICON));
else if(strncmp(cfgline, c_editdef, strlen(c_editdef))==0) edit_by_default=1;
else if(strncmp(cfgline, c_editany, strlen(c_editany))==0) edit_any_file=1;
+ else if(strncmp(cfgline, c_largeset, strlen(c_largeset))==0) largeset=1;
else if(strncmp(cfgline, c_du, strlen(c_du))==0) recursive_du=1;
else if(strncmp(cfgline, c_access, strlen(c_access))==0) access_check(cfgline);
}
diff --git a/wfm.h b/wfm.h
index 7e315bd..6852154 100644
--- a/wfm.h
+++ b/wfm.h
@@ -104,6 +104,7 @@ int users_defined;
int edit_by_default;
int edit_any_file;
int recursive_du;
+int largeset;
int js;
@@ -134,6 +135,7 @@ void error(char *, ...);
void redirect(char *, ...);
char *buprintf(float, int);
int strip(char *, int, char *);
+int strsplit(char *, char ***, char *);
void checkfilename(char *);
void checkdestination(void);
void mkfile(void);
@@ -152,6 +154,7 @@ void sendfile(void);
void receivefile(void);
off_t du(char *);
void re_dir_ui(char *, int);
+int re_dir_up(char *);
void login_ui(void);
void tstop(void);
void html_title(char *);