2005-01-31 07:28:44 +03:00
/*
* volume_id - reads filesystem label and uuid
*
* Copyright ( C ) 2004 Kay Sievers < kay . sievers @ vrfy . org >
2005-02-23 06:35:26 +03:00
* Copyright ( C ) 2005 Tobias Klauser < tklauser @ access . unizh . ch >
2005-01-31 07:28:44 +03:00
*
2005-09-27 18:27:35 +04:00
* This program is free software ; you can redistribute it and / or modify it
* under the terms of the GNU General Public License as published by the
* Free Software Foundation version 2 of the License .
2005-01-31 07:28:44 +03:00
*/
# ifndef _GNU_SOURCE
# define _GNU_SOURCE 1
# endif
# ifdef HAVE_CONFIG_H
# include <config.h>
# endif
# include <stdio.h>
# include <stdlib.h>
# include <unistd.h>
# include <string.h>
# include <errno.h>
# include <ctype.h>
2005-02-23 04:58:31 +03:00
# include "volume_id.h"
# include "logging.h"
# include "util.h"
2005-01-31 07:28:44 +03:00
2005-02-09 03:02:18 +03:00
struct reiserfs_super_block {
2005-08-01 03:33:36 +04:00
uint32_t blocks_count ;
uint32_t free_blocks ;
uint32_t root_block ;
uint32_t journal_block ;
uint32_t journal_dev ;
uint32_t orig_journal_size ;
uint32_t dummy2 [ 5 ] ;
uint16_t blocksize ;
uint16_t dummy3 [ 3 ] ;
uint8_t magic [ 12 ] ;
uint32_t dummy4 [ 5 ] ;
uint8_t uuid [ 16 ] ;
uint8_t label [ 16 ] ;
2006-02-21 20:44:18 +03:00
} PACKED ;
2005-02-09 03:02:18 +03:00
2005-02-23 06:35:26 +03:00
struct reiser4_super_block {
2005-08-01 03:33:36 +04:00
uint8_t magic [ 16 ] ;
uint16_t dummy [ 2 ] ;
uint8_t uuid [ 16 ] ;
uint8_t label [ 16 ] ;
uint64_t dummy2 ;
2006-02-21 20:44:18 +03:00
} PACKED ;
2005-02-23 06:35:26 +03:00
2005-01-31 07:28:44 +03:00
# define REISERFS1_SUPERBLOCK_OFFSET 0x2000
# define REISERFS_SUPERBLOCK_OFFSET 0x10000
2005-08-01 03:33:36 +04:00
int volume_id_probe_reiserfs ( struct volume_id * id , uint64_t off )
2005-01-31 07:28:44 +03:00
{
2005-02-09 03:02:18 +03:00
struct reiserfs_super_block * rs ;
2005-02-23 06:35:26 +03:00
struct reiser4_super_block * rs4 ;
2005-08-01 03:33:36 +04:00
uint8_t * buf ;
2005-02-09 03:02:18 +03:00
2005-03-10 02:58:01 +03:00
dbg ( " probing at offset 0x%llx " , ( unsigned long long ) off ) ;
2005-01-31 07:28:44 +03:00
2005-02-23 06:35:26 +03:00
buf = volume_id_get_buffer ( id , off + REISERFS_SUPERBLOCK_OFFSET , 0x200 ) ;
if ( buf = = NULL )
2005-01-31 07:28:44 +03:00
return - 1 ;
2005-02-23 06:35:26 +03:00
rs = ( struct reiserfs_super_block * ) buf ; ;
2005-03-16 02:46:44 +03:00
if ( memcmp ( rs - > magic , " ReIsErFs " , 8 ) = = 0 ) {
strcpy ( id - > type_version , " 3.5 " ) ;
2005-09-18 07:06:10 +04:00
id - > type = " reiserfs " ;
2005-03-16 02:46:44 +03:00
goto found ;
}
2005-02-05 06:10:48 +03:00
if ( memcmp ( rs - > magic , " ReIsEr2Fs " , 9 ) = = 0 ) {
2005-01-31 07:28:44 +03:00
strcpy ( id - > type_version , " 3.6 " ) ;
2005-09-18 07:06:10 +04:00
id - > type = " reiserfs " ;
2005-03-16 02:52:00 +03:00
goto found_label ;
2005-01-31 07:28:44 +03:00
}
2005-02-05 06:10:48 +03:00
if ( memcmp ( rs - > magic , " ReIsEr3Fs " , 9 ) = = 0 ) {
2005-01-31 07:28:44 +03:00
strcpy ( id - > type_version , " JR " ) ;
2005-09-18 07:06:10 +04:00
id - > type = " reiserfs " ;
2005-03-16 02:52:00 +03:00
goto found_label ;
2005-02-23 06:35:26 +03:00
}
rs4 = ( struct reiser4_super_block * ) buf ;
if ( memcmp ( rs4 - > magic , " ReIsEr4 " , 7 ) = = 0 ) {
strcpy ( id - > type_version , " 4 " ) ;
volume_id_set_label_raw ( id , rs4 - > label , 16 ) ;
volume_id_set_label_string ( id , rs4 - > label , 16 ) ;
volume_id_set_uuid ( id , rs4 - > uuid , UUID_DCE ) ;
2005-09-18 07:06:10 +04:00
id - > type = " reiser4 " ;
2005-01-31 07:28:44 +03:00
goto found ;
}
2005-09-18 07:06:10 +04:00
buf = volume_id_get_buffer ( id , off + REISERFS1_SUPERBLOCK_OFFSET , 0x200 ) ;
if ( buf = = NULL )
2005-01-31 07:28:44 +03:00
return - 1 ;
2005-09-18 07:06:10 +04:00
rs = ( struct reiserfs_super_block * ) buf ;
2005-02-05 06:10:48 +03:00
if ( memcmp ( rs - > magic , " ReIsErFs " , 8 ) = = 0 ) {
2005-01-31 07:28:44 +03:00
strcpy ( id - > type_version , " 3.5 " ) ;
2005-09-18 07:06:10 +04:00
id - > type = " reiserfs " ;
2005-03-16 02:46:44 +03:00
goto found ;
2005-01-31 07:28:44 +03:00
}
return - 1 ;
2005-03-16 02:52:00 +03:00
found_label :
2005-01-31 07:28:44 +03:00
volume_id_set_label_raw ( id , rs - > label , 16 ) ;
volume_id_set_label_string ( id , rs - > label , 16 ) ;
volume_id_set_uuid ( id , rs - > uuid , UUID_DCE ) ;
2005-02-23 06:35:26 +03:00
found :
2005-01-31 07:28:44 +03:00
volume_id_set_usage ( id , VOLUME_ID_FILESYSTEM ) ;
return 0 ;
}