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} __attribute__((__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} __attribute__((__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 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// 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// 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} 126