aboutsummaryrefslogtreecommitdiff
#pragma once

#include "types.hh"


namespace nix {


/* Abstract destination of binary data. */
struct Sink 
{
    virtual ~Sink() { }
    virtual void operator () (const unsigned char * data, size_t len) = 0;
};


/* A buffered abstract sink. */
struct BufferedSink : Sink
{
    size_t bufSize, bufPos;
    unsigned char * buffer;

    BufferedSink(size_t bufSize = 32 * 1024)
        : bufSize(bufSize), bufPos(0), buffer(0) { }
    ~BufferedSink();

    void operator () (const unsigned char * data, size_t len);
    
    void flush();
    
    virtual void write(const unsigned char * data, size_t len) = 0;
};


/* Abstract source of binary data. */
struct Source
{
    virtual ~Source() { }
    
    /* Store exactly ‘len’ bytes in the buffer pointed to by ‘data’.
       It blocks until all the requested data is available, or throws
       an error if it is not going to be available.   */
    void operator () (unsigned char * data, size_t len);

    /* Store up to ‘len’ in the buffer pointed to by ‘data’, and
       return the number of bytes stored.  If blocks until at least
       one byte is available. */
    virtual size_t read(unsigned char * data, size_t len) = 0;
};


/* A buffered abstract source. */
struct BufferedSource : Source
{
    size_t bufSize, bufPosIn, bufPosOut;
    unsigned char * buffer;

    BufferedSource(size_t bufSize = 32 * 1024)
        : bufSize(bufSize), bufPosIn(0), bufPosOut(0), buffer(0) { }
    ~BufferedSource();
    
    size_t read(unsigned char * data, size_t len);
    
    /* Underlying read call, to be overridden. */
    virtual size_t readUnbuffered(unsigned char * data, size_t len) = 0;

    bool hasData();
};


/* A sink that writes data to a file descriptor. */
struct FdSink : BufferedSink
{
    int fd;
    bool warn;
    size_t written;

    FdSink() : fd(-1), warn(false), written(0) { }
    FdSink(int fd) : fd(fd), warn(false), written(0) { }
    ~FdSink();
    
    void write(const unsigned char * data, size_t len);
};


/* A source that reads data from a file descriptor. */
struct FdSource : BufferedSource
{
    int fd;
    FdSource() : fd(-1) { }
    FdSource(int fd) : fd(fd) { }
    size_t readUnbuffered(unsigned char * data, size_t len);
};


/* A sink that writes data to a string. */
struct StringSink : Sink
{
    string s;
    void operator () (const unsigned char * data, size_t len);
};


/* A source that reads data from a string. */
struct StringSource : Source
{
    const string & s;
    size_t pos;
    StringSource(const string & _s) : s(_s), pos(0) { }
    size_t read(unsigned char * data, size_t len);    
};


void writePadding(size_t len, Sink & sink);
void writeInt(unsigned int n, Sink & sink);
void writeLongLong(unsigned long long n, Sink & sink);
void writeString(const unsigned char * buf, size_t len, Sink & sink);
void writeString(const string & s, Sink & sink);
template<class T> void writeStrings(const T & ss, Sink & sink);

void readPadding(size_t len, Source & source);
unsigned int readInt(Source & source);
unsigned long long readLongLong(Source & source);
size_t readString(unsigned char * buf, size_t max, Source & source);
string readString(Source & source);
template<class T> T readStrings(Source & source);


MakeError(SerialisationError, Error)


}
ypto-devices. (read-boot-parameters): Parse store-crypto-devices field. [uuid-sexp->uuid]: New helper function extracted from device-sexp->device. (operating-system-bootloader-crypto-devices): New function. (operating-system-bootcfg): Use operating-system-bootloader-crypto-devices to provide its contents to the bootloader configuration generation process. (operating-system-boot-parameters): Add store-crypto-devices to the generated boot-parameters. (operating-system-boot-parameters-file): Likewise to the file with the serialized structure. * guix/scripts/system.scm (reinstall-bootloader): Use boot-parameters-store-crypto-devices to provide its contents to the bootloader configuration generation process. * tests/boot-parameters.scm (%default-store-crypto-devices): New variable. (%grub-boot-parameters, test-read-boot-parameters): Use %default-store-crypto-devices. (tests store-crypto-devices): New tests. 2020-12-15Revert "gnu: grub: Fix unicode font loading when booting over TFTP."Ludovic Courtès This reverts commit 03fb57ff77b57de510b59485845ed7cb4e0a77a7, which breaks most system tests. Specifically, grub.cfg.drv fails to build: ERROR: In procedure canonicalize-path: In procedure canonicalize-path: No such file or directory 2020-12-14gnu: grub: Fix unicode font loading when booting over TFTP.Stefan * gnu/bootloader/grub.scm (eye-candy)(font-file): Fix unicode font loading when booting over TFTP. Signed-off-by: Danny Milosavljevic <dannym@scratchpost.org> 2020-11-17bootloader: grub: Skip install-grub-efi when producing a disk image.Maxim Cournoyer Fixes <http://issues.guix.gnu.org/44353>. Every bootloader should try their best to install themselves using only the MOUNT-POINT and otherwise do nothing. This requirement comes from the necessity to call INSTALL-GRUB when installing the (non-EFI) GRUB bootloader, which needs to populate the root file system with extra modules that cannot be fit in the core.img file, limited in size to 491520 bytes (by the i386-pc format required for legacy BIOS compatibility). As introducing bootloader knowledge at the level of the image code is undesirable, every bootloader should be adapted to support this fall-back for their installation procedure (TODO). * gnu/bootloader/grub.scm (install-grub-efi)[efi-dir]: Skip when the EFI-DIR argument is set to #f. 2020-11-01system: Generate grub locale directory for grub.cfg.Miguel Ángel Arruga Vivas * gnu/bootloader/grub.scm (grub-locale-directory): New function. (grub-configuration-file)[locale-config]: Use grub-locale-directory and avoid the extra search when eye-candy have performed it. 2020-10-30system: Fix dependency for grub.cfg generation.Miguel Ángel Arruga Vivas * gnu/bootloader/grub.scm (eye-candy)[font-file]: Use the bootloader package provided with the configuration. 2020-10-30system: Fix grub keymap with store in btrfs subvolume.Miguel Ángel Arruga Vivas * gnu/bootloader/grub.scm (grub-configuration-file) [keyboard-layout-config]: Use normalize-file. 2020-10-18system: Use locale information in grub.cfg.Miguel Ángel Arruga Vivas * gnu/bootloader/grub.scm (define-module): Add new dependency. (grub-configuration-file): Add locale keyword. (grub-configuration-file)[locale-config]: New variable with generated locale configuration when locale parameter has been provided. [builder]: Add locale-config. 2020-10-05bootloader: Fix u-boot installation.Mathieu Othacehe This is a follow-up of f19cf27c2b9ff92e2c0fd931ef7fde39c376adaa. The bootloader installation must be done on the final disk-image, hence using "disk-image-installer" instead of "installer" callback. * gnu/bootloader/u-boot.scm: Turn all installer callbacks into disk-image-installer callbacks. * gnu/build/bootloader.scm (write-file-on-device): Open the output file with 'no-truncate and 'no-create options. * gnu/system/image.scm (with-imported-modules*): Add (gnu build bootloader) module. 2020-09-27gnu: grub: Support for network boot via TFTP.Stefan * gnu/bootloader/grub.scm (grub-efi-netboot-bootloader): New variable. (install-grub-efi-netboot): New procedure. (grub-root-search): Update comment. Signed-off-by: Danny Milosavljevic <dannym@scratchpost.org> 2020-09-14gnu: grub: Support loading files from TFTP if the root filesystem is NFS.Stefan * gnu/bootloader/grub.scm (grub-root-search): Set the root to "(tftp)" if the searched-for file is stored on NFS. 2020-09-07bootloader: Use "define" instead of "define*" for all records.Stefan * gnu/bootloader/grub.scm (grub-minimal-bootloader): Use "define". (grub-efi-bootloader): Use "define". (grub-mkrescue-bootloader): Use "define". Signed-off-by: Danny Milosavljevic <dannym@scratchpost.org> 2020-09-06bootloader: Add comment about grub configuration files.Stefan * gnu/bootloader/grub.scm: Add comment about grub configuration files. Signed-off-by: Danny Milosavljevic <dannym@scratchpost.org> 2020-06-09bootloader: grub: Fix cross-compilation.Mathieu Othacehe This is a follow-up of 536c53d347291dcc75e1073af6e6c5c614e0fff4, that do not use the native version of "font-file", breaking cross-compilation. * gnu/bootloader/grub.scm (eye-candy): Use the native version of "font-file". 2020-06-09gnu: grub: Support graphical gfxterm on all systems.Stefan * gnu/bootloaders/grub.scm (eye-candy): Use gfxterm depending only on (bootloader-configuration (terminal-outputs …)), which defaults to '(gfxterm). This makes the system argument obsolete. Signed-off-by: Mathieu Othacehe <othacehe@gnu.org> 2020-06-08bootloader: grub: Add support for multiboot.Jan (janneke) Nieuwenhuizen * gnu/bootloader/grub.scm (grub-configuration-file): Add support for multiboot. 2020-05-29bootloader: grub: Rename the btrfs-subvolume-file-name parameter.Maxim Cournoyer Following discussion in <https://issues.guix.gnu.org/37305>, it seems more appropriate to give the parameter a more generic name that better describes what it does. * gnu/bootloader/grub.scm (normalize-file): Rename the BTRFS-SUBVOLUME-FILE-NAME parameter to STORE-DIRECTORY-PREFIX, and always assume this argument to be a string. (eye-candy): Likewise. Default STORE-DIRECTORY-PREFIX to "". (grub-configuration-file): Likewise. * gnu/system.scm (operating-system-bootcfg): Adapt. 2020-05-29bootloader: grub: Use inheritance to define grub-minimal-bootloader.Mathieu Othacehe * gnu/bootloader/grub.scm (grub-minimal-bootloader): Inherit from grub-bootloader to avoid field redefinition. 2020-05-29bootloader: grub: Do not run grub-install when creating a disk-image.Mathieu Othacehe * gnu/bootloader/grub.scm (install-grub): When creating a disk-image, grub-install will fail because it lacks root permissions. In that case, do not run grub-install and only copy Grub modules to the /boot directory. 2020-05-29bootloader: Add 'disk-image-installer'.Mathieu Othacehe * gnu/bootloader.scm (<bootloader>)[disk-image-installer]: New field, (bootloader-disk-image-installer): export it. * gnu/bootloader/grub.scm (install-grub-disk-image): New procedure ... (grub-bootloader): ... used as "disk-image-installer" here. (grub-efi-bootloader): set "disk-image-installer" to #f. * gnu/system/image.scm (root-partition?, find-root-partition): Move to "Helpers" section. (root-partition-index): New procedure. (system-disk-image): Honor disk-image-installer, and use it to install the bootloader directly on the disk-image, if supported. 2020-05-20bootloader: grub: Allow booting from a Btrfs subvolume.Maxim Cournoyer * gnu/bootloader/grub.scm (strip-mount-point): Remove procedure. (normalize-file): Add procedure. (grub-configuration-file): New BTRFS-SUBVOLUME-FILE-NAME parameter. When defined, prepend its value to the kernel and initrd file names, using the NORMALIZE-FILE procedure. Adjust the call to EYE-CANDY to pass the BTRFS-SUBVOLUME-FILE-NAME argument. Normalize the KEYMAP file as well. (eye-candy): Add a BTRFS-SUBVOLUME-FILE-NAME parameter, and use it, along with the NORMALIZE-FILE procedure, to normalize the FONT-FILE and IMAGE nested variables. Adjust doc. * gnu/bootloader/depthcharge.scm (depthcharge-configuration-file): Adapt. * gnu/bootloader/extlinux.scm (extlinux-configuration-file): Likewise. * gnu/system/file-systems.scm (btrfs-subvolume?) (btrfs-store-subvolume-file-name): New procedures. * gnu/system.scm (operating-system-bootcfg): Specify the Btrfs subvolume file name the store resides on to the `operating-system-bootcfg' procedure, using the new BTRFS-SUBVOLUME-FILE-NAME argument. * doc/guix.texi (File Systems): Add a Btrfs subsection to document the use of subvolumes. * gnu/tests/install.scm (%btrfs-root-on-subvolume-os) (%btrfs-root-on-subvolume-os-source) (%btrfs-root-on-subvolume-installation-script) (%test-btrfs-root-on-subvolume-os): New variables. 2020-05-19gnu: grub: Allow a PNG image and replace "aspect-ratio" with "resolution".Stefan * gnu/bootloaders/grub.scm (<grub-image>): Remove this record and replace it by ... (<grub-theme>)[image]: ... this field with the default from %background-image, (<grub-theme>)[resolution]: ... this field with the defaults from 'width' and 'height' of 'grub-background-image'. (<grub-theme>)[images]: Remove this field. (svg->png): Rename to ... (image->png): ... and use 'copy-file' instead of 'svg->png', if the suffix of the image file is not ".svg". (grub-background-image): Remove the arguments 'width' and 'height'. (grub-theme-image): Add function. (grub-theme-resolution): Add function. (grub-theme-gfxmode): Add function. (grub-image): Remove function. (grub-image?): Remove function. (grub-image-aspect-ratio): Remove function. (grub-image-file): Remove function. (grub-theme-images): Remove function. (%default-theme): Remove variable. (%background-image): Remove variable. Using image formats different to SVG was not possible. For a <grub-image> to be chosen, the 'aspect-ratio' of it had to be 4/3, as the resolution of any image was defaulting to 1024 x 768. There was no code to determine the proper boot-resolution to make any use of a list of images with different aspect-ratios. It seems to be a better solution to only define a single image with any format, and use a given resolution only for the conversion from a SVG file. This also makes the use of a special <grub-image> record unnecessary. Moving the default values from '%background-image' and '%default-theme' into <grub-theme> makes a customisation easier without (inherit) and allows to remove the undocumented variables %background-image' and '%default-theme'. Signed-off-by: Mathieu Othacehe <othacehe@gnu.org> 2020-05-16bootloader: grub: Refer to the native 'grub-mklayout' and font file.Ludovic Courtès * gnu/bootloader/grub.scm (eye-candy): Refer to the native FONT-FILE. (keyboard-layout-file): Refer to the native 'grub-mklayout'. 2020-04-23Merge branch 'master' into core-updatesMarius Bakke Conflicts: etc/news.scm gnu/local.mk gnu/packages/bootloaders.scm gnu/packages/linphone.scm gnu/packages/linux.scm gnu/packages/tls.scm gnu/system.scm 2020-04-20gnu: Add u-boot-pinebook-pro-rk3399.Vagrant Cascadian * gnu/packages/bootloaders (u-boot-pinebook-pro-rk3399): New variable. * gnu/packages/patches/u-boot-DT-for-Pinebook-Pro.patch: New file. * gnu/packages/patches/u-boot-add-boe-nv140fhmn49-display.patch: New file. * gnu/packages/patches/u-boot-gpio-keys-binding-cons.patch: New file. * gnu/packages/patches/u-boot-leds-common-binding-con.patch: New file. * gnu/packages/patches/u-boot-support-Pinebook-Pro-laptop.patch: New file. * gnu/packages/patches/u-boot-video-rockchip-fix-build.patch: New file. * gnu/local.mk (dist_patch_DATA): Add new patches. * gnu/bootloader/u-boot.scm (install-pinebook-pro-rk3399-u-boot, u-boot-pinebook-pro-rk3399-bootloader): New variable. Co-authored-by: Jan Nieuwenhuizen <janneke@gnu.org> 2020-04-08Merge branch 'master' into core-updatesMarius Bakke Conflicts: etc/news.scm gnu/local.mk gnu/packages/check.scm gnu/packages/cross-base.scm gnu/packages/gimp.scm gnu/packages/java.scm gnu/packages/mail.scm gnu/packages/sdl.scm gnu/packages/texinfo.scm gnu/packages/tls.scm gnu/packages/version-control.scm 2020-04-06system: Allow for comma-separated keyboard layouts.Ludovic Courtès Reported by Florian Pelz <pelzflorian@pelzflorian.de>. * gnu/bootloader/grub.scm (keyboard-layout-file): Replace commas with hyphens in the first argument to 'computed-file'. * gnu/system/keyboard.scm (keyboard-layout->console-keymap): Likewise. * doc/guix.texi (Keyboard Layout): Add example. 2020-03-29gnu: bootloader: Add grub-minimal-bootloader.Jan Nieuwenhuizen * gnu/bootloader/grub.scm (grub-minimal-bootloader): New variable. 2020-03-17bootloader: grub: Refactor eye-candy a bit.Maxim Cournoyer * gnu/bootloader/grub.scm (eye-candy)[setup-gfxterm-body]: Define the GFXMODE binding using AND-LET* instead of chained AND=>. Add a comment about supporting graphical mode on other systems than x86. Generate configuration string using FORMAT rather than STRING-APPEND. 2020-03-17bootloader: grub: Use the all_video module in graphic mode.Maxim Cournoyer * gnu/bootloader/grub.scm (eye-candy): Load the module 'all_video' which automatically loads all the available and relevant video modules. 2020-02-02gnu: Add u-boot-cubietruck-bootloader.Julien Lepiller * gnu/bootloader/u-boot.scm (u-boot-cubietrack-bootloader): New variable. 2020-01-25bootloader: grub: Add gfxmode (resolution) override.Jan Nieuwenhuizen * gnu/bootloader/grub.scm (<grub-theme>): Add `gfxmode' entry. (eye-candy): Use it. * doc/guix.texi (Bootloader Configuration): Document it. 2020-01-07Revert "bootloader: grub: Add gfxmode (resolution) override."Tobias Geerinckx-Rice This reverts commit a23091880d4dc6115acbfa3b7ef09d731fc5abb0. It causes ‘guix pull’ to fail: <https://paste.debian.net/plain/1125061>. 2020-01-07bootloader: grub: Add gfxmode (resolution) override.Jan Nieuwenhuizen * gnu/bootloader/grub.scm (<grub-theme>): Add `gfxmode' entry. (eye-candy): Use it. * doc/guix.texi (Bootloader Configuration): Document it. 2020-01-06Adjust module autoloads.Ludovic Courtès In Guile < 2.9.7, autoloading a module would give you access to all its bindings. In future versions, autoloading a module gives access only to the listed bindings, as per #:select (see <https://bugs.gnu.org/38895>). This commit adjusts autoloads to the new semantics, allowing Guix to be built with Guile 2.9.7/2.9.8. * guix/build/download.scm <top level>: Remove call to 'module-autoload!'. (load-gnutls): New procedure. (tls-wrap): Call it. * guix/git.scm <top level>: Remove call to 'module-autoload!'. (load-git-submodules): New procedure. (update-submodules): Call it instead of 'resolve-interface'. * gnu/bootloader/grub.scm: Replace #:autoload with #:use-module. * gnu/packages.scm: Likewise. * gnu/packages/ssh.scm: Likewise. * gnu/packages/tex.scm: Likewise. * gnu/services/cuirass.scm: Likewise. * gnu/services/mcron.scm: Likewise. * guix/lint.scm: Augment list of bindings in #:autoload. * guix/scripts/build.scm: Likewise. * guix/scripts/gc.scm: Likewise. * guix/scripts/pack.scm: Likewise. * guix/scripts/publish.scm: Likewise. * guix/scripts/pull.scm: Likewise. * guix/utils.scm: Remove unnecessary #:autoload clauses; replace one of them with #:use-module. 2020-01-03bootloader: Mark "grub.cfg" and "extlinux.conf" as non-substitutable.Ludovic Courtès Suggested by <pkill9@runbox.com>. * gnu/bootloader/grub.scm (grub-configuration-file): Pass #:options to 'computed-file'. * gnu/bootloader/extlinux.scm (extlinux-configuration-file): Likewise. 2019-12-23bootloader: grub: Add firmware setup entry.Brice Waegeneire * gnu/bootloader/grub.scm (grub-configuration-file): Add 'Firmware setup' entry for EFI platform. Signed-off-by: Danny Milosavljevic <dannym@scratchpost.org> 2019-12-14gnu: Add u-boot-pine64-lts-bootloader.Mathieu Othacehe * gnu/bootloader/u-boot.scm (u-boot-pine64-lts-bootloader): New variable. 2019-10-18gnu: Add u-boot-firefly-rk3399.Vagrant Cascadian * gnu/packages/bootloaders (u-boot-firefly-rk3399): New variable. * gnu/bootloader/u-boot (install-firefly-rk3399-u-boot): New variable. (u-boot-firefly-rk3399-bootloader): New variable. * gnu/system/install (define firefly-rk3399-installation-os): New variable. 2019-10-18gnu: Add u-boot-rock64-rk3328.Vagrant Cascadian * gnu/packages/bootloaders (u-boot-rock64-rk3328): New variable. * gnu/bootloader/u-boot (install-rock64-rk3328-u-boot): New variable. (u-boot-rock64-rk3328-bootloader): New variable. * gnu/system/install (define rock64-installation-os): New variable. 2019-10-18gnu: Add u-boot-rockpro64-rk3399Caliph Nomble * gnu/packages/bootloaders.scm (u-boot-rockpro64-rk3399): New exported variable. (u-boot-2019.10): New variable. * gnu/bootloader/u-boot.scm (u-boot-rockpro64-rk3399-bootloader): New exported variable. (install-rockpro64-rk3399-u-boot): New variable. * gnu/system/install.scm (rockpro64-installation-os): New exported variable. Adjusted-by: Vagrant Cascadian <vagrant@debian.org> Signed-off-by: Caliph Nomble <nomble@palism.com> Signed-off-by: Vagrant Cascadian <vagrant@debian.org> 2019-05-09bootloader: grub: Remove unneeded 'terminal_output'.Ludovic Courtès Fixes <https://bugs.gnu.org/35585>. Reported by Florian Pelz <pelzflorian@pelzflorian.de>. This statement was added in 8d058e7b1b1a409d3d9cc29c5650a98db4e78783 but turned out to be unnecessary. * gnu/bootloader/grub.scm (grub-configuration-file): Remove 'terminal_output' statement. 2019-04-29gnu: u-boot: Update to 2019.04.Vagrant Cascadian * gnu/packages/bootloaders.scm (u-boot): Update to 2019.04. [source]: Add patch. (u-boot-novena): Update dynamic patch to handle config key rename. (u-boot-am335x-evm): New variable. (u-boot-am335x-boneblack): Build with modified am335x-evm config. (u-boot-novena): Fix typo in description. * gnu/bootloader/u-boot.scm (u-boot-beaglebone-black-bootloader): Use u-boot-am335x-boneblack. * gnu/packages/patches/u-boot-fix-mkimage-header-verification.patch: New file. * gnu/local.mk (dist_patch_DATA): Update accordingly. Signed-off-by: Danny Milosavljevic <dannym@scratchpost.org>