- int r;
- fprintf(stderr,"summer: processing: %s\n",startpoint);
- r= nftw(startpoint, item, MAXDEPTH, FTW_MOUNT|FTW_PHYS);
- if (r) { fprintf(stderr, "summer: nftw failed: %s: %s\n",
- strerror(errno), startpoint); exit(4); }
+ if (!quiet)
+ fprintf(stderr,"summer: processing: %s\n",startpoint);
+ node(startpoint, 0,0);
+ 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_or_buf, unsigned nodeflags, dev_t fs) {
+ static char *buf;
+ static int buf_allocd;
+
+ struct dirent **namelist, *const *de;
+ const char *path_or_0= path_or_buf==buf ? 0 : path_or_buf;
+ int nentries, pathl, esave, buf_want, i;
+
+ pathl= strlen(path_or_buf);
+ recurse_maxlen= 2;
+ nentries= scandir(path_or_buf, &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;
+ }
+ /* NOTE that path_or_buf is invalid after this point because
+ * it might have been realloc'd ! */
+ if (path_or_0) strcpy(buf,path_or_0);
+
+ buf[pathl]= '/';
+ pathl++;
+ if (nentries < 0) {
+ buf[pathl]= 0; errno= esave;
+ problem_e(buf,CSUMXL+72,"scandir failed");
+ fn_escaped(stdout,buf); putchar('\n');
+ return;
+ }
+ for (i=0, de=namelist; i<nentries; i++, de++) {
+ strcpy(buf+pathl, (*de)->d_name);
+ node(buf, nodeflags, fs);
+ free(*de);
+ }
+ free(namelist);