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{ 28 uint16_t s_isize; 29 uint16_t s_pad0; 30 uint32_t s_fsize; 31 uint16_t s_nfree; 32 uint16_t s_pad1; 33 uint32_t s_free[SYSV_NICFREE]; 34 uint16_t s_ninode; 35 uint16_t s_pad2; 36 uint16_t s_inode[SYSV_NICINOD]; 37 uint8_t s_flock; 38 uint8_t s_ilock; 39 uint8_t s_fmod; 40 uint8_t s_ronly; 41 uint32_t s_time; 42 uint16_t s_dinfo[4]; 43 uint32_t s_tfree; 44 uint16_t s_tinode; 45 uint16_t s_pad3; 46 uint8_t s_fname[6]; 47 uint8_t s_fpack[6]; 48 uint32_t s_fill[12]; 49 uint32_t s_state; 50 uint32_t s_magic; 51 uint32_t s_type; 52} __attribute__((__packed__)); 53 54#define XENIX_NICINOD 100 55#define XENIX_NICFREE 100 56 57struct xenix_super { 58 uint16_t s_isize; 59 uint32_t s_fsize; 60 uint16_t s_nfree; 61 uint32_t s_free[XENIX_NICFREE]; 62 uint16_t s_ninode; 63 uint16_t s_inode[XENIX_NICINOD]; 64 uint8_t s_flock; 65 uint8_t s_ilock; 66 uint8_t s_fmod; 67 uint8_t s_ronly; 68 uint32_t s_time; 69 uint32_t s_tfree; 70 uint16_t s_tinode; 71 uint16_t s_dinfo[4]; 72 uint8_t s_fname[6]; 73 uint8_t s_fpack[6]; 74 uint8_t s_clean; 75 uint8_t s_fill[371]; 76 uint32_t s_magic; 77 uint32_t s_type; 78} __attribute__((__packed__)); 79 80#define SYSV_SUPERBLOCK_BLOCK 0x01 81#define SYSV_MAGIC 0xfd187e20 82#define XENIX_SUPERBLOCK_BLOCK 0x18 83#define XENIX_MAGIC 0x2b5544 84#define SYSV_MAX_BLOCKSIZE 0x800 85 86int volume_id_probe_sysv(struct volume_id *id /*,uint64_t off*/) 87{ 88#define off ((uint64_t)0) 89 struct sysv_super *vs; 90 struct xenix_super *xs; 91 unsigned boff; 92 93 dbg("probing at offset 0x%llx", (unsigned long long) off); 94 95 for (boff = 0x200; boff <= SYSV_MAX_BLOCKSIZE; boff <<= 1) { 96 vs = volume_id_get_buffer(id, off + (boff * SYSV_SUPERBLOCK_BLOCK), 0x200); 97 if (vs == NULL) 98 return -1; 99 100 if (vs->s_magic == cpu_to_le32(SYSV_MAGIC) || vs->s_magic == cpu_to_be32(SYSV_MAGIC)) { 101// volume_id_set_label_raw(id, vs->s_fname, 6); 102 volume_id_set_label_string(id, vs->s_fname, 6); 103// id->type = "sysv"; 104 goto found; 105 } 106 } 107 108 for (boff = 0x200; boff <= SYSV_MAX_BLOCKSIZE; boff <<= 1) { 109 xs = volume_id_get_buffer(id, off + (boff + XENIX_SUPERBLOCK_BLOCK), 0x200); 110 if (xs == NULL) 111 return -1; 112 113 if (xs->s_magic == cpu_to_le32(XENIX_MAGIC) || xs->s_magic == cpu_to_be32(XENIX_MAGIC)) { 114// volume_id_set_label_raw(id, xs->s_fname, 6); 115 volume_id_set_label_string(id, xs->s_fname, 6); 116// id->type = "xenix"; 117 goto found; 118 } 119 } 120 121 return -1; 122 123 found: 124// volume_id_set_usage(id, VOLUME_ID_FILESYSTEM); 125 return 0; 126} 127