Subversion Repositories planix.SVN

Rev

Rev 2 | Details | Compare with Previous | Last modification | View Log | RSS feed

Rev Author Line No. Line
2 - 1
/*
2
 * stubs to make bootstrap kernels link, copies of a few functions
3
 * to avoid including system calls yet have access to i/o functions,
4
 * and some convenience routines.
5
 */
6
#include	"u.h"
7
#include	"../port/lib.h"
8
#include	"mem.h"
9
#include	"dat.h"
10
#include	"fns.h"
11
#include	"../port/error.h"
12
 
13
void (*proctrace)(Proc*, int, vlong);
14
 
15
/* devmnt.c */
16
 
17
void
18
muxclose(Mnt *)
19
{
20
}
21
 
22
Chan*
23
mntauth(Chan *, char *)
24
{
25
	return nil;
26
}
27
 
28
long
29
mntversion(Chan *, char *, int, int)
30
{
31
	return 0;
32
}
33
 
34
/* swap.c */
35
 
36
Image swapimage;
37
 
38
void
39
putswap(Page *)
40
{
41
}
42
 
43
void
44
dupswap(Page *)
45
{
46
}
47
 
48
void
49
kickpager(void)
50
{
51
}
52
 
53
int
54
swapcount(ulong)
55
{
56
	return 0;
57
}
58
 
59
void
60
pagersummary(void)
61
{
62
}
63
 
64
void
65
setswapchan(Chan *)
66
{
67
}
68
 
69
/* devenv.c */
70
 
71
void
72
closeegrp(Egrp *)
73
{
74
}
75
 
76
void
77
ksetenv(char *, char *, int)
78
{
79
}
80
 
81
/* devproc.c */
82
 
83
Segment*
84
data2txt(Segment *s)
85
{
86
	Segment *ps;
87
 
88
	ps = newseg(SG_TEXT, s->base, s->size);
89
	ps->image = s->image;
90
	incref(ps->image);
91
	ps->fstart = s->fstart;
92
	ps->flen = s->flen;
93
	ps->flushme = 1;
94
	return ps;
95
}
96
 
97
/* sysproc.c */
98
 
99
int
100
return0(void*)
101
{
102
	return 0;
103
}
104
 
105
/* syscallfmt.c */
106
void
107
syscallfmt(int, ulong, va_list)
108
{
109
}
110
 
111
void
112
sysretfmt(int, va_list, long, uvlong, uvlong)
113
{
114
}
115
 
116
/* sysfile.c */
117
 
118
int
119
newfd(Chan *)
120
{
121
	return -1;
122
}
123
 
124
void
125
validstat(uchar *s, int n)
126
{
127
	int m;
128
	char buf[64];
129
 
130
	if(statcheck(s, n) < 0)
131
		error(Ebadstat);
132
	/* verify that name entry is acceptable */
133
	s += STATFIXLEN - 4*BIT16SZ;	/* location of first string */
134
	/*
135
	 * s now points at count for first string.
136
	 * if it's too long, let the server decide; this is
137
	 * only for his protection anyway. otherwise
138
	 * we'd have to allocate and waserror.
139
	 */
140
	m = GBIT16(s);
141
	s += BIT16SZ;
142
	if(m+1 > sizeof buf)
143
		return;
144
	memmove(buf, s, m);
145
	buf[m] = '\0';
146
	/* name could be '/' */
147
	if(strcmp(buf, "/") != 0)
148
		validname(buf, 0);
149
}
150
 
151
Chan*
152
fdtochan(int fd, int mode, int chkmnt, int iref)
153
{
154
	Chan *c;
155
	Fgrp *f;
156
 
157
	c = 0;
158
	f = up->fgrp;
159
 
160
	lock(f);
161
	if(fd<0 || f->nfd<=fd || (c = f->fd[fd])==0) {
162
		unlock(f);
163
		error(Ebadfd);
164
	}
165
	if(iref)
166
		incref(c);
167
	unlock(f);
168
 
169
	if(chkmnt && (c->flag&CMSG)) {
170
		if(iref)
171
			cclose(c);
172
		error(Ebadusefd);
173
	}
174
 
175
	if(mode<0 || c->mode==ORDWR)
176
		return c;
177
 
178
	if((mode&OTRUNC) && c->mode==OREAD) {
179
		if(iref)
180
			cclose(c);
181
		error(Ebadusefd);
182
	}
183
 
184
	if((mode&~OTRUNC) != c->mode) {
185
		if(iref)
186
			cclose(c);
187
		error(Ebadusefd);
188
	}
189
 
190
	return c;
191
}
192
 
193
int
194
openmode(ulong o)
195
{
196
	o &= ~(OTRUNC|OCEXEC|ORCLOSE);
197
	if(o > OEXEC)
198
		error(Ebadarg);
199
	if(o == OEXEC)
200
		return OREAD;
201
	return o;
202
}
203
 
204
int
205
bind(char *old, char *new, int flag)
206
{
207
	int ret;
208
	Chan *c0, *c1;
209
 
210
	if((flag&~MMASK) || (flag&MORDER)==(MBEFORE|MAFTER))
211
		error(Ebadarg);
212
 
213
	c0 = namec(old, Abind, 0, 0);
214
	if(waserror()){
215
		cclose(c0);
216
		return -1;
217
	}
218
 
219
	c1 = namec(new, Amount, 0, 0);
220
	if(waserror()){
221
		cclose(c1);
222
		nexterror();
223
	}
224
 
225
	ret = cmount(&c0, c1, flag, nil);
226
 
227
	poperror();
228
	cclose(c1);
229
	poperror();
230
	cclose(c0);
231
	return ret;
232
}
233
 
234
long
235
unmount(char *name, char *old)
236
{
237
	Chan *cmount, *cmounted;
238
 
239
	cmounted = 0;
240
	cmount = namec(old, Amount, 0, 0);
241
	if(waserror()) {
242
		cclose(cmount);
243
		if(cmounted)
244
			cclose(cmounted);
245
		return -1;
246
	}
247
 
248
	if(name)
249
		/*
250
		 * This has to be namec(..., Aopen, ...) because
251
		 * if name is something like /srv/cs or /fd/0,
252
		 * opening it is the only way to get at the real
253
		 * Chan underneath.
254
		 */
255
		cmounted = namec(name, Aopen, OREAD, 0);
256
	cunmount(cmount, cmounted);
257
	poperror();
258
	cclose(cmount);
259
	if(cmounted)
260
		cclose(cmounted);
261
	return 0;
262
}
263
 
264
long
265
chdir(char *dir)
266
{
267
	Chan *c;
268
 
269
	if (waserror())
270
		return -1;
271
	c = namec(dir, Atodir, 0, 0);
272
	if (up->dot)
273
		cclose(up->dot);
274
	up->dot = c;
275
	poperror();
276
	return 0;
277
}
278
 
279
Chan *
280
namecopen(char *name, int mode)
281
{
282
	Chan *c;
283
 
284
	if (waserror())
285
		return nil;
286
	c = namec(name, Aopen, mode, 0);
287
	poperror();
288
	return c;
289
}
290
 
291
Chan *
292
enamecopen(char *name, int mode)
293
{
294
	Chan *c;
295
 
296
	c = namecopen(name, mode);
297
	if (c == nil)
298
		panic("can't open %s", name);
299
	return c;
300
}
301
 
302
Chan *
303
nameccreate(char *name, int mode)
304
{
305
	Chan *c;
306
 
307
	if (waserror())
308
		return nil;
309
	c = namec(name, Acreate, mode, 0);
310
	poperror();
311
	return c;
312
}
313
 
314
Chan *
315
enameccreate(char *name, int mode)
316
{
317
	Chan *c;
318
 
319
	c = nameccreate(name, mode);
320
	if (c == nil)
321
		panic("can't create %s", name);
322
	return c;
323
}
324
 
325
int
326
myreadn(Chan *c, void *vp, long n)
327
{
328
	char *p = vp;
329
	long nn;
330
 
331
	while(n > 0) {
332
		nn = devtab[c->type]->read(c, p, n, c->offset);
333
		if(nn == 0)
334
			break;
335
		c->offset += nn;
336
		p += nn;
337
		n -= nn;
338
	}
339
	return p - (char *)vp;
340
}
341
 
342
int
343
readfile(char *file, void *buf, int len)
344
{
345
	int n;
346
	Chan *cc;
347
 
348
	cc = nil;
349
	if (waserror()) {
350
		if (cc)
351
			cclose(cc);
352
		return -1;
353
	}
354
	cc = namecopen(file, OREAD);
355
	if (cc == nil)
356
		error("no such file");
357
	n = myreadn(cc, buf, len);
358
	poperror();
359
	cclose(cc);
360
	return n;
361
}
362
 
363
static int
364
dumpfile(char *file)
365
{
366
	int n;
367
	char *buf;
368
 
369
	buf = smalloc(Maxfile + 1);
370
	n = readfile(file, buf, Maxfile);
371
	if (n < 0)
372
		return -1;
373
	buf[n] = 0;
374
	print("%s (%d bytes):\n", file, n);
375
	print("%s\n", buf);
376
	free(buf);
377
	return 0;
378
}
379
 
380
/* main.c */
381
 
382
void
383
fpx87restore(FPsave*)
384
{
385
}
386
 
387
void
388
fpx87save(FPsave*)
389
{
390
}
391
 
392
void
393
fpssesave(FPsave *)
394
{
395
}
396
 
397
void
398
fpsserestore(FPsave *)
399
{
400
}
401
 
402
ulong
403
l2be(long l)
404
{
405
	uchar *cp;
406
 
407
	cp = (uchar*)&l;
408
	return (cp[0]<<24) | (cp[1]<<16) | (cp[2]<<8) | cp[3];
409
}