1 #include <u.h> 2 #include <libc.h> 3 #include <auth.h> 4 #include <fcall.h> 5 6 #define CHAR(x) f->x = *p++ 7 #define SHORT(x) f->x = (p[0] | (p[1]<<8)); p += 2 8 #define LONG(x) f->x = (p[0] | (p[1]<<8) |\ 9 (p[2]<<16) | (p[3]<<24)); p += 4 10 #define VLONG(x) f->x = (p[0] | (p[1]<<8) |\ 11 (p[2]<<16) | (p[3]<<24)); p += 8 12 #define STRING(x,n) memmove(f->x, p, n); p += n 13 14 int 15 convM2S(char *ap, Fcall *f, int n) 16 { 17 uchar *p; 18 19 p = (uchar*)ap; 20 CHAR(type); 21 SHORT(tag); 22 switch(f->type) 23 { 24 default: 25 return 0; 26 27 case Tnop: 28 case Tosession: 29 break; 30 31 case Tsession: 32 STRING(chal, sizeof(f->chal)); 33 break; 34 35 case Tflush: 36 SHORT(oldtag); 37 break; 38 39 case Tattach: 40 SHORT(fid); 41 STRING(uname, sizeof(f->uname)); 42 STRING(aname, sizeof(f->aname)); 43 STRING(ticket, sizeof(f->ticket)); 44 STRING(auth, sizeof(f->auth)); 45 break; 46 47 case Toattach: 48 SHORT(fid); 49 STRING(uname, sizeof(f->uname)); 50 STRING(aname, sizeof(f->aname)); 51 STRING(ticket, NAMELEN); 52 break; 53 54 case Tauth: 55 SHORT(fid); 56 STRING(uname, sizeof(f->uname)); 57 STRING(ticket, 8+NAMELEN); 58 break; 59 60 case Tclone: 61 SHORT(fid); 62 SHORT(newfid); 63 break; 64 65 case Twalk: 66 SHORT(fid); 67 STRING(name, sizeof(f->name)); 68 break; 69 70 case Topen: 71 SHORT(fid); 72 CHAR(mode); 73 break; 74 75 case Tcreate: 76 SHORT(fid); 77 STRING(name, sizeof(f->name)); 78 LONG(perm); 79 CHAR(mode); 80 break; 81 82 case Tread: 83 SHORT(fid); 84 VLONG(offset); 85 SHORT(count); 86 break; 87 88 case Twrite: 89 SHORT(fid); 90 VLONG(offset); 91 SHORT(count); 92 p++; /* pad(1) */ 93 f->data = (char*)p; p += f->count; 94 break; 95 96 case Tclunk: 97 SHORT(fid); 98 break; 99 100 case Tremove: 101 SHORT(fid); 102 break; 103 104 case Tstat: 105 SHORT(fid); 106 break; 107 108 case Twstat: 109 SHORT(fid); 110 STRING(stat, sizeof(f->stat)); 111 break; 112 113 case Tclwalk: 114 SHORT(fid); 115 SHORT(newfid); 116 STRING(name, sizeof(f->name)); 117 break; 118 /* 119 */ 120 case Rnop: 121 case Rosession: 122 break; 123 124 case Rsession: 125 STRING(chal, sizeof(f->chal)); 126 STRING(authid, sizeof(f->authid)); 127 STRING(authdom, sizeof(f->authdom)); 128 break; 129 130 case Rerror: 131 STRING(ename, sizeof(f->ename)); 132 break; 133 134 case Rflush: 135 break; 136 137 case Rattach: 138 SHORT(fid); 139 LONG(qid.path); 140 LONG(qid.vers); 141 STRING(rauth, sizeof(f->rauth)); 142 break; 143 144 case Roattach: 145 SHORT(fid); 146 LONG(qid.path); 147 LONG(qid.vers); 148 break; 149 150 case Rauth: 151 SHORT(fid); 152 STRING(ticket, 8+8+7+7); 153 break; 154 155 case Rclone: 156 SHORT(fid); 157 break; 158 159 case Rwalk: 160 case Rclwalk: 161 SHORT(fid); 162 LONG(qid.path); 163 LONG(qid.vers); 164 break; 165 166 case Ropen: 167 SHORT(fid); 168 LONG(qid.path); 169 LONG(qid.vers); 170 break; 171 172 case Rcreate: 173 SHORT(fid); 174 LONG(qid.path); 175 LONG(qid.vers); 176 break; 177 178 case Rread: 179 SHORT(fid); 180 SHORT(count); 181 p++; /* pad(1) */ 182 f->data = (char*)p; p += f->count; 183 break; 184 185 case Rwrite: 186 SHORT(fid); 187 SHORT(count); 188 break; 189 190 case Rclunk: 191 SHORT(fid); 192 break; 193 194 case Rremove: 195 SHORT(fid); 196 break; 197 198 case Rstat: 199 SHORT(fid); 200 STRING(stat, sizeof(f->stat)); 201 break; 202 203 case Rwstat: 204 SHORT(fid); 205 break; 206 } 207 if((uchar*)ap+n == p) 208 return n; 209 return 0; 210 } 211