source: branches/3.2/mindi-busybox/util-linux/volume_id/sysv.c @ 3232

Last change on this file since 3232 was 3232, checked in by bruno, 5 years ago
  • Update mindi-busybox to 1.21.1
  • Property svn:eol-style set to native
File size: 3.3 KB
Line 
1/*
2 * volume_id - reads filesystem label and uuid
3 *
4 * Copyright (C) 2005 Kay Sievers <kay.sievers@vrfy.org>
5 *
6 *  This library is free software; you can redistribute it and/or
7 *  modify it under the terms of the GNU Lesser General Public
8 *  License as published by the Free Software Foundation; either
9 *  version 2.1 of the License, or (at your option) any later version.
10 *
11 *  This library is distributed in the hope that it will be useful,
12 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
13 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
14 *  Lesser General Public License for more details.
15 *
16 *  You should have received a copy of the GNU Lesser General Public
17 *  License along with this library; if not, write to the Free Software
18 *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
19 */
20
21#include "volume_id_internal.h"
22
23#define SYSV_NICINOD            100
24#define SYSV_NICFREE            50
25
26struct sysv_super {
27    uint16_t    s_isize;
28    uint16_t    s_pad0;
29    uint32_t    s_fsize;
30    uint16_t    s_nfree;
31    uint16_t    s_pad1;
32    uint32_t    s_free[SYSV_NICFREE];
33    uint16_t    s_ninode;
34    uint16_t    s_pad2;
35    uint16_t    s_inode[SYSV_NICINOD];
36    uint8_t     s_flock;
37    uint8_t     s_ilock;
38    uint8_t     s_fmod;
39    uint8_t     s_ronly;
40    uint32_t    s_time;
41    uint16_t    s_dinfo[4];
42    uint32_t    s_tfree;
43    uint16_t    s_tinode;
44    uint16_t    s_pad3;
45    uint8_t     s_fname[6];
46    uint8_t     s_fpack[6];
47    uint32_t    s_fill[12];
48    uint32_t    s_state;
49    uint32_t    s_magic;
50    uint32_t    s_type;
51} PACKED;
52
53#define XENIX_NICINOD               100
54#define XENIX_NICFREE               100
55
56struct xenix_super {
57    uint16_t    s_isize;
58    uint32_t    s_fsize;
59    uint16_t    s_nfree;
60    uint32_t    s_free[XENIX_NICFREE];
61    uint16_t    s_ninode;
62    uint16_t    s_inode[XENIX_NICINOD];
63    uint8_t     s_flock;
64    uint8_t     s_ilock;
65    uint8_t     s_fmod;
66    uint8_t     s_ronly;
67    uint32_t    s_time;
68    uint32_t    s_tfree;
69    uint16_t    s_tinode;
70    uint16_t    s_dinfo[4];
71    uint8_t     s_fname[6];
72    uint8_t     s_fpack[6];
73    uint8_t     s_clean;
74    uint8_t     s_fill[371];
75    uint32_t    s_magic;
76    uint32_t    s_type;
77} PACKED;
78
79#define SYSV_SUPERBLOCK_BLOCK           0x01
80#define SYSV_MAGIC              0xfd187e20
81#define XENIX_SUPERBLOCK_BLOCK          0x18
82#define XENIX_MAGIC             0x2b5544
83#define SYSV_MAX_BLOCKSIZE          0x800
84
85int FAST_FUNC volume_id_probe_sysv(struct volume_id *id /*,uint64_t off*/)
86{
87#define off ((uint64_t)0)
88    struct sysv_super *vs;
89    struct xenix_super *xs;
90    unsigned boff;
91
92    dbg("probing at offset 0x%llx", (unsigned long long) off);
93
94    for (boff = 0x200; boff <= SYSV_MAX_BLOCKSIZE; boff <<= 1) {
95        vs = volume_id_get_buffer(id, off + (boff * SYSV_SUPERBLOCK_BLOCK), 0x200);
96        if (vs == NULL)
97            return -1;
98
99        if (vs->s_magic == cpu_to_le32(SYSV_MAGIC) || vs->s_magic == cpu_to_be32(SYSV_MAGIC)) {
100//          volume_id_set_label_raw(id, vs->s_fname, 6);
101            volume_id_set_label_string(id, vs->s_fname, 6);
102            IF_FEATURE_BLKID_TYPE(id->type = "sysv");
103            goto found;
104        }
105    }
106
107    for (boff = 0x200; boff <= SYSV_MAX_BLOCKSIZE; boff <<= 1) {
108        xs = volume_id_get_buffer(id, off + (boff + XENIX_SUPERBLOCK_BLOCK), 0x200);
109        if (xs == NULL)
110            return -1;
111
112        if (xs->s_magic == cpu_to_le32(XENIX_MAGIC) || xs->s_magic == cpu_to_be32(XENIX_MAGIC)) {
113//          volume_id_set_label_raw(id, xs->s_fname, 6);
114            volume_id_set_label_string(id, xs->s_fname, 6);
115            IF_FEATURE_BLKID_TYPE(id->type = "xenix";)
116            goto found;
117        }
118    }
119
120    return -1;
121
122 found:
123//  volume_id_set_usage(id, VOLUME_ID_FILESYSTEM);
124    return 0;
125}
Note: See TracBrowser for help on using the repository browser.