summaryrefslogtreecommitdiff
path: root/sys/src/cmd/ext2srv/dat.h
diff options
context:
space:
mode:
authorTaru Karttunen <taruti@taruti.net>2011-03-30 15:46:40 +0300
committerTaru Karttunen <taruti@taruti.net>2011-03-30 15:46:40 +0300
commite5888a1ffdae813d7575f5fb02275c6bb07e5199 (patch)
treed8d51eac403f07814b9e936eed0c9a79195e2450 /sys/src/cmd/ext2srv/dat.h
Import sources from 2011-03-30 iso image
Diffstat (limited to 'sys/src/cmd/ext2srv/dat.h')
-rwxr-xr-xsys/src/cmd/ext2srv/dat.h222
1 files changed, 222 insertions, 0 deletions
diff --git a/sys/src/cmd/ext2srv/dat.h b/sys/src/cmd/ext2srv/dat.h
new file mode 100755
index 000000000..ce4e61e35
--- /dev/null
+++ b/sys/src/cmd/ext2srv/dat.h
@@ -0,0 +1,222 @@
+typedef struct Xfs Xfs;
+typedef struct Xfile Xfile;
+typedef struct Iobuf Iobuf;
+typedef struct Ext2 Ext2;
+
+typedef struct SuperBlock SuperBlock;
+typedef struct GroupDesc GroupDesc;
+typedef struct Inode Inode;
+typedef struct DirEntry DirEntry;
+
+#define SECTORSIZE 512
+#define OFFSET_SUPER_BLOCK 1024
+
+#define EXT2_SUPER_MAGIC 0xEF53
+#define EXT2_MIN_BLOCK_SIZE 1024
+#define EXT2_MAX_BLOCK_SIZE 4096
+#define EXT2_ROOT_INODE 2
+#define EXT2_FIRST_INO 11
+#define EXT2_VALID_FS 0x0001
+#define EXT2_ERROR_FS 0x0002
+
+/*
+ * Structure of the super block
+ */
+struct SuperBlock {
+ uint s_inodes_count; /* Inodes count */
+ uint s_blocks_count; /* Blocks count */
+ uint s_r_blocks_count; /* Reserved blocks count */
+ uint s_free_blocks_count; /* Free blocks count */
+ uint s_free_inodes_count; /* Free inodes count */
+ uint s_first_data_block; /* First Data Block */
+ uint s_log_block_size; /* Block size */
+ int s_log_frag_size; /* Fragment size */
+ uint s_blocks_per_group; /* # Blocks per group */
+ uint s_frags_per_group; /* # Fragments per group */
+ uint s_inodes_per_group; /* # Inodes per group */
+ uint s_mtime; /* Mount time */
+ uint s_wtime; /* Write time */
+ ushort s_mnt_count; /* Mount count */
+ short s_max_mnt_count; /* Maximal mount count */
+ ushort s_magic; /* Magic signature */
+ ushort s_state; /* File system state */
+ ushort s_errors; /* Behaviour when detecting errors */
+ ushort s_pad;
+ uint s_lastcheck; /* time of last check */
+ uint s_checkinterval; /* max. time between checks */
+ uint s_creator_os; /* OS */
+ uint s_rev_level; /* Revision level */
+ ushort s_def_resuid; /* Default uid for reserved blocks */
+ ushort s_def_resgid; /* Default gid for reserved blocks */
+ uint s_reserved[235]; /* Padding to the end of the block */
+};
+
+/*
+ * Structure of a blocks group descriptor
+ */
+struct GroupDesc
+{
+ uint bg_block_bitmap; /* Blocks bitmap block */
+ uint bg_inode_bitmap; /* Inodes bitmap block */
+ uint bg_inode_table; /* Inodes table block */
+ ushort bg_free_blocks_count; /* Free blocks count */
+ ushort bg_free_inodes_count; /* Free inodes count */
+ ushort bg_used_dirs_count; /* Directories count */
+ ushort bg_pad;
+ uint bg_reserved[3];
+};
+
+/*
+ * Constants relative to the data blocks
+ */
+#define EXT2_NDIR_BLOCKS 12
+#define EXT2_IND_BLOCK EXT2_NDIR_BLOCKS
+#define EXT2_DIND_BLOCK (EXT2_IND_BLOCK + 1)
+#define EXT2_TIND_BLOCK (EXT2_DIND_BLOCK + 1)
+#define EXT2_N_BLOCKS (EXT2_TIND_BLOCK + 1)
+
+/*
+ * Structure of an inode on the disk
+ */
+struct Inode {
+ ushort i_mode; /* File mode */
+ ushort i_uid; /* Owner Uid */
+ uint i_size; /* Size in bytes */
+ uint i_atime; /* Access time */
+ uint i_ctime; /* Creation time */
+ uint i_mtime; /* Modification time */
+ uint i_dtime; /* Deletion Time */
+ ushort i_gid; /* Group Id */
+ ushort i_links_count; /* Links count */
+ uint i_blocks; /* Blocks count */
+ uint i_flags; /* File flags */
+ uint osd1;
+ uint i_block[EXT2_N_BLOCKS];/* Pointers to blocks */
+ uint i_version; /* File version (for NFS) */
+ uint i_file_acl; /* File ACL */
+ uint i_dir_acl; /* Directory ACL */
+ uint i_faddr; /* Fragment address */
+ uchar osd2[12];
+};
+
+/*
+ * Structure of a directory entry
+ */
+#define EXT2_NAME_LEN 255
+#define DIR_REC_LEN(name_len) (((name_len) + 8 + 3) & ~3)
+
+struct DirEntry {
+ uint inode; /* Inode number */
+ ushort rec_len; /* Directory entry length */
+ uchar name_len; /* Name length */
+ uchar reserved;
+ char name[EXT2_NAME_LEN]; /* File name */
+};
+
+#define S_IFMT 00170000
+#define S_IFLNK 0120000
+#define S_IFREG 0100000
+#define S_IFDIR 0040000
+
+#define S_ISLNK(m) (((m) & S_IFMT) == S_IFLNK)
+#define S_ISREG(m) (((m) & S_IFMT) == S_IFREG)
+#define S_ISDIR(m) (((m) & S_IFMT) == S_IFDIR)
+
+#define DEFAULT_UID 200
+#define DEFAULT_GID 100
+
+struct Iobuf
+{
+ Xfs *dev;
+ long addr;
+ Iobuf *next;
+ Iobuf *prev;
+ Iobuf *hash;
+ int busy;
+ int dirty;
+ char *iobuf;
+};
+
+struct Xfs{
+ Xfs *next;
+ char *name; /* of file containing external f.s. */
+ Qid qid; /* of file containing external f.s. */
+ long ref; /* attach count */
+ Qid rootqid; /* of plan9 constructed root directory */
+ short dev;
+ short fmt;
+ void *ptr;
+
+ /* data from super block */
+
+ int block_size;
+ int desc_per_block;
+ int inodes_per_group;
+ int inodes_per_block;
+ int addr_per_block;
+ int blocks_per_group;
+
+ int ngroups;
+ int superaddr, superoff;
+ int grpaddr;
+};
+
+struct Xfile{
+ Xfile *next; /* in hash bucket */
+ long client;
+ long fid;
+ Xfs * xf;
+ void * ptr;
+
+ uint inbr; /* inode nbr */
+ uint pinbr; /* parrent inode */
+ ulong bufaddr; /* addr of inode block */
+ ulong bufoffset;
+ int root; /* true on attach for ref count */
+ int dirindex; /* next dir entry to read */
+};
+
+#define EXT2_SUPER 1
+#define EXT2_DESC 2
+#define EXT2_BBLOCK 3
+#define EXT2_BINODE 4
+
+struct Ext2{
+ char type;
+ union{
+ SuperBlock *sb;
+ GroupDesc *gd;
+ char *bmp;
+ }u;
+ Iobuf *buf;
+};
+
+#define DESC_ADDR(xf,n) ( (xf)->grpaddr + ((n)/(xf)->desc_per_block) )
+#define DESC_OFFSET(xf,d,n) ( ((GroupDesc *)(d)) + ((n)%(xf)->desc_per_block) )
+
+enum{
+ Asis, Clean, Clunk
+};
+
+enum{
+ Enevermind,
+ Eformat,
+ Eio,
+ Enomem,
+ Enonexist,
+ Eexist,
+ Eperm,
+ Enofilsys,
+ Eauth,
+ Enospace,
+ Elink,
+ Elongname,
+ Eintern,
+ Ecorrupt,
+ Enotclean
+};
+
+extern int chatty;
+extern int errno;
+extern char *deffile;
+extern int rdonly;