tapfs.c 1.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115
  1. #include <u.h>
  2. #include <libc.h>
  3. #include "tapefs.h"
  4. /*
  5. * File system for old tap tapes.
  6. */
  7. struct tap {
  8. unsigned char name[32];
  9. unsigned char mode[1];
  10. unsigned char uid[1];
  11. unsigned char size[2];
  12. unsigned char tmod[4];
  13. unsigned char taddress[2];
  14. unsigned char unused[20];
  15. unsigned char checksum[2];
  16. } dir[192];
  17. int tapefile;
  18. char buffer[8192];
  19. long cvtime(unsigned char *);
  20. extern int verbose;
  21. extern int newtap;
  22. void
  23. populate(char *name)
  24. {
  25. int i, isabs;
  26. struct tap *tpp;
  27. Fileinf f;
  28. replete = 1;
  29. tapefile = open(name, OREAD);
  30. if (tapefile<0)
  31. error("Can't open argument file");
  32. read(tapefile, dir, sizeof dir);
  33. for (i=0, tpp=&dir[8]; i<192; i++, tpp++) {
  34. unsigned char *sp = (unsigned char *)tpp;
  35. int j, cksum = 0;
  36. for (j=0; j<32; j++, sp+=2)
  37. cksum += sp[0] + (sp[1]<<8);
  38. cksum &= 0xFFFF;
  39. if (cksum!=0) {
  40. print("cksum failure\n");
  41. continue;
  42. }
  43. if (tpp->name[0]=='\0')
  44. continue;
  45. f.addr = tpp->taddress[0] + (tpp->taddress[1]<<8);
  46. if (f.addr==0)
  47. continue;
  48. f.size = tpp->size[0] + (tpp->size[1]<<8);
  49. f.mdate = cvtime(tpp->tmod);
  50. f.mode = tpp->mode[0]&0777;
  51. f.uid = tpp->uid[0]&0377;
  52. isabs = tpp->name[0]=='/';
  53. f.name = (char *)tpp->name+isabs;
  54. if (verbose)
  55. print("%s mode %o uid %d, %s", f.name, f.mode, f.uid, ctime(f.mdate));
  56. poppath(f, 1);
  57. }
  58. }
  59. long
  60. cvtime(unsigned char *tp)
  61. {
  62. unsigned long t = (tp[1]<<24)+(tp[0]<<16)+(tp[3]<<8)+(tp[2]<<0);
  63. if (!newtap) {
  64. t /= 60;
  65. t += 3*365*24*3600;
  66. }
  67. return t;
  68. }
  69. void
  70. popdir(Ram *r)
  71. {
  72. USED(r);
  73. }
  74. void
  75. dotrunc(Ram *r)
  76. {
  77. USED(r);
  78. }
  79. void
  80. docreate(Ram *r)
  81. {
  82. USED(r);
  83. }
  84. char *
  85. doread(Ram *r, vlong off, long cnt)
  86. {
  87. if (cnt>sizeof(buffer))
  88. print("count too big\n");
  89. seek(tapefile, 512*r->addr+off, 0);
  90. read(tapefile, buffer, cnt);
  91. return buffer;
  92. }
  93. void
  94. dowrite(Ram *r, char *buf, long off, long cnt)
  95. {
  96. USED(r); USED(buf); USED(off); USED(cnt);
  97. }
  98. int
  99. dopermw(Ram *r)
  100. {
  101. USED(r);
  102. return 0;
  103. }