From e9162d81ba9b19b5dedf96717ee6c24e81855919 Mon Sep 17 00:00:00 2001 From: tenox7 Date: Thu, 17 May 2018 23:56:30 -0700 Subject: large file set --- dialogs.c | 12 ++++++++++-- fileio.c | 34 ++++++++++++++++++++++++++++++++-- wfm.c | 62 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ wfm.h | 3 +++ 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, "

Source: %s

Destination: \n", virt_dirname); + fprintf(cgiOut, "\n"); + if(largeset) { + level=re_dir_up(virt_dirname); + re_dir_ui(virt_dirname, level); + } + else { + re_dir_ui("/", 1); + } fprintf(cgiOut, "\n\n

\n"); } diff --git a/fileio.c b/fileio.c index 497adfa..eb8732a 100644 --- a/fileio.c +++ b/fileio.c @@ -453,16 +453,46 @@ void re_dir_ui(char *vdir, int level) { for (n=0; n<(level-1); n++) fprintf(cgiOut, "   "); - fprintf(cgiOut, "%s %s\n", (js) ? "⌊" : "-", direntry[e]->d_name); + fprintf(cgiOut, "%s %s\n", (js) ? "├" : "-", direntry[e]->d_name); // recurse - re_dir_ui(child,level+1); + if(!largeset) + re_dir_ui(child,level+1); } free(direntry[e]); } } +// +// 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"); + + for(m=0; m\n", dirs[n]); + + } + + + return n+1; +} + // // Scandir replacement function // 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 *); -- cgit v1.2.3