fstools: use -Wno-format-truncation instead of -Wno-error=format-truncation
[project/fstools.git] / libblkid-tiny / f2fs.c
1 /*
2  * Copyright (C) 2013 Alejandro Martinez Ruiz <alex@nowcomputing.com>
3  *
4  * This file may be redistributed under the terms of the
5  * GNU Lesser General Public License
6  */
7
8 #include <stddef.h>
9 #include <string.h>
10
11 #include "superblocks.h"
12
13 #define F2FS_MAGIC              "\x10\x20\xF5\xF2"
14 #define F2FS_MAGIC_OFF          0
15 #define F2FS_UUID_SIZE          16
16 #define F2FS_LABEL_SIZE         512
17 #define F2FS_SB1_OFF            0x400
18 #define F2FS_SB1_KBOFF          (F2FS_SB1_OFF >> 10)
19 #define F2FS_SB2_OFF            0x1400
20 #define F2FS_SB2_KBOFF          (F2FS_SB2_OFF >> 10)
21
22 struct f2fs_super_block {                                       /* According to version 1.1 */
23 /* 0x00 */      uint32_t        magic;                          /* Magic Number */
24 /* 0x04 */      uint16_t        major_ver;                      /* Major Version */
25 /* 0x06 */      uint16_t        minor_ver;                      /* Minor Version */
26 /* 0x08 */      uint32_t        log_sectorsize;                 /* log2 sector size in bytes */
27 /* 0x0C */      uint32_t        log_sectors_per_block;          /* log2 # of sectors per block */
28 /* 0x10 */      uint32_t        log_blocksize;                  /* log2 block size in bytes */
29 /* 0x14 */      uint32_t        log_blocks_per_seg;             /* log2 # of blocks per segment */
30 /* 0x18 */      uint32_t        segs_per_sec;                   /* # of segments per section */
31 /* 0x1C */      uint32_t        secs_per_zone;                  /* # of sections per zone */
32 /* 0x20 */      uint32_t        checksum_offset;                /* checksum offset inside super block */
33 /* 0x24 */      uint64_t        block_count;                    /* total # of user blocks */
34 /* 0x2C */      uint32_t        section_count;                  /* total # of sections */
35 /* 0x30 */      uint32_t        segment_count;                  /* total # of segments */
36 /* 0x34 */      uint32_t        segment_count_ckpt;             /* # of segments for checkpoint */
37 /* 0x38 */      uint32_t        segment_count_sit;              /* # of segments for SIT */
38 /* 0x3C */      uint32_t        segment_count_nat;              /* # of segments for NAT */
39 /* 0x40 */      uint32_t        segment_count_ssa;              /* # of segments for SSA */
40 /* 0x44 */      uint32_t        segment_count_main;             /* # of segments for main area */
41 /* 0x48 */      uint32_t        segment0_blkaddr;               /* start block address of segment 0 */
42 /* 0x4C */      uint32_t        cp_blkaddr;                     /* start block address of checkpoint */
43 /* 0x50 */      uint32_t        sit_blkaddr;                    /* start block address of SIT */
44 /* 0x54 */      uint32_t        nat_blkaddr;                    /* start block address of NAT */
45 /* 0x58 */      uint32_t        ssa_blkaddr;                    /* start block address of SSA */
46 /* 0x5C */      uint32_t        main_blkaddr;                   /* start block address of main area */
47 /* 0x60 */      uint32_t        root_ino;                       /* root inode number */
48 /* 0x64 */      uint32_t        node_ino;                       /* node inode number */
49 /* 0x68 */      uint32_t        meta_ino;                       /* meta inode number */
50 /* 0x6C */      uint8_t         uuid[F2FS_UUID_SIZE];           /* 128-bit uuid for volume */
51 /* 0x7C */      uint16_t        volume_name[F2FS_LABEL_SIZE];   /* volume name */
52 #if 0
53 /* 0x47C */     uint32_t        extension_count;                /* # of extensions below */
54 /* 0x480 */     uint8_t         extension_list[64][8];          /* extension array */
55 #endif
56 } __attribute__((packed));
57
58 static int probe_f2fs(blkid_probe pr, const struct blkid_idmag *mag)
59 {
60         struct f2fs_super_block *sb;
61         uint16_t major, minor;
62
63         sb = blkid_probe_get_sb(pr, mag, struct f2fs_super_block);
64         if (!sb)
65                 return errno ? -errno : 1;
66
67         major = le16_to_cpu(sb->major_ver);
68         minor = le16_to_cpu(sb->minor_ver);
69
70         /* For version 1.0 we cannot know the correct sb structure */
71         if (major == 1 && minor == 0)
72                 return 0;
73
74 #if 0
75         if (*((unsigned char *) sb->volume_name))
76                 blkid_probe_set_utf8label(pr, (unsigned char *) sb->volume_name,
77                                                 sizeof(sb->volume_name),
78                                                 BLKID_ENC_UTF16LE);
79 #endif
80
81         blkid_probe_set_uuid(pr, sb->uuid);
82         blkid_probe_sprintf_version(pr, "%u.%u", major, minor);
83         return 0;
84 }
85
86 const struct blkid_idinfo f2fs_idinfo =
87 {
88         .name           = "f2fs",
89         .usage          = BLKID_USAGE_FILESYSTEM,
90         .probefunc      = probe_f2fs,
91         .magics         =
92         {
93                 {
94                         .magic = F2FS_MAGIC,
95                         .len = 4,
96                         .kboff = F2FS_SB1_KBOFF,
97                         .sboff = F2FS_MAGIC_OFF
98                 },
99                 { NULL }
100         }
101 };