1
1
git-svn-id: svn://blicky.net/ncdu/trunk@2 ce56bc8d-f834-0410-b703-f827bd498a76
Этот коммит содержится в:
yorhel 2007-07-20 11:29:50 +00:00
родитель 6e3bbe69ee
Коммит 4de245f29b
3 изменённых файлов: 41 добавлений и 9 удалений

Просмотреть файл

@ -434,6 +434,7 @@ void browseDir(void) {
for(i=1; i<fls; i++) for(i=1; i<fls; i++)
itrows[i] = itrows[0] + i*wincols; itrows[i] = itrows[0] + i*wincols;
s = 0;
switch(bgraph) { switch(bgraph) {
case 0: case 0:
sprintf(tmp, "%%c %%7s %%c%%-%ds", wincols-12); sprintf(tmp, "%%c %%7s %%c%%-%ds", wincols-12);

Просмотреть файл

@ -140,16 +140,17 @@ int calcUsage() {
WINDOW *calc; WINDOW *calc;
DIR *dir; DIR *dir;
char antext[15] = "Calculating..."; char antext[15] = "Calculating...";
int ch, anpos = 0, level = 0, i; int ch, anpos = 0, level = 0, i, cdir1len;
char cdir[PATH_MAX], emsg[PATH_MAX], tmp[PATH_MAX], err = 0, *f; char cdir[PATH_MAX], emsg[PATH_MAX], tmp[PATH_MAX], err = 0, *f,
dev_t dev; *cdir1, direrr, staterr;
dev_t dev = (dev_t) NULL;
struct dirent *dr; struct dirent *dr;
struct stat fs; struct stat fs;
struct dir *d, *dirs[512]; /* 512 recursive directories should be enough for everyone! */ struct dir *d, *dirs[512]; /* 512 recursive directories should be enough for everyone! */
#ifdef HAVE_GETTIMEOFDAY #ifdef HAVE_GETTIMEOFDAY
struct timeval tv; suseconds_t l; struct timeval tv; suseconds_t l;
gettimeofday(&tv, (void *)NULL); gettimeofday(&tv, (void *)NULL);
tv.tv_usec = (1000*(tv.tv_sec % 1000) + (tv.tv_usec / 1000)) / sdelay - 1; l = (1000*(tv.tv_sec % 1000) + (tv.tv_usec / 1000)) / sdelay - 1;
#else #else
time_t tv; time_t l; time_t tv; time_t l;
l = time(NULL) - 1; l = time(NULL) - 1;
@ -184,6 +185,9 @@ int calcUsage() {
nodelay(calc, 1); nodelay(calc, 1);
/* main loop */ /* main loop */
while((ch = wgetch(calc)) != 'q') { while((ch = wgetch(calc)) != 'q') {
direrr = staterr = 0;
cdir1 = cdir;
if(ch == KEY_RESIZE) { if(ch == KEY_RESIZE) {
delwin(calc); delwin(calc);
ncresize(); ncresize();
@ -199,6 +203,10 @@ int calcUsage() {
if(i > 0 && !(i == 1 && dat.name[strlen(dat.name)-1] == '/')) strcat(cdir, "/"); if(i > 0 && !(i == 1 && dat.name[strlen(dat.name)-1] == '/')) strcat(cdir, "/");
strcat(cdir, dirs[i]->name); strcat(cdir, dirs[i]->name);
} }
/* avoid lstat("//name", .) -- Linux:OK, Cygwin:UNC path, POSIX:Implementation-defined */
if(cdir[0] == '/' && cdir[1] == '\0')
cdir1++;
cdir1len = strlen(cdir1);
/* opendir */ /* opendir */
if((dir = opendir(cdir)) == NULL) { if((dir = opendir(cdir)) == NULL) {
dirs[level]->flags |= FF_ERR; dirs[level]->flags |= FF_ERR;
@ -213,19 +221,31 @@ int calcUsage() {
/* readdir */ /* readdir */
errno = 0; errno = 0;
while((dr = readdir(dir)) != NULL) { while((dr = readdir(dir)) != NULL) {
int namelen;
f = dr->d_name; f = dr->d_name;
if(f[0] == '.' && (f[1] == '\0' || (f[1] == '.' && f[2] == '\0'))) if(f[0] == '.' && (f[1] == '\0' || (f[1] == '.' && f[2] == '\0')))
continue; continue;
namelen = strlen(f);
if(cdir1len+namelen+1 >= PATH_MAX) {
direrr = 1;
errno = 0;
continue;
}
d = calloc(sizeof(struct dir), 1); d = calloc(sizeof(struct dir), 1);
d->name = malloc(strlen(f)+1); d->name = malloc(namelen+1);
strcpy(d->name, f); strcpy(d->name, f);
if(dirs[level] != NULL) dirs[level]->next = d; if(dirs[level] != NULL) dirs[level]->next = d;
d->prev = dirs[level]; d->prev = dirs[level];
d->parent = dirs[level-1]; d->parent = dirs[level-1];
dirs[level-1]->sub = d; dirs[level-1]->sub = d;
dirs[level] = d; dirs[level] = d;
sprintf(tmp, "%s/%s", cdir, d->name); sprintf(tmp, "%s/%s", cdir1, d->name);
lstat(tmp, &fs); if(lstat(tmp, &fs)) {
staterr = 1;
d->flags = FF_ERR;
errno = 0;
continue;
}
/* check filetype */ /* check filetype */
if(sflags & SF_SMFS && dev != fs.st_dev) if(sflags & SF_SMFS && dev != fs.st_dev)
d->flags |= FF_OTHFS; d->flags |= FF_OTHFS;
@ -247,10 +267,13 @@ int calcUsage() {
if(d->flags & FF_OTHFS) d->size = 0; if(d->flags & FF_OTHFS) d->size = 0;
for(i=level; i-->0;) for(i=level; i-->0;)
dirs[i]->size += d->size; dirs[i]->size += d->size;
errno = 0;
} }
if(errno)
direrr = 1;
closedir(dir); closedir(dir);
if(errno) { if(direrr || staterr) {
dirs[level-1]->flags |= FF_ERR; dirs[level-1]->flags |= (direrr ? FF_ERR : FF_SERR);
for(i=level-1; i-->0;) for(i=level-1; i-->0;)
dirs[i]->flags |= FF_SERR; dirs[i]->flags |= FF_SERR;
} }

Просмотреть файл

@ -47,6 +47,14 @@
#endif #endif
#include <dirent.h> #include <dirent.h>
/* PATH_MAX 260 on Cygwin is too small for /proc/registry */
#ifdef __CYGWIN__
# if PATH_MAX < 1024
# undef PATH_MAX
# define PATH_MAX 1024
# endif
#endif
/* get PATH_MAX */ /* get PATH_MAX */
#ifndef PATH_MAX #ifndef PATH_MAX
# ifdef _POSIX_PATH_MAX # ifdef _POSIX_PATH_MAX