func (m *memMapFs) lookupUnderlyingFS( nameMemFS string, origName string, // orig name has no mountname prefix á la mnt02 ) (fsi.File, error) { // log.Printf("check shadowFS %q %q\n", nameMemFS, origName) if m.shadow == nil { // no underlying filesystem return nil, fsi.ErrFileNotFound } fshad, err := m.shadow.Open(origName) if err != nil { return nil, fsi.ErrFileNotFound } defer fshad.Close() // log.Printf("found in shadoFS %q %q\n", nameMemFS, origName) inf, err := fshad.Stat() if err != nil { return nil, fmt.Errorf("fileinfo from shadow failed: %v", err) } // // special case // resource is a directory if inf.IsDir() { // return nil, fmt.Errorf("is dir") err = m.MkdirAll(origName, 0755) if err != nil && err != fsi.ErrFileExists { return nil, err } m.rlock() dir, ok := m.fos[common.Directorify(path.Dir(nameMemFS))] m.runlock() if !ok { return nil, fmt.Errorf("dir created with MkDir, but not in fos map %q %q", nameMemFS, origName) } // Now we try to cache the index-file. // Yes. I tried to keep it simple! idx, err := m.shadow.Open(path.Join(origName, "index.html")) if err != fsi.ErrFileNotFound { return dir, nil } if err != nil { return dir, nil } defer idx.Close() fshad = idx } // // nameMemFS = origName var dst fsi.File // regular file err = m.MkdirAll(path.Dir(nameMemFS), 0755) if err != nil && err != fsi.ErrFileExists { return nil, err } log.Printf(" from underlying: created front dir %q \n", path.Dir(nameMemFS)) dst, err = m.Create(nameMemFS) if err != nil { return nil, err } log.Printf(" from underlying: created front file %q \n", nameMemFS) n, err := io.Copy(dst, fshad) _ = n if err != nil { return nil, err } // log.Printf("copied %v for %v\n", n, name) err = dst.Close() if err != nil { return nil, err } // // reopen ff, okConv := dst.(*InMemoryFile) if okConv { ff.Open() } else { return nil, fmt.Errorf("could not convert opened file into InMemoryFile 2") } return dst, nil }