in src/go/cmd/smbwalker/main.go [215:270]
func (w *Walker) RunWalker(ctx context.Context, syncWaitGroup *sync.WaitGroup, runForever bool) {
w.StatsCollector.RunningThreadIncr()
defer w.StatsCollector.RunningThreadDecr()
defer syncWaitGroup.Done()
Info.Printf("[Walker %s", w.Smbpath)
defer Info.Printf("Walker %s]", w.Smbpath)
for {
folderSlice := []string{w.Smbpath}
for len(folderSlice) > 0 {
select {
case <-ctx.Done():
return
default:
folder := folderSlice[len(folderSlice)-1]
folderSlice[len(folderSlice)-1] = ""
folderSlice = folderSlice[:len(folderSlice)-1]
dirEntries, err := ioutil.ReadDir(folder)
if err != nil {
Error.Printf("error encountered reading directory '%s': %v", folder, err)
w.StatsCollector.IncrDirReadFailureCount()
continue
}
w.StatsCollector.IncrDirReadCount()
for _, dirEntry := range dirEntries {
if isCancelled(ctx) {
return
}
if dirEntry.IsDir() {
folderSlice = append(folderSlice, path.Join(folder, dirEntry.Name()))
} else {
// only scan file if it matches filter
if w.FileFilter != DefaultFileFilter {
if isMatch, err := filepath.Match(w.FileFilter, dirEntry.Name()); err != nil {
Error.Printf("error matching filename %s: %v", dirEntry.Name(), err)
continue
} else if !isMatch {
continue
}
}
filename := path.Join(folder, dirEntry.Name())
// DEBUG
//Info.Printf("checking filename %s", filename)
w.readFileFull(ctx, filename)
}
}
}
}
if !runForever {
break
}
}
}