func()

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
		}
	}

}