/* * cramfs_common - cramfs common code * * Copyright (c) 2008 Roy Peled, the.roy.peled -at- gmail * Copyright (c) 2004-2006 by Juliane Holzt, kju -at- fqdn.org * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * */ #ifndef __CRAMFS_H #define __CRAMFS_H #include #define CRAMFS_MAGIC 0x28cd3d45 /* some random number */ #define CRAMFS_SIGNATURE "Compressed ROMFS" /* * Width of various bitfields in struct cramfs_inode. * Primarily used to generate warnings in mkcramfs. */ #define CRAMFS_MODE_WIDTH 16 #define CRAMFS_UID_WIDTH 16 #define CRAMFS_SIZE_WIDTH 24 #define CRAMFS_GID_WIDTH 8 #define CRAMFS_NAMELEN_WIDTH 6 #define CRAMFS_OFFSET_WIDTH 26 #ifndef HOST_IS_BIG_ENDIAN #ifdef WORDS_BIGENDIAN #define HOST_IS_BIG_ENDIAN 1 #else #define HOST_IS_BIG_ENDIAN 0 #endif #endif /* * Reasonably terse representation of the inode data. */ struct cramfs_inode { uint32_t mode:16, uid:16; /* SIZE for device files is i_rdev */ uint32_t size:24, gid:8; /* * NAMELEN is the length of the file name, divided by 4 and * rounded up. (cramfs doesn't support hard links.) * * OFFSET: For symlinks and non-empty regular files, this * contains the offset (divided by 4) of the file data in * compressed form (starting with an array of block pointers; * see README). For non-empty directories it is the offset * (divided by 4) of the inode of the first file in that * directory. For anything else, offset is zero. */ uint32_t namelen:6, offset:26; }; struct cramfs_info { uint32_t crc; uint32_t edition; uint32_t blocks; uint32_t files; }; /* * Superblock information at the beginning of the FS. */ struct cramfs_super { uint32_t magic; /* 0x28cd3d45 - random number */ uint32_t size; /* Not used. mkcramfs currently writes a constant 1<<16 here. */ uint32_t flags; /* 0 */ uint32_t future; /* 0 */ uint8_t signature[16]; /* "Compressed ROMFS" */ struct cramfs_info fsid;/* unique filesystem info */ uint8_t name[16]; /* user-defined name */ struct cramfs_inode root; /* Root inode data */ }; #define CRAMFS_FLAG_FSID_VERSION_2 0x00000001 /* fsid version #2 */ #define CRAMFS_FLAG_SORTED_DIRS 0x00000002 /* sorted dirs */ #define CRAMFS_FLAG_HOLES 0x00000100 /* support for holes */ #define CRAMFS_FLAG_WRONG_SIGNATURE 0x00000200 /* reserved */ #define CRAMFS_FLAG_SHIFTED_ROOT_OFFSET 0x00000400 /* shifted root fs */ /* * Valid values in super.flags. Currently we refuse to mount * if (flags & ~CRAMFS_SUPPORTED_FLAGS). Maybe that should be * changed to test super.future instead. */ #define CRAMFS_SUPPORTED_FLAGS (0xff) /* Uncompression interfaces to the underlying zlib */ int cramfs_uncompress_block(void *dst, int dstlen, void *src, int srclen); int cramfs_uncompress_init(void); int cramfs_uncompress_exit(void); uint32_t u32_toggle_endianness(int big_endian, uint32_t what); void super_toggle_endianness(int from_big_endian, struct cramfs_super *super); void inode_to_host(int from_big_endian, struct cramfs_inode *inode_in, struct cramfs_inode *inode_out); void inode_from_host(int to_big_endian, struct cramfs_inode *inode_in, struct cramfs_inode *inode_out); #endif