xref: /plan9-contrib/sys/src/libc/9sys/convM2S.c (revision 219b2ee8daee37f4aad58d63f21287faa8e4ffdc)
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