- r= nftw(startpoint, item, MAXDEPTH, FTW_MOUNT|FTW_PHYS);
- if (r) { fprintf(stderr, "summer: nftw failed: %s: %s\n",
- strerror(errno), startpoint); exit(4); }
+ node(startpoint);
+ tdestroy(hardlinks,free);
+ hardlinks= 0;
+}
+
+static int recurse_maxlen;
+
+static int recurse_filter(const struct dirent *de) {
+ int l;
+ if (de->d_name[0]=='.' &&
+ (de->d_name[1]==0 ||
+ (de->d_name[1]=='.' &&
+ de->d_name[2]==0)))
+ return 0;
+ l= strlen(de->d_name);
+ if (l > recurse_maxlen) recurse_maxlen= l;
+ return 1;
+}
+
+static int recurse_compar(const void *av, const void *bv) {
+ const struct dirent *const *a=av, *const *b=bv;
+ return strcmp((*a)->d_name, (*b)->d_name);
+}
+
+static void recurse(const char *path) {
+ static char *buf;
+ static int buf_allocd;
+
+ struct dirent **namelist, *const *de;
+ char *subpathp;
+ int nentries, pathl, esave, buf_want, i;
+
+ pathl= strlen(path);
+ recurse_maxlen= 2;
+ nentries= scandir(path, &namelist, recurse_filter, recurse_compar);
+ esave= errno;
+ buf_want= pathl+1+recurse_maxlen+1;
+ if (buf_want > buf_allocd) {
+ buf= mrealloc(buf, buf_want);
+ buf_allocd= buf_want;
+ }
+ strcpy(buf,path);
+ buf[pathl]= '/';
+ subpathp= buf+pathl+1;
+ if (nentries < 0) {
+ strcpy(subpathp,"\\?"); errno= esave;
+ problem_e(buf,-1,"scandir failed");
+ return;
+ }
+ for (i=0, de=namelist; i<nentries; i++, de++) {
+ strcpy(subpathp, (*de)->d_name);
+ node(buf);
+ free(*de);
+ }
+ free(namelist);