94 lines
2.0 KiB
Go
94 lines
2.0 KiB
Go
// Copyright 2009 The Go9p Authors. All rights reserved.
|
|
// Use of this source code is governed by a BSD-style
|
|
// license that can be found in the LICENSE file.
|
|
|
|
package go9p
|
|
|
|
import (
|
|
"net"
|
|
)
|
|
|
|
// Creates an authentication fid for the specified user. Returns the fid, if
|
|
// successful, or an Error.
|
|
func (clnt *Clnt) Auth(user User, aname string) (*Fid, error) {
|
|
fid := clnt.FidAlloc()
|
|
tc := clnt.NewFcall()
|
|
err := PackTauth(tc, fid.Fid, user.Name(), aname, uint32(user.Id()), clnt.Dotu)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
|
|
_, err = clnt.Rpc(tc)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
|
|
fid.User = user
|
|
fid.walked = true
|
|
return fid, nil
|
|
}
|
|
|
|
// Creates a fid for the specified user that points to the root
|
|
// of the file server's file tree. Returns a Fid pointing to the root,
|
|
// if successful, or an Error.
|
|
func (clnt *Clnt) Attach(afid *Fid, user User, aname string) (*Fid, error) {
|
|
var afno uint32
|
|
|
|
if afid != nil {
|
|
afno = afid.Fid
|
|
} else {
|
|
afno = NOFID
|
|
}
|
|
|
|
fid := clnt.FidAlloc()
|
|
tc := clnt.NewFcall()
|
|
err := PackTattach(tc, fid.Fid, afno, user.Name(), aname, uint32(user.Id()), clnt.Dotu)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
|
|
rc, err := clnt.Rpc(tc)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
|
|
fid.Qid = rc.Qid
|
|
fid.User = user
|
|
fid.walked = true
|
|
return fid, nil
|
|
}
|
|
|
|
// Connects to a file server and attaches to it as the specified user.
|
|
func Mount(ntype, addr, aname string, msize uint32, user User) (*Clnt, error) {
|
|
c, e := net.Dial(ntype, addr)
|
|
if e != nil {
|
|
return nil, &Error{e.Error(), EIO}
|
|
}
|
|
|
|
return MountConn(c, aname, msize, user)
|
|
}
|
|
|
|
func MountConn(c net.Conn, aname string, msize uint32, user User) (*Clnt, error) {
|
|
clnt, err := Connect(c, msize+IOHDRSZ, true)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
|
|
fid, err := clnt.Attach(nil, user, aname)
|
|
if err != nil {
|
|
clnt.Unmount()
|
|
return nil, err
|
|
}
|
|
|
|
clnt.Root = fid
|
|
return clnt, nil
|
|
}
|
|
|
|
// Closes the connection to the file server.
|
|
func (clnt *Clnt) Unmount() {
|
|
clnt.Lock()
|
|
clnt.err = &Error{"connection closed", EIO}
|
|
clnt.conn.Close()
|
|
clnt.Unlock()
|
|
}
|