sub.c 25 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273127412751276127712781279128012811282128312841285128612871288128912901291129212931294129512961297129812991300130113021303130413051306130713081309131013111312131313141315131613171318131913201321132213231324132513261327132813291330133113321333133413351336133713381339134013411342134313441345134613471348134913501351135213531354135513561357135813591360136113621363136413651366136713681369137013711372137313741375137613771378137913801381138213831384138513861387138813891390139113921393139413951396139713981399140014011402140314041405140614071408140914101411141214131414141514161417141814191420142114221423142414251426142714281429143014311432143314341435143614371438143914401441144214431444144514461447144814491450145114521453145414551456145714581459146014611462146314641465146614671468146914701471147214731474147514761477147814791480148114821483148414851486148714881489149014911492149314941495149614971498149915001501150215031504150515061507150815091510151115121513151415151516151715181519152015211522152315241525152615271528152915301531153215331534153515361537153815391540154115421543154415451546154715481549155015511552155315541555155615571558155915601561156215631564156515661567156815691570157115721573157415751576157715781579158015811582158315841585158615871588158915901591159215931594159515961597159815991600160116021603160416051606160716081609161016111612161316141615161616171618161916201621162216231624162516261627162816291630163116321633163416351636163716381639164016411642164316441645164616471648
  1. #include "all.h"
  2. #include "io.h"
  3. #ifdef OLD
  4. #define swaboff swab4
  5. #else
  6. #define swaboff swab8
  7. #endif
  8. Filsys*
  9. fsstr(char *p)
  10. {
  11. Filsys *fs;
  12. for(fs=filsys; fs->name; fs++)
  13. if(strcmp(fs->name, p) == 0)
  14. return fs;
  15. return 0;
  16. }
  17. Filsys*
  18. dev2fs(Device *dev)
  19. {
  20. Filsys *fs;
  21. for(fs=filsys; fs->name; fs++)
  22. if(fs->dev == dev)
  23. return fs;
  24. return 0;
  25. }
  26. /*
  27. * allocate 'count' contiguous channels
  28. * of type 'type' and return pointer to base
  29. */
  30. Chan*
  31. chaninit(int type, int count, int data)
  32. {
  33. uchar *p;
  34. Chan *cp, *icp;
  35. int i;
  36. p = ialloc(count * (sizeof(Chan)+data), 0);
  37. icp = (Chan*)p;
  38. for(i=0; i<count; i++) {
  39. cp = (Chan*)p;
  40. cp->next = chans;
  41. chans = cp;
  42. cp->type = type;
  43. cp->chan = cons.chano;
  44. cons.chano++;
  45. strncpy(cp->whoname, "<none>", sizeof(cp->whoname));
  46. dofilter(&cp->work, C0a, C0b, 1);
  47. dofilter(&cp->rate, C0a, C0b, 1000);
  48. wlock(&cp->reflock);
  49. wunlock(&cp->reflock);
  50. rlock(&cp->reflock);
  51. runlock(&cp->reflock);
  52. p += sizeof(Chan);
  53. if(data){
  54. cp->pdata = p;
  55. p += data;
  56. }
  57. }
  58. return icp;
  59. }
  60. void
  61. fileinit(Chan *cp)
  62. {
  63. File *f, *prev;
  64. Tlock *t;
  65. int h;
  66. loop:
  67. lock(&flock);
  68. for (h=0; h<nelem(flist); h++)
  69. for (prev=0, f=flist[h]; f; prev=f, f=f->next) {
  70. if(f->cp != cp)
  71. continue;
  72. if(prev) {
  73. prev->next = f->next;
  74. f->next = flist[h];
  75. flist[h] = f;
  76. }
  77. flist[h] = f->next;
  78. unlock(&flock);
  79. qlock(f);
  80. if(t = f->tlock) {
  81. if(t->file == f)
  82. t->time = 0; /* free the lock */
  83. f->tlock = 0;
  84. }
  85. if(f->open & FREMOV)
  86. doremove(f, 0);
  87. freewp(f->wpath);
  88. f->open = 0;
  89. authfree(f->auth);
  90. f->auth = 0;
  91. f->cp = 0;
  92. qunlock(f);
  93. goto loop;
  94. }
  95. unlock(&flock);
  96. }
  97. #define NOFID (ulong)~0
  98. /*
  99. * returns a locked file structure
  100. */
  101. File*
  102. filep(Chan *cp, ulong fid, int flag)
  103. {
  104. File *f;
  105. int h;
  106. if(fid == NOFID)
  107. return 0;
  108. h = (long)cp + fid;
  109. if(h < 0)
  110. h = ~h;
  111. h %= nelem(flist);
  112. loop:
  113. lock(&flock);
  114. for(f=flist[h]; f; f=f->next)
  115. if(f->fid == fid && f->cp == cp){
  116. /*
  117. * Already in use is an error
  118. * when called from attach or clone (walk
  119. * in 9P2000). The console uses FID[12] and
  120. * never clunks them so catch that case.
  121. */
  122. if(flag == 0 || cp == cons.chan)
  123. goto out;
  124. unlock(&flock);
  125. return 0;
  126. }
  127. if(flag) {
  128. f = newfp();
  129. if(f) {
  130. f->fid = fid;
  131. f->cp = cp;
  132. f->wpath = 0;
  133. f->tlock = 0;
  134. f->doffset = 0;
  135. f->dslot = 0;
  136. f->auth = 0;
  137. f->next = flist[h];
  138. flist[h] = f;
  139. goto out;
  140. }
  141. }
  142. unlock(&flock);
  143. return 0;
  144. out:
  145. unlock(&flock);
  146. qlock(f);
  147. if(f->fid == fid && f->cp == cp)
  148. return f;
  149. qunlock(f);
  150. goto loop;
  151. }
  152. /*
  153. * always called with flock locked
  154. */
  155. File*
  156. newfp(void)
  157. {
  158. static int first;
  159. File *f;
  160. int start, i;
  161. i = first;
  162. start = i;
  163. do {
  164. f = &files[i];
  165. i++;
  166. if(i >= conf.nfile)
  167. i = 0;
  168. if(f->cp)
  169. continue;
  170. first = i;
  171. return f;
  172. } while(i != start);
  173. print("out of files\n");
  174. return 0;
  175. }
  176. void
  177. freefp(File *fp)
  178. {
  179. Chan *cp;
  180. File *f, *prev;
  181. int h;
  182. if(!fp || !(cp = fp->cp))
  183. return;
  184. h = (long)cp + fp->fid;
  185. if(h < 0)
  186. h = ~h;
  187. h %= nelem(flist);
  188. lock(&flock);
  189. for(prev=0,f=flist[h]; f; prev=f,f=f->next)
  190. if(f == fp) {
  191. if(prev)
  192. prev->next = f->next;
  193. else
  194. flist[h] = f->next;
  195. break;
  196. }
  197. fp->cp = 0;
  198. unlock(&flock);
  199. }
  200. int
  201. iaccess(File *f, Dentry *d, int m)
  202. {
  203. /* uid none gets only other permissions */
  204. if(f->uid != 0) {
  205. /*
  206. * owner
  207. */
  208. if(f->uid == d->uid)
  209. if((m<<6) & d->mode)
  210. return 0;
  211. /*
  212. * group membership
  213. */
  214. if(ingroup(f->uid, d->gid))
  215. if((m<<3) & d->mode)
  216. return 0;
  217. }
  218. /*
  219. * other
  220. */
  221. if(m & d->mode) {
  222. if((d->mode & DDIR) && (m == DEXEC))
  223. return 0;
  224. if(!ingroup(f->uid, 9999))
  225. return 0;
  226. }
  227. /*
  228. * various forms of superuser
  229. */
  230. if(wstatallow)
  231. return 0;
  232. if(duallow != 0 && duallow == f->uid)
  233. if((d->mode & DDIR) && (m == DREAD || m == DEXEC))
  234. return 0;
  235. return 1;
  236. }
  237. Tlock*
  238. tlocked(Iobuf *p, Dentry *d)
  239. {
  240. Tlock *t, *t1;
  241. Off qpath;
  242. Timet tim;
  243. Device *dev;
  244. tim = toytime();
  245. qpath = d->qid.path;
  246. dev = p->dev;
  247. again:
  248. t1 = 0;
  249. for(t=tlocks+NTLOCK-1; t>=tlocks; t--) {
  250. if(t->qpath == qpath)
  251. if(t->time >= tim)
  252. if(t->dev == dev)
  253. return nil; /* its locked */
  254. if(t1 != nil && t->time == 0)
  255. t1 = t; /* remember free lock */
  256. }
  257. if(t1 == 0) {
  258. // reclaim old locks
  259. lock(&tlocklock);
  260. for(t=tlocks+NTLOCK-1; t>=tlocks; t--)
  261. if(t->time < tim) {
  262. t->time = 0;
  263. t1 = t;
  264. }
  265. unlock(&tlocklock);
  266. }
  267. if(t1) {
  268. lock(&tlocklock);
  269. if(t1->time != 0) {
  270. unlock(&tlocklock);
  271. goto again;
  272. }
  273. t1->dev = dev;
  274. t1->qpath = qpath;
  275. t1->time = tim + TLOCK;
  276. unlock(&tlocklock);
  277. }
  278. /* botch
  279. * out of tlock nodes simulates
  280. * a locked file
  281. */
  282. return t1;
  283. }
  284. Wpath*
  285. newwp(void)
  286. {
  287. static int si = 0;
  288. int i;
  289. Wpath *w, *sw, *ew;
  290. i = si + 1;
  291. if(i < 0 || i >= conf.nwpath)
  292. i = 0;
  293. si = i;
  294. sw = &wpaths[i];
  295. ew = &wpaths[conf.nwpath];
  296. for(w=sw;;) {
  297. w++;
  298. if(w >= ew)
  299. w = &wpaths[0];
  300. if(w == sw) {
  301. print("out of wpaths\n");
  302. return 0;
  303. }
  304. if(w->refs)
  305. continue;
  306. lock(&wpathlock);
  307. if(w->refs) {
  308. unlock(&wpathlock);
  309. continue;
  310. }
  311. w->refs = 1;
  312. w->up = 0;
  313. unlock(&wpathlock);
  314. return w;
  315. }
  316. }
  317. void
  318. freewp(Wpath *w)
  319. {
  320. lock(&wpathlock);
  321. for(; w; w=w->up)
  322. w->refs--;
  323. unlock(&wpathlock);
  324. }
  325. Off
  326. qidpathgen(Device *dev)
  327. {
  328. Iobuf *p;
  329. Superb *sb;
  330. Off path;
  331. p = getbuf(dev, superaddr(dev), Bread|Bmod);
  332. if(!p || checktag(p, Tsuper, QPSUPER))
  333. panic("newqid: super block");
  334. sb = (Superb*)p->iobuf;
  335. sb->qidgen++;
  336. path = sb->qidgen;
  337. putbuf(p);
  338. return path;
  339. }
  340. /* truncating to length > 0 */
  341. static void
  342. truncfree(Truncstate *ts, Device *dev, int d, Iobuf *p, int i)
  343. {
  344. int pastlast;
  345. Off a;
  346. pastlast = ts->pastlast;
  347. a = ((Off *)p->iobuf)[i];
  348. if (d > 0 || pastlast)
  349. buffree(dev, a, d, ts);
  350. if (pastlast) {
  351. ((Off *)p->iobuf)[i] = 0;
  352. p->flags |= Bmod|Bimm;
  353. } else if (d == 0 && ts->relblk == ts->lastblk)
  354. ts->pastlast = 1;
  355. if (d == 0)
  356. ts->relblk++;
  357. }
  358. /*
  359. * free the block at `addr' on dev.
  360. * if it's an indirect block (d [depth] > 0),
  361. * first recursively free all the blocks it names.
  362. *
  363. * ts->relblk is the block number within the file of this
  364. * block (or the first data block eventually pointed to via
  365. * this indirect block).
  366. */
  367. void
  368. buffree(Device *dev, Off addr, int d, Truncstate *ts)
  369. {
  370. Iobuf *p;
  371. Off a;
  372. int i, pastlast;
  373. if(!addr)
  374. return;
  375. pastlast = (ts == nil? 1: ts->pastlast);
  376. /*
  377. * if this is an indirect block, recurse and free any
  378. * suitable blocks within it (possibly via further indirect blocks).
  379. */
  380. if(d > 0) {
  381. d--;
  382. p = getbuf(dev, addr, Bread);
  383. if(p) {
  384. if (ts == nil) /* common case: create */
  385. for(i=INDPERBUF-1; i>=0; i--) {
  386. a = ((Off *)p->iobuf)[i];
  387. buffree(dev, a, d, nil);
  388. }
  389. else /* wstat truncation */
  390. for (i = 0; i < INDPERBUF; i++)
  391. truncfree(ts, dev, d, p, i);
  392. putbuf(p);
  393. }
  394. }
  395. if (!pastlast)
  396. return;
  397. /*
  398. * having zeroed the pointer to this block, add it to the free list.
  399. * stop outstanding i/o
  400. */
  401. p = getbuf(dev, addr, Bprobe);
  402. if(p) {
  403. p->flags &= ~(Bmod|Bimm);
  404. putbuf(p);
  405. }
  406. /*
  407. * dont put written worm
  408. * blocks into free list
  409. */
  410. if(dev->type == Devcw) {
  411. i = cwfree(dev, addr);
  412. if(i)
  413. return;
  414. }
  415. p = getbuf(dev, superaddr(dev), Bread|Bmod);
  416. if(!p || checktag(p, Tsuper, QPSUPER))
  417. panic("buffree: super block");
  418. addfree(dev, addr, (Superb*)p->iobuf);
  419. putbuf(p);
  420. }
  421. Off
  422. bufalloc(Device *dev, int tag, long qid, int uid)
  423. {
  424. Iobuf *bp, *p;
  425. Superb *sb;
  426. Off a, n;
  427. p = getbuf(dev, superaddr(dev), Bread|Bmod);
  428. if(!p || checktag(p, Tsuper, QPSUPER)) {
  429. print("bufalloc: super block\n");
  430. if(p)
  431. putbuf(p);
  432. return 0;
  433. }
  434. sb = (Superb*)p->iobuf;
  435. loop:
  436. n = --sb->fbuf.nfree;
  437. sb->tfree--;
  438. if(n < 0 || n >= FEPERBUF) {
  439. print("bufalloc: %Z: bad freelist\n", dev);
  440. n = 0;
  441. sb->fbuf.free[0] = 0;
  442. }
  443. a = sb->fbuf.free[n];
  444. if(n <= 0) {
  445. if(a == 0) {
  446. sb->tfree = 0;
  447. sb->fbuf.nfree = 1;
  448. if(dev->type == Devcw) {
  449. n = uid;
  450. if(n < 0 || n >= nelem(growacct))
  451. n = 0;
  452. growacct[n]++;
  453. if(cwgrow(dev, sb, uid))
  454. goto loop;
  455. }
  456. putbuf(p);
  457. print("fs %Z full uid=%d\n", dev, uid);
  458. return 0;
  459. }
  460. bp = getbuf(dev, a, Bread);
  461. if(!bp || checktag(bp, Tfree, QPNONE)) {
  462. if(bp)
  463. putbuf(bp);
  464. putbuf(p);
  465. return 0;
  466. }
  467. sb->fbuf = *(Fbuf*)bp->iobuf;
  468. putbuf(bp);
  469. }
  470. bp = getbuf(dev, a, Bmod);
  471. memset(bp->iobuf, 0, RBUFSIZE);
  472. settag(bp, tag, qid);
  473. if(tag == Tind1 || tag == Tind2 || tag == Tdir)
  474. bp->flags |= Bimm;
  475. putbuf(bp);
  476. putbuf(p);
  477. return a;
  478. }
  479. /*
  480. * what are legal characters in a name?
  481. * only disallow control characters.
  482. * a) utf avoids control characters.
  483. * b) '/' may not be the separator
  484. */
  485. int
  486. checkname(char *n)
  487. {
  488. int i, c;
  489. for(i=0; i<NAMELEN; i++) {
  490. c = *n & 0xff;
  491. if(c == 0) {
  492. if(i == 0)
  493. return 1;
  494. memset(n, 0, NAMELEN-i);
  495. return 0;
  496. }
  497. if(c <= 040)
  498. return 1;
  499. n++;
  500. }
  501. return 1; /* too long */
  502. }
  503. void
  504. addfree(Device *dev, Off addr, Superb *sb)
  505. {
  506. int n;
  507. Iobuf *p;
  508. n = sb->fbuf.nfree;
  509. if(n < 0 || n > FEPERBUF)
  510. panic("addfree: bad freelist");
  511. if(n >= FEPERBUF) {
  512. p = getbuf(dev, addr, Bmod|Bimm);
  513. if(p == 0)
  514. panic("addfree: getbuf");
  515. *(Fbuf*)p->iobuf = sb->fbuf;
  516. settag(p, Tfree, QPNONE);
  517. putbuf(p);
  518. n = 0;
  519. }
  520. sb->fbuf.free[n++] = addr;
  521. sb->fbuf.nfree = n;
  522. sb->tfree++;
  523. if(addr >= sb->fsize)
  524. sb->fsize = addr+1;
  525. }
  526. static int
  527. Yfmt(Fmt* fmt)
  528. {
  529. Chan *cp;
  530. char s[20];
  531. cp = va_arg(fmt->args, Chan*);
  532. sprint(s, "C%d.%.3d", cp->type, cp->chan);
  533. return fmtstrcpy(fmt, s);
  534. }
  535. static int
  536. Zfmt(Fmt* fmt)
  537. {
  538. Device *d;
  539. int c, c1;
  540. char s[100];
  541. d = va_arg(fmt->args, Device*);
  542. if(d == 0) {
  543. sprint(s, "Z***");
  544. goto out;
  545. }
  546. switch(d->type) {
  547. default:
  548. sprint(s, "D%d", d->type);
  549. break;
  550. case Devwren:
  551. c = 'w';
  552. goto d1;
  553. case Devide:
  554. c = 'h';
  555. goto d1;
  556. case Devmarvsata:
  557. c = 'm';
  558. goto d1;
  559. case Devworm:
  560. c = 'r';
  561. goto d1;
  562. case Devlworm:
  563. c = 'l';
  564. goto d1;
  565. d1:
  566. if(d->wren.ctrl == 0 && d->wren.lun == 0)
  567. sprint(s, "%c%d", c, d->wren.targ);
  568. else
  569. sprint(s, "%c%d.%d.%d", c, d->wren.ctrl, d->wren.targ, d->wren.lun);
  570. break;
  571. case Devmcat:
  572. c = '(';
  573. c1 = ')';
  574. goto d2;
  575. case Devmlev:
  576. c = '[';
  577. c1 = ']';
  578. goto d2;
  579. case Devmirr:
  580. c = '{';
  581. c1 = '}';
  582. d2:
  583. if(d->cat.first == d->cat.last)
  584. sprint(s, "%c%Z%c", c, d->cat.first, c1);
  585. else
  586. if(d->cat.first->link == d->cat.last)
  587. sprint(s, "%c%Z%Z%c", c, d->cat.first, d->cat.last, c1);
  588. else
  589. sprint(s, "%c%Z-%Z%c", c, d->cat.first, d->cat.last, c1);
  590. break;
  591. case Devro:
  592. sprint(s, "o%Z%Z", d->ro.parent->cw.c, d->ro.parent->cw.w);
  593. break;
  594. case Devcw:
  595. sprint(s, "c%Z%Z", d->cw.c, d->cw.w);
  596. break;
  597. case Devjuke:
  598. sprint(s, "j%Z%Z", d->j.j, d->j.m);
  599. break;
  600. case Devfworm:
  601. sprint(s, "f%Z", d->fw.fw);
  602. break;
  603. case Devpart:
  604. sprint(s, "p(%Z)%ld.%ld",
  605. d->part.d, d->part.base, d->part.size);
  606. break;
  607. case Devswab:
  608. sprint(s, "x%Z", d->swab.d);
  609. break;
  610. case Devnone:
  611. sprint(s, "n");
  612. break;
  613. }
  614. out:
  615. return fmtstrcpy(fmt, s);
  616. }
  617. static int
  618. Wfmt(Fmt* fmt)
  619. {
  620. Filter* a;
  621. char s[30];
  622. a = va_arg(fmt->args, Filter*);
  623. snprint(s, sizeof s, "%lud", fdf(a->filter, a->c3*a->c1));
  624. return fmtstrcpy(fmt, s);
  625. }
  626. static int
  627. Gfmt(Fmt* fmt)
  628. {
  629. int t;
  630. char *s;
  631. t = va_arg(fmt->args, int);
  632. s = "<badtag>";
  633. if(t >= 0 && t < MAXTAG)
  634. s = tagnames[t];
  635. return fmtstrcpy(fmt, s);
  636. }
  637. static int
  638. Efmt(Fmt* fmt)
  639. {
  640. char s[64];
  641. uchar *p;
  642. p = va_arg(fmt->args, uchar*);
  643. sprint(s, "%.2ux%.2ux%.2ux%.2ux%.2ux%.2ux",
  644. p[0], p[1], p[2], p[3], p[4], p[5]);
  645. return fmtstrcpy(fmt, s);
  646. }
  647. static int
  648. Ifmt(Fmt* fmt)
  649. {
  650. char s[64];
  651. uchar *p;
  652. p = va_arg(fmt->args, uchar*);
  653. sprint(s, "%d.%d.%d.%d", p[0], p[1], p[2], p[3]);
  654. return fmtstrcpy(fmt, s);
  655. }
  656. void
  657. formatinit(void)
  658. {
  659. quotefmtinstall();
  660. fmtinstall('Y', Yfmt); /* print channels */
  661. fmtinstall('Z', Zfmt); /* print devices */
  662. fmtinstall('W', Wfmt); /* print filters */
  663. fmtinstall('G', Gfmt); /* print tags */
  664. fmtinstall('T', Tfmt); /* print times */
  665. fmtinstall('E', Efmt); /* print ether addresses */
  666. fmtinstall('I', Ifmt); /* print ip addresses */
  667. }
  668. void
  669. rootream(Device *dev, Off addr)
  670. {
  671. Iobuf *p;
  672. Dentry *d;
  673. p = getbuf(dev, addr, Bmod|Bimm);
  674. memset(p->iobuf, 0, RBUFSIZE);
  675. settag(p, Tdir, QPROOT);
  676. d = getdir(p, 0);
  677. strcpy(d->name, "/");
  678. d->uid = -1;
  679. d->gid = -1;
  680. d->mode = DALLOC | DDIR |
  681. ((DREAD|DEXEC) << 6) |
  682. ((DREAD|DEXEC) << 3) |
  683. ((DREAD|DEXEC) << 0);
  684. d->qid = QID9P1(QPROOT|QPDIR,0);
  685. d->atime = time();
  686. d->mtime = d->atime;
  687. d->muid = 0;
  688. putbuf(p);
  689. }
  690. void
  691. superream(Device *dev, Off addr)
  692. {
  693. Iobuf *p;
  694. Superb *s;
  695. Off i;
  696. p = getbuf(dev, addr, Bmod|Bimm);
  697. memset(p->iobuf, 0, RBUFSIZE);
  698. settag(p, Tsuper, QPSUPER);
  699. s = (Superb*)p->iobuf;
  700. s->fstart = 2;
  701. s->fsize = devsize(dev);
  702. s->fbuf.nfree = 1;
  703. s->qidgen = 10;
  704. #ifdef AUTOSWAB
  705. s->magic = 0x123456789abcdef0;
  706. #endif
  707. for(i=s->fsize-1; i>=addr+2; i--)
  708. addfree(dev, i, s);
  709. putbuf(p);
  710. }
  711. struct
  712. {
  713. Lock;
  714. Msgbuf *smsgbuf;
  715. Msgbuf *lmsgbuf;
  716. } msgalloc;
  717. /*
  718. * pre-allocate some message buffers at boot time.
  719. * if this supply is exhausted, more will be allocated as needed.
  720. */
  721. void
  722. mbinit(void)
  723. {
  724. Msgbuf *mb;
  725. Rabuf *rb;
  726. int i;
  727. lock(&msgalloc);
  728. unlock(&msgalloc);
  729. msgalloc.lmsgbuf = 0;
  730. msgalloc.smsgbuf = 0;
  731. for(i=0; i<conf.nlgmsg; i++) {
  732. mb = ialloc(sizeof(Msgbuf), 0);
  733. if(1)
  734. mb->xdata = ialloc(LARGEBUF+256, 256);
  735. else
  736. mb->xdata = ialloc(LARGEBUF+OFFMSG, LINESIZE);
  737. mb->flags = LARGE;
  738. mb->free = 0;
  739. mbfree(mb);
  740. cons.nlarge++;
  741. }
  742. for(i=0; i<conf.nsmmsg; i++) {
  743. mb = ialloc(sizeof(Msgbuf), 0);
  744. if(1)
  745. mb->xdata = ialloc(SMALLBUF+256, 256);
  746. else
  747. mb->xdata = ialloc(SMALLBUF+OFFMSG, LINESIZE);
  748. mb->flags = 0;
  749. mb->free = 0;
  750. mbfree(mb);
  751. cons.nsmall++;
  752. }
  753. memset(mballocs, 0, sizeof(mballocs));
  754. lock(&rabuflock);
  755. unlock(&rabuflock);
  756. rabuffree = 0;
  757. for(i=0; i<1000; i++) {
  758. rb = ialloc(sizeof(*rb), 0);
  759. rb->link = rabuffree;
  760. rabuffree = rb;
  761. }
  762. }
  763. Msgbuf*
  764. mballoc(int count, Chan *cp, int category)
  765. {
  766. Msgbuf *mb;
  767. ilock(&msgalloc);
  768. if(count > SMALLBUF) {
  769. if(count > LARGEBUF)
  770. panic("msgbuf count");
  771. mb = msgalloc.lmsgbuf;
  772. if(mb == 0) {
  773. mb = ialloc(sizeof(Msgbuf), 0);
  774. if(1)
  775. mb->xdata = ialloc(LARGEBUF+256, 256);
  776. else
  777. mb->xdata = ialloc(LARGEBUF+OFFMSG, LINESIZE);
  778. mb->free = 0;
  779. cons.nlarge++;
  780. } else
  781. msgalloc.lmsgbuf = mb->next;
  782. mb->flags = LARGE;
  783. } else {
  784. mb = msgalloc.smsgbuf;
  785. if(mb == 0) {
  786. mb = ialloc(sizeof(Msgbuf), 0);
  787. if(1)
  788. mb->xdata = ialloc(SMALLBUF+256, 256);
  789. else
  790. mb->xdata = ialloc(SMALLBUF+OFFMSG, LINESIZE);
  791. mb->free = 0;
  792. cons.nsmall++;
  793. } else
  794. msgalloc.smsgbuf = mb->next;
  795. mb->flags = 0;
  796. }
  797. mballocs[category]++;
  798. iunlock(&msgalloc);
  799. mb->count = count;
  800. mb->chan = cp;
  801. mb->next = 0;
  802. mb->param = 0;
  803. mb->category = category;
  804. if(1)
  805. mb->data = mb->xdata+256;
  806. else
  807. mb->data = mb->xdata+OFFMSG;
  808. mb->free = 0;
  809. return mb;
  810. }
  811. void
  812. mbfree(Msgbuf *mb)
  813. {
  814. if(mb == nil)
  815. return;
  816. if(mb->flags & BTRACE)
  817. print("mbfree: BTRACE cat=%d flags=%ux, caller 0x%lux\n",
  818. mb->category, mb->flags, getcallerpc(&mb));
  819. /*
  820. * drivers which perform non cache coherent DMA manage their own buffer
  821. * pool of uncached buffers and provide their own free routine.
  822. * this is provided mainly for ethernet drivers ported from cpu kernel.
  823. */
  824. if(mb->flags&Mbrcvbuf) {
  825. if (mb->free == nil)
  826. panic("freeb: nil mb->free");
  827. (*mb->free)(mb);
  828. return;
  829. }
  830. if(mb->flags & FREE)
  831. panic("mbfree already free");
  832. ilock(&msgalloc);
  833. mballocs[mb->category]--;
  834. mb->flags |= FREE;
  835. if(mb->flags & LARGE) {
  836. mb->next = msgalloc.lmsgbuf;
  837. msgalloc.lmsgbuf = mb;
  838. } else {
  839. mb->next = msgalloc.smsgbuf;
  840. msgalloc.smsgbuf = mb;
  841. }
  842. mb->data = 0;
  843. mb->free = 0;
  844. iunlock(&msgalloc);
  845. }
  846. /*
  847. * returns 1 if n is prime
  848. * used for adjusting lengths
  849. * of hashing things.
  850. * there is no need to be clever
  851. */
  852. int
  853. prime(vlong n)
  854. {
  855. long i;
  856. if((n%2) == 0)
  857. return 0;
  858. for(i=3;; i+=2) {
  859. if((n%i) == 0)
  860. return 0;
  861. if((vlong)i*i >= n)
  862. return 1;
  863. }
  864. }
  865. char*
  866. getwd(char *word, char *line)
  867. {
  868. int c, n;
  869. while(*line == ' ')
  870. line++;
  871. for(n=0; n<Maxword; n++) {
  872. c = *line;
  873. if(c == ' ' || c == 0 || c == '\n')
  874. break;
  875. line++;
  876. *word++ = c;
  877. }
  878. *word = 0;
  879. return line;
  880. }
  881. void
  882. hexdump(void *a, int n)
  883. {
  884. char s1[30], s2[4];
  885. uchar *p;
  886. int i;
  887. p = a;
  888. s1[0] = 0;
  889. for(i=0; i<n; i++) {
  890. sprint(s2, " %.2ux", p[i]);
  891. strcat(s1, s2);
  892. if((i&7) == 7) {
  893. print("%s\n", s1);
  894. s1[0] = 0;
  895. }
  896. }
  897. if(s1[0])
  898. print("%s\n", s1);
  899. }
  900. void*
  901. recv(Queue *q, int)
  902. {
  903. User *p;
  904. void *a;
  905. int i, c;
  906. long s;
  907. if(q == 0)
  908. panic("recv null q");
  909. for(;;) {
  910. lock(q);
  911. c = q->count;
  912. if(c > 0) {
  913. i = q->loc;
  914. a = q->args[i];
  915. i++;
  916. if(i >= q->size)
  917. i = 0;
  918. q->loc = i;
  919. q->count = c-1;
  920. p = q->whead;
  921. if(p) {
  922. q->whead = p->qnext;
  923. if(q->whead == 0)
  924. q->wtail = 0;
  925. ready(p);
  926. }
  927. unlock(q);
  928. return a;
  929. }
  930. p = q->rtail;
  931. if(p == 0)
  932. q->rhead = u;
  933. else
  934. p->qnext = u;
  935. q->rtail = u;
  936. u->qnext = 0;
  937. s = splhi();
  938. u->state = Recving;
  939. unlock(q);
  940. sched();
  941. splx(s);
  942. }
  943. }
  944. void
  945. send(Queue *q, void *a)
  946. {
  947. User *p;
  948. int i, c;
  949. long s;
  950. if(q == 0)
  951. panic("send null q");
  952. for(;;) {
  953. lock(q);
  954. c = q->count;
  955. if(c < q->size) {
  956. i = q->loc + c;
  957. if(i >= q->size)
  958. i -= q->size;
  959. q->args[i] = a;
  960. q->count = c+1;
  961. p = q->rhead;
  962. if(p) {
  963. q->rhead = p->qnext;
  964. if(q->rhead == 0)
  965. q->rtail = 0;
  966. ready(p);
  967. }
  968. unlock(q);
  969. return;
  970. }
  971. p = q->wtail;
  972. if(p == 0)
  973. q->whead = u;
  974. else
  975. p->qnext = u;
  976. q->wtail = u;
  977. u->qnext = 0;
  978. s = splhi();
  979. u->state = Sending;
  980. unlock(q);
  981. sched();
  982. splx(s);
  983. }
  984. }
  985. Queue*
  986. newqueue(int size)
  987. {
  988. Queue *q;
  989. q = ialloc(sizeof(Queue) + (size-1)*sizeof(void*), 0);
  990. q->size = size;
  991. lock(q);
  992. unlock(q);
  993. return q;
  994. }
  995. no(void*)
  996. {
  997. return 0;
  998. }
  999. int
  1000. devread(Device *d, Off b, void *c)
  1001. {
  1002. int e;
  1003. for (;;)
  1004. switch(d->type)
  1005. {
  1006. case Devcw:
  1007. return cwread(d, b, c);
  1008. case Devjuke:
  1009. d = d->j.m;
  1010. break;
  1011. case Devro:
  1012. return roread(d, b, c);
  1013. case Devwren:
  1014. return wrenread(d, b, c);
  1015. case Devide:
  1016. return ideread(d, b, c);
  1017. case Devworm:
  1018. case Devlworm:
  1019. return wormread(d, b, c);
  1020. case Devfworm:
  1021. return fwormread(d, b, c);
  1022. case Devmcat:
  1023. return mcatread(d, b, c);
  1024. case Devmlev:
  1025. return mlevread(d, b, c);
  1026. case Devmirr:
  1027. return mirrread(d, b, c);
  1028. case Devpart:
  1029. return partread(d, b, c);
  1030. case Devswab:
  1031. e = devread(d->swab.d, b, c);
  1032. if(e == 0)
  1033. swab(c, 0);
  1034. return e;
  1035. case Devnone:
  1036. print("read from device none(%lld)\n", (Wideoff)b);
  1037. return 1;
  1038. default:
  1039. panic("illegal device in read: %Z %lld", d, (Wideoff)b);
  1040. return 1;
  1041. }
  1042. }
  1043. int
  1044. devwrite(Device *d, Off b, void *c)
  1045. {
  1046. int e;
  1047. /*
  1048. * set readonly to non-0 to prevent all writes;
  1049. * mainly for trying dangerous experiments.
  1050. */
  1051. if (readonly)
  1052. return 0;
  1053. for (;;)
  1054. switch(d->type)
  1055. {
  1056. case Devcw:
  1057. return cwwrite(d, b, c);
  1058. case Devjuke:
  1059. d = d->j.m;
  1060. break;
  1061. case Devro:
  1062. print("write to ro device %Z(%lld)\n", d, (Wideoff)b);
  1063. return 1;
  1064. case Devwren:
  1065. return wrenwrite(d, b, c);
  1066. case Devide:
  1067. return idewrite(d, b, c);
  1068. case Devworm:
  1069. case Devlworm:
  1070. return wormwrite(d, b, c);
  1071. case Devfworm:
  1072. return fwormwrite(d, b, c);
  1073. case Devmcat:
  1074. return mcatwrite(d, b, c);
  1075. case Devmlev:
  1076. return mlevwrite(d, b, c);
  1077. case Devmirr:
  1078. return mirrwrite(d, b, c);
  1079. case Devpart:
  1080. return partwrite(d, b, c);
  1081. case Devswab:
  1082. swab(c, 1);
  1083. e = devwrite(d->swab.d, b, c);
  1084. swab(c, 0);
  1085. return e;
  1086. case Devnone:
  1087. /* checktag() can generate blocks with type devnone */
  1088. return 0;
  1089. default:
  1090. panic("illegal device in write: %Z %ld", d, b);
  1091. return 1;
  1092. }
  1093. }
  1094. Devsize
  1095. devsize(Device *d)
  1096. {
  1097. for (;;)
  1098. switch(d->type)
  1099. {
  1100. case Devcw:
  1101. case Devro:
  1102. return cwsize(d);
  1103. case Devjuke:
  1104. d = d->j.m;
  1105. break;
  1106. case Devwren:
  1107. return wrensize(d);
  1108. case Devide:
  1109. return idesize(d);
  1110. case Devworm:
  1111. case Devlworm:
  1112. return wormsize(d);
  1113. case Devfworm:
  1114. return fwormsize(d);
  1115. case Devmcat:
  1116. return mcatsize(d);
  1117. case Devmlev:
  1118. return mlevsize(d);
  1119. case Devmirr:
  1120. return mirrsize(d);
  1121. case Devpart:
  1122. return partsize(d);
  1123. case Devswab:
  1124. d = d->swab.d;
  1125. break;
  1126. default:
  1127. panic("illegal device in dev_size: %Z", d);
  1128. return 0;
  1129. }
  1130. }
  1131. Off
  1132. superaddr(Device *d)
  1133. {
  1134. for (;;)
  1135. switch(d->type) {
  1136. default:
  1137. return SUPER_ADDR;
  1138. case Devcw:
  1139. case Devro:
  1140. return cwsaddr(d);
  1141. case Devswab:
  1142. d = d->swab.d;
  1143. break;
  1144. }
  1145. }
  1146. Off
  1147. getraddr(Device *d)
  1148. {
  1149. for (;;)
  1150. switch(d->type) {
  1151. default:
  1152. return ROOT_ADDR;
  1153. case Devcw:
  1154. case Devro:
  1155. return cwraddr(d);
  1156. case Devswab:
  1157. d = d->swab.d;
  1158. break;
  1159. }
  1160. }
  1161. void
  1162. devream(Device *d, int top)
  1163. {
  1164. Device *l;
  1165. loop:
  1166. print(" devream: %Z %d\n", d, top);
  1167. switch(d->type) {
  1168. default:
  1169. print("ream: unknown dev type %Z\n", d);
  1170. return;
  1171. case Devcw:
  1172. devream(d->cw.w, 0);
  1173. devream(d->cw.c, 0);
  1174. if(top) {
  1175. wlock(&mainlock);
  1176. cwream(d);
  1177. wunlock(&mainlock);
  1178. }
  1179. devinit(d);
  1180. return;
  1181. case Devfworm:
  1182. devream(d->fw.fw, 0);
  1183. fwormream(d);
  1184. break;
  1185. case Devpart:
  1186. devream(d->part.d, 0);
  1187. break;
  1188. case Devmlev:
  1189. case Devmcat:
  1190. case Devmirr:
  1191. for(l=d->cat.first; l; l=l->link)
  1192. devream(l, 0);
  1193. break;
  1194. case Devjuke:
  1195. case Devworm:
  1196. case Devlworm:
  1197. case Devwren:
  1198. case Devide:
  1199. case Devmarvsata:
  1200. break;
  1201. case Devswab:
  1202. d = d->swab.d;
  1203. goto loop;
  1204. }
  1205. devinit(d);
  1206. if(top) {
  1207. wlock(&mainlock);
  1208. rootream(d, ROOT_ADDR);
  1209. superream(d, SUPER_ADDR);
  1210. wunlock(&mainlock);
  1211. }
  1212. }
  1213. void
  1214. devrecover(Device *d)
  1215. {
  1216. for (;;) {
  1217. print("recover: %Z\n", d);
  1218. switch(d->type) {
  1219. default:
  1220. print("recover: unknown dev type %Z\n", d);
  1221. return;
  1222. case Devcw:
  1223. wlock(&mainlock); /* recover */
  1224. cwrecover(d);
  1225. wunlock(&mainlock);
  1226. return;
  1227. case Devswab:
  1228. d = d->swab.d;
  1229. break;
  1230. }
  1231. }
  1232. }
  1233. void
  1234. devinit(Device *d)
  1235. {
  1236. for (;;) {
  1237. if(d->init)
  1238. return;
  1239. d->init = 1;
  1240. print(" devinit %Z\n", d);
  1241. switch(d->type) {
  1242. default:
  1243. print("devinit unknown device %Z\n", d);
  1244. return;
  1245. case Devro:
  1246. cwinit(d->ro.parent);
  1247. return;
  1248. case Devcw:
  1249. cwinit(d);
  1250. return;
  1251. case Devjuke:
  1252. jukeinit(d);
  1253. return;
  1254. case Devwren:
  1255. wreninit(d);
  1256. return;
  1257. case Devide:
  1258. ideinit(d);
  1259. return;
  1260. case Devworm:
  1261. case Devlworm:
  1262. return;
  1263. case Devfworm:
  1264. fworminit(d);
  1265. return;
  1266. case Devmcat:
  1267. mcatinit(d);
  1268. return;
  1269. case Devmlev:
  1270. mlevinit(d);
  1271. return;
  1272. case Devmirr:
  1273. mirrinit(d);
  1274. return;
  1275. case Devpart:
  1276. partinit(d);
  1277. return;
  1278. case Devswab:
  1279. d = d->swab.d;
  1280. break;
  1281. case Devnone:
  1282. print("devinit of Devnone\n");
  1283. return;
  1284. }
  1285. }
  1286. }
  1287. void
  1288. swab2(void *c)
  1289. {
  1290. uchar *p;
  1291. int t;
  1292. p = c;
  1293. t = p[0];
  1294. p[0] = p[1];
  1295. p[1] = t;
  1296. }
  1297. void
  1298. swab4(void *c)
  1299. {
  1300. uchar *p;
  1301. int t;
  1302. p = c;
  1303. t = p[0];
  1304. p[0] = p[3];
  1305. p[3] = t;
  1306. t = p[1];
  1307. p[1] = p[2];
  1308. p[2] = t;
  1309. }
  1310. void
  1311. swab8(void *c)
  1312. {
  1313. uchar *p;
  1314. int t;
  1315. p = c;
  1316. t = p[0];
  1317. p[0] = p[7];
  1318. p[7] = t;
  1319. t = p[1];
  1320. p[1] = p[6];
  1321. p[6] = t;
  1322. t = p[2];
  1323. p[2] = p[5];
  1324. p[5] = t;
  1325. t = p[3];
  1326. p[3] = p[4];
  1327. p[4] = t;
  1328. }
  1329. /*
  1330. * swab a block
  1331. * flag = 0 -- convert from foreign to native
  1332. * flag = 1 -- convert from native to foreign
  1333. */
  1334. void
  1335. swab(void *c, int flag)
  1336. {
  1337. uchar *p;
  1338. Tag *t;
  1339. int i, j;
  1340. Dentry *d;
  1341. Cache *h;
  1342. Bucket *b;
  1343. Superb *s;
  1344. Fbuf *f;
  1345. Off *l;
  1346. /* swab the tag */
  1347. p = (uchar*)c;
  1348. t = (Tag*)(p + BUFSIZE);
  1349. if(!flag) {
  1350. swab2(&t->pad);
  1351. swab2(&t->tag);
  1352. swaboff(&t->path);
  1353. }
  1354. /* swab each block type */
  1355. switch(t->tag) {
  1356. default:
  1357. print("no swab for tag=%G rw=%d\n", t->tag, flag);
  1358. for(j=0; j<16; j++)
  1359. print(" %.2x", p[BUFSIZE+j]);
  1360. print("\n");
  1361. for(i=0; i<16; i++) {
  1362. print("%.4x", i*16);
  1363. for(j=0; j<16; j++)
  1364. print(" %.2x", p[i*16+j]);
  1365. print("\n");
  1366. }
  1367. panic("swab");
  1368. break;
  1369. case Tsuper:
  1370. s = (Superb*)p;
  1371. swaboff(&s->fbuf.nfree);
  1372. for(i=0; i<FEPERBUF; i++)
  1373. swaboff(&s->fbuf.free[i]);
  1374. #ifdef AUTOSWAB
  1375. swaboff(&s->magic);
  1376. #endif
  1377. swaboff(&s->fstart);
  1378. swaboff(&s->fsize);
  1379. swaboff(&s->tfree);
  1380. swaboff(&s->qidgen);
  1381. swaboff(&s->cwraddr);
  1382. swaboff(&s->roraddr);
  1383. swaboff(&s->last);
  1384. swaboff(&s->next);
  1385. break;
  1386. case Tdir:
  1387. for(i=0; i<DIRPERBUF; i++) {
  1388. d = (Dentry*)p + i;
  1389. swab2(&d->uid);
  1390. swab2(&d->gid);
  1391. swab2(&d->mode);
  1392. swab2(&d->muid);
  1393. swaboff(&d->qid.path);
  1394. swab4(&d->qid.version);
  1395. swaboff(&d->size);
  1396. for(j=0; j<NDBLOCK; j++)
  1397. swaboff(&d->dblock[j]);
  1398. for (j = 0; j < NIBLOCK; j++)
  1399. swaboff(&d->iblocks[j]);
  1400. swab4(&d->atime);
  1401. swab4(&d->mtime);
  1402. }
  1403. break;
  1404. case Tind1:
  1405. case Tind2:
  1406. #ifndef OLD
  1407. case Tind3:
  1408. case Tind4:
  1409. /* add more Tind tags here ... */
  1410. #endif
  1411. l = (Off *)p;
  1412. for(i=0; i<INDPERBUF; i++) {
  1413. swaboff(l);
  1414. l++;
  1415. }
  1416. break;
  1417. case Tfree:
  1418. f = (Fbuf*)p;
  1419. swaboff(&f->nfree);
  1420. for(i=0; i<FEPERBUF; i++)
  1421. swaboff(&f->free[i]);
  1422. break;
  1423. case Tbuck:
  1424. for(i=0; i<BKPERBLK; i++) {
  1425. b = (Bucket*)p + i;
  1426. swab4(&b->agegen);
  1427. for(j=0; j<CEPERBK; j++) {
  1428. swab2(&b->entry[j].age);
  1429. swab2(&b->entry[j].state);
  1430. swaboff(&b->entry[j].waddr);
  1431. }
  1432. }
  1433. break;
  1434. case Tcache:
  1435. h = (Cache*)p;
  1436. swaboff(&h->maddr);
  1437. swaboff(&h->msize);
  1438. swaboff(&h->caddr);
  1439. swaboff(&h->csize);
  1440. swaboff(&h->fsize);
  1441. swaboff(&h->wsize);
  1442. swaboff(&h->wmax);
  1443. swaboff(&h->sbaddr);
  1444. swaboff(&h->cwraddr);
  1445. swaboff(&h->roraddr);
  1446. swab4(&h->toytime);
  1447. swab4(&h->time);
  1448. break;
  1449. case Tnone: // unitialized
  1450. case Tfile: // someone elses problem
  1451. case Tvirgo: // bit map -- all bytes
  1452. case Tconfig: // configuration string -- all bytes
  1453. break;
  1454. }
  1455. /* swab the tag */
  1456. if(flag) {
  1457. swab2(&t->pad);
  1458. swab2(&t->tag);
  1459. swaboff(&t->path);
  1460. }
  1461. }