source: MondoRescue/branches/3.3/mindi-busybox/util-linux/volume_id/sysv.c@ 3625

Last change on this file since 3625 was 3621, checked in by Bruno Cornec, 10 years ago

New 3?3 banch for incorporation of latest busybox 1.25. Changing minor version to handle potential incompatibilities.

  • Property svn:eol-style set to native
File size: 3.5 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//kbuild:lib-$(CONFIG_FEATURE_VOLUMEID_SYSV) += sysv.o
22
23//config:
24//config:config FEATURE_VOLUMEID_SYSV
25//config: bool "sysv filesystem"
26//config: default y
27//config: depends on VOLUMEID
28//config: help
29//config: TODO
30//config:
31
32#include "volume_id_internal.h"
33
34#define SYSV_NICINOD 100
35#define SYSV_NICFREE 50
36
37struct sysv_super {
38 uint16_t s_isize;
39 uint16_t s_pad0;
40 uint32_t s_fsize;
41 uint16_t s_nfree;
42 uint16_t s_pad1;
43 uint32_t s_free[SYSV_NICFREE];
44 uint16_t s_ninode;
45 uint16_t s_pad2;
46 uint16_t s_inode[SYSV_NICINOD];
47 uint8_t s_flock;
48 uint8_t s_ilock;
49 uint8_t s_fmod;
50 uint8_t s_ronly;
51 uint32_t s_time;
52 uint16_t s_dinfo[4];
53 uint32_t s_tfree;
54 uint16_t s_tinode;
55 uint16_t s_pad3;
56 uint8_t s_fname[6];
57 uint8_t s_fpack[6];
58 uint32_t s_fill[12];
59 uint32_t s_state;
60 uint32_t s_magic;
61 uint32_t s_type;
62} PACKED;
63
64#define XENIX_NICINOD 100
65#define XENIX_NICFREE 100
66
67struct xenix_super {
68 uint16_t s_isize;
69 uint32_t s_fsize;
70 uint16_t s_nfree;
71 uint32_t s_free[XENIX_NICFREE];
72 uint16_t s_ninode;
73 uint16_t s_inode[XENIX_NICINOD];
74 uint8_t s_flock;
75 uint8_t s_ilock;
76 uint8_t s_fmod;
77 uint8_t s_ronly;
78 uint32_t s_time;
79 uint32_t s_tfree;
80 uint16_t s_tinode;
81 uint16_t s_dinfo[4];
82 uint8_t s_fname[6];
83 uint8_t s_fpack[6];
84 uint8_t s_clean;
85 uint8_t s_fill[371];
86 uint32_t s_magic;
87 uint32_t s_type;
88} PACKED;
89
90#define SYSV_SUPERBLOCK_BLOCK 0x01
91#define SYSV_MAGIC 0xfd187e20
92#define XENIX_SUPERBLOCK_BLOCK 0x18
93#define XENIX_MAGIC 0x2b5544
94#define SYSV_MAX_BLOCKSIZE 0x800
95
96int FAST_FUNC volume_id_probe_sysv(struct volume_id *id /*,uint64_t off*/)
97{
98#define off ((uint64_t)0)
99 struct sysv_super *vs;
100 struct xenix_super *xs;
101 unsigned boff;
102
103 dbg("probing at offset 0x%llx", (unsigned long long) off);
104
105 for (boff = 0x200; boff <= SYSV_MAX_BLOCKSIZE; boff <<= 1) {
106 vs = volume_id_get_buffer(id, off + (boff * SYSV_SUPERBLOCK_BLOCK), 0x200);
107 if (vs == NULL)
108 return -1;
109
110 if (vs->s_magic == cpu_to_le32(SYSV_MAGIC) || vs->s_magic == cpu_to_be32(SYSV_MAGIC)) {
111// volume_id_set_label_raw(id, vs->s_fname, 6);
112 volume_id_set_label_string(id, vs->s_fname, 6);
113 IF_FEATURE_BLKID_TYPE(id->type = "sysv");
114 goto found;
115 }
116 }
117
118 for (boff = 0x200; boff <= SYSV_MAX_BLOCKSIZE; boff <<= 1) {
119 xs = volume_id_get_buffer(id, off + (boff + XENIX_SUPERBLOCK_BLOCK), 0x200);
120 if (xs == NULL)
121 return -1;
122
123 if (xs->s_magic == cpu_to_le32(XENIX_MAGIC) || xs->s_magic == cpu_to_be32(XENIX_MAGIC)) {
124// volume_id_set_label_raw(id, xs->s_fname, 6);
125 volume_id_set_label_string(id, xs->s_fname, 6);
126 IF_FEATURE_BLKID_TYPE(id->type = "xenix";)
127 goto found;
128 }
129 }
130
131 return -1;
132
133 found:
134// volume_id_set_usage(id, VOLUME_ID_FILESYSTEM);
135 return 0;
136}
Note: See TracBrowser for help on using the repository browser.