PageRenderTime 17ms CodeModel.GetById 7ms RepoModel.GetById 0ms app.codeStats 0ms

/filesystems/unixfs/ancientfs/ancientfs_tap.h

http://macfuse.googlecode.com/
C Header | 187 lines | 128 code | 39 blank | 20 comment | 22 complexity | c16174db13494bbadb894ba11d8a207b MD5 | raw file
Possible License(s): Apache-2.0, BSD-3-Clause, GPL-2.0
  1. /*
  2. * Ancient UNIX File Systems for MacFUSE
  3. * Amit Singh
  4. * http://osxbook.com
  5. */
  6. #ifndef _ANCIENTFS_TAP_H_
  7. #define _ANCIENTFS_TAP_H_
  8. #include "unixfs_internal.h"
  9. #include "ancientfs.h"
  10. #define BSIZE 512
  11. #define ROOTINO 1
  12. #define DIRSIZ 14
  13. #define PATHSIZ 32
  14. struct filsys
  15. {
  16. uint32_t s_fsize;
  17. uint32_t s_files;
  18. uint32_t s_directories;
  19. uint32_t s_lastino;
  20. struct inode* s_rootip;
  21. };
  22. struct dinode_tap {
  23. uint8_t di_path[PATHSIZ]; /* if di_path[0] == 0, the entry is empty */
  24. uint8_t di_mode; /* type and permissions */
  25. uint8_t di_uid; /* owner's id */
  26. uint16_t di_size; /* file's size */
  27. uint32_t di_mtime; /* file's modification time */
  28. uint16_t di_addr; /* tape block of the start of the file's contents */
  29. uint8_t di_unused[20];
  30. uint16_t di_cksum; /* sum of the 32 words of the directory is 0 */
  31. } __attribute__((packed));
  32. #define INOPB 8
  33. struct tap_node_info {
  34. struct inode* ti_self;
  35. uint8_t ti_name[DIRSIZ];
  36. struct tap_node_info* ti_parent;
  37. struct tap_node_info* ti_children;
  38. struct tap_node_info* ti_next_sibling;
  39. };
  40. /* flags */
  41. #define ILOCK 01
  42. #define IUPD 02
  43. #define IACC 04
  44. #define IMOUNT 010
  45. #define IWANT 020
  46. #define ITEXT 040
  47. /* modes */
  48. #define IALLOC 0100000 /* i-node is allocated */
  49. #define IFMT 060000
  50. #define IFDIR 040000 /* directory */
  51. #define IMOD 020000 /* file has been modified (always on) */
  52. #define ILARG 010000 /* large file */
  53. /* v1/v2/v3 modes */
  54. #define ISUID 000040 /* set user ID on execution */
  55. #define IEXEC 000020 /* executable */
  56. #define IRUSR 000010 /* read, owner */
  57. #define IWUSR 000004 /* write, owner */
  58. #define IROTH 000002 /* read, non-owner */
  59. #define IWOTH 000001 /* write, non-owner */
  60. #include <sys/stat.h>
  61. static inline mode_t
  62. ancientfs_tap_mode(mode_t mode, uint32_t flags)
  63. {
  64. mode_t newmode = 0;
  65. mode = mode & ~(IALLOC | ILARG);
  66. if ((flags & ANCIENTFS_UNIX_V1) ||
  67. (flags & ANCIENTFS_UNIX_V2) ||
  68. (flags & ANCIENTFS_UNIX_V3))
  69. goto tap;
  70. /* ntap */
  71. /* we synthesize directories ourselves, so mode is OK as it is */
  72. if (S_ISDIR(mode))
  73. return mode;
  74. /* translate ntap mode bits */
  75. if ((mode & IFMT) == IFDIR)
  76. newmode |= S_IFDIR;
  77. else
  78. newmode |= S_IFREG;
  79. if (mode & 040)
  80. newmode |= S_IRUSR;
  81. if (mode & 020)
  82. newmode |= S_IWUSR;
  83. if (mode & 010)
  84. newmode |= S_IXUSR;
  85. if (mode & 004)
  86. newmode |= S_IROTH;
  87. if (mode & 002)
  88. newmode |= S_IWOTH;
  89. if (mode & 001)
  90. newmode |= S_IXOTH;
  91. return newmode;
  92. tap:
  93. /* we synthesize directories ourselves, so mode is OK as it is */
  94. if (S_ISDIR(mode))
  95. return mode;
  96. /* translate tap mode bits */
  97. if ((mode & IFMT) == IFDIR)
  98. newmode |= S_IFDIR;
  99. else
  100. newmode |= S_IFREG;
  101. if (mode & ISUID)
  102. newmode |= S_ISUID;
  103. if (mode & IEXEC)
  104. newmode |= S_IXUSR;
  105. if (mode & IRUSR)
  106. newmode |= S_IRUSR;
  107. if (mode & IWUSR)
  108. newmode |= S_IWUSR;
  109. if (mode & IROTH) {
  110. newmode |= S_IROTH;
  111. if (mode & IEXEC)
  112. newmode |= S_IXOTH;
  113. }
  114. if (mode & IWOTH)
  115. newmode |= S_IWOTH;
  116. return newmode;
  117. }
  118. static inline int
  119. ancientfs_tap_cksum(uint8_t* de, fs_endian_t e, uint32_t flags)
  120. {
  121. uint16_t* p = (uint16_t*)de;
  122. uint16_t cksum = 0;
  123. int i = 0;
  124. for (i = 0; i < 32; i++, p++)
  125. cksum += fs16_to_host(e, *p);
  126. return cksum;
  127. }
  128. /*
  129. * v1 00:00 Jan 1, 1971 /60
  130. * v2 00:00 Jan 1, 1971 /60
  131. * v3 00:00 Jan 1, 1972 /60
  132. *
  133. * modern 00:00 Jan 1, 1970 full seconds
  134. */
  135. static inline uint32_t
  136. ancientfs_tap_time(uint32_t t, uint32_t flags)
  137. {
  138. if (!(flags & (ANCIENTFS_UNIX_V1 | ANCIENTFS_UNIX_V2 | ANCIENTFS_UNIX_V3)))
  139. return t;
  140. uint32_t cvt = t;
  141. cvt = cvt / 60; /* times were measured in sixtieths of a second */
  142. uint32_t epoch_years = (flags & ANCIENTFS_UNIX_V1) ? 1 :
  143. (flags & ANCIENTFS_UNIX_V2) ? 1 :
  144. (flags & ANCIENTFS_UNIX_V3) ? 2 : 0;
  145. cvt += (epoch_years * 365 * 24 * 3600); /* epoch fixup */
  146. return cvt;
  147. }
  148. #endif /* _ANCIENTFS_TAP_H_ */