[PATCH] ui: do not initialize readline (which would output!) in --script mode

Jim Meyering meyering at redhat.com
Thu Sep 24 16:46:45 UTC 2009


Running parted with its --script (-s) option would, surprisingly,
print a few control characters if TERM were set appropriately,
and if readline and curses support were compiled in.
This fixes it not to do that.
* parted/parted.c (_init): Initialize readline support only after
parsing command line options, so we can skip it in --script mode.
* parted/ui.c (init_readline): New function.
Body extracted from ...
(init_ui): ...here.
* parted/ui.h (init_readline): Declare.
* tests/t0010-script-no-ctrl-chars.sh: New file.  Test for the above.
* tests/Makefile.am (TESTS): Add that new file.
---
 parted/parted.c                     |    3 ++
 parted/ui.c                         |   18 ++++++++----
 parted/ui.h                         |    3 +-
 tests/Makefile.am                   |    1 +
 tests/t0010-script-no-ctrl-chars.sh |   50 +++++++++++++++++++++++++++++++++++
 5 files changed, 68 insertions(+), 7 deletions(-)
 create mode 100755 tests/t0010-script-no-ctrl-chars.sh

diff --git a/parted/parted.c b/parted/parted.c
index a7253d2..cde0ae3 100644
--- a/parted/parted.c
+++ b/parted/parted.c
@@ -1999,6 +1999,9 @@ _init_commands ();
 if (!_parse_options (argc_ptr, argv_ptr))
         goto error_done_commands;

+if (!opt_script_mode)
+        init_readline ();
+
 #ifdef HAVE_GETUID
         if (getuid() != 0 && !opt_script_mode) {
             puts (_("WARNING: You are not superuser.  Watch out for "
diff --git a/parted/ui.c b/parted/ui.c
index d61f6ac..3b55024 100644
--- a/parted/ui.c
+++ b/parted/ui.c
@@ -1394,6 +1394,18 @@ init_disk_type_str ()
 }

 int
+init_readline (void)
+{
+#ifdef HAVE_LIBREADLINE
+  if (!opt_script_mode) {
+    rl_initialize ();
+    rl_attempted_completion_function = (CPPFunction*) complete_function;
+    readline_state.in_readline = 0;
+  }
+#endif
+}
+
+int
 init_ui ()
 {
         if (!init_ex_opt_str ()
@@ -1403,12 +1415,6 @@ init_ui ()
                 return 0;
         ped_exception_set_handler (exception_handler);

-#ifdef HAVE_LIBREADLINE
-        rl_initialize ();
-        rl_attempted_completion_function = (CPPFunction*) complete_function;
-        readline_state.in_readline = 0;
-#endif
-
 #ifdef SA_SIGINFO
         sigset_t curr;
         sigfillset (&curr);
diff --git a/parted/ui.h b/parted/ui.h
index 77bb194..da3fca5 100644
--- a/parted/ui.h
+++ b/parted/ui.h
@@ -1,6 +1,6 @@
 /*
     parted - a frontend to libparted
-    Copyright (C) 1999, 2000, 2001, 2007-2008 Free Software Foundation, Inc.
+    Copyright (C) 1999, 2000, 2001, 2007-2009 Free Software Foundation, Inc.

     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
@@ -24,6 +24,7 @@
 extern const char *prog_name;

 extern int init_ui ();
+extern int init_readline ();
 extern int non_interactive_mode (PedDevice** dev, Command* cmd_list[],
 				 int argc, char* argv[]);
 extern int interactive_mode (PedDevice** dev, Command* cmd_list[]);
diff --git a/tests/Makefile.am b/tests/Makefile.am
index 326ccb4..548e469 100644
--- a/tests/Makefile.am
+++ b/tests/Makefile.am
@@ -1,5 +1,6 @@
 TESTS = \
   t0000-basic.sh \
+  t0010-script-no-ctrl-chars.sh \
   t0100-print.sh \
   t0200-gpt.sh \
   t0201-gpt.sh \
diff --git a/tests/t0010-script-no-ctrl-chars.sh b/tests/t0010-script-no-ctrl-chars.sh
new file mode 100755
index 0000000..9862eea
--- /dev/null
+++ b/tests/t0010-script-no-ctrl-chars.sh
@@ -0,0 +1,50 @@
+#!/bin/sh
+# Ensure that printing with -s outputs no readline control chars
+
+# Copyright (C) 2009 Free Software Foundation, Inc.
+
+# 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 3 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.
+
+# You should have received a copy of the GNU General Public License
+# along with this program.  If not, see <http://www.gnu.org/licenses/>.
+
+test_description='--script does no readline initialization'
+
+: ${srcdir=.}
+. $srcdir/test-lib.sh
+
+ss=$sector_size_
+n_sectors=5000
+dev=loop-file
+
+test_expect_success \
+    'create the test file' \
+    'dd if=/dev/null of=$dev bs=$ss seek=$n_sectors'
+
+test_expect_success \
+    'run parted -s FILE mklabel msdos' \
+    'parted -s $dev mklabel msdos > out 2>&1'
+test_expect_success 'expect no output' 'compare out /dev/null'
+
+test_expect_success \
+    'print partition table in --script mode' \
+    'TERM=xterm parted -m -s $dev u s p > out 2>&1'
+
+ok=0
+sed "s,.*/$dev:,$dev:," out > k && mv k out &&
+printf "BYT;\n$dev:${n_sectors}s:file:$ss:$ss:msdos:;\n" > exp &&
+  ok=1
+
+test_expect_success \
+    'match against expected output' \
+    'test $ok = 1 && compare out exp'
+
+test_done
--
1.6.5.rc2.177.ga9dd6



More information about the parted-devel mailing list