-
- for(c1 = np; *c1; ++c1);
- if(*(c1-1) == '/')
- --c1;
- endofname = c1;
- dirsize = Statb.st_size;
- if(chdir(fname) == -1)
- return 0;
- for(offset=0; offset < dirsize; offset += BUFSIZ) { /* each block */
- dsize = BUFSIZ<(dirsize-offset)? BUFSIZ: (dirsize-offset);
- if(!dir) {
- if((dir=open(".",0))<0) {
- fprintf(stderr, "--cannot open < %s >\n",
- np);
- goto ret;
- }
- if(offset) lseek(dir, (long)offset, 0);
- if(read(dir, (char *)dentry, dsize)<0) {
- fprintf(stderr, "--cannot read < %s >\n",
- np);
- goto ret;
- }
- if(dir > 10) {
- close(dir);
- dir = 0;
- }
- } else
- if(read(dir, (char *)dentry, dsize)<0) {
- fprintf(stderr, "--cannot read < %s >\n",
- np);
- goto ret;
+ if (dirp != NULL)
+ closedir(dirp);
+ dirp = opendir(name);
+ if (dirp == NULL) {
+ perror(base);
+ *ebase0 = 0;
+ return (0);
+ }
+ if (chdir(name) < 0) {
+ perror(base);
+ *ebase0 = 0;
+ closedir(dirp);
+ dirp = NULL;
+ return (0);
+ }
+ while (dp = readdir(dirp)) {
+ if (!strcmp(dp->d_name, ".") || !strcmp(dp->d_name, ".."))
+ continue;
+ (void) sprintf(ebase, "/%s", dp->d_name);
+ curoff = telldir(dirp);
+ kbytes += descend(base, ebase+1);
+ *ebase = 0;
+ if (dirp == NULL) {
+ dirp = opendir(".");
+ if (dirp == NULL) {
+ perror(".");
+ return (0);