diff options
Diffstat (limited to 'defaultenv')
30 files changed, 640 insertions, 0 deletions
diff --git a/defaultenv/Makefile b/defaultenv/Makefile new file mode 100644 index 0000000000..fc679ebc9c --- /dev/null +++ b/defaultenv/Makefile @@ -0,0 +1,24 @@ +bbenv-$(CONFIG_DEFAULT_ENVIRONMENT_GENERIC_NEW) += defaultenv-2-base +bbenv-$(CONFIG_DEFAULT_ENVIRONMENT_GENERIC_NEW_MENU) += defaultenv-2-menu +bbenv-$(CONFIG_DEFAULT_ENVIRONMENT_GENERIC_NEW_DFU) += defaultenv-2-dfu +bbenv-$(CONFIG_DEFAULT_ENVIRONMENT_GENERIC) += defaultenv-1 +obj-$(CONFIG_DEFAULT_ENVIRONMENT) += defaultenv.o +extra-y += barebox_default_env barebox_default_env.h barebox_default_env$(DEFAULT_COMPRESSION_SUFFIX) + +$(obj)/defaultenv.o: $(obj)/barebox_default_env.h + +# +# Generate a barebox envfs image. +# +quiet_cmd_env_default = ENV $@ +cmd_env_default = ($(srctree)/scripts/genenv $(srctree) $(objtree) $@ $(CONFIG_DEFAULT_ENVIRONMENT_PATH)) + +$(obj)/barebox_default_env: FORCE + $(call cmd,env_default) + +quiet_cmd_env_h = ENVH $@ +cmd_env_h = cat $< | (cd $(obj) && $(objtree)/scripts/bin2c "__aligned(4) default_environment") > $@; \ + echo "static const int default_environment_uncompress_size=`stat -c%s $(obj)/barebox_default_env`;" >> $@ + +$(obj)/barebox_default_env.h: $(obj)/barebox_default_env$(DEFAULT_COMPRESSION_SUFFIX) FORCE + $(call if_changed,env_h) diff --git a/defaultenv/bin/_boot_help b/defaultenv/defaultenv-1/bin/_boot_help index a07e4e0135..a07e4e0135 100644 --- a/defaultenv/bin/_boot_help +++ b/defaultenv/defaultenv-1/bin/_boot_help diff --git a/defaultenv/bin/_update b/defaultenv/defaultenv-1/bin/_update index 8e27ee10c6..8e27ee10c6 100644 --- a/defaultenv/bin/_update +++ b/defaultenv/defaultenv-1/bin/_update diff --git a/defaultenv/bin/_update_help b/defaultenv/defaultenv-1/bin/_update_help index b41e288ba0..b41e288ba0 100644 --- a/defaultenv/bin/_update_help +++ b/defaultenv/defaultenv-1/bin/_update_help diff --git a/defaultenv/bin/boot b/defaultenv/defaultenv-1/bin/boot index c17ccdb8f5..c17ccdb8f5 100644 --- a/defaultenv/bin/boot +++ b/defaultenv/defaultenv-1/bin/boot diff --git a/defaultenv/bin/init b/defaultenv/defaultenv-1/bin/init index adb3c43a66..adb3c43a66 100644 --- a/defaultenv/bin/init +++ b/defaultenv/defaultenv-1/bin/init diff --git a/defaultenv/bin/update b/defaultenv/defaultenv-1/bin/update index 1578789a56..1578789a56 100644 --- a/defaultenv/bin/update +++ b/defaultenv/defaultenv-1/bin/update diff --git a/defaultenv/config b/defaultenv/defaultenv-1/config index 391ba47c18..391ba47c18 100644 --- a/defaultenv/config +++ b/defaultenv/defaultenv-1/config diff --git a/defaultenv/defaultenv-2-base/bin/bootargs-ip b/defaultenv/defaultenv-2-base/bin/bootargs-ip new file mode 100644 index 0000000000..2d4486caf8 --- /dev/null +++ b/defaultenv/defaultenv-2-base/bin/bootargs-ip @@ -0,0 +1,11 @@ +#!/bin/sh + +# pass either static ip or dhcp to kernel based on barebox settings + +. /env/network/eth0 + +if [ $ip = dhcp ]; then + global.linux.bootargs.dyn.ip="ip=dhcp" +else + global.linux.bootargs.dyn.ip="ip=$ipaddr:$serverip:$gateway:$netmask::eth0:" +fi diff --git a/defaultenv/defaultenv-2-base/bin/init b/defaultenv/defaultenv-2-base/bin/init new file mode 100644 index 0000000000..3a0e93b49d --- /dev/null +++ b/defaultenv/defaultenv-2-base/bin/init @@ -0,0 +1,80 @@ +#!/bin/sh + +export PATH=/env/bin + +global hostname +global user +global autoboot_timeout +global boot.default +global allow_color +global linux.bootargs.base +global linux.bootargs.console +#linux.bootargs.dyn.* will be cleared at the beginning of boot +global linux.bootargs.dyn.ip +global linux.bootargs.dyn.root +global editcmd + +[ -z "${global.hostname}" ] && global.hostname=generic +[ -z "${global.user}" ] && global.user=none +[ -z "${global.autoboot_timeout}" ] && global.autoboot_timeout=3 +[ -z "${global.boot.default}" ] && global.boot.default=net +[ -z "${global.allow_color}" ] && global.allow_color=true +[ -z "${global.editcmd}" ] && global.editcmd=sedit + +[ -e /env/config-board ] && /env/config-board +/env/config + +# request password to login if a timeout is specified and password set +if [ -n ${global.login.timeout} ]; then + [ ${global.login.timeout} -gt 0 ] && login_cmd=login +fi +# allow the input if not +[ -n ${global.console.input_allow} ] && global.console.input_allow=1 + +# allow to stop the boot before execute the /env/init/* +# but without waiting +timeout -s -a -v key 0 + +if [ "${key}" = "q" ]; then + ${login_cmd} + exit +fi + +[ -n ${login_cmd} ] && global.console.input_allow=0 + +for i in /env/init/*; do + . $i +done + +if [ -e /env/menu ]; then + echo -e -n "\nHit m for menu or any other key to stop autoboot: " +else + echo -e -n "\nHit any key to stop autoboot: " +fi + +[ -n ${login_cmd} ] && global.console.input_allow=1 + +timeout -a $global.autoboot_timeout -v key +autoboot="$?" + +[ -n ${login_cmd} ] && global.console.input_allow=0 + +if [ "${key}" = "q" ]; then + ${login_cmd} + exit +fi + +if [ "$autoboot" = 0 ]; then + boot +fi + +if [ -e /env/menu ]; then + ${login_cmd} + if [ "${key}" != "m" ]; then + echo -e "\ntype exit to get to the menu" + sh + fi + /env/menu/mainmenu +fi + +${login_cmd} diff --git a/defaultenv/defaultenv-2-base/bin/mtdparts-add b/defaultenv/defaultenv-2-base/bin/mtdparts-add new file mode 100644 index 0000000000..58c9fa7a21 --- /dev/null +++ b/defaultenv/defaultenv-2-base/bin/mtdparts-add @@ -0,0 +1,49 @@ +#!/bin/sh + +mkdir -p /tmp/mtdparts + +parts= +device= +kernelname= +bbdev= + +while getopt "p:d:k:b" opt; do + if [ ${opt} = p ]; then + parts=${OPTARG} + elif [ ${opt} = d ]; then + device=${OPTARG} + elif [ ${opt} = k ]; then + kernelname=${OPTARG} + elif [ ${opt} = b ]; then + bbdev=true + fi +done + +if [ -z "${device}" ]; then + echo "$0: no device given" + exit +fi + +if [ -z "${parts}" ]; then + echo "$0: no partitions given" + exit +fi + +if [ -e /tmp/mtdparts/${device} ]; then + if [ -n "/dev/${device}.*.bb" ]; then + nand -d /dev/${device}.*.bb + fi + delpart /dev/${device}.* +fi + +addpart -n /dev/${device} "$parts" || exit +mkdir -p /tmp/mtdparts/${device} + +if [ -n "${bbdev}" ]; then + nand -a /dev/${device}.* +fi + +if [ -n ${kernelname} ]; then + global linux.mtdparts.${device} + global.linux.mtdparts.${device}="${kernelname}:${parts}" +fi diff --git a/defaultenv/defaultenv-2-base/boot/net b/defaultenv/defaultenv-2-base/boot/net new file mode 100644 index 0000000000..05bb728fa1 --- /dev/null +++ b/defaultenv/defaultenv-2-base/boot/net @@ -0,0 +1,19 @@ +#!/bin/sh + +if [ "$1" = menu ]; then + boot-menu-add-entry "$0" "network (tftp, nfs)" + exit +fi + +path="/mnt/tftp" + +global.bootm.image="${path}/${global.user}-linux-${global.hostname}" + +oftree="${path}/${global.user}-oftree-${global.hostname}" +if [ -f "${oftree}" ]; then + global.bootm.oftree="$oftree" +fi + +nfsroot="/home/${global.user}/nfsroot/${global.hostname}" +bootargs-ip +global.linux.bootargs.dyn.root="root=/dev/nfs nfsroot=$nfsroot,v3,tcp" diff --git a/defaultenv/defaultenv-2-base/config b/defaultenv/defaultenv-2-base/config new file mode 100644 index 0000000000..784ae52b80 --- /dev/null +++ b/defaultenv/defaultenv-2-base/config @@ -0,0 +1,25 @@ +#!/bin/sh + +# change network settings in /env/network/eth0 +# change mtd partition settings and automountpoints in /env/init/* + +#global.hostname= + +# set to false if you do not want to have colors +#global.allow_color=true + +# user (used for network filenames) +#global.user=none + +# timeout in seconds before the default boot entry is started +#global.autoboot_timeout=3 + +# list of boot entries. These are executed in order until one +# succeeds. An entry can be: +# - a filename in /env/boot/ +# - a full path to a directory. All files in this directory are +# treated as boot files and executed in alphabetical order +#global.boot.default=net + +# base bootargs +#global.linux.bootargs.base="console=ttyS0,115200" diff --git a/defaultenv/defaultenv-2-base/data/ansi-colors b/defaultenv/defaultenv-2-base/data/ansi-colors new file mode 100644 index 0000000000..636532979a --- /dev/null +++ b/defaultenv/defaultenv-2-base/data/ansi-colors @@ -0,0 +1,30 @@ +#!/bin/sh + +if [ ${global.allow_color} != "true" ]; then + exit +fi + +# Colors +export RED='\e[1;31m' +export BLUE='\e[1;34m' +export GREEN='\e[1;32m' +export CYAN='\e[1;36m' +export YELLOW='\e[1;33m' +export PINK='\e[1;35m' +export WHITE='\e[1;37m' + +export DARK_RED='\e[2;31m' +export DARK_BLUE='\e[2;34m' +export DARK_GREEN='\e[2;32m' +export DARK_CYAN='\e[2;36m' +export DARK_YELLOW='\e[2;33m' +export DARK_PINK='\e[2;35m' +export DARK_WHITE='\e[2;37m' + +export RED_INV='\e[1;41m' +export BLUE_INV='\e[1;44m' +export GREEN_INV='\e[1;42m' +export CYAN_INV='\e[1;46m' +export ORANGE_INV='\e[1;43m' +export PINK_INV='\e[1;45m' +export NC='\e[0m' # No Color diff --git a/defaultenv/defaultenv-2-base/data/boot-template b/defaultenv/defaultenv-2-base/data/boot-template new file mode 100644 index 0000000000..9297499036 --- /dev/null +++ b/defaultenv/defaultenv-2-base/data/boot-template @@ -0,0 +1,14 @@ +#!/bin/sh + +if [ "$1" = menu ]; then + boot-menu-add-entry "$0" "<menu text here>" + exit +fi + +global.bootm.image=<path to image> +#global.bootm.oftree=<path to oftree> +#global.bootm.initrd=<path to initrd> + +#bootargs-ip + +global.linux.bootargs.dyn.root="root=<rootfs here>" diff --git a/defaultenv/defaultenv-2-base/init/automount b/defaultenv/defaultenv-2-base/init/automount new file mode 100644 index 0000000000..fe56d920e7 --- /dev/null +++ b/defaultenv/defaultenv-2-base/init/automount @@ -0,0 +1,22 @@ +#!/bin/sh + +if [ "$1" = menu ]; then + init-menu-add-entry "$0" "Automountpoints" + exit +fi + +# automount tftp server based on $eth0.serverip + +mkdir -p /mnt/tftp +automount /mnt/tftp 'ifup eth0 && mount -t tftp $eth0.serverip /mnt/tftp' + +# automount nfs server example + +#nfshost=somehost +#mkdir -p /mnt/${nfshost} +#automount /mnt/$nfshost "ifup eth0 && mount -t nfs ${nfshost}:/tftpboot /mnt/${nfshost}" + +# FAT on usb disk example + +#mkdir -p /mnt/fat +#automount -d /mnt/fat 'usb && [ -e /dev/disk0.0 ] && mount /dev/disk0.0 /mnt/fat' diff --git a/defaultenv/defaultenv-2-base/init/ps1 b/defaultenv/defaultenv-2-base/init/ps1 new file mode 100644 index 0000000000..02d7b4b780 --- /dev/null +++ b/defaultenv/defaultenv-2-base/init/ps1 @@ -0,0 +1,7 @@ +#!/bin/sh + +if [ ${global.allow_color} = "true" ]; then + export PS1="\e[1;32mbarebox@\e[1;36m\h:\w\e[0m " +else + export PS1="barebox@\h:\w " +fi diff --git a/defaultenv/defaultenv-2-base/network/eth0 b/defaultenv/defaultenv-2-base/network/eth0 new file mode 100644 index 0000000000..7e731cae00 --- /dev/null +++ b/defaultenv/defaultenv-2-base/network/eth0 @@ -0,0 +1,16 @@ +#!/bin/sh + +# ip setting (static/dhcp) +ip=dhcp +global.dhcp.vendor_id=barebox-${global.hostname} + +# static setup used if ip=static +ipaddr= +netmask= +gateway= +serverip= + +# MAC address if needed +#ethaddr=xx:xx:xx:xx:xx:xx + +# put code to discover eth0 (i.e. 'usb') to /env/network/eth0-discover diff --git a/defaultenv/defaultenv-2-dfu/boot/dfu b/defaultenv/defaultenv-2-dfu/boot/dfu new file mode 100644 index 0000000000..c9463b667e --- /dev/null +++ b/defaultenv/defaultenv-2-dfu/boot/dfu @@ -0,0 +1,39 @@ +#!/bin/sh + +if [ "$1" = menu ]; then + boot-menu-add-entry "$0" "Device Firmware upgrade (DFU)" + exit +fi + +if [ -d /dfutmp ]; then + rm -r /dfutmp +fi + +mkdir -p /dfutmp + +kernel="/dfutmp/kernel" +dtb="/dfutmp/dtb" +cmdline="/dfutmp/cmdline" + +global.bootm.image="$kernel" + +dfu $kernel(kernel)c,$dtb(dtb)c,$cmdline(cmdline)c +if [ $? != 0 ]; then + exit 1 +fi + +if [ ! -f "$kernel" ]; then + echo "No kernel uploaded. Aborting" + exit 1 +fi + +if [ -f "$cmdline" ]; then + global linux.bootargs.dyn.dfu + readf $cmdline global.linux.bootargs.dyn.dfu +fi + +if [ -f "$dtb" ]; then + global.bootm.oftree="$dtb" +fi + +true diff --git a/defaultenv/defaultenv-2-menu/menu/boot-entries-collect b/defaultenv/defaultenv-2-menu/menu/boot-entries-collect new file mode 100644 index 0000000000..c066c930ab --- /dev/null +++ b/defaultenv/defaultenv-2-menu/menu/boot-entries-collect @@ -0,0 +1,13 @@ +#!/bin/sh + +cd /env/boot + +./$global.boot.default menu + +for i in *; do + if [ "$i" != "$global.boot.default" ]; then + ./$i menu + fi +done + +cd / diff --git a/defaultenv/defaultenv-2-menu/menu/boot-entries-edit b/defaultenv/defaultenv-2-menu/menu/boot-entries-edit new file mode 100644 index 0000000000..c4e1c3d5fd --- /dev/null +++ b/defaultenv/defaultenv-2-menu/menu/boot-entries-edit @@ -0,0 +1,20 @@ +#!/bin/sh + +export menu_exit=false + +while true; do + menu -a -m boot_entries_edit -d "\e[1;36mEdit boot entries\e[0m" + + boot-entries-collect + + menu -e -a -m boot_entries_edit -c "boot-menu-new-boot-entry" -d "Add a new entry" + menu -e -a -m boot_entries_edit -c "boot-entries-remove" -d "Remove an entry" + menu -e -a -m boot_entries_edit -c "menu_exit=true" -d "back" + + menu -s -m boot_entries_edit + menu -r -m boot_entries_edit + + if [ $menu_exit = true ]; then + exit + fi +done diff --git a/defaultenv/defaultenv-2-menu/menu/boot-entries-remove b/defaultenv/defaultenv-2-menu/menu/boot-entries-remove new file mode 100644 index 0000000000..566be9dd6e --- /dev/null +++ b/defaultenv/defaultenv-2-menu/menu/boot-entries-remove @@ -0,0 +1,18 @@ +#!/bin/sh + +export menu_exit=false + +while true; do + menu -a -m boot_entries_remove -d "\e[1;36mRemove Boot entry\e[0m" + + boot-entries-collect + + menu -e -a -m boot_entries_remove -c "menu_exit=true" -d "back" + + menu -s -m boot_entries_remove + menu -r -m boot_entries_remove + + if [ $menu_exit = true ]; then + exit + fi +done diff --git a/defaultenv/defaultenv-2-menu/menu/boot-menu-add-entry b/defaultenv/defaultenv-2-menu/menu/boot-menu-add-entry new file mode 100644 index 0000000000..f06c524034 --- /dev/null +++ b/defaultenv/defaultenv-2-menu/menu/boot-menu-add-entry @@ -0,0 +1,5 @@ +#!/bin/sh + +menu -e -a -m boot -c "boot -v $1; echo; readline \"press enter to continue\" a " -d "Boot: ${GREEN}$2${NC}" +menu -e -a -m boot_entries_edit -c "$global.editcmd /env/boot/$1" -d "${GREEN}$2${NC}" +menu -e -a -m boot_entries_remove -c "rm /env/boot/$1" -d "${GREEN}$2${NC}" diff --git a/defaultenv/defaultenv-2-menu/menu/boot-menu-new-boot-entry b/defaultenv/defaultenv-2-menu/menu/boot-menu-new-boot-entry new file mode 100644 index 0000000000..c5e982cdb2 --- /dev/null +++ b/defaultenv/defaultenv-2-menu/menu/boot-menu-new-boot-entry @@ -0,0 +1,21 @@ +#!/bin/sh + +name= + +readline "Name of the new entry: " name + +if [ -z "$name" ]; then + exit 1 +fi + +if [ -e "/env/boot/$name" ]; then + echo "entry $name already exists" + readline "<enter>" unused + exit 1 +fi + +cp /env/data/boot-template /env/boot/$name + +edit /env/boot/$name + +boot-menu-show rebuild diff --git a/defaultenv/defaultenv-2-menu/menu/init-entries-collect b/defaultenv/defaultenv-2-menu/menu/init-entries-collect new file mode 100644 index 0000000000..dbb775779a --- /dev/null +++ b/defaultenv/defaultenv-2-menu/menu/init-entries-collect @@ -0,0 +1,9 @@ +#!/bin/sh + +cd /env/init + +for i in *; do + ./$i menu +done + +cd / diff --git a/defaultenv/defaultenv-2-menu/menu/init-entries-edit b/defaultenv/defaultenv-2-menu/menu/init-entries-edit new file mode 100644 index 0000000000..fc02b327d9 --- /dev/null +++ b/defaultenv/defaultenv-2-menu/menu/init-entries-edit @@ -0,0 +1,20 @@ +#!/bin/sh + +export menu_exit=false + +while true; do + menu -a -m init_entries_edit -d "\e[1;36mEdit init entries\e[0m" + + menu -e -a -m init_entries_edit -R -c "true" -d ">> Reset board to let changes here take effect <<" + + init-entries-collect + + menu -e -a -m init_entries_edit -c "menu_exit=true" -d "back" + + menu -s -m init_entries_edit + menu -r -m init_entries_edit + + if [ $menu_exit = true ]; then + exit + fi +done diff --git a/defaultenv/defaultenv-2-menu/menu/init-menu-add-entry b/defaultenv/defaultenv-2-menu/menu/init-menu-add-entry new file mode 100644 index 0000000000..7cb5686402 --- /dev/null +++ b/defaultenv/defaultenv-2-menu/menu/init-menu-add-entry @@ -0,0 +1,3 @@ +#!/bin/sh + +menu -e -a -m init_entries_edit -c "$global.editcmd /env/init/$1" -d "\e[1;32m$2\e[0m" diff --git a/defaultenv/defaultenv-2-menu/menu/mainmenu b/defaultenv/defaultenv-2-menu/menu/mainmenu new file mode 100644 index 0000000000..f10f67a62f --- /dev/null +++ b/defaultenv/defaultenv-2-menu/menu/mainmenu @@ -0,0 +1,23 @@ +#!/bin/sh + +savepath=$PATH +export menupath=$PATH:/env/menu + +. /env/data/ansi-colors + +while true; do + export PATH=${menupath} + + echo $PATH + + menu -a -m boot -d "${CYAN}Welcome to Barebox${NC}" + + boot-entries-collect + + menu -e -a -m boot -c "settings" -d "Settings" + menu -e -a -m boot -c 'PATH=$savepath; echo "enter exit to return to menu"; sh' -d "${DARK_YELLOW}Shell${NC}" + menu -e -a -m boot -c reset -d "${RED}Reset${NC}" + + menu -s -m boot + menu -r -m boot +done diff --git a/defaultenv/defaultenv-2-menu/menu/settings b/defaultenv/defaultenv-2-menu/menu/settings new file mode 100644 index 0000000000..db619afa6f --- /dev/null +++ b/defaultenv/defaultenv-2-menu/menu/settings @@ -0,0 +1,21 @@ +#!/bin/sh + +export menu_exit=false + +while true; do + menu -a -m settings -d "${CYAN}Settings${NC}" + + menu -e -a -R -m settings -c "$global.editcmd /env/network/eth0" -d "Network settings" + menu -e -a -R -m settings -c "$global.editcmd /env/config" -d "Config settings" + menu -e -a -m settings -c "boot-entries-edit" -d "Edit boot entries" + menu -e -a -m settings -c "init-entries-edit" -d "Edit init entries" + menu -e -a -R -m settings -c "saveenv || echo \"failed to save environment\" && sleep 2" -d "Save settings" + menu -e -a -m settings -c "menu_exit=true" -d "back" + + menu -s -m settings + menu -r -m settings + + if [ $menu_exit = true ]; then + exit + fi +done diff --git a/defaultenv/defaultenv.c b/defaultenv/defaultenv.c new file mode 100644 index 0000000000..dc0e484c88 --- /dev/null +++ b/defaultenv/defaultenv.c @@ -0,0 +1,151 @@ +/* + * Copyright (C) 2014 Sascha Hauer, Pengutronix + * + * See file CREDITS for list of people who contributed to this + * project. + * + * 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; either version 2 of + * the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + */ +#include <common.h> +#include <envfs.h> +#include <filetype.h> +#include <uncompress.h> +#include <malloc.h> +#include <init.h> +#include <asm/unaligned.h> +#include "barebox_default_env.h" + +static LIST_HEAD(defaultenv_list); + +struct defaultenv { + struct list_head list; + const char *name; + void *buf; + size_t size; +}; + +static void defaultenv_add_base(void) +{ + static int base_added; + + if (base_added) + return; + + base_added = 1; + + if (IS_ENABLED(CONFIG_DEFAULT_ENVIRONMENT_GENERIC_NEW)) + defaultenv_append_directory(defaultenv_2_base); + if (IS_ENABLED(CONFIG_DEFAULT_ENVIRONMENT_GENERIC_NEW_MENU)) + defaultenv_append_directory(defaultenv_2_menu); + if (IS_ENABLED(CONFIG_DEFAULT_ENVIRONMENT_GENERIC_NEW_DFU)) + defaultenv_append_directory(defaultenv_2_dfu); + if (IS_ENABLED(CONFIG_DEFAULT_ENVIRONMENT_GENERIC)) + defaultenv_append_directory(defaultenv_1); + + /* + * The traditional environment given with CONFIG_DEFAULT_ENVIRONMENT_PATH. + * Once all users are converted to bbenv-y this can go. + */ + defaultenv_append((void *)default_environment, + default_environment_size, "defaultenv"); +} + +/* + * defaultenv_append - append a envfs buffer to the default environment + * @buf: The buffer containing the binary environment. If it is + * not a plain buffer it is assumed to be a compressed buffer. + * @size: The length of the buffer + * + * This adds an overlay to the default environment. New files will be created, + * existing files will be overwritten with the overlay. + */ +void defaultenv_append(void *buf, unsigned int size, const char *name) +{ + struct defaultenv *df; + + defaultenv_add_base(); + + df = xzalloc(sizeof(*df)); + df->buf = buf; + df->size = size; + df->name = name; + + list_add_tail(&df->list, &defaultenv_list); +} + +static int defaultenv_load_one(struct defaultenv *df, const char *dir, + unsigned flags) +{ + void *freep = NULL; + void *buf; + enum filetype ft = file_detect_type(df->buf, df->size); + uint32_t size; + int ret; + + pr_debug("loading %s\n", df->name); + + if (!IS_ENABLED(CONFIG_DEFAULT_COMPRESSION_NONE) && + ft != filetype_barebox_env) { + size = get_unaligned_le32(df->buf + df->size - 4); + freep = malloc(size); + if (!freep) + return -ENOMEM; + + ret = uncompress(df->buf, df->size, + NULL, NULL, + freep, NULL, uncompress_err_stdout); + if (ret) { + free(freep); + pr_err("Failed to uncompress: %s\n", strerror(-ret)); + return ret; + } + + buf = freep; + } else { + buf = df->buf; + size = df->size; + } + + ret = envfs_load_from_buf(buf, size, dir, flags); + + free(freep); + + if (ret) + pr_err("Failed to load defaultenv: %s\n", strerror(-ret)); + + return ret; +} + +/* + * defaultenv_load - load the default environment + * @dir: The directory the default environment should be loaded to. + * + * This loads all environment snippets previously registered with + * defaultenv_append to the directory given with @dir. + * + * Return: 0 for success, negative error code otherwise. + */ +int defaultenv_load(const char *dir, unsigned flags) +{ + struct defaultenv *df; + int ret; + + defaultenv_add_base(); + + list_for_each_entry(df, &defaultenv_list, list) { + ret = defaultenv_load_one(df, dir, flags); + if (ret) + return ret; + } + + return 0; +} |