2005-02-09 03:02:18 +03:00
/*
* volume_id - reads filesystem label and uuid
*
* Copyright ( C ) 2004 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-02-09 03:02:18 +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-02-09 03:02:18 +03:00
struct romfs_super {
2005-08-01 03:33:36 +04:00
uint8_t magic [ 8 ] ;
uint32_t size ;
uint32_t checksum ;
uint8_t name [ 0 ] ;
2006-02-21 20:44:18 +03:00
} PACKED ;
2005-02-09 03:02:18 +03:00
2005-08-01 03:33:36 +04:00
int volume_id_probe_romfs ( struct volume_id * id , uint64_t off )
2005-02-09 03:02:18 +03:00
{
struct romfs_super * rfs ;
2005-03-10 02:58:01 +03:00
dbg ( " probing at offset 0x%llx " , ( unsigned long long ) off ) ;
2005-02-09 03:02:18 +03:00
rfs = ( struct romfs_super * ) volume_id_get_buffer ( id , off , 0x200 ) ;
if ( rfs = = NULL )
return - 1 ;
if ( memcmp ( rfs - > magic , " -rom1fs- " , 4 ) = = 0 ) {
2005-08-01 03:33:36 +04:00
size_t len = strlen ( ( char * ) rfs - > name ) ;
2005-02-09 03:02:18 +03:00
if ( len ) {
volume_id_set_label_raw ( id , rfs - > name , len ) ;
volume_id_set_label_string ( id , rfs - > name , len ) ;
}
volume_id_set_usage ( id , VOLUME_ID_FILESYSTEM ) ;
id - > type = " romfs " ;
return 0 ;
}
return - 1 ;
}