func (*Ufs) Create(req *srv.Req) { fid := req.Fid.Aux.(*Fid) tc := req.Tc err := fid.stat() if err != nil { req.RespondError(err) return } path := fid.path + "/" + tc.Name var e error = nil var file *os.File = nil switch { case tc.Perm&ninep.DMDIR != 0: e = os.Mkdir(path, os.FileMode(tc.Perm&0777)) case tc.Perm&ninep.DMSYMLINK != 0: e = os.Symlink(tc.Ext, path) case tc.Perm&ninep.DMLINK != 0: n, e := strconv.ParseUint(tc.Ext, 10, 0) if e != nil { break } ofid := req.Conn.FidGet(uint32(n)) if ofid == nil { req.RespondError(srv.Eunknownfid) return } e = os.Link(ofid.Aux.(*Fid).path, path) ofid.DecRef() case tc.Perm&ninep.DMNAMEDPIPE != 0: case tc.Perm&ninep.DMDEVICE != 0: req.RespondError(&ninep.Error{"not implemented", ninep.EIO}) return default: var mode uint32 = tc.Perm & 0777 if req.Conn.Dotu { if tc.Perm&ninep.DMSETUID > 0 { mode |= syscall.S_ISUID } if tc.Perm&ninep.DMSETGID > 0 { mode |= syscall.S_ISGID } } file, e = os.OpenFile(path, omode2uflags(tc.Mode)|os.O_CREATE, os.FileMode(mode)) } if file == nil && e == nil { file, e = os.OpenFile(path, omode2uflags(tc.Mode), 0) } if e != nil { req.RespondError(toError(e)) return } fid.path = path fid.file = file err = fid.stat() if err != nil { req.RespondError(err) return } req.RespondRcreate(dir2Qid(fid.st), 0) }