cpiofs.c 2.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139
  1. #include <u.h>
  2. #include <libc.h>
  3. #include <auth.h>
  4. #include <fcall.h>
  5. #include "tapefs.h"
  6. /*
  7. * File system for cpio tapes (read-only)
  8. */
  9. #define TBLOCK 512
  10. #define NBLOCK 40 /* maximum blocksize */
  11. #define DBLOCK 20 /* default blocksize */
  12. #define TNAMSIZ 100
  13. union hblock {
  14. char dummy[TBLOCK];
  15. char tbuf[Maxbuf];
  16. struct header {
  17. char magic[6];
  18. char dev[6];
  19. char ino[6];
  20. char mode[6];
  21. char uid[6];
  22. char gid[6];
  23. char nlink[6];
  24. char rdev[6];
  25. char mtime[11];
  26. char namesize[6];
  27. char size[11];
  28. } dbuf;
  29. struct hname {
  30. struct header x;
  31. char name[1];
  32. } nbuf;
  33. } dblock;
  34. int tapefile;
  35. vlong getoct(char*, int);
  36. void
  37. populate(char *name)
  38. {
  39. vlong offset;
  40. long isabs, magic, namesize, mode;
  41. Fileinf f;
  42. tapefile = open(name, OREAD);
  43. if (tapefile<0)
  44. error("Can't open argument file");
  45. replete = 1;
  46. for (offset = 0;;) {
  47. seek(tapefile, offset, 0);
  48. if (read(tapefile, (char *)&dblock.dbuf, TBLOCK)<TBLOCK)
  49. break;
  50. magic = getoct(dblock.dbuf.magic, sizeof(dblock.dbuf.magic));
  51. if (magic != 070707){
  52. print("%lo\n", magic);
  53. error("out of phase--get help");
  54. }
  55. if (dblock.nbuf.name[0]=='\0' || strcmp(dblock.nbuf.name, "TRAILER!!!")==0)
  56. break;
  57. mode = getoct(dblock.dbuf.mode, sizeof(dblock.dbuf.mode));
  58. f.mode = mode&0777;
  59. switch(mode & 0170000) {
  60. case 0040000:
  61. f.mode |= DMDIR;
  62. break;
  63. case 0100000:
  64. break;
  65. default:
  66. f.mode = 0;
  67. break;
  68. }
  69. f.uid = getoct(dblock.dbuf.uid, sizeof(dblock.dbuf.uid));
  70. f.gid = getoct(dblock.dbuf.gid, sizeof(dblock.dbuf.gid));
  71. f.size = getoct(dblock.dbuf.size, sizeof(dblock.dbuf.size));
  72. f.mdate = getoct(dblock.dbuf.mtime, sizeof(dblock.dbuf.mtime));
  73. namesize = getoct(dblock.dbuf.namesize, sizeof(dblock.dbuf.namesize));
  74. f.addr = offset+sizeof(struct header)+namesize;
  75. isabs = dblock.nbuf.name[0]=='/';
  76. f.name = &dblock.nbuf.name[isabs];
  77. poppath(f, 1);
  78. offset += sizeof(struct header)+namesize+f.size;
  79. }
  80. }
  81. vlong
  82. getoct(char *p, int l)
  83. {
  84. vlong r;
  85. for (r=0; l>0; p++, l--){
  86. r <<= 3;
  87. r += *p-'0';
  88. }
  89. return r;
  90. }
  91. void
  92. dotrunc(Ram *r)
  93. {
  94. USED(r);
  95. }
  96. void
  97. docreate(Ram *r)
  98. {
  99. USED(r);
  100. }
  101. char *
  102. doread(Ram *r, vlong off, long cnt)
  103. {
  104. seek(tapefile, r->addr+off, 0);
  105. if (cnt>sizeof(dblock.tbuf))
  106. error("read too big");
  107. read(tapefile, dblock.tbuf, cnt);
  108. return dblock.tbuf;
  109. }
  110. void
  111. popdir(Ram *r)
  112. {
  113. USED(r);
  114. }
  115. void
  116. dowrite(Ram *r, char *buf, long off, long cnt)
  117. {
  118. USED(r); USED(buf); USED(off); USED(cnt);
  119. }
  120. int
  121. dopermw(Ram *r)
  122. {
  123. USED(r);
  124. return 0;
  125. }