Blob
1 package p9p3 import "fmt"5 // FcallType encodes the message type for the target Fcall.6 type FcallType uint88 // Definitions for Fcall's used in 9P2000.9 const (10 Tversion FcallType = iota + 10011 Rversion12 Tauth13 Rauth14 Tattach15 Rattach16 Terror17 Rerror18 Tflush19 Rflush20 Twalk21 Rwalk22 Topen23 Ropen24 Tcreate25 Rcreate26 Tread27 Rread28 Twrite29 Rwrite30 Tclunk31 Rclunk32 Tremove33 Rremove34 Tstat35 Rstat36 Twstat37 Rwstat38 Tmax39 )41 func (fct FcallType) String() string {42 switch fct {43 case Tversion:44 return "Tversion"45 case Rversion:46 return "Rversion"47 case Tauth:48 return "Tauth"49 case Rauth:50 return "Rauth"51 case Tattach:52 return "Tattach"53 case Rattach:54 return "Rattach"55 case Terror:56 // invalid.57 return "Terror"58 case Rerror:59 return "Rerror"60 case Tflush:61 return "Tflush"62 case Rflush:63 return "Rflush"64 case Twalk:65 return "Twalk"66 case Rwalk:67 return "Rwalk"68 case Topen:69 return "Topen"70 case Ropen:71 return "Ropen"72 case Tcreate:73 return "Tcreate"74 case Rcreate:75 return "Rcreate"76 case Tread:77 return "Tread"78 case Rread:79 return "Rread"80 case Twrite:81 return "Twrite"82 case Rwrite:83 return "Rwrite"84 case Tclunk:85 return "Tclunk"86 case Rclunk:87 return "Rclunk"88 case Tremove:89 return "Tremove"90 case Rremove:91 return "Rremove"92 case Tstat:93 return "Tstat"94 case Rstat:95 return "Rstat"96 case Twstat:97 return "Twstat"98 case Rwstat:99 return "Rwstat"100 default:101 return "Tunknown"102 }103 }105 // Fcall defines the fields for sending a 9p formatted message. The type will106 // be introspected from the Message implementation.107 type Fcall struct {108 Type FcallType109 Tag Tag110 Message Message111 }113 func newFcall(tag Tag, msg Message) *Fcall {114 switch msg.Type() {115 case Tversion, Rversion:116 tag = NOTAG117 }119 return &Fcall{120 Type: msg.Type(),121 Tag: tag,122 Message: msg,123 }124 }126 func newErrorFcall(tag Tag, err error) *Fcall {127 var msg Message129 switch v := err.(type) {130 case MessageRerror:131 msg = v132 case *MessageRerror:133 msg = *v134 default:135 msg = MessageRerror{Ename: v.Error()}136 }138 return &Fcall{139 Type: Rerror,140 Tag: tag,141 Message: msg,142 }143 }145 func (fc *Fcall) String() string {146 return fmt.Sprintf("%v(%v) %v", fc.Type, fc.Tag, string9p(fc.Message))147 }