Merge back Debian changes.
This commit is contained in:
parent
ee4e0d44b3
commit
a3d2f9bee9
14 changed files with 169 additions and 87 deletions
20
ChangeLog
20
ChangeLog
|
@ -1,3 +1,19 @@
|
||||||
|
1999-11-03 Gordon Matzigkeit <gord@fig.org>
|
||||||
|
|
||||||
|
* debian/rules: Add variables for cross-compilation.
|
||||||
|
|
||||||
|
* debian/control (Standards-Version): Update to version 3.1.0.
|
||||||
|
* debian/rules (build): Install manpages into /usr/share/man, and
|
||||||
|
info into /usr/share/info in accordance with FHS.
|
||||||
|
(binary-arch): Likewise, and put docs into /usr/share/doc.
|
||||||
|
* debian/postinst: Use /usr/share/info, and manage compatibility
|
||||||
|
/usr/doc/grub -> /usr/share/doc/grub symlink.
|
||||||
|
* debian/prerm: Likewise.
|
||||||
|
|
||||||
|
* stage2/Makefile.am (CLEANFILES): Change to
|
||||||
|
$(nodist_pkgdata_DATA) so that the raw binary files are deleted.
|
||||||
|
* stage1/Makefile.am (CLEANFILES): Likewise.
|
||||||
|
|
||||||
1999-11-06 OKUJI Yoshinori <okuji@kuicr.kyoto-u.ac.jp>
|
1999-11-06 OKUJI Yoshinori <okuji@kuicr.kyoto-u.ac.jp>
|
||||||
|
|
||||||
* grub/asmstub.c (grub_putchar) [HAVE_LIBCURSES]: Do not call
|
* grub/asmstub.c (grub_putchar) [HAVE_LIBCURSES]: Do not call
|
||||||
|
@ -8,13 +24,13 @@
|
||||||
function biosdisk is changed from SECTOR + I * SECTOR_SIZE to
|
function biosdisk is changed from SECTOR + I * SECTOR_SIZE to
|
||||||
SECTOR + I.
|
SECTOR + I.
|
||||||
(find_func): Clear ERRNUM before each of the attempts.
|
(find_func): Clear ERRNUM before each of the attempts.
|
||||||
|
|
||||||
1999-11-05 OKUJI Yoshinori <okuji@kuicr.kyoto-u.ac.jp>
|
1999-11-05 OKUJI Yoshinori <okuji@kuicr.kyoto-u.ac.jp>
|
||||||
|
|
||||||
* docs/multiboot.texi (Boot information format): Add the members
|
* docs/multiboot.texi (Boot information format): Add the members
|
||||||
`drives_addr' and `drives_count' into the Multiboot information
|
`drives_addr' and `drives_count' into the Multiboot information
|
||||||
structure, and added the descriptions.
|
structure, and added the descriptions.
|
||||||
|
|
||||||
1999-11-03 Gordon Matzigkeit <gord@fig.org>
|
1999-11-03 Gordon Matzigkeit <gord@fig.org>
|
||||||
|
|
||||||
* util/mbchk.c (main): Move the version number inside the
|
* util/mbchk.c (main): Move the version number inside the
|
||||||
|
|
7
TODO
7
TODO
|
@ -26,6 +26,9 @@ Priorities:
|
||||||
* Support embedding a Stage 1.5 in the "bootloader" area of a FFS
|
* Support embedding a Stage 1.5 in the "bootloader" area of a FFS
|
||||||
partition. !!!
|
partition. !!!
|
||||||
|
|
||||||
|
* Support embedding a Stage 1.5 in the EXT2_BOOT_LOADER_INO of an ext2fs
|
||||||
|
partition. Maybe we can just make a hard link to an existing file? !
|
||||||
|
|
||||||
* Complete the netboot support. !
|
* Complete the netboot support. !
|
||||||
|
|
||||||
* Add automatic configuration support.
|
* Add automatic configuration support.
|
||||||
|
@ -38,6 +41,10 @@ Priorities:
|
||||||
|
|
||||||
* Fix the completion so that it works for BSD partitions as well. !!
|
* Fix the completion so that it works for BSD partitions as well. !!
|
||||||
|
|
||||||
|
* Add BSD syntax support, using results of ioprobe to map drives.
|
||||||
|
(0x1f0-0x1f77 = primary IDE, 0x170-0x176 = secondary,
|
||||||
|
0x1e8-0x1ef = tertiary, 0x168-0x16f = quaternary).
|
||||||
|
|
||||||
* Add more filesystems support (XFS, NTFS, etc.)
|
* Add more filesystems support (XFS, NTFS, etc.)
|
||||||
|
|
||||||
* Add remote console support (serial, parallel and net).
|
* Add remote console support (serial, parallel and net).
|
||||||
|
|
19
configure
vendored
19
configure
vendored
|
@ -1,7 +1,7 @@
|
||||||
#! /bin/sh
|
#! /bin/sh
|
||||||
|
|
||||||
# Guess values for system-dependent variables and create Makefiles.
|
# Guess values for system-dependent variables and create Makefiles.
|
||||||
# Generated automatically using autoconf version 2.13.1
|
# Generated automatically using autoconf version 2.13.1
|
||||||
# Copyright (C) 1992, 93, 94, 95, 96 Free Software Foundation, Inc.
|
# Copyright (C) 1992, 93, 94, 95, 96 Free Software Foundation, Inc.
|
||||||
#
|
#
|
||||||
# This configure script is free software; the Free Software Foundation
|
# This configure script is free software; the Free Software Foundation
|
||||||
|
@ -975,7 +975,7 @@ else
|
||||||
fi
|
fi
|
||||||
|
|
||||||
echo "$ac_t""$USE_MAINTAINER_MODE" 1>&6
|
echo "$ac_t""$USE_MAINTAINER_MODE" 1>&6
|
||||||
|
|
||||||
|
|
||||||
if test $USE_MAINTAINER_MODE = yes; then
|
if test $USE_MAINTAINER_MODE = yes; then
|
||||||
MAINTAINER_MODE_TRUE=
|
MAINTAINER_MODE_TRUE=
|
||||||
|
@ -985,7 +985,7 @@ else
|
||||||
MAINTAINER_MODE_FALSE=
|
MAINTAINER_MODE_FALSE=
|
||||||
fi
|
fi
|
||||||
MAINT=$MAINTAINER_MODE_TRUE
|
MAINT=$MAINTAINER_MODE_TRUE
|
||||||
|
|
||||||
|
|
||||||
if test "x$enable_maintainer_mode" = xyes; then
|
if test "x$enable_maintainer_mode" = xyes; then
|
||||||
# Extract the first word of "perl", so it can be a program name with args.
|
# Extract the first word of "perl", so it can be a program name with args.
|
||||||
|
@ -1005,7 +1005,7 @@ else
|
||||||
*)
|
*)
|
||||||
IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS=":"
|
IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS=":"
|
||||||
ac_dummy="$PATH"
|
ac_dummy="$PATH"
|
||||||
for ac_dir in $ac_dummy; do
|
for ac_dir in $ac_dummy; do
|
||||||
test -z "$ac_dir" && ac_dir=.
|
test -z "$ac_dir" && ac_dir=.
|
||||||
if test -f $ac_dir/$ac_word; then
|
if test -f $ac_dir/$ac_word; then
|
||||||
ac_cv_path_PERL="$ac_dir/$ac_word"
|
ac_cv_path_PERL="$ac_dir/$ac_word"
|
||||||
|
@ -1363,7 +1363,7 @@ else
|
||||||
*)
|
*)
|
||||||
IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS=":"
|
IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS=":"
|
||||||
ac_dummy=""$with_binutils:$PATH""
|
ac_dummy=""$with_binutils:$PATH""
|
||||||
for ac_dir in $ac_dummy; do
|
for ac_dir in $ac_dummy; do
|
||||||
test -z "$ac_dir" && ac_dir=.
|
test -z "$ac_dir" && ac_dir=.
|
||||||
if test -f $ac_dir/$ac_word; then
|
if test -f $ac_dir/$ac_word; then
|
||||||
ac_cv_path_RANLIB="$ac_dir/$ac_word"
|
ac_cv_path_RANLIB="$ac_dir/$ac_word"
|
||||||
|
@ -1430,7 +1430,7 @@ echo "configure:1430: checking whether optimization for size works" >&5
|
||||||
if eval "test \"\${size_flag+set}\" = set"; then
|
if eval "test \"\${size_flag+set}\" = set"; then
|
||||||
echo $ac_n "(cached) $ac_c" 1>&6
|
echo $ac_n "(cached) $ac_c" 1>&6
|
||||||
else
|
else
|
||||||
|
|
||||||
saved_CFLAGS=$CFLAGS
|
saved_CFLAGS=$CFLAGS
|
||||||
CFLAGS="-Os -g"
|
CFLAGS="-Os -g"
|
||||||
cat > conftest.$ac_ext <<EOF
|
cat > conftest.$ac_ext <<EOF
|
||||||
|
@ -1452,7 +1452,7 @@ else
|
||||||
fi
|
fi
|
||||||
rm -f conftest*
|
rm -f conftest*
|
||||||
CFLAGS=$saved_CFLAGS
|
CFLAGS=$saved_CFLAGS
|
||||||
|
|
||||||
fi
|
fi
|
||||||
|
|
||||||
echo "$ac_t""$size_flag" 1>&6
|
echo "$ac_t""$size_flag" 1>&6
|
||||||
|
@ -1489,7 +1489,7 @@ else
|
||||||
*)
|
*)
|
||||||
IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS=":"
|
IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS=":"
|
||||||
ac_dummy=""$with_binutils:$PATH""
|
ac_dummy=""$with_binutils:$PATH""
|
||||||
for ac_dir in $ac_dummy; do
|
for ac_dir in $ac_dummy; do
|
||||||
test -z "$ac_dir" && ac_dir=.
|
test -z "$ac_dir" && ac_dir=.
|
||||||
if test -f $ac_dir/$ac_word; then
|
if test -f $ac_dir/$ac_word; then
|
||||||
ac_cv_path_OBJCOPY="$ac_dir/$ac_word"
|
ac_cv_path_OBJCOPY="$ac_dir/$ac_word"
|
||||||
|
@ -2230,7 +2230,7 @@ if eval "test \"`echo '$ac_cv_header_'$ac_safe`\" = yes"; then
|
||||||
cat >> confdefs.h <<EOF
|
cat >> confdefs.h <<EOF
|
||||||
#define $ac_tr_hdr 1
|
#define $ac_tr_hdr 1
|
||||||
EOF
|
EOF
|
||||||
|
|
||||||
else
|
else
|
||||||
echo "$ac_t""no" 1>&6
|
echo "$ac_t""no" 1>&6
|
||||||
fi
|
fi
|
||||||
|
@ -2847,4 +2847,3 @@ EOF
|
||||||
chmod +x $CONFIG_STATUS
|
chmod +x $CONFIG_STATUS
|
||||||
rm -fr confdefs* $ac_clean_files
|
rm -fr confdefs* $ac_clean_files
|
||||||
test "$no_create" = yes || $SHELL $CONFIG_STATUS || exit 1
|
test "$no_create" = yes || $SHELL $CONFIG_STATUS || exit 1
|
||||||
|
|
||||||
|
|
15
debian/changelog
vendored
15
debian/changelog
vendored
|
@ -1,5 +1,18 @@
|
||||||
grub (0.5.94) unstable; urgency=low
|
grub (0.5.94) unstable; urgency=low
|
||||||
|
|
||||||
|
--
|
||||||
|
|
||||||
|
grub (0.5.93.1) unstable; urgency=low
|
||||||
|
|
||||||
|
* Update to Standards-Version: 3.0.1, mainly for FHS support.
|
||||||
|
* Fix definition of ext2_dir_entry. (closes:bug#49017)
|
||||||
|
* Fix rules for cross-compiling. (closes:bug#49034)
|
||||||
|
* Update synopsis for grub(8). (closes:bug#48991)
|
||||||
|
* Don't clear the line when hitting enter in the GRUB shell.
|
||||||
|
(closes:bug#48989)
|
||||||
|
|
||||||
|
-- Gordon Matzigkeit <gord@debian.org> Fri, 5 Nov 1999 22:31:30 -0600
|
||||||
|
|
||||||
grub (0.5.93) unstable; urgency=low
|
grub (0.5.93) unstable; urgency=low
|
||||||
|
|
||||||
* Updated example configurations. (closes:bug#42136)
|
* Updated example configurations. (closes:bug#42136)
|
||||||
|
|
2
debian/control
vendored
2
debian/control
vendored
|
@ -2,7 +2,7 @@ Source: grub
|
||||||
Section: base
|
Section: base
|
||||||
Priority: extra
|
Priority: extra
|
||||||
Maintainer: GNU GRUB Maintainers <bug-grub@gnu.org>
|
Maintainer: GNU GRUB Maintainers <bug-grub@gnu.org>
|
||||||
Standards-Version: 2.5.0.0
|
Standards-Version: 3.0.1
|
||||||
|
|
||||||
Package: grub
|
Package: grub
|
||||||
Architecture: i386 hurd-i386
|
Architecture: i386 hurd-i386
|
||||||
|
|
18
debian/postinst
vendored
18
debian/postinst
vendored
|
@ -1,6 +1,20 @@
|
||||||
#! /bin/sh
|
#! /bin/sh
|
||||||
set -e
|
set -e
|
||||||
|
|
||||||
|
# Provide a backward-compatibility symlink to the doc directory.
|
||||||
|
package=grub
|
||||||
|
case "$1" in
|
||||||
|
install | upgrade)
|
||||||
|
if [ -d /usr/doc ]; then
|
||||||
|
if [ ! -e /usr/doc/$package -a -d /usr/share/doc/$package ]; then
|
||||||
|
ln -s /usr/share/doc/$package /usr/doc/$package
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
|
||||||
|
# Install our info pages.
|
||||||
install-info --quiet --section Kernel Kernel \
|
install-info --quiet --section Kernel Kernel \
|
||||||
/usr/info/grub.info.gz
|
/usr/share/info/grub.info.gz
|
||||||
install-info --quiet --section Kernel Kernel \
|
install-info --quiet --section Kernel Kernel \
|
||||||
/usr/info/multiboot.info.gz
|
/usr/share/info/multiboot.info.gz
|
||||||
|
|
17
debian/prerm
vendored
17
debian/prerm
vendored
|
@ -1,3 +1,16 @@
|
||||||
#! /bin/sh
|
#! /bin/sh
|
||||||
install-info --quiet --remove /usr/info/grub.info.gz
|
set -e
|
||||||
install-info --quiet --remove /usr/info/multiboot.info.gz
|
|
||||||
|
# Delete our backward-compatibility symlink.
|
||||||
|
package=grub
|
||||||
|
case "$1" in
|
||||||
|
remove | upgrade)
|
||||||
|
if [ -d /usr/doc -a -L /usr/doc/$package ]; then
|
||||||
|
rm -f /usr/doc/$package
|
||||||
|
fi
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
|
||||||
|
# Install our info pages.
|
||||||
|
install-info --quiet --remove /usr/share/info/grub.info.gz
|
||||||
|
install-info --quiet --remove /usr/share/info/multiboot.info.gz
|
||||||
|
|
36
debian/rules
vendored
36
debian/rules
vendored
|
@ -4,13 +4,26 @@
|
||||||
|
|
||||||
package:=grub
|
package:=grub
|
||||||
|
|
||||||
|
# For cross-compilation.
|
||||||
|
DEB_BUILD_ARCH := $(shell dpkg --print-installation-architecture)
|
||||||
|
DEB_BUILD_GNU_CPU := $(patsubst hurd-%,%,$(DEB_BUILD_ARCH))
|
||||||
|
ifeq ($(filter-out hurd-%,$(DEB_BUILD_ARCH)),)
|
||||||
|
DEB_BUILD_GNU_SYSTEM := gnu
|
||||||
|
else
|
||||||
|
DEB_BUILD_GNU_SYSTEM := linux
|
||||||
|
endif
|
||||||
|
DEB_BUILD_GNU_TYPE := $(DEB_BUILD_GNU_CPU)-$(DEB_BUILD_GNU_SYSTEM)
|
||||||
|
DEB_HOST_GNU_TYPE := $(DEB_BUILD_GNU_TYPE)
|
||||||
|
|
||||||
INSTALL = install -c
|
INSTALL = install -c
|
||||||
INSTALL_DATA = $(INSTALL) -m 644
|
INSTALL_DATA = $(INSTALL) -m 644
|
||||||
INSTALL_PROGRAM = $(INSTALL) -m 755
|
INSTALL_PROGRAM = $(INSTALL) -m 755
|
||||||
|
|
||||||
build:
|
build:
|
||||||
$(checkdir)
|
$(checkdir)
|
||||||
./configure --prefix=/usr
|
./configure --prefix=/usr \
|
||||||
|
$(DEB_HOST_GNU_TYPE) --build=$(DEB_BUILD_GNU_TYPE) \
|
||||||
|
--mandir='$${datadir}/man' --infodir='$${datadir}/info'
|
||||||
make
|
make
|
||||||
echo timestamp > build
|
echo timestamp > build
|
||||||
|
|
||||||
|
@ -31,25 +44,26 @@ binary-arch: checkroot build
|
||||||
$(checkdir)
|
$(checkdir)
|
||||||
-rm -rf debian/tmp
|
-rm -rf debian/tmp
|
||||||
## make dirs
|
## make dirs
|
||||||
install -d debian/tmp debian/tmp/usr/doc/grub debian/tmp/DEBIAN
|
install -d debian/tmp debian/tmp/usr/share/doc/grub debian/tmp/DEBIAN
|
||||||
## install files
|
## install files
|
||||||
|
|
||||||
dir=`cd debian/tmp && pwd` && make install DESTDIR=$$dir
|
dir=`cd debian/tmp && pwd` && make install DESTDIR=$$dir
|
||||||
gzip -f9 debian/tmp/usr/info/* debian/tmp/usr/man/man8/*
|
gzip -f9 debian/tmp/usr/share/info/* debian/tmp/usr/share/man/*/*
|
||||||
strip -s debian/tmp/usr/sbin/*
|
strip -s debian/tmp/usr/sbin/*
|
||||||
|
|
||||||
$(INSTALL_DATA) TODO BUGS NEWS docs/menu.lst debian/tmp/usr/doc/grub/
|
$(INSTALL_DATA) TODO BUGS NEWS docs/menu.lst \
|
||||||
|
debian/tmp/usr/share/doc/grub/
|
||||||
|
|
||||||
$(INSTALL_DATA) ChangeLog debian/tmp/usr/doc/grub/changelog
|
$(INSTALL_DATA) ChangeLog debian/tmp/usr/share/doc/grub/changelog
|
||||||
gzip -f9 debian/tmp/usr/doc/grub/changelog
|
gzip -f9 debian/tmp/usr/share/doc/grub/changelog
|
||||||
$(INSTALL_DATA) debian/changelog debian/tmp/usr/doc/grub/changelog.Debian
|
$(INSTALL_DATA) debian/changelog debian/tmp/usr/share/doc/grub/changelog.Debian
|
||||||
gzip -f9 debian/tmp/usr/doc/grub/changelog.Debian
|
gzip -f9 debian/tmp/usr/share/doc/grub/changelog.Debian
|
||||||
$(INSTALL_DATA) debian/copyright debian/tmp/usr/doc/grub/
|
$(INSTALL_DATA) debian/copyright debian/tmp/usr/share/doc/grub/
|
||||||
$(INSTALL_DATA) debian/README.debian debian/tmp/usr/doc/grub/
|
$(INSTALL_DATA) debian/README.debian debian/tmp/usr/share/doc/grub/
|
||||||
|
|
||||||
# Install control files.
|
# Install control files.
|
||||||
$(INSTALL_PROGRAM) debian/postinst debian/prerm debian/tmp/DEBIAN
|
$(INSTALL_PROGRAM) debian/postinst debian/prerm debian/tmp/DEBIAN
|
||||||
dpkg-shlibdeps debian/tmp/usr/sbin/grub
|
dpkg-shlibdeps debian/tmp/usr/*bin/*
|
||||||
dpkg-gencontrol
|
dpkg-gencontrol
|
||||||
chown -R root.root debian/tmp
|
chown -R root.root debian/tmp
|
||||||
chmod -R go=rX debian/tmp
|
chmod -R go=rX debian/tmp
|
||||||
|
|
|
@ -1,6 +1,9 @@
|
||||||
pkgdatadir = $(datadir)/$(PACKAGE)/$(host_cpu)-$(host_vendor)
|
pkgdatadir = $(datadir)/$(PACKAGE)/$(host_cpu)-$(host_vendor)
|
||||||
nodist_pkgdata_DATA = stage1
|
nodist_pkgdata_DATA = stage1
|
||||||
|
|
||||||
|
BUILT_SOURCES = stage2_size.h
|
||||||
|
CLEANFILES = $(nodist_pkgdata_DATA) $(BUILT_SOURCES)
|
||||||
|
|
||||||
# We can't use builtins or standard includes.
|
# We can't use builtins or standard includes.
|
||||||
AM_CFLAGS = $(STAGE1_CFLAGS) -fno-builtin -nostdinc
|
AM_CFLAGS = $(STAGE1_CFLAGS) -fno-builtin -nostdinc
|
||||||
LDFLAGS = -nostdlib -Wl,-N -Wl,-Ttext -Wl,7C00
|
LDFLAGS = -nostdlib -Wl,-N -Wl,-Ttext -Wl,7C00
|
||||||
|
|
|
@ -83,6 +83,9 @@ install_sh = @install_sh@
|
||||||
pkgdatadir = $(datadir)/$(PACKAGE)/$(host_cpu)-$(host_vendor)
|
pkgdatadir = $(datadir)/$(PACKAGE)/$(host_cpu)-$(host_vendor)
|
||||||
nodist_pkgdata_DATA = stage1
|
nodist_pkgdata_DATA = stage1
|
||||||
|
|
||||||
|
BUILT_SOURCES = stage2_size.h
|
||||||
|
CLEANFILES = $(nodist_pkgdata_DATA) $(BUILT_SOURCES)
|
||||||
|
|
||||||
# We can't use builtins or standard includes.
|
# We can't use builtins or standard includes.
|
||||||
AM_CFLAGS = $(STAGE1_CFLAGS) -fno-builtin -nostdinc
|
AM_CFLAGS = $(STAGE1_CFLAGS) -fno-builtin -nostdinc
|
||||||
LDFLAGS = -nostdlib -Wl,-N -Wl,-Ttext -Wl,7C00
|
LDFLAGS = -nostdlib -Wl,-N -Wl,-Ttext -Wl,7C00
|
||||||
|
|
|
@ -23,6 +23,7 @@ libgrub_a_CFLAGS = $(GRUB_CFLAGS) -DGRUB_UTIL=1 -DFSYS_EXT2FS=1 \
|
||||||
pkgdatadir = $(datadir)/$(PACKAGE)/$(host_cpu)-$(host_vendor)
|
pkgdatadir = $(datadir)/$(PACKAGE)/$(host_cpu)-$(host_vendor)
|
||||||
nodist_pkgdata_DATA = stage2 e2fs_stage1_5 fat_stage1_5 ffs_stage1_5 \
|
nodist_pkgdata_DATA = stage2 e2fs_stage1_5 fat_stage1_5 ffs_stage1_5 \
|
||||||
minix_stage1_5
|
minix_stage1_5
|
||||||
|
CLEANFILES = $(nodist_pkgdata_DATA)
|
||||||
noinst_DATA = pre_stage2 start
|
noinst_DATA = pre_stage2 start
|
||||||
noinst_PROGRAMS = pre_stage2.exec start.exec \
|
noinst_PROGRAMS = pre_stage2.exec start.exec \
|
||||||
e2fs_stage1_5.exec fat_stage1_5.exec \
|
e2fs_stage1_5.exec fat_stage1_5.exec \
|
||||||
|
|
|
@ -110,6 +110,7 @@ pkgdatadir = $(datadir)/$(PACKAGE)/$(host_cpu)-$(host_vendor)
|
||||||
nodist_pkgdata_DATA = stage2 e2fs_stage1_5 fat_stage1_5 ffs_stage1_5 \
|
nodist_pkgdata_DATA = stage2 e2fs_stage1_5 fat_stage1_5 ffs_stage1_5 \
|
||||||
minix_stage1_5
|
minix_stage1_5
|
||||||
|
|
||||||
|
CLEANFILES = $(nodist_pkgdata_DATA)
|
||||||
noinst_DATA = pre_stage2 start
|
noinst_DATA = pre_stage2 start
|
||||||
noinst_PROGRAMS = pre_stage2.exec start.exec \
|
noinst_PROGRAMS = pre_stage2.exec start.exec \
|
||||||
e2fs_stage1_5.exec fat_stage1_5.exec \
|
e2fs_stage1_5.exec fat_stage1_5.exec \
|
||||||
|
|
|
@ -128,9 +128,9 @@ grub_sprintf (char *buffer, const char *format, ...)
|
||||||
int *dataptr = (int *) &format;
|
int *dataptr = (int *) &format;
|
||||||
char c, *ptr, str[16];
|
char c, *ptr, str[16];
|
||||||
char *bp = buffer;
|
char *bp = buffer;
|
||||||
|
|
||||||
dataptr++;
|
dataptr++;
|
||||||
|
|
||||||
while ((c = *format++) != 0)
|
while ((c = *format++) != 0)
|
||||||
{
|
{
|
||||||
if (c != '%')
|
if (c != '%')
|
||||||
|
@ -140,26 +140,26 @@ grub_sprintf (char *buffer, const char *format, ...)
|
||||||
{
|
{
|
||||||
case 'd': case 'u': case 'x':
|
case 'd': case 'u': case 'x':
|
||||||
*convert_to_ascii (str, c, *((unsigned long *) dataptr++)) = 0;
|
*convert_to_ascii (str, c, *((unsigned long *) dataptr++)) = 0;
|
||||||
|
|
||||||
ptr = str;
|
ptr = str;
|
||||||
|
|
||||||
while (*ptr)
|
while (*ptr)
|
||||||
*bp++ = *(ptr++); /* putchar(*(ptr++)); */
|
*bp++ = *(ptr++); /* putchar(*(ptr++)); */
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case 'c': *bp++ = (*(dataptr++))&0xff;
|
case 'c': *bp++ = (*(dataptr++))&0xff;
|
||||||
/* putchar((*(dataptr++))&0xff); */
|
/* putchar((*(dataptr++))&0xff); */
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case 's':
|
case 's':
|
||||||
ptr = (char *) (*(dataptr++));
|
ptr = (char *) (*(dataptr++));
|
||||||
|
|
||||||
while ((c = *ptr++) != 0)
|
while ((c = *ptr++) != 0)
|
||||||
*bp++ = c; /* putchar(c); */
|
*bp++ = c; /* putchar(c); */
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
*bp = 0;
|
*bp = 0;
|
||||||
return bp - buffer;
|
return bp - buffer;
|
||||||
}
|
}
|
||||||
|
@ -222,7 +222,7 @@ get_cmdline (char *prompt, char *cmdline, int maxlen,
|
||||||
char *buf = (char *) CMDLINE_BUF;
|
char *buf = (char *) CMDLINE_BUF;
|
||||||
/* The kill buffer. */
|
/* The kill buffer. */
|
||||||
char *kill = (char *) KILL_BUF;
|
char *kill = (char *) KILL_BUF;
|
||||||
|
|
||||||
/* nested function definition for code simplicity */
|
/* nested function definition for code simplicity */
|
||||||
static void cl_print (char *str, int echo_char)
|
static void cl_print (char *str, int echo_char)
|
||||||
{
|
{
|
||||||
|
@ -241,7 +241,7 @@ get_cmdline (char *prompt, char *cmdline, int maxlen,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/* nested function definition for code simplicity */
|
/* nested function definition for code simplicity */
|
||||||
static void cl_setcpos (void)
|
static void cl_setcpos (void)
|
||||||
{
|
{
|
||||||
|
@ -249,13 +249,13 @@ get_cmdline (char *prompt, char *cmdline, int maxlen,
|
||||||
xend = ((lpos + plen) % 79);
|
xend = ((lpos + plen) % 79);
|
||||||
gotoxy (xend, yend);
|
gotoxy (xend, yend);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* nested function definition for initial command-line printing */
|
/* nested function definition for initial command-line printing */
|
||||||
static void cl_init ()
|
static void cl_init ()
|
||||||
{
|
{
|
||||||
/* distinguish us from other lines and error messages! */
|
/* distinguish us from other lines and error messages! */
|
||||||
putchar ('\n');
|
putchar ('\n');
|
||||||
|
|
||||||
/* print full line and set position here */
|
/* print full line and set position here */
|
||||||
ystart = (getxy () & 0xff);
|
ystart = (getxy () & 0xff);
|
||||||
yend = ystart;
|
yend = ystart;
|
||||||
|
@ -264,7 +264,7 @@ get_cmdline (char *prompt, char *cmdline, int maxlen,
|
||||||
cl_print (buf, echo_char);
|
cl_print (buf, echo_char);
|
||||||
cl_setcpos ();
|
cl_setcpos ();
|
||||||
}
|
}
|
||||||
|
|
||||||
/* nested function definition for erasing to the end of the line */
|
/* nested function definition for erasing to the end of the line */
|
||||||
static void cl_kill_to_end ()
|
static void cl_kill_to_end ()
|
||||||
{
|
{
|
||||||
|
@ -283,7 +283,7 @@ get_cmdline (char *prompt, char *cmdline, int maxlen,
|
||||||
static void cl_insert (const char *str)
|
static void cl_insert (const char *str)
|
||||||
{
|
{
|
||||||
int l = grub_strlen (str);
|
int l = grub_strlen (str);
|
||||||
|
|
||||||
if (llen + l < maxlen)
|
if (llen + l < maxlen)
|
||||||
{
|
{
|
||||||
if (lpos == llen)
|
if (lpos == llen)
|
||||||
|
@ -306,7 +306,7 @@ get_cmdline (char *prompt, char *cmdline, int maxlen,
|
||||||
llen += l;
|
llen += l;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
plen = grub_strlen (prompt);
|
plen = grub_strlen (prompt);
|
||||||
llen = grub_strlen (cmdline);
|
llen = grub_strlen (cmdline);
|
||||||
|
|
||||||
|
@ -321,9 +321,9 @@ get_cmdline (char *prompt, char *cmdline, int maxlen,
|
||||||
}
|
}
|
||||||
lpos = llen;
|
lpos = llen;
|
||||||
grub_strcpy (buf, cmdline);
|
grub_strcpy (buf, cmdline);
|
||||||
|
|
||||||
cl_init ();
|
cl_init ();
|
||||||
|
|
||||||
while (ASCII_CHAR (c = getkey ()) != '\n' && ASCII_CHAR (c) != '\r')
|
while (ASCII_CHAR (c = getkey ()) != '\n' && ASCII_CHAR (c) != '\r')
|
||||||
{
|
{
|
||||||
switch (c)
|
switch (c)
|
||||||
|
@ -378,7 +378,7 @@ get_cmdline (char *prompt, char *cmdline, int maxlen,
|
||||||
pos++;
|
pos++;
|
||||||
|
|
||||||
is_filename = (lpos > pos);
|
is_filename = (lpos > pos);
|
||||||
|
|
||||||
/* Find the position of the equal character after a
|
/* Find the position of the equal character after a
|
||||||
command, and replace it with a space. */
|
command, and replace it with a space. */
|
||||||
for (i = pos; buf[i] && buf[i] != ' '; i++)
|
for (i = pos; buf[i] && buf[i] != ' '; i++)
|
||||||
|
@ -400,7 +400,7 @@ get_cmdline (char *prompt, char *cmdline, int maxlen,
|
||||||
completion_buffer[lpos - i] = 0;
|
completion_buffer[lpos - i] = 0;
|
||||||
ret = print_completions (is_filename, 1);
|
ret = print_completions (is_filename, 1);
|
||||||
errnum = ERR_NONE;
|
errnum = ERR_NONE;
|
||||||
|
|
||||||
if (ret >= 0)
|
if (ret >= 0)
|
||||||
{
|
{
|
||||||
/* Found, so insert COMPLETION_BUFFER. */
|
/* Found, so insert COMPLETION_BUFFER. */
|
||||||
|
@ -410,7 +410,7 @@ get_cmdline (char *prompt, char *cmdline, int maxlen,
|
||||||
{
|
{
|
||||||
/* There is more than one candidates, so print
|
/* There is more than one candidates, so print
|
||||||
the list. */
|
the list. */
|
||||||
|
|
||||||
/* Go to the part after the line here. */
|
/* Go to the part after the line here. */
|
||||||
yend = ((llen + plen) / 79) + ystart;
|
yend = ((llen + plen) / 79) + ystart;
|
||||||
grub_putchar ('\n');
|
grub_putchar ('\n');
|
||||||
|
@ -419,11 +419,11 @@ get_cmdline (char *prompt, char *cmdline, int maxlen,
|
||||||
print_completions (is_filename, 0);
|
print_completions (is_filename, 0);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Restore the command-line. */
|
/* Restore the command-line. */
|
||||||
if (equal_pos >= 0)
|
if (equal_pos >= 0)
|
||||||
buf[equal_pos] = '=';
|
buf[equal_pos] = '=';
|
||||||
|
|
||||||
if (ret)
|
if (ret)
|
||||||
cl_init ();
|
cl_init ();
|
||||||
}
|
}
|
||||||
|
@ -478,14 +478,14 @@ get_cmdline (char *prompt, char *cmdline, int maxlen,
|
||||||
case 16: /* C-p fetch the previous command */
|
case 16: /* C-p fetch the previous command */
|
||||||
{
|
{
|
||||||
char *p;
|
char *p;
|
||||||
|
|
||||||
if (history < 0)
|
if (history < 0)
|
||||||
/* Save the working buffer. */
|
/* Save the working buffer. */
|
||||||
grub_strcpy (cmdline, buf);
|
grub_strcpy (cmdline, buf);
|
||||||
else if (grub_strcmp (get_history (history), buf) != 0)
|
else if (grub_strcmp (get_history (history), buf) != 0)
|
||||||
/* If BUF is modified, add it into the history list. */
|
/* If BUF is modified, add it into the history list. */
|
||||||
add_history (buf, history);
|
add_history (buf, history);
|
||||||
|
|
||||||
history++;
|
history++;
|
||||||
p = get_history (history);
|
p = get_history (history);
|
||||||
if (! p)
|
if (! p)
|
||||||
|
@ -493,7 +493,7 @@ get_cmdline (char *prompt, char *cmdline, int maxlen,
|
||||||
history--;
|
history--;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
lpos = 0;
|
lpos = 0;
|
||||||
cl_setcpos ();
|
cl_setcpos ();
|
||||||
cl_kill_to_end ();
|
cl_kill_to_end ();
|
||||||
|
@ -507,7 +507,7 @@ get_cmdline (char *prompt, char *cmdline, int maxlen,
|
||||||
case 14: /* C-n fetch the next command */
|
case 14: /* C-n fetch the next command */
|
||||||
{
|
{
|
||||||
char *p;
|
char *p;
|
||||||
|
|
||||||
if (history < 0)
|
if (history < 0)
|
||||||
{
|
{
|
||||||
break;
|
break;
|
||||||
|
@ -515,12 +515,12 @@ get_cmdline (char *prompt, char *cmdline, int maxlen,
|
||||||
else if (grub_strcmp (get_history (history), buf) != 0)
|
else if (grub_strcmp (get_history (history), buf) != 0)
|
||||||
/* If BUF is modified, add it into the history list. */
|
/* If BUF is modified, add it into the history list. */
|
||||||
add_history (buf, history);
|
add_history (buf, history);
|
||||||
|
|
||||||
history--;
|
history--;
|
||||||
p = get_history (history);
|
p = get_history (history);
|
||||||
if (! p)
|
if (! p)
|
||||||
p = cmdline;
|
p = cmdline;
|
||||||
|
|
||||||
lpos = 0;
|
lpos = 0;
|
||||||
cl_setcpos ();
|
cl_setcpos ();
|
||||||
cl_kill_to_end ();
|
cl_kill_to_end ();
|
||||||
|
@ -579,7 +579,7 @@ get_cmdline (char *prompt, char *cmdline, int maxlen,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Move the cursor to the end of the command. */
|
/* Move the cursor to the end of the command. */
|
||||||
lpos = llen;
|
lpos = llen;
|
||||||
cl_setcpos ();
|
cl_setcpos ();
|
||||||
|
@ -599,7 +599,7 @@ get_cmdline (char *prompt, char *cmdline, int maxlen,
|
||||||
empty, add it into the history list. */
|
empty, add it into the history list. */
|
||||||
if (readline && lpos < llen)
|
if (readline && lpos < llen)
|
||||||
add_history (cmdline, 0);
|
add_history (cmdline, 0);
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
#endif /* STAGE1_5 */
|
#endif /* STAGE1_5 */
|
||||||
|
@ -626,7 +626,7 @@ safe_parse_maxint (char **str_ptr, int *myint_ptr)
|
||||||
(A >= B && A <= C) <=> ((A - B) <= (C - B))
|
(A >= B && A <= C) <=> ((A - B) <= (C - B))
|
||||||
when C > B and A is unsigned. */
|
when C > B and A is unsigned. */
|
||||||
unsigned int digit;
|
unsigned int digit;
|
||||||
|
|
||||||
digit = tolower (*ptr) - '0';
|
digit = tolower (*ptr) - '0';
|
||||||
if (digit > 9)
|
if (digit > 9)
|
||||||
{
|
{
|
||||||
|
@ -690,7 +690,7 @@ grub_memcmp (const char *s1, const char *s2, int n)
|
||||||
s2++;
|
s2++;
|
||||||
n--;
|
n--;
|
||||||
}
|
}
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -784,10 +784,10 @@ int
|
||||||
grub_strlen (const char *str)
|
grub_strlen (const char *str)
|
||||||
{
|
{
|
||||||
int len = 0;
|
int len = 0;
|
||||||
|
|
||||||
while (*str++)
|
while (*str++)
|
||||||
len++;
|
len++;
|
||||||
|
|
||||||
return len;
|
return len;
|
||||||
}
|
}
|
||||||
#endif /* ! STAGE1_5 */
|
#endif /* ! STAGE1_5 */
|
||||||
|
@ -817,7 +817,7 @@ memcheck (int addr, int len)
|
||||||
# endif
|
# endif
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (start_addr () <= addr && end_addr () > addr + len)
|
if (start_addr () <= addr && end_addr () > addr + len)
|
||||||
return ! errnum;
|
return ! errnum;
|
||||||
#endif /* GRUB_UTIL */
|
#endif /* GRUB_UTIL */
|
||||||
|
@ -841,7 +841,7 @@ grub_memmove (char *to, const char *from, int len)
|
||||||
linux-2.2.2/include/asm-i386/string.h. This is not very fast
|
linux-2.2.2/include/asm-i386/string.h. This is not very fast
|
||||||
but compact. */
|
but compact. */
|
||||||
int d0, d1, d2;
|
int d0, d1, d2;
|
||||||
|
|
||||||
if (to < from)
|
if (to < from)
|
||||||
{
|
{
|
||||||
asm volatile ("cld\n\t"
|
asm volatile ("cld\n\t"
|
||||||
|
|
40
util/mbchk.c
40
util/mbchk.c
|
@ -48,7 +48,7 @@ Check if the format of FILE complies with the Multiboot Specification.
|
||||||
|
|
||||||
Report bugs to <bug-grub@gnu.org>.
|
Report bugs to <bug-grub@gnu.org>.
|
||||||
");
|
");
|
||||||
|
|
||||||
exit (status);
|
exit (status);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -58,7 +58,7 @@ check_multiboot (const char *filename, FILE *fp)
|
||||||
multiboot_header_t *mbh = 0;
|
multiboot_header_t *mbh = 0;
|
||||||
int i;
|
int i;
|
||||||
char buf[8192];
|
char buf[8192];
|
||||||
|
|
||||||
if (fread (buf, 1, 8192, fp) < 0)
|
if (fread (buf, 1, 8192, fp) < 0)
|
||||||
{
|
{
|
||||||
fprintf (stderr, "%s: Read error.\n", filename);
|
fprintf (stderr, "%s: Read error.\n", filename);
|
||||||
|
@ -75,17 +75,17 @@ check_multiboot (const char *filename, FILE *fp)
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (! mbh)
|
if (! mbh)
|
||||||
{
|
{
|
||||||
fprintf (stderr, "%s: No Multiboot header.\n", filename);
|
fprintf (stderr, "%s: No Multiboot header.\n", filename);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (! quiet)
|
if (! quiet)
|
||||||
printf ("%s: The Multiboot header is found at the offset %d.\n",
|
printf ("%s: The Multiboot header is found at the offset %d.\n",
|
||||||
filename, i);
|
filename, i);
|
||||||
|
|
||||||
/* Check for the checksum. */
|
/* Check for the checksum. */
|
||||||
if (mbh->magic + mbh->flags + mbh->checksum != 0)
|
if (mbh->magic + mbh->flags + mbh->checksum != 0)
|
||||||
{
|
{
|
||||||
|
@ -94,7 +94,7 @@ check_multiboot (const char *filename, FILE *fp)
|
||||||
filename, mbh->checksum);
|
filename, mbh->checksum);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Reserved flags must be zero. */
|
/* Reserved flags must be zero. */
|
||||||
if (mbh->flags & ~0x00010003)
|
if (mbh->flags & ~0x00010003)
|
||||||
{
|
{
|
||||||
|
@ -103,7 +103,7 @@ check_multiboot (const char *filename, FILE *fp)
|
||||||
filename, mbh->flags);
|
filename, mbh->flags);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (! quiet)
|
if (! quiet)
|
||||||
{
|
{
|
||||||
printf ("%s: Page alignment is turned %s.\n",
|
printf ("%s: Page alignment is turned %s.\n",
|
||||||
|
@ -113,7 +113,7 @@ check_multiboot (const char *filename, FILE *fp)
|
||||||
printf ("%s: Address fields is turned %s.\n",
|
printf ("%s: Address fields is turned %s.\n",
|
||||||
filename, (mbh->flags & 0x10000)? "on" : "off");
|
filename, (mbh->flags & 0x10000)? "on" : "off");
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Check for the address fields. */
|
/* Check for the address fields. */
|
||||||
if (mbh->flags & 0x10000)
|
if (mbh->flags & 0x10000)
|
||||||
{
|
{
|
||||||
|
@ -125,7 +125,7 @@ check_multiboot (const char *filename, FILE *fp)
|
||||||
filename, mbh->header_addr, mbh->load_addr);
|
filename, mbh->header_addr, mbh->load_addr);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (mbh->load_addr >= mbh->load_end_addr)
|
if (mbh->load_addr >= mbh->load_end_addr)
|
||||||
{
|
{
|
||||||
fprintf (stderr,
|
fprintf (stderr,
|
||||||
|
@ -134,7 +134,7 @@ check_multiboot (const char *filename, FILE *fp)
|
||||||
filename, mbh->load_addr, mbh->load_end_addr);
|
filename, mbh->load_addr, mbh->load_end_addr);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (mbh->load_end_addr > mbh->bss_end_addr)
|
if (mbh->load_end_addr > mbh->bss_end_addr)
|
||||||
{
|
{
|
||||||
fprintf (stderr,
|
fprintf (stderr,
|
||||||
|
@ -143,7 +143,7 @@ check_multiboot (const char *filename, FILE *fp)
|
||||||
filename, mbh->load_end_addr, mbh->bss_end_addr);
|
filename, mbh->load_end_addr, mbh->bss_end_addr);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (mbh->load_addr > mbh->entry_addr)
|
if (mbh->load_addr > mbh->entry_addr)
|
||||||
{
|
{
|
||||||
fprintf (stderr,
|
fprintf (stderr,
|
||||||
|
@ -152,7 +152,7 @@ check_multiboot (const char *filename, FILE *fp)
|
||||||
filename, mbh->load_addr, mbh->entry_addr);
|
filename, mbh->load_addr, mbh->entry_addr);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (mbh->load_end_addr <= mbh->entry_addr)
|
if (mbh->load_end_addr <= mbh->entry_addr)
|
||||||
{
|
{
|
||||||
fprintf (stderr,
|
fprintf (stderr,
|
||||||
|
@ -161,7 +161,7 @@ check_multiboot (const char *filename, FILE *fp)
|
||||||
filename, mbh->load_end_addr, mbh->entry_addr);
|
filename, mbh->load_end_addr, mbh->entry_addr);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* This is a GRUB-specific limitation. */
|
/* This is a GRUB-specific limitation. */
|
||||||
if (mbh->load_addr < 0x100000)
|
if (mbh->load_addr < 0x100000)
|
||||||
{
|
{
|
||||||
|
@ -172,10 +172,10 @@ check_multiboot (const char *filename, FILE *fp)
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (! quiet)
|
if (! quiet)
|
||||||
printf ("%s: All checks passed.\n", filename);
|
printf ("%s: All checks passed.\n", filename);
|
||||||
|
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -183,7 +183,7 @@ int
|
||||||
main (int argc, char *argv[])
|
main (int argc, char *argv[])
|
||||||
{
|
{
|
||||||
int c;
|
int c;
|
||||||
|
|
||||||
do
|
do
|
||||||
{
|
{
|
||||||
c = getopt_long (argc, argv, optstring, longopts, 0);
|
c = getopt_long (argc, argv, optstring, longopts, 0);
|
||||||
|
@ -191,20 +191,20 @@ main (int argc, char *argv[])
|
||||||
{
|
{
|
||||||
case EOF:
|
case EOF:
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case 'h':
|
case 'h':
|
||||||
usage (0);
|
usage (0);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case 'v':
|
case 'v':
|
||||||
printf ("mbchk (GNU GRUB) " VERSION "\n");
|
printf ("mbchk (GNU GRUB " VERSION ")\n");
|
||||||
exit (0);
|
exit (0);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case 'q':
|
case 'q':
|
||||||
quiet = 1;
|
quiet = 1;
|
||||||
break;
|
break;
|
||||||
|
|
||||||
default:
|
default:
|
||||||
usage (1);
|
usage (1);
|
||||||
break;
|
break;
|
||||||
|
@ -240,5 +240,3 @@ main (int argc, char *argv[])
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue