server: handle session/new write+read in server (rdwr pattern), bypass FileConfig
This commit is contained in:
parent
7e731d4624
commit
daf535308f
|
|
@ -50,6 +50,7 @@ type fid struct {
|
|||
completeResult []byte // for /complete: result of last write (per-fid state)
|
||||
generateResult []byte // for /generate: result of last write (per-fid state)
|
||||
routeResult []byte // for /route: result of last write (per-fid state)
|
||||
sessionResult []byte // for /session/new: session name from last write
|
||||
}
|
||||
|
||||
// connState tracks all open fids for a single 9P connection.
|
||||
|
|
@ -842,6 +843,12 @@ func (s *Server) read(cs *connState, fc *plan9.Fcall, ctx context.Context) *plan
|
|||
return s.readDNS(fc, &f.routeResult)
|
||||
}
|
||||
|
||||
// /session/new: return per-fid result from previous write
|
||||
if path == "/session/new" {
|
||||
s.log.Debug("Tread path=%q offset=%d count=%d", path, fc.Offset, fc.Count)
|
||||
return s.readDNS(fc, &f.sessionResult)
|
||||
}
|
||||
|
||||
s.log.Debug("Tread path=%q offset=%d count=%d", path, fc.Offset, fc.Count)
|
||||
entry, err := s.openEntry(path)
|
||||
if err != nil {
|
||||
|
|
@ -1014,6 +1021,17 @@ func (s *Server) write(cs *connState, fc *plan9.Fcall) *plan9.Fcall {
|
|||
return &plan9.Fcall{Type: plan9.Rwrite, Tag: fc.Tag, Count: uint32(len(fc.Data))}
|
||||
}
|
||||
|
||||
// /session/new: synchronous create-session (per-fid state, like /net/dns)
|
||||
if f.path == "/session/new" {
|
||||
cs.mu.Unlock()
|
||||
name, err := fs.CreateFromRoot(s.sessionTree, strings.Fields(strings.TrimSpace(string(fc.Data))))
|
||||
if err != nil {
|
||||
return errFcall(fc, err.Error())
|
||||
}
|
||||
f.sessionResult = []byte(name)
|
||||
return &plan9.Fcall{Type: plan9.Rwrite, Tag: fc.Tag, Count: uint32(len(fc.Data))}
|
||||
}
|
||||
|
||||
// Accumulate; the 9P client may split large writes across multiple Twrite messages.
|
||||
end := int(fc.Offset) + len(fc.Data)
|
||||
if end > len(f.writeBuf) {
|
||||
|
|
|
|||
|
|
@ -423,24 +423,15 @@ func rootOpen(rs *rootState, name string) (File, error) {
|
|||
IsBlocking_: true,
|
||||
}, nil
|
||||
case "new":
|
||||
var sessResult string
|
||||
return &FileConfig{
|
||||
StatFn: func() (os.FileInfo, error) {
|
||||
return &SyntheticFileInfo{Name_: "new", Mode_: Perms[PathSessions].Files["new"]}, nil
|
||||
},
|
||||
ReadFn: func() ([]byte, error) {
|
||||
if sessResult != "" {
|
||||
return []byte(sessResult + "\n"), nil
|
||||
}
|
||||
return []byte("name=\n"), nil
|
||||
},
|
||||
WriteFn: func(data []byte) error {
|
||||
name, err := Create(rs, strings.Fields(strings.TrimSpace(string(data))))
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
sessResult = name
|
||||
return nil
|
||||
return fmt.Errorf("use ollie-9p rdwr session/new")
|
||||
},
|
||||
BlockingReadFn: notBlocking,
|
||||
}, nil
|
||||
|
|
|
|||
Loading…
Reference in New Issue