diff --git a/ChangeLog b/ChangeLog index d345ad8a7..4af8855b0 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,11 @@ +2008-02-02 Robert Millan + + * commands/read.c: New file. + * conf/common.rmk (pkglib_MODULES): Add `commands/read.c'. + (read_mod_SOURCES): New variable. + (read_mod_CFLAGS): Likewise. + (read_mod_LDFLAGS): Likewise. + 2008-02-02 Robert Millan * normal/main.c (grub_normal_execute): Check for `menu->size' when diff --git a/DISTLIST b/DISTLIST index 6b527c73c..7bf60bc3c 100644 --- a/DISTLIST +++ b/DISTLIST @@ -41,6 +41,7 @@ commands/echo.c commands/help.c commands/hexdump.c commands/ls.c +commands/read.c commands/search.c commands/terminal.c commands/test.c diff --git a/commands/read.c b/commands/read.c new file mode 100644 index 000000000..19959183d --- /dev/null +++ b/commands/read.c @@ -0,0 +1,81 @@ +/* read.c - Command to read variables from user. */ +/* + * GRUB -- GRand Unified Bootloader + * Copyright (C) 2006,2007,2008 Free Software Foundation, Inc. + * + * GRUB 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 3 of the License, or + * (at your option) any later version. + * + * GRUB 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. + * + * You should have received a copy of the GNU General Public License + * along with GRUB. If not, see . + */ + +#include +#include +#include +#include +#include +#include + +static char * +grub_getline (void) +{ + int i; + char *line; + char *tmp; + + i = 0; + line = grub_malloc (1 + i + sizeof('\0')); + if (! line) + return NULL; + + while ((line[i - 1] != '\n') && (line[i - 1] != '\r')) + { + line[i] = grub_getkey (); + if (grub_isprint (line[i])) + grub_putchar (line[i]); + i++; + tmp = grub_realloc (line, 1 + i + sizeof('\0')); + if (! tmp) + { + grub_free (line); + return NULL; + } + line = tmp; + } + line[i] = '\0'; + + return line; +} + +static grub_err_t +grub_cmd_read (struct grub_arg_list *state UNUSED, int argc, char **args) +{ + char *line = grub_getline (); + if (! line) + return grub_errno; + if (argc > 0) + grub_env_set (args[0], line); + + grub_free (line); + return 0; +} + + +GRUB_MOD_INIT(read) +{ + grub_register_command ("read", grub_cmd_read, GRUB_COMMAND_FLAG_CMDLINE, + "read [ENVVAR]", "Set variable with user input", 0); +} + +GRUB_MOD_FINI(read) +{ + grub_unregister_command ("read"); +} diff --git a/conf/common.mk b/conf/common.mk index 3e710d2d7..9ca36112d 100644 --- a/conf/common.mk +++ b/conf/common.mk @@ -1505,7 +1505,8 @@ lvm_mod_LDFLAGS = $(COMMON_LDFLAGS) pkglib_MODULES += hello.mod boot.mod terminal.mod ls.mod \ cmp.mod cat.mod help.mod font.mod search.mod \ loopback.mod configfile.mod echo.mod \ - terminfo.mod test.mod blocklist.mod hexdump.mod + terminfo.mod test.mod blocklist.mod hexdump.mod \ + read.mod # For hello.mod. hello_mod_SOURCES = hello/hello.c @@ -2461,5 +2462,54 @@ fs-gzio_mod-io_gzio.lst: io/gzio.c $(io/gzio.c_DEPENDENCIES) genfslist.sh gzio_mod_CFLAGS = $(COMMON_CFLAGS) gzio_mod_LDFLAGS = $(COMMON_LDFLAGS) +# For read.mod. +read_mod_SOURCES = commands/read.c +CLEANFILES += read.mod mod-read.o mod-read.c pre-read.o read_mod-commands_read.o und-read.lst +ifneq ($(read_mod_EXPORTS),no) +CLEANFILES += def-read.lst +DEFSYMFILES += def-read.lst +endif +MOSTLYCLEANFILES += read_mod-commands_read.d +UNDSYMFILES += und-read.lst + +read.mod: pre-read.o mod-read.o + -rm -f $@ + $(TARGET_CC) $(read_mod_LDFLAGS) $(TARGET_LDFLAGS) -Wl,-r,-d -o $@ $^ + $(STRIP) --strip-unneeded -K grub_mod_init -K grub_mod_fini -R .note -R .comment $@ + +pre-read.o: $(read_mod_DEPENDENCIES) read_mod-commands_read.o + -rm -f $@ + $(TARGET_CC) $(read_mod_LDFLAGS) $(TARGET_LDFLAGS) -Wl,-r,-d -o $@ read_mod-commands_read.o + +mod-read.o: mod-read.c + $(TARGET_CC) $(TARGET_CPPFLAGS) $(TARGET_CFLAGS) $(read_mod_CFLAGS) -c -o $@ $< + +mod-read.c: moddep.lst genmodsrc.sh + sh $(srcdir)/genmodsrc.sh 'read' $< > $@ || (rm -f $@; exit 1) + +ifneq ($(read_mod_EXPORTS),no) +def-read.lst: pre-read.o + $(NM) -g --defined-only -P -p $< | sed 's/^\([^ ]*\).*/\1 read/' > $@ +endif + +und-read.lst: pre-read.o + echo 'read' > $@ + $(NM) -u -P -p $< | cut -f1 -d' ' >> $@ + +read_mod-commands_read.o: commands/read.c $(commands/read.c_DEPENDENCIES) + $(TARGET_CC) -Icommands -I$(srcdir)/commands $(TARGET_CPPFLAGS) $(TARGET_CFLAGS) $(read_mod_CFLAGS) -MD -c -o $@ $< +-include read_mod-commands_read.d + +CLEANFILES += cmd-read_mod-commands_read.lst fs-read_mod-commands_read.lst +COMMANDFILES += cmd-read_mod-commands_read.lst +FSFILES += fs-read_mod-commands_read.lst + +cmd-read_mod-commands_read.lst: commands/read.c $(commands/read.c_DEPENDENCIES) gencmdlist.sh + set -e; $(TARGET_CC) -Icommands -I$(srcdir)/commands $(TARGET_CPPFLAGS) $(TARGET_CFLAGS) $(read_mod_CFLAGS) -E $< | sh $(srcdir)/gencmdlist.sh read > $@ || (rm -f $@; exit 1) + +fs-read_mod-commands_read.lst: commands/read.c $(commands/read.c_DEPENDENCIES) genfslist.sh + set -e; $(TARGET_CC) -Icommands -I$(srcdir)/commands $(TARGET_CPPFLAGS) $(TARGET_CFLAGS) $(read_mod_CFLAGS) -E $< | sh $(srcdir)/genfslist.sh read > $@ || (rm -f $@; exit 1) +read_mod_CFLAGS = $(COMMON_CFLAGS) +read_mod_LDFLAGS = $(COMMON_LDFLAGS) diff --git a/conf/common.rmk b/conf/common.rmk index 39c9ec8e8..4722ac12f 100644 --- a/conf/common.rmk +++ b/conf/common.rmk @@ -231,7 +231,8 @@ lvm_mod_LDFLAGS = $(COMMON_LDFLAGS) pkglib_MODULES += hello.mod boot.mod terminal.mod ls.mod \ cmp.mod cat.mod help.mod font.mod search.mod \ loopback.mod configfile.mod echo.mod \ - terminfo.mod test.mod blocklist.mod hexdump.mod + terminfo.mod test.mod blocklist.mod hexdump.mod \ + read.mod # For hello.mod. hello_mod_SOURCES = hello/hello.c @@ -326,5 +327,7 @@ gzio_mod_SOURCES = io/gzio.c gzio_mod_CFLAGS = $(COMMON_CFLAGS) gzio_mod_LDFLAGS = $(COMMON_LDFLAGS) - - +# For read.mod. +read_mod_SOURCES = commands/read.c +read_mod_CFLAGS = $(COMMON_CFLAGS) +read_mod_LDFLAGS = $(COMMON_LDFLAGS)