diff -ruN mkinitrd-4.2.1.10.orig/grubby/grubby.c mkinitrd-4.2.1.10/grubby/grubby.c --- mkinitrd-4.2.1.10.orig/grubby/grubby.c 2005-08-30 00:28:34.000000000 +0400 +++ mkinitrd-4.2.1.10/grubby/grubby.c 2007-06-11 11:28:32.000000000 +0400 @@ -235,7 +235,7 @@ struct singleEntry * findEntryByPath(struct grubConfig * cfg, const char * path, const char * prefix, int * index); -static char * strndup(char * from, int len); +static char * strndup(char * from, size_t len); static int readFile(int fd, char ** bufPtr); static void lineInit(struct singleLine * line); static void lineFree(struct singleLine * line); @@ -245,7 +245,7 @@ struct configFileInfo * cfi); static char * getRootSpecifier(char * str); -static char * strndup(char * from, int len) { +static char * strndup(char * from, size_t len) { char * to; to = malloc(len + 1); diff -ruN mkinitrd-4.2.1.10.orig/nash/linux_fs.h mkinitrd-4.2.1.10/nash/linux_fs.h --- mkinitrd-4.2.1.10.orig/nash/linux_fs.h 2002-01-14 04:40:14.000000000 +0300 +++ mkinitrd-4.2.1.10/nash/linux_fs.h 2007-06-11 22:50:30.000000000 +0400 @@ -80,10 +80,19 @@ unsigned char s_oid_maxsize[2]; unsigned char s_oid_cursize[2]; unsigned char s_state[2]; - unsigned char s_magic[12]; + unsigned char s_magic[10]; + unsigned char s_dummy1[10]; + unsigned char s_version[2]; /* only valid with relocated journal */ + + /* only valid in 3.6.x format --mason@suse.com */ + unsigned char s_dummy2[10]; + unsigned char s_uuid[16]; + unsigned char s_label[16]; }; #define REISERFS_SUPER_MAGIC_STRING "ReIsErFs" #define REISER2FS_SUPER_MAGIC_STRING "ReIsEr2Fs" +/* also known as REISER2FS_JR_SUPER_MAGIC_STRING */ +#define REISER3FS_SUPER_MAGIC_STRING "ReIsEr3Fs" #define REISERFS_DISK_OFFSET_IN_BYTES (64 * 1024) /* the spot for the super in versions 3.5 - 3.5.10 (inclusive) */ #define REISERFS_OLD_DISK_OFFSET_IN_BYTES (8 * 1024) diff -ruN mkinitrd-4.2.1.10.orig/nash/mount_by_label.c mkinitrd-4.2.1.10/nash/mount_by_label.c --- mkinitrd-4.2.1.10.orig/nash/mount_by_label.c 2004-08-16 21:11:01.000000000 +0400 +++ mkinitrd-4.2.1.10/nash/mount_by_label.c 2007-06-11 22:51:31.000000000 +0400 @@ -37,39 +37,103 @@ int major, minor; } *uuidCache = NULL; -/* for now, only ext2, ext3 and xfs are supported */ -static int -get_label_uuid(const char *device, char **label, char *uuid) { +typedef int (*GetLabelUuidProc)(int fd, char **label, char *uuid); - /* start with ext2/3 and xfs tests, taken from mount_guess_fstype */ - /* should merge these later */ - int fd; - int rv = 1; - size_t namesize; +static int get_label_uuid_ext2(int fd, char **label, char *uuid); +static int get_label_uuid_xfs(int fd, char **label, char *uuid); +static int get_label_uuid_reiserfs(int fd, char **label, char *uuid); + +/* for now, only ext2, ext3, reiserfs and xfs are supported */ +static const +GetLabelUuidProc get_label_uuid_proc_table[] = +{ + get_label_uuid_ext2, + get_label_uuid_reiserfs, + get_label_uuid_xfs, + NULL +}; + +static int +get_label_uuid_ext2(int fd, char **label, char *uuid) +{ struct ext2_super_block e2sb; - struct xfs_super_block xfsb; - - fd = open(device, O_RDONLY); - if (fd < 0) - return rv; - - if (lseek(fd, 1024, SEEK_SET) == 1024 - && read(fd, (char *) &e2sb, sizeof(e2sb)) == sizeof(e2sb) - && (ext2magic(e2sb) == EXT2_SUPER_MAGIC)) { + if ( ( lseek(fd, 1024, SEEK_SET) == 1024 ) + && read(fd, (char *) &e2sb, sizeof(e2sb)) == sizeof(e2sb) + && (ext2magic(e2sb) == EXT2_SUPER_MAGIC)) { + size_t namesize; memcpy(uuid, e2sb.s_uuid, sizeof(e2sb.s_uuid)); namesize = sizeof(e2sb.s_volume_name); if ((*label = calloc(namesize + 1, 1)) != NULL) memcpy(*label, e2sb.s_volume_name, namesize); - rv = 0; + return 0; } - else if (lseek(fd, 0, SEEK_SET) == 0 - && read(fd, (char *) &xfsb, sizeof(xfsb)) == sizeof(xfsb) - && (strncmp(xfsb.s_magic, XFS_SUPER_MAGIC, 4) == 0)) { + return 1; +} + +static int +get_label_uuid_xfs(int fd, char **label, char *uuid) +{ + struct xfs_super_block xfsb; + if ( (lseek(fd, 0, SEEK_SET) == 0) + && (read(fd, (char *) &xfsb, sizeof(xfsb)) == sizeof(xfsb) ) + && (strncmp((const char*)xfsb.s_magic, XFS_SUPER_MAGIC, 4) == 0) ) { + size_t namesize; memcpy(uuid, xfsb.s_uuid, sizeof(xfsb.s_uuid)); namesize = sizeof(xfsb.s_fname); if ((*label = calloc(namesize + 1, 1)) != NULL) memcpy(*label, xfsb.s_fname, namesize); - rv = 0; + return 0; + } + return 1; +} + +static inline int reiserfs_magic_version(const char *magic) +{ + int rc = 0; + if ( !strncmp(magic, REISERFS_SUPER_MAGIC_STRING, strlen(REISERFS_SUPER_MAGIC_STRING)) ) + rc = 1; + if ( !strncmp(magic, REISER2FS_SUPER_MAGIC_STRING, strlen(REISER2FS_SUPER_MAGIC_STRING)) ) + rc = 2; + if ( !strncmp(magic, REISER3FS_SUPER_MAGIC_STRING, strlen(REISER3FS_SUPER_MAGIC_STRING)) ) + rc = 3; + return rc; +} + +static int +get_label_uuid_reiserfs(int fd, char **label, char *uuid) +{ + struct reiserfs_super_block reiserfssb; + if ( (lseek(fd, REISERFS_DISK_OFFSET_IN_BYTES, SEEK_SET) == REISERFS_DISK_OFFSET_IN_BYTES) + && ( read(fd, (char *) &reiserfssb, sizeof(reiserfssb)) == sizeof(reiserfssb) ) + /* Only 3.6.x format supers have labels or uuids. + Label and UUID can be set by reiserfstune -l/-u. */ + && (reiserfs_magic_version((const char*)reiserfssb.s_magic) > 1) ) { + size_t namesize; + memcpy(uuid, reiserfssb.s_uuid, sizeof(reiserfssb.s_uuid)); + namesize = sizeof(reiserfssb.s_label); + if ((*label = calloc(namesize + 1, 1)) != NULL) + memcpy(*label, reiserfssb.s_label, namesize); + return 0; + } + return 1; +} + +static int +get_label_uuid(const char *device, char **label, char *uuid) +{ + int fd; + int rv = 1; + const GetLabelUuidProc *proc = get_label_uuid_proc_table; + + fd = open(device, O_RDONLY); + if (fd < 0) + return rv; + + while(proc) { + rv = (*proc)(fd, label, uuid); + if ( !rv ) + break; + ++proc; } close(fd); @@ -265,7 +329,7 @@ uuid[i] = ((fromhex(s[0])<<4) | fromhex(s[1])); s += 2; } - return get_spec_by_x(UUID, uuid, major, minor); + return get_spec_by_x(UUID, (const char*)uuid, major, minor); bad_uuid: fprintf(stderr, _("mount: bad UUID")); diff -ruN mkinitrd-4.2.1.10.orig/nash/nash.c mkinitrd-4.2.1.10/nash/nash.c --- mkinitrd-4.2.1.10.orig/nash/nash.c 2007-01-31 23:45:09.000000000 +0300 +++ mkinitrd-4.2.1.10/nash/nash.c 2007-06-11 11:26:22.000000000 +0400 @@ -1561,7 +1561,7 @@ int i; char * start, * end; char * chptr; - int rc; + int rc = -1; i = read(fd, contents, sizeof(contents) - 1); if (i == (sizeof(contents) - 1)) {