diff -ruN muddleftpd/doc/reference.txt muddleftpd-oskar/doc/reference.txt --- muddleftpd/doc/reference.txt 2002-09-26 09:55:42.000000000 +0200 +++ muddleftpd-oskar/doc/reference.txt 2002-10-23 20:44:40.000000000 +0200 @@ -1450,7 +1450,9 @@ I - Remove existing directories. W - Write to existing files. H - Chmod existing files. - C - allow to change to that directory. + C - Allow to change to that directory. + K - List files (only for directories), but don't list symlinks + (instead list the destination file). By combining these letters, any access level can be set. @@ -1771,4 +1773,4 @@ 3.0 FTP commands. -3.1 Non-site commands. \ No newline at end of file +3.1 Non-site commands. diff -ruN muddleftpd/src/acl.c muddleftpd-oskar/src/acl.c --- muddleftpd/src/acl.c 2002-09-26 09:55:42.000000000 +0200 +++ muddleftpd-oskar/src/acl.c 2002-10-23 20:44:53.000000000 +0200 @@ -55,6 +55,7 @@ case 'W': { result |= ACL_WRITE ; break ; } case 'H': { result |= ACL_CHMOD ; break ; } case 'C': { result |= ACL_CHDIR ; break ; } + case 'K': { result |= ACL_LISTLINKS ; break ; } default : { log_giveentry(MYLOG_INFO, 0, safe_snprintf("Unknown ACL char ", aclchar)); } } instr++; diff -ruN muddleftpd/src/acl.h muddleftpd-oskar/src/acl.h --- muddleftpd/src/acl.h 2002-09-26 09:55:42.000000000 +0200 +++ muddleftpd-oskar/src/acl.h 2002-10-23 20:45:03.000000000 +0200 @@ -12,6 +12,7 @@ #define ACL_WRITE 128 #define ACL_CHMOD 256 #define ACL_CHDIR 512 +#define ACL_LISTLINKS 1024 typedef struct { diff -ruN muddleftpd/src/file.c muddleftpd-oskar/src/file.c --- muddleftpd/src/file.c 2002-09-26 09:55:42.000000000 +0200 +++ muddleftpd-oskar/src/file.c 2002-10-23 20:45:36.000000000 +0200 @@ -294,8 +294,17 @@ check_acl(peer, pdir, ACL_LIST); - if (errno == 0) - mg = myglob(pdir, pattern, allfiles, TRUE); + if (errno == 0) + { + mg = myglob(pdir, pattern, allfiles, TRUE, TRUE); + } + else + { + check_acl(peer, pdir, ACL_LISTLINKS); + + if (errno == 0) + mg = myglob(pdir, pattern, allfiles, TRUE, FALSE); + } freewrapper(pdir); return(mg); diff -ruN muddleftpd/src/myglob.c muddleftpd-oskar/src/myglob.c --- muddleftpd/src/myglob.c 2002-09-26 09:55:42.000000000 +0200 +++ muddleftpd-oskar/src/myglob.c 2002-10-23 20:46:58.000000000 +0200 @@ -332,7 +332,7 @@ qsortarray(l, pivot + 1, end); } -MYGLOBDATA *myglob (char *dir, char *pattern, int allfiles, int sortforward) +MYGLOBDATA *myglob (char *dir, char *pattern, int allfiles, int sortforward, int statlinks) { MYGLOBDATA *g = NULL; int error = 0; @@ -377,7 +377,14 @@ for(count = 0; count < g->namecount; count++) { - if (lstat(g->name[count], g->stat_buf + count) == -1) + int rc; + + if (statlinks) + rc = lstat(g->name[count], g->stat_buf + count); + else + rc = stat(g->name[count], g->stat_buf + count); + + if (rc == -1) { printf("stat error\n"); diff -ruN muddleftpd/src/myglob.h muddleftpd-oskar/src/myglob.h --- muddleftpd/src/myglob.h 2002-09-26 09:55:42.000000000 +0200 +++ muddleftpd-oskar/src/myglob.h 2002-10-23 20:47:10.000000000 +0200 @@ -26,7 +26,7 @@ struct stat *stat_buf; /* file information. */ } MYGLOBDATA; -MYGLOBDATA *myglob ( char *dir, char *pattern, int flags, int sortforward ); +MYGLOBDATA *myglob ( char *dir, char *pattern, int flags, int sortforward, int statlinks ); /* Free storage allocated in PGLOB by a previous `glob' call. */ extern void myglobfree (MYGLOBDATA *g);