diff options
author | tenox7 <as@tenoware.com> | 2018-05-17 23:56:30 -0700 |
---|---|---|
committer | tenox7 <as@tenoware.com> | 2018-05-17 23:56:30 -0700 |
commit | e9162d81ba9b19b5dedf96717ee6c24e81855919 (patch) | |
tree | 4d20af960bfd2852a34771ed122923f3a6204c2d | |
parent | 82fc7934b4ee4440e53e386bc39a542c097bd7d2 (diff) | |
download | wfm-e9162d81ba9b19b5dedf96717ee6c24e81855919.tar.gz |
large file set
-rw-r--r-- | dialogs.c | 12 | ||||
-rw-r--r-- | fileio.c | 34 | ||||
-rw-r--r-- | wfm.c | 62 | ||||
-rw-r--r-- | wfm.h | 3 |
4 files changed, 107 insertions, 4 deletions
@@ -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"); } @@ -453,10 +453,11 @@ void re_dir_ui(char *vdir, int level) { for (n=0; n<(level-1); n++) fprintf(cgiOut, " "); - fprintf(cgiOut, "%s %s</OPTION>\n", (js) ? "⌊" : "-", direntry[e]->d_name); + fprintf(cgiOut, "%s %s</OPTION>\n", (js) ? "├" : "-", 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, " "); + + fprintf(cgiOut, "├ %s</OPTION>\n", dirs[n]); + + } + + + return n+1; +} + +// // Scandir replacement function // int namesort(const void *d1, const void *d2) { @@ -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); } @@ -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 *); |