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