(root)/
util-linux-2.39/
disk-utils/
cramfs.h
       1  /*
       2   * cramfs_common - cramfs common code
       3   *
       4   * Copyright (c) 2008 Roy Peled, the.roy.peled  -at-  gmail
       5   * Copyright (c) 2004-2006 by Juliane Holzt, kju -at- fqdn.org
       6   *
       7   * This program is free software; you can redistribute it and/or modify
       8   * it under the terms of the GNU General Public License as published by
       9   * the Free Software Foundation; either version 2 of the License, or
      10   * (at your option) any later version.
      11   *
      12   * This program is distributed in the hope that it will be useful,
      13   * but WITHOUT ANY WARRANTY; without even the implied warranty of
      14   * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
      15   * GNU General Public License for more details.
      16   *
      17   */
      18  
      19  #ifndef __CRAMFS_H
      20  #define __CRAMFS_H
      21  
      22  #include <stdint.h>
      23  
      24  #define CRAMFS_MAGIC		0x28cd3d45	/* some random number */
      25  #define CRAMFS_SIGNATURE	"Compressed ROMFS"
      26  
      27  /*
      28   * Width of various bitfields in struct cramfs_inode.
      29   * Primarily used to generate warnings in mkcramfs.
      30   */
      31  #define CRAMFS_MODE_WIDTH 16
      32  #define CRAMFS_UID_WIDTH 16
      33  #define CRAMFS_SIZE_WIDTH 24
      34  #define CRAMFS_GID_WIDTH 8
      35  #define CRAMFS_NAMELEN_WIDTH 6
      36  #define CRAMFS_OFFSET_WIDTH 26
      37  
      38  #ifndef HOST_IS_BIG_ENDIAN
      39  #define HOST_IS_BIG_ENDIAN (__BYTE_ORDER__ == __ORDER_BIG_ENDIAN__)
      40  #endif
      41  
      42  /*
      43   * Reasonably terse representation of the inode data.
      44   */
      45  struct cramfs_inode {
      46  	uint32_t mode:16, uid:16;
      47  	/* SIZE for device files is i_rdev */
      48  	uint32_t size:24, gid:8;
      49  	/*
      50  	 * NAMELEN is the length of the file name, divided by 4 and
      51  	 * rounded up.  (cramfs doesn't support hard links.)
      52  	 *
      53  	 * OFFSET: For symlinks and non-empty regular files, this
      54  	 * contains the offset (divided by 4) of the file data in
      55  	 * compressed form (starting with an array of block pointers;
      56  	 * see README).  For non-empty directories it is the offset
      57  	 * (divided by 4) of the inode of the first file in that
      58  	 * directory.  For anything else, offset is zero.
      59  	 */
      60  	uint32_t namelen:6, offset:26;
      61  };
      62  
      63  struct cramfs_info {
      64  	uint32_t crc;
      65  	uint32_t edition;
      66  	uint32_t blocks;
      67  	uint32_t files;
      68  };
      69  
      70  /*
      71   * Superblock information at the beginning of the FS.
      72   */
      73  struct cramfs_super {
      74  	uint32_t magic;		/* 0x28cd3d45 - random number */
      75  	uint32_t size;		/* Not used.  mkcramfs currently
      76  				   writes a constant 1<<16 here. */
      77  	uint32_t flags;		/* 0 */
      78  	uint32_t future;		/* 0 */
      79  	uint8_t signature[16];	/* "Compressed ROMFS" */
      80  	struct cramfs_info fsid;/* unique filesystem info */
      81  	uint8_t name[16];		/* user-defined name */
      82  	struct cramfs_inode root;	/* Root inode data */
      83  };
      84  
      85  #define CRAMFS_FLAG_FSID_VERSION_2	0x00000001	/* fsid version #2 */
      86  #define CRAMFS_FLAG_SORTED_DIRS		0x00000002	/* sorted dirs */
      87  #define CRAMFS_FLAG_HOLES		0x00000100	/* support for holes */
      88  #define CRAMFS_FLAG_WRONG_SIGNATURE	0x00000200	/* reserved */
      89  #define CRAMFS_FLAG_SHIFTED_ROOT_OFFSET 0x00000400	/* shifted root fs */
      90  
      91  /*
      92   * Valid values in super.flags.  Currently we refuse to mount
      93   * if (flags & ~CRAMFS_SUPPORTED_FLAGS).  Maybe that should be
      94   * changed to test super.future instead.
      95   */
      96  #define CRAMFS_SUPPORTED_FLAGS (0xff)
      97  
      98  /* Uncompression interfaces to the underlying zlib */
      99  int cramfs_uncompress_block(void *dst, int dstlen, void *src, int srclen);
     100  int cramfs_uncompress_init(void);
     101  int cramfs_uncompress_exit(void);
     102  
     103  uint32_t u32_toggle_endianness(int big_endian, uint32_t what);
     104  void super_toggle_endianness(int from_big_endian, struct cramfs_super *super);
     105  void inode_to_host(int from_big_endian, struct cramfs_inode *inode_in,
     106  		   struct cramfs_inode *inode_out);
     107  void inode_from_host(int to_big_endian, struct cramfs_inode *inode_in,
     108  		     struct cramfs_inode *inode_out);
     109  
     110  #endif