summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authoryorhel <yorhel@ce56bc8d-f834-0410-b703-f827bd498a76>2007-07-20 11:29:50 +0000
committeryorhel <yorhel@ce56bc8d-f834-0410-b703-f827bd498a76>2007-07-20 11:29:50 +0000
commit4de245f29be7558cf3dd4c68e038ff6c48b2de26 (patch)
tree82b521e370cdd0922a4af65efb81afa0688df12f
parent6e3bbe69ee8ade74bdb2fe0528248a35c54a585c (diff)
Small bugfixes + cygwin patch
git-svn-id: svn://blicky.net/ncdu/trunk@2 ce56bc8d-f834-0410-b703-f827bd498a76
-rw-r--r--src/browser.c1
-rw-r--r--src/calc.c41
-rw-r--r--src/ncdu.h8
3 files changed, 41 insertions, 9 deletions
diff --git a/src/browser.c b/src/browser.c
index 0740002..c54ae53 100644
--- a/src/browser.c
+++ b/src/browser.c
@@ -434,6 +434,7 @@ void browseDir(void) {
for(i=1; i<fls; i++)
itrows[i] = itrows[0] + i*wincols;
+ s = 0;
switch(bgraph) {
case 0:
sprintf(tmp, "%%c %%7s %%c%%-%ds", wincols-12);
diff --git a/src/calc.c b/src/calc.c
index 6bca13a..6bb6edc 100644
--- a/src/calc.c
+++ b/src/calc.c
@@ -140,16 +140,17 @@ int calcUsage() {
WINDOW *calc;
DIR *dir;
char antext[15] = "Calculating...";
- int ch, anpos = 0, level = 0, i;
- char cdir[PATH_MAX], emsg[PATH_MAX], tmp[PATH_MAX], err = 0, *f;
- dev_t dev;
+ int ch, anpos = 0, level = 0, i, cdir1len;
+ char cdir[PATH_MAX], emsg[PATH_MAX], tmp[PATH_MAX], err = 0, *f,
+ *cdir1, direrr, staterr;
+ dev_t dev = (dev_t) NULL;
struct dirent *dr;
struct stat fs;
struct dir *d, *dirs[512]; /* 512 recursive directories should be enough for everyone! */
#ifdef HAVE_GETTIMEOFDAY
struct timeval tv; suseconds_t l;
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
time_t tv; time_t l;
l = time(NULL) - 1;
@@ -184,6 +185,9 @@ int calcUsage() {
nodelay(calc, 1);
/* main loop */
while((ch = wgetch(calc)) != 'q') {
+ direrr = staterr = 0;
+ cdir1 = cdir;
+
if(ch == KEY_RESIZE) {
delwin(calc);
ncresize();
@@ -199,6 +203,10 @@ int calcUsage() {
if(i > 0 && !(i == 1 && dat.name[strlen(dat.name)-1] == '/')) strcat(cdir, "/");
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 */
if((dir = opendir(cdir)) == NULL) {
dirs[level]->flags |= FF_ERR;
@@ -213,19 +221,31 @@ int calcUsage() {
/* readdir */
errno = 0;
while((dr = readdir(dir)) != NULL) {
+ int namelen;
f = dr->d_name;
if(f[0] == '.' && (f[1] == '\0' || (f[1] == '.' && f[2] == '\0')))
continue;
+ namelen = strlen(f);
+ if(cdir1len+namelen+1 >= PATH_MAX) {
+ direrr = 1;
+ errno = 0;
+ continue;
+ }
d = calloc(sizeof(struct dir), 1);
- d->name = malloc(strlen(f)+1);
+ d->name = malloc(namelen+1);
strcpy(d->name, f);
if(dirs[level] != NULL) dirs[level]->next = d;
d->prev = dirs[level];
d->parent = dirs[level-1];
dirs[level-1]->sub = d;
dirs[level] = d;
- sprintf(tmp, "%s/%s", cdir, d->name);
- lstat(tmp, &fs);
+ sprintf(tmp, "%s/%s", cdir1, d->name);
+ if(lstat(tmp, &fs)) {
+ staterr = 1;
+ d->flags = FF_ERR;
+ errno = 0;
+ continue;
+ }
/* check filetype */
if(sflags & SF_SMFS && dev != fs.st_dev)
d->flags |= FF_OTHFS;
@@ -247,10 +267,13 @@ int calcUsage() {
if(d->flags & FF_OTHFS) d->size = 0;
for(i=level; i-->0;)
dirs[i]->size += d->size;
+ errno = 0;
}
+ if(errno)
+ direrr = 1;
closedir(dir);
- if(errno) {
- dirs[level-1]->flags |= FF_ERR;
+ if(direrr || staterr) {
+ dirs[level-1]->flags |= (direrr ? FF_ERR : FF_SERR);
for(i=level-1; i-->0;)
dirs[i]->flags |= FF_SERR;
}
diff --git a/src/ncdu.h b/src/ncdu.h
index 1960877..eaf8d13 100644
--- a/src/ncdu.h
+++ b/src/ncdu.h
@@ -47,6 +47,14 @@
#endif
#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 */
#ifndef PATH_MAX
# ifdef _POSIX_PATH_MAX