scandir: sort directories and show filetype
sort in order: directory or non-directory, filename (case-sensitive). show filetypes after filename: - / for directory - @ for symlink - | for pipe - = for socket - etc
This commit is contained in:
parent
ee10f83391
commit
a551445fba
1 changed files with 27 additions and 3 deletions
30
quark.c
30
quark.c
|
@ -313,6 +313,30 @@ getrequest(int fd, struct request *r)
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static int
|
||||||
|
compareent(const struct dirent **d1, const struct dirent **d2)
|
||||||
|
{
|
||||||
|
int v;
|
||||||
|
|
||||||
|
v = ((*d2)->d_type == DT_DIR ? 1 : -1) -
|
||||||
|
((*d1)->d_type == DT_DIR ? 1 : -1);
|
||||||
|
if (v)
|
||||||
|
return v;
|
||||||
|
return strcmp((*d1)->d_name, (*d2)->d_name);
|
||||||
|
}
|
||||||
|
|
||||||
|
static char *
|
||||||
|
filetype(int t)
|
||||||
|
{
|
||||||
|
switch (t) {
|
||||||
|
case DT_FIFO: return "|";
|
||||||
|
case DT_DIR: return "/";
|
||||||
|
case DT_LNK: return "@";
|
||||||
|
case DT_SOCK: return "=";
|
||||||
|
}
|
||||||
|
return "";
|
||||||
|
}
|
||||||
|
|
||||||
static enum status
|
static enum status
|
||||||
senddir(int fd, char *name, struct request *r)
|
senddir(int fd, char *name, struct request *r)
|
||||||
{
|
{
|
||||||
|
@ -322,7 +346,7 @@ senddir(int fd, char *name, struct request *r)
|
||||||
static char t[TIMESTAMP_LEN];
|
static char t[TIMESTAMP_LEN];
|
||||||
|
|
||||||
/* read directory */
|
/* read directory */
|
||||||
if ((dirlen = scandir(name, &e, NULL, alphasort)) < 0) {
|
if ((dirlen = scandir(name, &e, NULL, compareent)) < 0) {
|
||||||
return sendstatus(fd, S_FORBIDDEN);
|
return sendstatus(fd, S_FORBIDDEN);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -355,8 +379,8 @@ senddir(int fd, char *name, struct request *r)
|
||||||
}
|
}
|
||||||
|
|
||||||
/* entry line */
|
/* entry line */
|
||||||
if (dprintf(fd, "<br />\n\t\t<a href=\"%s\">%s</a>",
|
if (dprintf(fd, "<br />\n\t\t<a href=\"%s\">%s%s</a>",
|
||||||
e[i]->d_name, e[i]->d_name) < 0) {
|
e[i]->d_name, e[i]->d_name, filetype(e[i]->d_type)) < 0) {
|
||||||
return S_REQUEST_TIMEOUT;
|
return S_REQUEST_TIMEOUT;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue