%PDF- %PDF-
Mini Shell

Mini Shell

Direktori : /usr/src/veeamsnap-6.1.2.1781/
Upload File :
Create Path :
Current File : //usr/src/veeamsnap-6.1.2.1781/genconfig.sh

#!/bin/bash -e
#
# Copyright (c) Veeam Software Group GmbH
#
# Generate config.h file with specific options for module
if [ -n "$1" ]
then
	if [ "-" = "$1" ]
	then
		echo "kernel version is not set"
    else
	    KERNEL_VERSION="$1"
    fi
else
	KERNEL_VERSION="$(uname -r)"
fi

if [ -n "$2" ]
then
	OUTPUT_FILE="$2"
else
	OUTPUT_FILE="$(dirname "$0")/config.h"
fi

if [ -n "$3" ]
then
	if [ "-" = "$3" ]
	then
		echo "System map file is not set"
	else
		SYSTEM_MAP_FILE="$3"
	fi
else
	if [ -n "${KERNEL_VERSION}" ]
	then
		FILES=( "/lib/modules/${KERNEL_VERSION}/System.map" "/boot/System.map-${KERNEL_VERSION}" )
		for FILE in ${FILES[@]}
		do
			if [ -f ${FILE} ]
			then
                HEADER=$(head -n 1 ${FILE} | awk '{print $1;}')
                if [ "ffffffffffffffff" = "${HEADER}" ]
                then
                    echo "Fake System.map was found in '${FILE}'"
                    continue
                fi

                echo "Real System.map was found in '${FILE}'"
				SYSTEM_MAP_FILE=${FILE}
				break
			fi
		done
	fi
fi
echo "Generate \"${OUTPUT_FILE}\" for kernel \"${KERNEL_VERSION}\"."

echo "// Copyright (c) Veeam Software Group GmbH" > ${OUTPUT_FILE}
echo "#ifndef VEEAM_CONFIG" >> ${OUTPUT_FILE}
echo "#define VEEAM_CONFIG" >> ${OUTPUT_FILE}

if [[ -r /etc/os-release ]]
then
	. /etc/os-release
	echo "ID: " $ID
	echo "VERSION_ID: " $VERSION_ID
	DISTRIB_NAME=$(echo ${ID//[.-]/_} | awk '{print toupper($0)}')
    echo "#ifndef DISTRIB_NAME_${DISTRIB_NAME}" >> ${OUTPUT_FILE}
	echo "#define DISTRIB_NAME_${DISTRIB_NAME}" >> ${OUTPUT_FILE}
	awk '{ n=split($0,v,"."); echo "n="n; for (i=0; ++i<=n;) print "#define DISTRIB_VERSION_"i" "v[i] }' <<< $VERSION_ID >> ${OUTPUT_FILE}
    echo "#endif" >> ${OUTPUT_FILE}
else
	echo "/etc/os-release file not found"
fi

# try to find kernel headers files
if [ -n "${KERNEL_VERSION}" ]
then
    if [ -e "/lib/modules/${KERNEL_VERSION}/build/include/linux" ]
    then
	    LINUX_INCLUDE="/lib/modules/${KERNEL_VERSION}/build/include/linux"
    elif [ -e "/lib/modules/${KERNEL_VERSION}/source/include/linux" ]
    then
	    LINUX_INCLUDE="/lib/modules/${KERNEL_VERSION}/source/include/linux"
    fi

	# try to find patch for lookup_bdev
	# https://patchwork.kernel.org/patch/7748091/
	if [ -n "${LINUX_INCLUDE}" ]
	then
		if [[ 0 -ne $(cat ${LINUX_INCLUDE}/fs.h | grep 'lookup_bdev' | grep -c 'mask' ) ]]
		then
			echo "#define LOOKUP_BDEV_MASK" >> ${OUTPUT_FILE}
		fi
	fi
fi

# parses the system map and check exported symbols
if [ -n "${SYSTEM_MAP_FILE}" ]
then
	echo "System map \"${SYSTEM_MAP_FILE}\"."

	SYMBOLS="blk_mq_make_request blk_alloc_queue_rh submit_bio_noacct"
	for SYMBOL_NAME in ${SYMBOLS}
	do
		SYMBOL_ADDR=$(grep " __ksymtab_${SYMBOL_NAME}$" "${SYSTEM_MAP_FILE}" | awk '{print $1}')
		if [ -z "${SYMBOL_ADDR}" ]
		then
			echo "Exported function \"${SYMBOL_NAME}\" not found"
		else
			MACRO_NAME="$(echo ${SYMBOL_NAME} | awk '{print toupper($0)}')_EXPORTED"
			echo "#define ${MACRO_NAME}" >> ${OUTPUT_FILE}
			echo "Exported function \"${SYMBOL_NAME}\" was found"
		fi
	done

	# parses the system map and determines the addresses for some non-exported functions
	KERNEL_ENTRY_BASE_NAME="__request_module"
	KERNEL_ENTRY_BASE_ADDR=$(grep " ${KERNEL_ENTRY_BASE_NAME}$" "${SYSTEM_MAP_FILE}" | awk '{print $1}')
	if [ -z "${KERNEL_ENTRY_BASE_ADDR}" ]
	then
		echo "Function \"${KERNEL_ENTRY_BASE_NAME}\" not found"
	else
		echo "#define KERNEL_ENTRY_BASE_ADDR 0x${KERNEL_ENTRY_BASE_ADDR}" >> ${OUTPUT_FILE}
		echo "Address of the function \"${KERNEL_ENTRY_BASE_NAME}\" was defined"
	fi

	SYMBOLS="blk_mq_submit_bio"
	for SYMBOL_NAME in ${SYMBOLS}
	do
		SYMBOL_ADDR=$(grep " ${SYMBOL_NAME}$" "${SYSTEM_MAP_FILE}" | awk '{print $1}')
		if [ -z "${SYMBOL_ADDR}" ]
		then
			echo "Function \"${SYMBOL_NAME}\" not found"
		else
			MACRO_NAME="$(echo ${SYMBOL_NAME} | awk '{print toupper($0)}')_ADDR"
			echo "#define ${MACRO_NAME} 0x${SYMBOL_ADDR}" >> ${OUTPUT_FILE}
			echo "Address of the function \"${SYMBOL_NAME}\" was defined"
		fi
	done
fi

# the end of the config file
echo "#endif" >> ${OUTPUT_FILE}

Zerion Mini Shell 1.0