af28f636873b7156cfd73ceffa927658cca33fd0Enrico Perla - Sun Microsystems/*
af28f636873b7156cfd73ceffa927658cca33fd0Enrico Perla - Sun Microsystems * CDDL HEADER START
af28f636873b7156cfd73ceffa927658cca33fd0Enrico Perla - Sun Microsystems *
af28f636873b7156cfd73ceffa927658cca33fd0Enrico Perla - Sun Microsystems * The contents of this file are subject to the terms of the
af28f636873b7156cfd73ceffa927658cca33fd0Enrico Perla - Sun Microsystems * Common Development and Distribution License (the "License").
af28f636873b7156cfd73ceffa927658cca33fd0Enrico Perla - Sun Microsystems * You may not use this file except in compliance with the License.
af28f636873b7156cfd73ceffa927658cca33fd0Enrico Perla - Sun Microsystems *
af28f636873b7156cfd73ceffa927658cca33fd0Enrico Perla - Sun Microsystems * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
af28f636873b7156cfd73ceffa927658cca33fd0Enrico Perla - Sun Microsystems * or http://www.opensolaris.org/os/licensing.
af28f636873b7156cfd73ceffa927658cca33fd0Enrico Perla - Sun Microsystems * See the License for the specific language governing permissions
af28f636873b7156cfd73ceffa927658cca33fd0Enrico Perla - Sun Microsystems * and limitations under the License.
af28f636873b7156cfd73ceffa927658cca33fd0Enrico Perla - Sun Microsystems *
af28f636873b7156cfd73ceffa927658cca33fd0Enrico Perla - Sun Microsystems * When distributing Covered Code, include this CDDL HEADER in each
af28f636873b7156cfd73ceffa927658cca33fd0Enrico Perla - Sun Microsystems * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
af28f636873b7156cfd73ceffa927658cca33fd0Enrico Perla - Sun Microsystems * If applicable, add the following below this CDDL HEADER, with the
af28f636873b7156cfd73ceffa927658cca33fd0Enrico Perla - Sun Microsystems * fields enclosed by brackets "[]" replaced with your own identifying
af28f636873b7156cfd73ceffa927658cca33fd0Enrico Perla - Sun Microsystems * information: Portions Copyright [yyyy] [name of copyright owner]
af28f636873b7156cfd73ceffa927658cca33fd0Enrico Perla - Sun Microsystems *
af28f636873b7156cfd73ceffa927658cca33fd0Enrico Perla - Sun Microsystems * CDDL HEADER END
af28f636873b7156cfd73ceffa927658cca33fd0Enrico Perla - Sun Microsystems */
af28f636873b7156cfd73ceffa927658cca33fd0Enrico Perla - Sun Microsystems/*
af28f636873b7156cfd73ceffa927658cca33fd0Enrico Perla - Sun Microsystems * Copyright (c) 2010, Oracle and/or its affiliates. All rights reserved.
af28f636873b7156cfd73ceffa927658cca33fd0Enrico Perla - Sun Microsystems */
af28f636873b7156cfd73ceffa927658cca33fd0Enrico Perla - Sun Microsystems
af28f636873b7156cfd73ceffa927658cca33fd0Enrico Perla - Sun Microsystems#include <stdio.h>
af28f636873b7156cfd73ceffa927658cca33fd0Enrico Perla - Sun Microsystems#include <stdint.h>
af28f636873b7156cfd73ceffa927658cca33fd0Enrico Perla - Sun Microsystems#include <stdlib.h>
af28f636873b7156cfd73ceffa927658cca33fd0Enrico Perla - Sun Microsystems#include <string.h>
af28f636873b7156cfd73ceffa927658cca33fd0Enrico Perla - Sun Microsystems#include <libintl.h>
af28f636873b7156cfd73ceffa927658cca33fd0Enrico Perla - Sun Microsystems#include <unistd.h>
af28f636873b7156cfd73ceffa927658cca33fd0Enrico Perla - Sun Microsystems#include <fcntl.h>
af28f636873b7156cfd73ceffa927658cca33fd0Enrico Perla - Sun Microsystems#include <sys/types.h>
af28f636873b7156cfd73ceffa927658cca33fd0Enrico Perla - Sun Microsystems#include <sys/stat.h>
af28f636873b7156cfd73ceffa927658cca33fd0Enrico Perla - Sun Microsystems
af28f636873b7156cfd73ceffa927658cca33fd0Enrico Perla - Sun Microsystems#include "bblk_einfo.h"
af28f636873b7156cfd73ceffa927658cca33fd0Enrico Perla - Sun Microsystems#include "boot_utils.h"
af28f636873b7156cfd73ceffa927658cca33fd0Enrico Perla - Sun Microsystems
af28f636873b7156cfd73ceffa927658cca33fd0Enrico Perla - Sun Microsystemsbblk_hash_t bblk_no_hash = {BBLK_NO_HASH, 0, "(no hash)", NULL};
af28f636873b7156cfd73ceffa927658cca33fd0Enrico Perla - Sun Microsystemsbblk_hash_t bblk_md5_hash = {BBLK_HASH_MD5, 0x10, "MD5", md5_calc};
af28f636873b7156cfd73ceffa927658cca33fd0Enrico Perla - Sun Microsystems
af28f636873b7156cfd73ceffa927658cca33fd0Enrico Perla - Sun Microsystemsbblk_hash_t *bblk_hash_list[BBLK_HASH_TOT] = {
af28f636873b7156cfd73ceffa927658cca33fd0Enrico Perla - Sun Microsystems &bblk_no_hash,
af28f636873b7156cfd73ceffa927658cca33fd0Enrico Perla - Sun Microsystems &bblk_md5_hash
af28f636873b7156cfd73ceffa927658cca33fd0Enrico Perla - Sun Microsystems};
af28f636873b7156cfd73ceffa927658cca33fd0Enrico Perla - Sun Microsystems
af28f636873b7156cfd73ceffa927658cca33fd0Enrico Perla - Sun Microsystems/*
af28f636873b7156cfd73ceffa927658cca33fd0Enrico Perla - Sun Microsystems * einfo_compare_dotted_version()
af28f636873b7156cfd73ceffa927658cca33fd0Enrico Perla - Sun Microsystems * Compares two strings with an arbitrary long number of dot-separated numbers.
af28f636873b7156cfd73ceffa927658cca33fd0Enrico Perla - Sun Microsystems * Returns: 0 - if the version numbers are equal
af28f636873b7156cfd73ceffa927658cca33fd0Enrico Perla - Sun Microsystems * 1 - if str1 version number is more recent than str2
af28f636873b7156cfd73ceffa927658cca33fd0Enrico Perla - Sun Microsystems * 2 - if str2 version number is more recent than str1
af28f636873b7156cfd73ceffa927658cca33fd0Enrico Perla - Sun Microsystems * -1 - if an error occurred
af28f636873b7156cfd73ceffa927658cca33fd0Enrico Perla - Sun Microsystems *
af28f636873b7156cfd73ceffa927658cca33fd0Enrico Perla - Sun Microsystems * Comparison is done field by field, by retrieving an unsigned integer value,
af28f636873b7156cfd73ceffa927658cca33fd0Enrico Perla - Sun Microsystems * (missing fields are assumed as 0, but explict zeroes take precedence) so:
af28f636873b7156cfd73ceffa927658cca33fd0Enrico Perla - Sun Microsystems * 4.1.2.11 > 4.1.2.2 > 4.1.2.0 > 4.1.2
af28f636873b7156cfd73ceffa927658cca33fd0Enrico Perla - Sun Microsystems *
af28f636873b7156cfd73ceffa927658cca33fd0Enrico Perla - Sun Microsystems * where ">" means "more recent than".
af28f636873b7156cfd73ceffa927658cca33fd0Enrico Perla - Sun Microsystems */
af28f636873b7156cfd73ceffa927658cca33fd0Enrico Perla - Sun Microsystemsstatic int
af28f636873b7156cfd73ceffa927658cca33fd0Enrico Perla - Sun Microsystemseinfo_compare_dotted_version(const char *str1, const char *str2)
af28f636873b7156cfd73ceffa927658cca33fd0Enrico Perla - Sun Microsystems{
af28f636873b7156cfd73ceffa927658cca33fd0Enrico Perla - Sun Microsystems int retval = 0;
af28f636873b7156cfd73ceffa927658cca33fd0Enrico Perla - Sun Microsystems char *verstr1, *verstr2, *freeptr1, *freeptr2;
af28f636873b7156cfd73ceffa927658cca33fd0Enrico Perla - Sun Microsystems char *parsep1, *parsep2;
af28f636873b7156cfd73ceffa927658cca33fd0Enrico Perla - Sun Microsystems unsigned int val_str1, val_str2;
af28f636873b7156cfd73ceffa927658cca33fd0Enrico Perla - Sun Microsystems
af28f636873b7156cfd73ceffa927658cca33fd0Enrico Perla - Sun Microsystems freeptr1 = verstr1 = strdup(str1);
af28f636873b7156cfd73ceffa927658cca33fd0Enrico Perla - Sun Microsystems freeptr2 = verstr2 = strdup(str2);
af28f636873b7156cfd73ceffa927658cca33fd0Enrico Perla - Sun Microsystems if (verstr1 == NULL || verstr2 == NULL) {
af28f636873b7156cfd73ceffa927658cca33fd0Enrico Perla - Sun Microsystems retval = -1;
af28f636873b7156cfd73ceffa927658cca33fd0Enrico Perla - Sun Microsystems goto out;
af28f636873b7156cfd73ceffa927658cca33fd0Enrico Perla - Sun Microsystems }
af28f636873b7156cfd73ceffa927658cca33fd0Enrico Perla - Sun Microsystems
af28f636873b7156cfd73ceffa927658cca33fd0Enrico Perla - Sun Microsystems while (verstr1 != NULL && verstr2 != NULL) {
af28f636873b7156cfd73ceffa927658cca33fd0Enrico Perla - Sun Microsystems parsep1 = strsep(&verstr1, ".");
af28f636873b7156cfd73ceffa927658cca33fd0Enrico Perla - Sun Microsystems parsep2 = strsep(&verstr2, ".");
af28f636873b7156cfd73ceffa927658cca33fd0Enrico Perla - Sun Microsystems
af28f636873b7156cfd73ceffa927658cca33fd0Enrico Perla - Sun Microsystems val_str1 = atoi(parsep1);
af28f636873b7156cfd73ceffa927658cca33fd0Enrico Perla - Sun Microsystems val_str2 = atoi(parsep2);
af28f636873b7156cfd73ceffa927658cca33fd0Enrico Perla - Sun Microsystems
af28f636873b7156cfd73ceffa927658cca33fd0Enrico Perla - Sun Microsystems if (val_str1 > val_str2) {
af28f636873b7156cfd73ceffa927658cca33fd0Enrico Perla - Sun Microsystems retval = 1;
af28f636873b7156cfd73ceffa927658cca33fd0Enrico Perla - Sun Microsystems goto out;
af28f636873b7156cfd73ceffa927658cca33fd0Enrico Perla - Sun Microsystems }
af28f636873b7156cfd73ceffa927658cca33fd0Enrico Perla - Sun Microsystems
af28f636873b7156cfd73ceffa927658cca33fd0Enrico Perla - Sun Microsystems if (val_str2 > val_str1) {
af28f636873b7156cfd73ceffa927658cca33fd0Enrico Perla - Sun Microsystems retval = 2;
af28f636873b7156cfd73ceffa927658cca33fd0Enrico Perla - Sun Microsystems goto out;
af28f636873b7156cfd73ceffa927658cca33fd0Enrico Perla - Sun Microsystems }
af28f636873b7156cfd73ceffa927658cca33fd0Enrico Perla - Sun Microsystems }
af28f636873b7156cfd73ceffa927658cca33fd0Enrico Perla - Sun Microsystems
af28f636873b7156cfd73ceffa927658cca33fd0Enrico Perla - Sun Microsystems /* Common portion of the version string is equal. */
af28f636873b7156cfd73ceffa927658cca33fd0Enrico Perla - Sun Microsystems if (verstr1 == NULL && verstr2 != NULL)
af28f636873b7156cfd73ceffa927658cca33fd0Enrico Perla - Sun Microsystems retval = 2;
af28f636873b7156cfd73ceffa927658cca33fd0Enrico Perla - Sun Microsystems if (verstr2 == NULL && verstr1 != NULL)
af28f636873b7156cfd73ceffa927658cca33fd0Enrico Perla - Sun Microsystems retval = 1;
af28f636873b7156cfd73ceffa927658cca33fd0Enrico Perla - Sun Microsystems
af28f636873b7156cfd73ceffa927658cca33fd0Enrico Perla - Sun Microsystemsout:
af28f636873b7156cfd73ceffa927658cca33fd0Enrico Perla - Sun Microsystems free(freeptr1);
af28f636873b7156cfd73ceffa927658cca33fd0Enrico Perla - Sun Microsystems free(freeptr2);
af28f636873b7156cfd73ceffa927658cca33fd0Enrico Perla - Sun Microsystems return (retval);
af28f636873b7156cfd73ceffa927658cca33fd0Enrico Perla - Sun Microsystems}
af28f636873b7156cfd73ceffa927658cca33fd0Enrico Perla - Sun Microsystems
af28f636873b7156cfd73ceffa927658cca33fd0Enrico Perla - Sun Microsystems/*
af28f636873b7156cfd73ceffa927658cca33fd0Enrico Perla - Sun Microsystems * einfo_compare_timestamps()
af28f636873b7156cfd73ceffa927658cca33fd0Enrico Perla - Sun Microsystems * Currently, timestamp is in %Y%m%dT%H%M%SZ format in UTC, which means that
af28f636873b7156cfd73ceffa927658cca33fd0Enrico Perla - Sun Microsystems * we can simply do a lexicographic comparison to know which one is the most
af28f636873b7156cfd73ceffa927658cca33fd0Enrico Perla - Sun Microsystems * recent.
af28f636873b7156cfd73ceffa927658cca33fd0Enrico Perla - Sun Microsystems *
af28f636873b7156cfd73ceffa927658cca33fd0Enrico Perla - Sun Microsystems * Returns: 0 - if timestamps coincide
af28f636873b7156cfd73ceffa927658cca33fd0Enrico Perla - Sun Microsystems * 1 - if the timestamp in str1 is more recent
af28f636873b7156cfd73ceffa927658cca33fd0Enrico Perla - Sun Microsystems * 2 - if the timestamp in str2 is more recent
af28f636873b7156cfd73ceffa927658cca33fd0Enrico Perla - Sun Microsystems */
af28f636873b7156cfd73ceffa927658cca33fd0Enrico Perla - Sun Microsystemsstatic int
af28f636873b7156cfd73ceffa927658cca33fd0Enrico Perla - Sun Microsystemseinfo_compare_timestamps(const char *str1, const char *str2)
af28f636873b7156cfd73ceffa927658cca33fd0Enrico Perla - Sun Microsystems{
af28f636873b7156cfd73ceffa927658cca33fd0Enrico Perla - Sun Microsystems int retval;
af28f636873b7156cfd73ceffa927658cca33fd0Enrico Perla - Sun Microsystems
af28f636873b7156cfd73ceffa927658cca33fd0Enrico Perla - Sun Microsystems retval = strcmp(str1, str2);
af28f636873b7156cfd73ceffa927658cca33fd0Enrico Perla - Sun Microsystems if (retval > 0)
af28f636873b7156cfd73ceffa927658cca33fd0Enrico Perla - Sun Microsystems retval = 1;
af28f636873b7156cfd73ceffa927658cca33fd0Enrico Perla - Sun Microsystems if (retval < 0)
af28f636873b7156cfd73ceffa927658cca33fd0Enrico Perla - Sun Microsystems retval = 2;
af28f636873b7156cfd73ceffa927658cca33fd0Enrico Perla - Sun Microsystems
af28f636873b7156cfd73ceffa927658cca33fd0Enrico Perla - Sun Microsystems return (retval);
af28f636873b7156cfd73ceffa927658cca33fd0Enrico Perla - Sun Microsystems}
af28f636873b7156cfd73ceffa927658cca33fd0Enrico Perla - Sun Microsystems
af28f636873b7156cfd73ceffa927658cca33fd0Enrico Perla - Sun Microsystems/*
af28f636873b7156cfd73ceffa927658cca33fd0Enrico Perla - Sun Microsystems * einfo_compare_version()
af28f636873b7156cfd73ceffa927658cca33fd0Enrico Perla - Sun Microsystems * Given two extended versions, compare the two and returns which one is more
af28f636873b7156cfd73ceffa927658cca33fd0Enrico Perla - Sun Microsystems * "recent". Comparison is based on dotted version number fields and a
af28f636873b7156cfd73ceffa927658cca33fd0Enrico Perla - Sun Microsystems * timestamp.
af28f636873b7156cfd73ceffa927658cca33fd0Enrico Perla - Sun Microsystems *
af28f636873b7156cfd73ceffa927658cca33fd0Enrico Perla - Sun Microsystems * Returns: -1 - on error
af28f636873b7156cfd73ceffa927658cca33fd0Enrico Perla - Sun Microsystems * 0 - if the two versions coincide
af28f636873b7156cfd73ceffa927658cca33fd0Enrico Perla - Sun Microsystems * 1 - if the version in str1 is more recent
af28f636873b7156cfd73ceffa927658cca33fd0Enrico Perla - Sun Microsystems * 2 - if the version in str2 is more recent
af28f636873b7156cfd73ceffa927658cca33fd0Enrico Perla - Sun Microsystems */
af28f636873b7156cfd73ceffa927658cca33fd0Enrico Perla - Sun Microsystemsstatic int
af28f636873b7156cfd73ceffa927658cca33fd0Enrico Perla - Sun Microsystemseinfo_compare_version(const char *str1, const char *str2)
af28f636873b7156cfd73ceffa927658cca33fd0Enrico Perla - Sun Microsystems{
af28f636873b7156cfd73ceffa927658cca33fd0Enrico Perla - Sun Microsystems int retval = 0;
af28f636873b7156cfd73ceffa927658cca33fd0Enrico Perla - Sun Microsystems char *verstr1, *verstr2, *freeptr1, *freeptr2;
af28f636873b7156cfd73ceffa927658cca33fd0Enrico Perla - Sun Microsystems char *parsep1, *parsep2;
af28f636873b7156cfd73ceffa927658cca33fd0Enrico Perla - Sun Microsystems
af28f636873b7156cfd73ceffa927658cca33fd0Enrico Perla - Sun Microsystems freeptr1 = verstr1 = strdup(str1);
af28f636873b7156cfd73ceffa927658cca33fd0Enrico Perla - Sun Microsystems freeptr2 = verstr2 = strdup(str2);
af28f636873b7156cfd73ceffa927658cca33fd0Enrico Perla - Sun Microsystems if (verstr1 == NULL || verstr2 == NULL) {
af28f636873b7156cfd73ceffa927658cca33fd0Enrico Perla - Sun Microsystems retval = -1;
af28f636873b7156cfd73ceffa927658cca33fd0Enrico Perla - Sun Microsystems goto out;
af28f636873b7156cfd73ceffa927658cca33fd0Enrico Perla - Sun Microsystems }
af28f636873b7156cfd73ceffa927658cca33fd0Enrico Perla - Sun Microsystems
af28f636873b7156cfd73ceffa927658cca33fd0Enrico Perla - Sun Microsystems parsep1 = verstr1;
af28f636873b7156cfd73ceffa927658cca33fd0Enrico Perla - Sun Microsystems parsep2 = verstr2;
af28f636873b7156cfd73ceffa927658cca33fd0Enrico Perla - Sun Microsystems
af28f636873b7156cfd73ceffa927658cca33fd0Enrico Perla - Sun Microsystems while (parsep1 != NULL && parsep2 != NULL) {
af28f636873b7156cfd73ceffa927658cca33fd0Enrico Perla - Sun Microsystems parsep1 = strsep(&verstr1, ",:-");
af28f636873b7156cfd73ceffa927658cca33fd0Enrico Perla - Sun Microsystems parsep2 = strsep(&verstr2, ",:-");
af28f636873b7156cfd73ceffa927658cca33fd0Enrico Perla - Sun Microsystems
af28f636873b7156cfd73ceffa927658cca33fd0Enrico Perla - Sun Microsystems /* verstr1 or verstr2 will be NULL before parsep1 or parsep2. */
af28f636873b7156cfd73ceffa927658cca33fd0Enrico Perla - Sun Microsystems if (verstr1 == NULL || verstr2 == NULL) {
af28f636873b7156cfd73ceffa927658cca33fd0Enrico Perla - Sun Microsystems retval = einfo_compare_timestamps(parsep1, parsep2);
af28f636873b7156cfd73ceffa927658cca33fd0Enrico Perla - Sun Microsystems goto out;
af28f636873b7156cfd73ceffa927658cca33fd0Enrico Perla - Sun Microsystems }
af28f636873b7156cfd73ceffa927658cca33fd0Enrico Perla - Sun Microsystems
af28f636873b7156cfd73ceffa927658cca33fd0Enrico Perla - Sun Microsystems retval = einfo_compare_dotted_version(parsep1, parsep2);
af28f636873b7156cfd73ceffa927658cca33fd0Enrico Perla - Sun Microsystems if (retval == 0)
af28f636873b7156cfd73ceffa927658cca33fd0Enrico Perla - Sun Microsystems continue;
af28f636873b7156cfd73ceffa927658cca33fd0Enrico Perla - Sun Microsystems else
af28f636873b7156cfd73ceffa927658cca33fd0Enrico Perla - Sun Microsystems goto out;
af28f636873b7156cfd73ceffa927658cca33fd0Enrico Perla - Sun Microsystems }
af28f636873b7156cfd73ceffa927658cca33fd0Enrico Perla - Sun Microsystemsout:
af28f636873b7156cfd73ceffa927658cca33fd0Enrico Perla - Sun Microsystems free(freeptr1);
af28f636873b7156cfd73ceffa927658cca33fd0Enrico Perla - Sun Microsystems free(freeptr2);
af28f636873b7156cfd73ceffa927658cca33fd0Enrico Perla - Sun Microsystems return (retval);
af28f636873b7156cfd73ceffa927658cca33fd0Enrico Perla - Sun Microsystems}
af28f636873b7156cfd73ceffa927658cca33fd0Enrico Perla - Sun Microsystems
af28f636873b7156cfd73ceffa927658cca33fd0Enrico Perla - Sun Microsystems/*
af28f636873b7156cfd73ceffa927658cca33fd0Enrico Perla - Sun Microsystems * print_einfo()
af28f636873b7156cfd73ceffa927658cca33fd0Enrico Perla - Sun Microsystems *
af28f636873b7156cfd73ceffa927658cca33fd0Enrico Perla - Sun Microsystems * Print the extended information contained into the pointed structure.
af28f636873b7156cfd73ceffa927658cca33fd0Enrico Perla - Sun Microsystems * 'bufsize' specifies the real size of the structure, since str_off and
af28f636873b7156cfd73ceffa927658cca33fd0Enrico Perla - Sun Microsystems * hash_off need to point somewhere past the header.
af28f636873b7156cfd73ceffa927658cca33fd0Enrico Perla - Sun Microsystems */
af28f636873b7156cfd73ceffa927658cca33fd0Enrico Perla - Sun Microsystemsvoid
af28f636873b7156cfd73ceffa927658cca33fd0Enrico Perla - Sun Microsystemsprint_einfo(uint8_t flags, bblk_einfo_t *einfo, unsigned long bufsize)
af28f636873b7156cfd73ceffa927658cca33fd0Enrico Perla - Sun Microsystems{
af28f636873b7156cfd73ceffa927658cca33fd0Enrico Perla - Sun Microsystems int i = 0;
af28f636873b7156cfd73ceffa927658cca33fd0Enrico Perla - Sun Microsystems char *version;
af28f636873b7156cfd73ceffa927658cca33fd0Enrico Perla - Sun Microsystems boolean_t has_hash = B_FALSE;
3bbf88b3546192f29c18986b9fb8a19ff364a4eaToomas Soome unsigned char *hash = NULL;
af28f636873b7156cfd73ceffa927658cca33fd0Enrico Perla - Sun Microsystems
af28f636873b7156cfd73ceffa927658cca33fd0Enrico Perla - Sun Microsystems if (einfo->str_off + einfo->str_size > bufsize) {
af28f636873b7156cfd73ceffa927658cca33fd0Enrico Perla - Sun Microsystems (void) fprintf(stdout, gettext("String offset %d is beyond the "
af28f636873b7156cfd73ceffa927658cca33fd0Enrico Perla - Sun Microsystems "buffer size\n"), einfo->str_off);
af28f636873b7156cfd73ceffa927658cca33fd0Enrico Perla - Sun Microsystems return;
af28f636873b7156cfd73ceffa927658cca33fd0Enrico Perla - Sun Microsystems }
af28f636873b7156cfd73ceffa927658cca33fd0Enrico Perla - Sun Microsystems
af28f636873b7156cfd73ceffa927658cca33fd0Enrico Perla - Sun Microsystems version = (char *)einfo + einfo->str_off;
af28f636873b7156cfd73ceffa927658cca33fd0Enrico Perla - Sun Microsystems if (einfo->hash_type != BBLK_NO_HASH &&
af28f636873b7156cfd73ceffa927658cca33fd0Enrico Perla - Sun Microsystems einfo->hash_type < BBLK_HASH_TOT) {
af28f636873b7156cfd73ceffa927658cca33fd0Enrico Perla - Sun Microsystems if (einfo->hash_off + einfo->hash_size > bufsize) {
af28f636873b7156cfd73ceffa927658cca33fd0Enrico Perla - Sun Microsystems (void) fprintf(stdout, gettext("Warning: hashing "
af28f636873b7156cfd73ceffa927658cca33fd0Enrico Perla - Sun Microsystems "present but hash offset %d is beyond the buffer "
af28f636873b7156cfd73ceffa927658cca33fd0Enrico Perla - Sun Microsystems "size\n"), einfo->hash_off);
af28f636873b7156cfd73ceffa927658cca33fd0Enrico Perla - Sun Microsystems has_hash = B_FALSE;
af28f636873b7156cfd73ceffa927658cca33fd0Enrico Perla - Sun Microsystems } else {
af28f636873b7156cfd73ceffa927658cca33fd0Enrico Perla - Sun Microsystems hash = (unsigned char *)einfo + einfo->hash_off;
af28f636873b7156cfd73ceffa927658cca33fd0Enrico Perla - Sun Microsystems has_hash = B_TRUE;
af28f636873b7156cfd73ceffa927658cca33fd0Enrico Perla - Sun Microsystems }
af28f636873b7156cfd73ceffa927658cca33fd0Enrico Perla - Sun Microsystems }
af28f636873b7156cfd73ceffa927658cca33fd0Enrico Perla - Sun Microsystems
af28f636873b7156cfd73ceffa927658cca33fd0Enrico Perla - Sun Microsystems if (flags & EINFO_PRINT_HEADER) {
af28f636873b7156cfd73ceffa927658cca33fd0Enrico Perla - Sun Microsystems (void) fprintf(stdout, "Boot Block Extended Info Header:\n");
af28f636873b7156cfd73ceffa927658cca33fd0Enrico Perla - Sun Microsystems (void) fprintf(stdout, "\tmagic: ");
af28f636873b7156cfd73ceffa927658cca33fd0Enrico Perla - Sun Microsystems for (i = 0; i < EINFO_MAGIC_SIZE; i++)
af28f636873b7156cfd73ceffa927658cca33fd0Enrico Perla - Sun Microsystems (void) fprintf(stdout, "%c", einfo->magic[i]);
af28f636873b7156cfd73ceffa927658cca33fd0Enrico Perla - Sun Microsystems (void) fprintf(stdout, "\n");
af28f636873b7156cfd73ceffa927658cca33fd0Enrico Perla - Sun Microsystems (void) fprintf(stdout, "\tversion: %d\n", einfo->version);
af28f636873b7156cfd73ceffa927658cca33fd0Enrico Perla - Sun Microsystems (void) fprintf(stdout, "\tflags: %x\n", einfo->flags);
af28f636873b7156cfd73ceffa927658cca33fd0Enrico Perla - Sun Microsystems (void) fprintf(stdout, "\textended version string offset: %d\n",
af28f636873b7156cfd73ceffa927658cca33fd0Enrico Perla - Sun Microsystems einfo->str_off);
af28f636873b7156cfd73ceffa927658cca33fd0Enrico Perla - Sun Microsystems (void) fprintf(stdout, "\textended version string size: %d\n",
af28f636873b7156cfd73ceffa927658cca33fd0Enrico Perla - Sun Microsystems einfo->str_size);
af28f636873b7156cfd73ceffa927658cca33fd0Enrico Perla - Sun Microsystems (void) fprintf(stdout, "\thashing type: %d (%s)\n",
af28f636873b7156cfd73ceffa927658cca33fd0Enrico Perla - Sun Microsystems einfo->hash_type, has_hash ?
af28f636873b7156cfd73ceffa927658cca33fd0Enrico Perla - Sun Microsystems bblk_hash_list[einfo->hash_type]->name : "nil");
af28f636873b7156cfd73ceffa927658cca33fd0Enrico Perla - Sun Microsystems (void) fprintf(stdout, "\thash offset: %d\n", einfo->hash_off);
af28f636873b7156cfd73ceffa927658cca33fd0Enrico Perla - Sun Microsystems (void) fprintf(stdout, "\thash size: %d\n", einfo->hash_size);
af28f636873b7156cfd73ceffa927658cca33fd0Enrico Perla - Sun Microsystems }
af28f636873b7156cfd73ceffa927658cca33fd0Enrico Perla - Sun Microsystems
af28f636873b7156cfd73ceffa927658cca33fd0Enrico Perla - Sun Microsystems if (flags & EINFO_EASY_PARSE) {
af28f636873b7156cfd73ceffa927658cca33fd0Enrico Perla - Sun Microsystems (void) fprintf(stdout, "%s\n", version);
af28f636873b7156cfd73ceffa927658cca33fd0Enrico Perla - Sun Microsystems } else {
af28f636873b7156cfd73ceffa927658cca33fd0Enrico Perla - Sun Microsystems (void) fprintf(stdout, "Extended version string: %s\n",
af28f636873b7156cfd73ceffa927658cca33fd0Enrico Perla - Sun Microsystems version);
af28f636873b7156cfd73ceffa927658cca33fd0Enrico Perla - Sun Microsystems if (has_hash) {
af28f636873b7156cfd73ceffa927658cca33fd0Enrico Perla - Sun Microsystems (void) fprintf(stdout, "%s hash: ",
af28f636873b7156cfd73ceffa927658cca33fd0Enrico Perla - Sun Microsystems bblk_hash_list[einfo->hash_type]->name);
af28f636873b7156cfd73ceffa927658cca33fd0Enrico Perla - Sun Microsystems } else {
af28f636873b7156cfd73ceffa927658cca33fd0Enrico Perla - Sun Microsystems (void) fprintf(stdout, "No hashing available\n");
af28f636873b7156cfd73ceffa927658cca33fd0Enrico Perla - Sun Microsystems }
af28f636873b7156cfd73ceffa927658cca33fd0Enrico Perla - Sun Microsystems }
af28f636873b7156cfd73ceffa927658cca33fd0Enrico Perla - Sun Microsystems
af28f636873b7156cfd73ceffa927658cca33fd0Enrico Perla - Sun Microsystems if (has_hash) {
af28f636873b7156cfd73ceffa927658cca33fd0Enrico Perla - Sun Microsystems for (i = 0; i < einfo->hash_size; i++) {
af28f636873b7156cfd73ceffa927658cca33fd0Enrico Perla - Sun Microsystems (void) fprintf(stdout, "%02x", hash[i]);
af28f636873b7156cfd73ceffa927658cca33fd0Enrico Perla - Sun Microsystems }
af28f636873b7156cfd73ceffa927658cca33fd0Enrico Perla - Sun Microsystems (void) fprintf(stdout, "\n");
af28f636873b7156cfd73ceffa927658cca33fd0Enrico Perla - Sun Microsystems }
af28f636873b7156cfd73ceffa927658cca33fd0Enrico Perla - Sun Microsystems}
af28f636873b7156cfd73ceffa927658cca33fd0Enrico Perla - Sun Microsystems
af28f636873b7156cfd73ceffa927658cca33fd0Enrico Perla - Sun Microsystemsstatic int
af28f636873b7156cfd73ceffa927658cca33fd0Enrico Perla - Sun Microsystemscompute_hash(bblk_hs_t *hs, unsigned char *dest, bblk_hash_t *hash)
af28f636873b7156cfd73ceffa927658cca33fd0Enrico Perla - Sun Microsystems{
af28f636873b7156cfd73ceffa927658cca33fd0Enrico Perla - Sun Microsystems if (hs == NULL || dest == NULL || hash == NULL)
af28f636873b7156cfd73ceffa927658cca33fd0Enrico Perla - Sun Microsystems return (-1);
af28f636873b7156cfd73ceffa927658cca33fd0Enrico Perla - Sun Microsystems
af28f636873b7156cfd73ceffa927658cca33fd0Enrico Perla - Sun Microsystems hash->compute_hash(dest, hs->src_buf, hs->src_size);
af28f636873b7156cfd73ceffa927658cca33fd0Enrico Perla - Sun Microsystems return (0);
af28f636873b7156cfd73ceffa927658cca33fd0Enrico Perla - Sun Microsystems}
af28f636873b7156cfd73ceffa927658cca33fd0Enrico Perla - Sun Microsystems
af28f636873b7156cfd73ceffa927658cca33fd0Enrico Perla - Sun Microsystemsint
af28f636873b7156cfd73ceffa927658cca33fd0Enrico Perla - Sun Microsystemsprepare_and_write_einfo(unsigned char *dest, char *infostr, bblk_hs_t *hs,
af28f636873b7156cfd73ceffa927658cca33fd0Enrico Perla - Sun Microsystems uint32_t maxsize, uint32_t *used_space)
af28f636873b7156cfd73ceffa927658cca33fd0Enrico Perla - Sun Microsystems{
af28f636873b7156cfd73ceffa927658cca33fd0Enrico Perla - Sun Microsystems uint16_t hash_size;
af28f636873b7156cfd73ceffa927658cca33fd0Enrico Perla - Sun Microsystems uint32_t hash_off;
af28f636873b7156cfd73ceffa927658cca33fd0Enrico Perla - Sun Microsystems unsigned char *data;
af28f636873b7156cfd73ceffa927658cca33fd0Enrico Perla - Sun Microsystems bblk_einfo_t *einfo = (bblk_einfo_t *)dest;
af28f636873b7156cfd73ceffa927658cca33fd0Enrico Perla - Sun Microsystems bblk_hash_t *hashinfo = bblk_hash_list[BBLK_DEFAULT_HASH];
af28f636873b7156cfd73ceffa927658cca33fd0Enrico Perla - Sun Microsystems
af28f636873b7156cfd73ceffa927658cca33fd0Enrico Perla - Sun Microsystems /*
af28f636873b7156cfd73ceffa927658cca33fd0Enrico Perla - Sun Microsystems * 'dest' might be both containing the buffer we want to hash and
af28f636873b7156cfd73ceffa927658cca33fd0Enrico Perla - Sun Microsystems * containing our einfo structure: delay any update of it after the
af28f636873b7156cfd73ceffa927658cca33fd0Enrico Perla - Sun Microsystems * hashing has been calculated.
af28f636873b7156cfd73ceffa927658cca33fd0Enrico Perla - Sun Microsystems */
af28f636873b7156cfd73ceffa927658cca33fd0Enrico Perla - Sun Microsystems hash_size = hashinfo->size;
af28f636873b7156cfd73ceffa927658cca33fd0Enrico Perla - Sun Microsystems hash_off = sizeof (bblk_einfo_t);
af28f636873b7156cfd73ceffa927658cca33fd0Enrico Perla - Sun Microsystems
af28f636873b7156cfd73ceffa927658cca33fd0Enrico Perla - Sun Microsystems if (hash_off + hash_size > maxsize) {
af28f636873b7156cfd73ceffa927658cca33fd0Enrico Perla - Sun Microsystems (void) fprintf(stderr, gettext("Unable to add extended info, "
af28f636873b7156cfd73ceffa927658cca33fd0Enrico Perla - Sun Microsystems "not enough space\n"));
af28f636873b7156cfd73ceffa927658cca33fd0Enrico Perla - Sun Microsystems return (-1);
af28f636873b7156cfd73ceffa927658cca33fd0Enrico Perla - Sun Microsystems }
af28f636873b7156cfd73ceffa927658cca33fd0Enrico Perla - Sun Microsystems
af28f636873b7156cfd73ceffa927658cca33fd0Enrico Perla - Sun Microsystems data = dest + hash_off;
af28f636873b7156cfd73ceffa927658cca33fd0Enrico Perla - Sun Microsystems if (compute_hash(hs, data, hashinfo) < 0) {
af28f636873b7156cfd73ceffa927658cca33fd0Enrico Perla - Sun Microsystems (void) fprintf(stderr, gettext("%s hash operation failed\n"),
af28f636873b7156cfd73ceffa927658cca33fd0Enrico Perla - Sun Microsystems hashinfo->name);
af28f636873b7156cfd73ceffa927658cca33fd0Enrico Perla - Sun Microsystems einfo->hash_type = bblk_no_hash.type;
af28f636873b7156cfd73ceffa927658cca33fd0Enrico Perla - Sun Microsystems einfo->hash_size = bblk_no_hash.size;
af28f636873b7156cfd73ceffa927658cca33fd0Enrico Perla - Sun Microsystems } else {
af28f636873b7156cfd73ceffa927658cca33fd0Enrico Perla - Sun Microsystems einfo->hash_type = hashinfo->type;
af28f636873b7156cfd73ceffa927658cca33fd0Enrico Perla - Sun Microsystems einfo->hash_size = hashinfo->size;
af28f636873b7156cfd73ceffa927658cca33fd0Enrico Perla - Sun Microsystems }
af28f636873b7156cfd73ceffa927658cca33fd0Enrico Perla - Sun Microsystems
af28f636873b7156cfd73ceffa927658cca33fd0Enrico Perla - Sun Microsystems (void) memcpy(einfo->magic, EINFO_MAGIC, EINFO_MAGIC_SIZE);
af28f636873b7156cfd73ceffa927658cca33fd0Enrico Perla - Sun Microsystems einfo->version = BBLK_EINFO_VERSION;
af28f636873b7156cfd73ceffa927658cca33fd0Enrico Perla - Sun Microsystems einfo->flags = 0;
af28f636873b7156cfd73ceffa927658cca33fd0Enrico Perla - Sun Microsystems einfo->hash_off = hash_off;
af28f636873b7156cfd73ceffa927658cca33fd0Enrico Perla - Sun Microsystems einfo->hash_size = hash_size;
af28f636873b7156cfd73ceffa927658cca33fd0Enrico Perla - Sun Microsystems einfo->str_off = einfo->hash_off + einfo->hash_size + 1;
af28f636873b7156cfd73ceffa927658cca33fd0Enrico Perla - Sun Microsystems
af28f636873b7156cfd73ceffa927658cca33fd0Enrico Perla - Sun Microsystems if (infostr == NULL) {
af28f636873b7156cfd73ceffa927658cca33fd0Enrico Perla - Sun Microsystems (void) fprintf(stderr, gettext("Unable to add extended info, "
af28f636873b7156cfd73ceffa927658cca33fd0Enrico Perla - Sun Microsystems "string is empty\n"));
af28f636873b7156cfd73ceffa927658cca33fd0Enrico Perla - Sun Microsystems return (-1);
af28f636873b7156cfd73ceffa927658cca33fd0Enrico Perla - Sun Microsystems }
af28f636873b7156cfd73ceffa927658cca33fd0Enrico Perla - Sun Microsystems einfo->str_size = strlen(infostr);
af28f636873b7156cfd73ceffa927658cca33fd0Enrico Perla - Sun Microsystems
af28f636873b7156cfd73ceffa927658cca33fd0Enrico Perla - Sun Microsystems if (einfo->str_off + einfo->str_size > maxsize) {
af28f636873b7156cfd73ceffa927658cca33fd0Enrico Perla - Sun Microsystems (void) fprintf(stderr, gettext("Unable to add extended info, "
af28f636873b7156cfd73ceffa927658cca33fd0Enrico Perla - Sun Microsystems "not enough space\n"));
af28f636873b7156cfd73ceffa927658cca33fd0Enrico Perla - Sun Microsystems return (-1);
af28f636873b7156cfd73ceffa927658cca33fd0Enrico Perla - Sun Microsystems }
af28f636873b7156cfd73ceffa927658cca33fd0Enrico Perla - Sun Microsystems
af28f636873b7156cfd73ceffa927658cca33fd0Enrico Perla - Sun Microsystems data = dest + einfo->str_off;
af28f636873b7156cfd73ceffa927658cca33fd0Enrico Perla - Sun Microsystems (void) memcpy(data, infostr, einfo->str_size);
af28f636873b7156cfd73ceffa927658cca33fd0Enrico Perla - Sun Microsystems *used_space = einfo->str_off + einfo->str_size;
af28f636873b7156cfd73ceffa927658cca33fd0Enrico Perla - Sun Microsystems
af28f636873b7156cfd73ceffa927658cca33fd0Enrico Perla - Sun Microsystems return (0);
af28f636873b7156cfd73ceffa927658cca33fd0Enrico Perla - Sun Microsystems}
af28f636873b7156cfd73ceffa927658cca33fd0Enrico Perla - Sun Microsystems
af28f636873b7156cfd73ceffa927658cca33fd0Enrico Perla - Sun Microsystems/*
af28f636873b7156cfd73ceffa927658cca33fd0Enrico Perla - Sun Microsystems * einfo_should_update()
af28f636873b7156cfd73ceffa927658cca33fd0Enrico Perla - Sun Microsystems * Given information on the boot block currently on disk (disk_einfo) and
af28f636873b7156cfd73ceffa927658cca33fd0Enrico Perla - Sun Microsystems * information on the supplied boot block (hs for hashing, verstr as the
af28f636873b7156cfd73ceffa927658cca33fd0Enrico Perla - Sun Microsystems * associated version string) decide if an update of the on-disk boot block
af28f636873b7156cfd73ceffa927658cca33fd0Enrico Perla - Sun Microsystems * is necessary or not.
af28f636873b7156cfd73ceffa927658cca33fd0Enrico Perla - Sun Microsystems */
af28f636873b7156cfd73ceffa927658cca33fd0Enrico Perla - Sun Microsystemsboolean_t
af28f636873b7156cfd73ceffa927658cca33fd0Enrico Perla - Sun Microsystemseinfo_should_update(bblk_einfo_t *disk_einfo, bblk_hs_t *hs, char *verstr)
af28f636873b7156cfd73ceffa927658cca33fd0Enrico Perla - Sun Microsystems{
af28f636873b7156cfd73ceffa927658cca33fd0Enrico Perla - Sun Microsystems bblk_hash_t *hashing;
af28f636873b7156cfd73ceffa927658cca33fd0Enrico Perla - Sun Microsystems unsigned char *disk_hash;
af28f636873b7156cfd73ceffa927658cca33fd0Enrico Perla - Sun Microsystems unsigned char *local_hash;
af28f636873b7156cfd73ceffa927658cca33fd0Enrico Perla - Sun Microsystems char *disk_version;
af28f636873b7156cfd73ceffa927658cca33fd0Enrico Perla - Sun Microsystems int retval;
af28f636873b7156cfd73ceffa927658cca33fd0Enrico Perla - Sun Microsystems
af28f636873b7156cfd73ceffa927658cca33fd0Enrico Perla - Sun Microsystems if (disk_einfo == NULL)
af28f636873b7156cfd73ceffa927658cca33fd0Enrico Perla - Sun Microsystems return (B_TRUE);
af28f636873b7156cfd73ceffa927658cca33fd0Enrico Perla - Sun Microsystems
af28f636873b7156cfd73ceffa927658cca33fd0Enrico Perla - Sun Microsystems if (memcmp(disk_einfo->magic, EINFO_MAGIC, EINFO_MAGIC_SIZE) != 0)
af28f636873b7156cfd73ceffa927658cca33fd0Enrico Perla - Sun Microsystems return (B_TRUE);
af28f636873b7156cfd73ceffa927658cca33fd0Enrico Perla - Sun Microsystems
af28f636873b7156cfd73ceffa927658cca33fd0Enrico Perla - Sun Microsystems if (disk_einfo->version < BBLK_EINFO_VERSION)
af28f636873b7156cfd73ceffa927658cca33fd0Enrico Perla - Sun Microsystems return (B_TRUE);
af28f636873b7156cfd73ceffa927658cca33fd0Enrico Perla - Sun Microsystems
af28f636873b7156cfd73ceffa927658cca33fd0Enrico Perla - Sun Microsystems disk_version = einfo_get_string(disk_einfo);
af28f636873b7156cfd73ceffa927658cca33fd0Enrico Perla - Sun Microsystems retval = einfo_compare_version(verstr, disk_version);
af28f636873b7156cfd73ceffa927658cca33fd0Enrico Perla - Sun Microsystems /*
af28f636873b7156cfd73ceffa927658cca33fd0Enrico Perla - Sun Microsystems * If something goes wrong or if the on-disk version is more recent
af28f636873b7156cfd73ceffa927658cca33fd0Enrico Perla - Sun Microsystems * do not update the bootblock.
af28f636873b7156cfd73ceffa927658cca33fd0Enrico Perla - Sun Microsystems */
af28f636873b7156cfd73ceffa927658cca33fd0Enrico Perla - Sun Microsystems if (retval == -1 || retval == 2)
af28f636873b7156cfd73ceffa927658cca33fd0Enrico Perla - Sun Microsystems return (B_FALSE);
af28f636873b7156cfd73ceffa927658cca33fd0Enrico Perla - Sun Microsystems
af28f636873b7156cfd73ceffa927658cca33fd0Enrico Perla - Sun Microsystems /*
af28f636873b7156cfd73ceffa927658cca33fd0Enrico Perla - Sun Microsystems * If we got here it means that the two version strings are either
af28f636873b7156cfd73ceffa927658cca33fd0Enrico Perla - Sun Microsystems * equal or the new bootblk binary is more recent. In order to save
af28f636873b7156cfd73ceffa927658cca33fd0Enrico Perla - Sun Microsystems * some needless writes let's use the hash to determine if an update
af28f636873b7156cfd73ceffa927658cca33fd0Enrico Perla - Sun Microsystems * is really necessary.
af28f636873b7156cfd73ceffa927658cca33fd0Enrico Perla - Sun Microsystems */
af28f636873b7156cfd73ceffa927658cca33fd0Enrico Perla - Sun Microsystems if (disk_einfo->hash_type == bblk_no_hash.type)
af28f636873b7156cfd73ceffa927658cca33fd0Enrico Perla - Sun Microsystems return (B_TRUE);
af28f636873b7156cfd73ceffa927658cca33fd0Enrico Perla - Sun Microsystems
af28f636873b7156cfd73ceffa927658cca33fd0Enrico Perla - Sun Microsystems if (disk_einfo->hash_type >= BBLK_HASH_TOT)
af28f636873b7156cfd73ceffa927658cca33fd0Enrico Perla - Sun Microsystems return (B_TRUE);
af28f636873b7156cfd73ceffa927658cca33fd0Enrico Perla - Sun Microsystems
af28f636873b7156cfd73ceffa927658cca33fd0Enrico Perla - Sun Microsystems hashing = bblk_hash_list[disk_einfo->hash_type];
af28f636873b7156cfd73ceffa927658cca33fd0Enrico Perla - Sun Microsystems
af28f636873b7156cfd73ceffa927658cca33fd0Enrico Perla - Sun Microsystems local_hash = malloc(hashing->size);
af28f636873b7156cfd73ceffa927658cca33fd0Enrico Perla - Sun Microsystems if (local_hash == NULL)
af28f636873b7156cfd73ceffa927658cca33fd0Enrico Perla - Sun Microsystems return (B_TRUE);
af28f636873b7156cfd73ceffa927658cca33fd0Enrico Perla - Sun Microsystems
af28f636873b7156cfd73ceffa927658cca33fd0Enrico Perla - Sun Microsystems /*
af28f636873b7156cfd73ceffa927658cca33fd0Enrico Perla - Sun Microsystems * Failure in computing the hash may mean something wrong
af28f636873b7156cfd73ceffa927658cca33fd0Enrico Perla - Sun Microsystems * with the boot block file. Better be conservative here.
af28f636873b7156cfd73ceffa927658cca33fd0Enrico Perla - Sun Microsystems */
af28f636873b7156cfd73ceffa927658cca33fd0Enrico Perla - Sun Microsystems if (compute_hash(hs, local_hash, hashing) < 0) {
af28f636873b7156cfd73ceffa927658cca33fd0Enrico Perla - Sun Microsystems free(local_hash);
af28f636873b7156cfd73ceffa927658cca33fd0Enrico Perla - Sun Microsystems return (B_FALSE);
af28f636873b7156cfd73ceffa927658cca33fd0Enrico Perla - Sun Microsystems }
af28f636873b7156cfd73ceffa927658cca33fd0Enrico Perla - Sun Microsystems
af28f636873b7156cfd73ceffa927658cca33fd0Enrico Perla - Sun Microsystems disk_hash = (unsigned char *)einfo_get_hash(disk_einfo);
af28f636873b7156cfd73ceffa927658cca33fd0Enrico Perla - Sun Microsystems
af28f636873b7156cfd73ceffa927658cca33fd0Enrico Perla - Sun Microsystems if (memcmp(local_hash, disk_hash, disk_einfo->hash_size) == 0) {
af28f636873b7156cfd73ceffa927658cca33fd0Enrico Perla - Sun Microsystems free(local_hash);
af28f636873b7156cfd73ceffa927658cca33fd0Enrico Perla - Sun Microsystems return (B_FALSE);
af28f636873b7156cfd73ceffa927658cca33fd0Enrico Perla - Sun Microsystems }
af28f636873b7156cfd73ceffa927658cca33fd0Enrico Perla - Sun Microsystems
af28f636873b7156cfd73ceffa927658cca33fd0Enrico Perla - Sun Microsystems free(local_hash);
af28f636873b7156cfd73ceffa927658cca33fd0Enrico Perla - Sun Microsystems return (B_TRUE);
af28f636873b7156cfd73ceffa927658cca33fd0Enrico Perla - Sun Microsystems}
af28f636873b7156cfd73ceffa927658cca33fd0Enrico Perla - Sun Microsystems
af28f636873b7156cfd73ceffa927658cca33fd0Enrico Perla - Sun Microsystemschar *
af28f636873b7156cfd73ceffa927658cca33fd0Enrico Perla - Sun Microsystemseinfo_get_string(bblk_einfo_t *einfo)
af28f636873b7156cfd73ceffa927658cca33fd0Enrico Perla - Sun Microsystems{
af28f636873b7156cfd73ceffa927658cca33fd0Enrico Perla - Sun Microsystems if (einfo == NULL)
af28f636873b7156cfd73ceffa927658cca33fd0Enrico Perla - Sun Microsystems return (NULL);
af28f636873b7156cfd73ceffa927658cca33fd0Enrico Perla - Sun Microsystems
af28f636873b7156cfd73ceffa927658cca33fd0Enrico Perla - Sun Microsystems return ((char *)einfo + einfo->str_off);
af28f636873b7156cfd73ceffa927658cca33fd0Enrico Perla - Sun Microsystems}
af28f636873b7156cfd73ceffa927658cca33fd0Enrico Perla - Sun Microsystems
af28f636873b7156cfd73ceffa927658cca33fd0Enrico Perla - Sun Microsystemschar *
af28f636873b7156cfd73ceffa927658cca33fd0Enrico Perla - Sun Microsystemseinfo_get_hash(bblk_einfo_t *einfo)
af28f636873b7156cfd73ceffa927658cca33fd0Enrico Perla - Sun Microsystems{
af28f636873b7156cfd73ceffa927658cca33fd0Enrico Perla - Sun Microsystems if (einfo == NULL)
af28f636873b7156cfd73ceffa927658cca33fd0Enrico Perla - Sun Microsystems return (NULL);
af28f636873b7156cfd73ceffa927658cca33fd0Enrico Perla - Sun Microsystems
af28f636873b7156cfd73ceffa927658cca33fd0Enrico Perla - Sun Microsystems return ((char *)einfo + einfo->hash_off);
af28f636873b7156cfd73ceffa927658cca33fd0Enrico Perla - Sun Microsystems}