2005-03-06 14:16:32 +03:00
/*
* volume_id - reads filesystem label and uuid
*
* Copyright ( C ) 2005 Kay Sievers < kay . sievers @ vrfy . org >
*
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-03-06 14:16:32 +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>
2006-03-23 12:50:55 +03:00
# include "libvolume_id.h"
2005-03-06 14:16:32 +03:00
# include "util.h"
struct minix_super_block
{
2005-08-01 03:33:36 +04:00
uint16_t s_ninodes ;
uint16_t s_nzones ;
uint16_t s_imap_blocks ;
uint16_t s_zmap_blocks ;
uint16_t s_firstdatazone ;
uint16_t s_log_zone_size ;
uint32_t s_max_size ;
uint16_t s_magic ;
uint16_t s_state ;
uint32_t s_zones ;
2006-02-21 20:44:18 +03:00
} PACKED ;
2005-03-06 14:16:32 +03:00
# define MINIX_SUPERBLOCK_OFFSET 0x400
2005-08-01 03:33:36 +04:00
int volume_id_probe_minix ( struct volume_id * id , uint64_t off )
2005-03-06 14:16:32 +03:00
{
struct minix_super_block * ms ;
2006-04-08 07:04:35 +04:00
info ( " probing at offset 0x%llx " , ( unsigned long long ) off ) ;
2005-03-06 14:16:32 +03:00
ms = ( struct minix_super_block * ) volume_id_get_buffer ( id , off + MINIX_SUPERBLOCK_OFFSET , 0x200 ) ;
if ( ms = = NULL )
return - 1 ;
if ( le16_to_cpu ( ms - > s_magic ) = = 0x137f ) {
strcpy ( id - > type_version , " 1 " ) ;
goto found ;
}
if ( le16_to_cpu ( ms - > s_magic ) = = 0x1387 ) {
strcpy ( id - > type_version , " 1 " ) ;
goto found ;
}
if ( le16_to_cpu ( ms - > s_magic ) = = 0x2468 ) {
strcpy ( id - > type_version , " 2 " ) ;
goto found ;
}
if ( le16_to_cpu ( ms - > s_magic ) = = 0x2478 ) {
strcpy ( id - > type_version , " 2 " ) ;
goto found ;
}
goto exit ;
found :
volume_id_set_usage ( id , VOLUME_ID_FILESYSTEM ) ;
id - > type = " minix " ;
return 0 ;
exit :
return - 1 ;
}