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. int getoct(char*, int);
  36. void
  37. populate(char *name)
  38. {
  39. long offset, isabs, magic, namesize, mode;
  40. Fileinf f;
  41. tapefile = open(name, OREAD);
  42. if (tapefile<0)
  43. error("Can't open argument file");
  44. replete = 1;
  45. for (offset = 0;;) {
  46. seek(tapefile, offset, 0);
  47. if (read(tapefile, (char *)&dblock.dbuf, TBLOCK)<TBLOCK)
  48. break;
  49. magic = getoct(dblock.dbuf.magic, sizeof(dblock.dbuf.magic));
  50. if (magic != 070707){
  51. print("%lo\n", magic);
  52. error("out of phase--get help");
  53. }
  54. if (dblock.nbuf.name[0]=='\0' || strcmp(dblock.nbuf.name, "TRAILER!!!")==0)
  55. break;
  56. mode = getoct(dblock.dbuf.mode, sizeof(dblock.dbuf.mode));
  57. f.mode = mode&0777;
  58. switch(mode & 0170000) {
  59. case 0040000:
  60. f.mode |= DMDIR;
  61. break;
  62. case 0100000:
  63. break;
  64. default:
  65. f.mode = 0;
  66. break;
  67. }
  68. f.uid = getoct(dblock.dbuf.uid, sizeof(dblock.dbuf.uid));
  69. f.gid = getoct(dblock.dbuf.gid, sizeof(dblock.dbuf.gid));
  70. f.size = getoct(dblock.dbuf.size, sizeof(dblock.dbuf.size));
  71. f.mdate = getoct(dblock.dbuf.mtime, sizeof(dblock.dbuf.mtime));
  72. namesize = getoct(dblock.dbuf.namesize, sizeof(dblock.dbuf.namesize));
  73. f.addr = (void*)(offset+sizeof(struct header)+namesize);
  74. isabs = dblock.nbuf.name[0]=='/';
  75. f.name = &dblock.nbuf.name[isabs];
  76. poppath(f, 1);
  77. offset += sizeof(struct header)+namesize+f.size;
  78. }
  79. }
  80. int
  81. getoct(char *p, int l)
  82. {
  83. int r;
  84. for (r=0; l>0; p++, l--){
  85. r <<= 3;
  86. r += *p-'0';
  87. }
  88. return r;
  89. }
  90. void
  91. dotrunc(Ram *r)
  92. {
  93. USED(r);
  94. }
  95. void
  96. docreate(Ram *r)
  97. {
  98. USED(r);
  99. }
  100. char *
  101. doread(Ram *r, long off, long cnt)
  102. {
  103. seek(tapefile, (long)r->data+off, 0);
  104. if (cnt>sizeof(dblock.tbuf))
  105. error("read too big");
  106. read(tapefile, dblock.tbuf, cnt);
  107. return dblock.tbuf;
  108. }
  109. void
  110. popdir(Ram *r)
  111. {
  112. USED(r);
  113. }
  114. void
  115. dowrite(Ram *r, char *buf, long off, long cnt)
  116. {
  117. USED(r); USED(buf); USED(off); USED(cnt);
  118. }
  119. int
  120. dopermw(Ram *r)
  121. {
  122. USED(r);
  123. return 0;
  124. }