summaryrefslogtreecommitdiff
path: root/usr/src/cmd/parted/ui.c
diff options
context:
space:
mode:
Diffstat (limited to 'usr/src/cmd/parted/ui.c')
-rw-r--r--usr/src/cmd/parted/ui.c1542
1 files changed, 0 insertions, 1542 deletions
diff --git a/usr/src/cmd/parted/ui.c b/usr/src/cmd/parted/ui.c
deleted file mode 100644
index a53643fa41..0000000000
--- a/usr/src/cmd/parted/ui.c
+++ /dev/null
@@ -1,1542 +0,0 @@
-/*
- parted - a frontend to libparted
- Copyright (C) 1999, 2000, 2001, 2002, 2006, 2007
- 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/>.
-*/
-
-#include <parted/parted.h>
-#include <parted/debug.h>
-
-#include <ctype.h>
-#include <signal.h>
-#include <stdlib.h>
-#include <string.h>
-#include <unistd.h>
-#include <setjmp.h>
-
-#include <config.h>
-#include "command.h"
-#include "strlist.h"
-#include "ui.h"
-#include "error.h"
-
-#define N_(String) String
-#if ENABLE_NLS
-# include <libintl.h>
-# include <locale.h>
-# define _(String) dgettext (PACKAGE, String)
-#else
-# define _(String) (String)
-#endif /* ENABLE_NLS */
-
-#ifdef HAVE_LIBREADLINE
-
-#ifdef HAVE_TERMCAP_H
-#include <termcap.h>
-#else
-extern int tgetnum (char* key);
-#endif
-
-#include <readline/readline.h>
-#include <readline/history.h>
-
-#ifndef HAVE_RL_COMPLETION_MATCHES
-#define rl_completion_matches completion_matches
-#endif
-
-#ifndef rl_compentry_func_t
-#define rl_compentry_func_t void
-#endif
-
-#endif /* HAVE_LIBREADLINE */
-
-#ifndef SA_SIGINFO
-# ifndef HAVE_SIGACTION
-
-struct sigaction {
-};
-
-static inline int
-sigaction (int signum, const struct* sigaction, struct* sigaction)
-{
-}
-
-# endif /* HAVE_SIGACTON */
-
-struct siginfo_t {
- int si_code;
-};
-
-#endif /* SA_SIGINFO */
-
-#ifndef SEGV_MAPERR
-# define SEGV_MAPERR (INTMAX - 1)
-#endif
-
-#ifndef SEGV_ACCERR
-# define SEGV_ACCERR (INTMAX - 2)
-#endif
-
-#ifndef FPE_INTDIV
-# define FPE_INTDIV (INTMAX - 1)
-#endif
-
-#ifndef FPE_INTOVF
-# define FPE_INTOVF (INTMAX - 2)
-#endif
-
-#ifndef FPE_FLTDIV
-# define FPE_FLTDIV (INTMAX - 3)
-#endif
-
-#ifndef FPE_FLTOVF
-# define FPE_FLTOVF (INTMAX - 4)
-#endif
-
-#ifndef FPE_FLTUND
-# define FPE_FLTUND (INTMAX - 5)
-#endif
-
-#ifndef FPE_FLTRES
-# define FPE_FLTRES (INTMAX - 6)
-#endif
-
-#ifndef FPE_FLTINV
-# define FPE_FLTINV (INTMAX - 7)
-#endif
-
-#ifndef FPE_FLTSUB
-# define FPE_FLTSUB (INTMAX - 8)
-#endif
-
-#ifndef ILL_ILLOPC
-# define ILL_ILLOPC (INTMAX - 1)
-#endif
-
-#ifndef ILL_ILLOPN
-# define ILL_ILLOPN (INTMAX - 2)
-#endif
-
-#ifndef ILL_ILLADR
-# define ILL_ILLADR (INTMAX - 3)
-#endif
-
-#ifndef ILL_ILLTRP
-# define ILL_ILLTRP (INTMAX - 4)
-#endif
-
-#ifndef ILL_PRVOPC
-# define ILL_PRVOPC (INTMAX - 5)
-#endif
-
-#ifndef ILL_PRVREG
-# define ILL_PRVREG (INTMAX - 6)
-#endif
-
-#ifndef ILL_COPROC
-# define ILL_COPROC (INTMAX - 7)
-#endif
-
-#ifndef ILL_BADSTK
-# define ILL_BADSTK (INTMAX - 8)
-#endif
-
-char* prog_name = "GNU Parted " VERSION "\n";
-
-static char* banner_msg = N_(
-"Welcome to GNU Parted! Type 'help' to view a list of commands.\n");
-
-static char* usage_msg = N_(
-"Usage: parted [OPTION]... [DEVICE [COMMAND [PARAMETERS]...]...]\n"
-"Apply COMMANDs with PARAMETERS to DEVICE. If no COMMAND(s) are given, "
-"run in\ninteractive mode.\n");
-
-static char* bug_msg = N_(
-"\n\nYou found a bug in GNU Parted! Here's what you have to do:\n\n"
-"Don't panic! The bug has most likely not affected any of your data.\n"
-"Help us to fix this bug by doing the following:\n\n"
-"Check whether the bug has already been fixed by checking\n"
-"the last version of GNU Parted that you can find at:\n\n"
-"\thttp://ftp.gnu.org/gnu/parted/\n\n"
-"Please check this version prior to bug reporting.\n\n"
-"If this has not been fixed yet or if you don't know how to check,\n"
-"please visit the GNU Parted website:\n\n"
-"\thttp://www.gnu.org/software/parted\n\n"
-"for further information.\n\n"
-"Your report should contain the version of this release (%s)\n"
-"along with the error message below, the output of\n\n"
-"\tparted DEVICE unit co print unit s print\n\n"
-"and the following history of commands you entered.\n"
-"Also include any additional information about your setup you\n"
-"consider important.\n");
-
-#define MAX_WORDS 1024
-
-static StrList* command_line;
-static Command** commands;
-static StrList* ex_opt_str [64];
-static StrList* on_list;
-static StrList* off_list;
-static StrList* on_off_list;
-static StrList* fs_type_list;
-static StrList* disk_type_list;
-
-static struct {
- const StrList* possibilities;
- const StrList* cur_pos;
- int in_readline;
- sigjmp_buf jmp_state;
-} readline_state;
-
-static struct sigaction sig_segv;
-static struct sigaction sig_int;
-static struct sigaction sig_fpe;
-static struct sigaction sig_ill;
-
-volatile int got_ctrl_c = 0; /* used in exception_handler */
-
-int
-screen_width ()
-{
- int width = 0;
-
- if (opt_script_mode || pretend_input_tty)
- return 32768; /* no wrapping ;) */
-
-/* HACK: don't specify termcap separately - it'll annoy the users. */
-#ifdef HAVE_LIBREADLINE
- width = tgetnum ("co");
-#endif
-
- if (width <= 0)
- width = 80;
-
- return width;
-}
-
-void
-wipe_line ()
-{
- if (opt_script_mode)
- return;
-
- /* yuck */
- fputs ("\r "
- " \r", stdout);
-}
-
-#ifdef HAVE_LIBREADLINE
-/* returns matching commands for text */
-static char*
-command_generator (char* text, int state)
-{
- if (!state)
- readline_state.cur_pos = readline_state.possibilities;
-
- while (readline_state.cur_pos) {
- const StrList* cur = readline_state.cur_pos;
- readline_state.cur_pos = cur->next;
- if (str_list_match_node (cur, text))
- return str_list_convert_node (cur);
- }
-
- return NULL;
-}
-
-/* completion function for readline() */
-char**
-complete_function (char* text, int start, int end)
-{
- return rl_completion_matches (text,
- (rl_compentry_func_t*) command_generator);
-}
-
-static void
-_add_history_unique (const char* line)
-{
- HIST_ENTRY* last_entry = current_history ();
- if (!strlen (line))
- return;
- if (!last_entry || strcmp (last_entry->line, line))
- add_history ((char*) line);
-}
-
-/* Prints command history, to be used before aborting */
-static void
-_dump_history ()
-{
- int i = 0;
- HIST_ENTRY** all_entries = history_list ();
-
- fputs (_("\nCommand History:\n"), stdout);
- while (all_entries[i]) {
- puts(all_entries[i++]->line);
- }
-}
-
-#else
-
-/* Print nothing because Readline is absent. */
-static inline void
-_dump_history (void)
-{
-}
-
-#endif /* HAVE_LIBREADLINE */
-
-static void
-mask_signal()
-{
- sigset_t curr;
- sigset_t prev;
-
- sigfillset(&curr);
- sigprocmask(SIG_SETMASK, &curr, &prev);
-}
-
-/* Resets the environment by jumping to the initial state
- * saved during ui intitialisation.
- * Pass 1 as the parameter if you want to quit parted,
- * 0 if you just want to reset to the command prompt.
- */
-static void
-reset_env (int quit)
-{
- int in_readline = readline_state.in_readline;
-
- readline_state.in_readline = 0;
-
- if (in_readline) {
- putchar ('\n');
- if (quit)
- exit (0);
-
- siglongjmp (readline_state.jmp_state, 1);
- }
-}
-
-/* Signal handler for SIGINT using 'sigaction'. */
-static void
-sa_sigint_handler (int signum, siginfo_t* info, void *ucontext)
-{
- if (info)
- sigaction (SIGINT, &sig_int, NULL);
-
- got_ctrl_c = 1;
- reset_env (0);
-}
-
-/* Signal handler for SIGINT using 'signal'. */
-static void
-s_sigint_handler (int signum)
-{
- signal (SIGINT, &s_sigint_handler);
- mask_signal ();
- sa_sigint_handler (signum, NULL, NULL);
-}
-
-/* Signal handler for SIGSEGV using 'sigaction'. */
-static void
-sa_sigsegv_handler (int signum, siginfo_t* info, void* ucontext)
-{
- printf (bug_msg, VERSION);
- _dump_history ();
-
- if (!info)
- abort ();
-
- sigaction (SIGSEGV, &sig_segv, NULL);
-
- switch (info->si_code) {
-
- case SEGV_MAPERR:
- fputs(_("\nError: SEGV_MAPERR (Address not mapped "
- "to object)\n"), stdout);
- PED_ASSERT(0, break); /* Force a backtrace */
- break;
-
- case SEGV_ACCERR:
- fputs(_("\nError: SEGV_ACCERR (Invalid permissions "
- "for mapped object)\n"), stdout);
- break;
-
- default:
- fputs(_("\nError: A general SIGSEGV signal was "
- "encountered.\n"), stdout);
- PED_ASSERT(0, break); /* Force a backtrace */
- break;
- }
-
- abort ();
-}
-
-/* Signal handler for SIGSEGV using 'signal'. */
-static void
-s_sigsegv_handler (int signum)
-{
- signal (SIGSEGV, &s_sigsegv_handler);
- mask_signal ();
- sa_sigsegv_handler (signum, NULL, NULL);
-}
-
-/* Signal handler for SIGFPE using 'sigaction'. */
-static void
-sa_sigfpe_handler (int signum, siginfo_t* info, void* ucontext)
-{
- printf (bug_msg, VERSION);
- _dump_history ();
-
- if (!info)
- abort ();
-
- sigaction (SIGFPE, &sig_fpe, NULL);
-
- switch (info->si_code) {
-
- case FPE_INTDIV:
- fputs(_("\nError: FPE_INTDIV (Integer: "
- "divide by zero)"), stdout);
- break;
-
- case FPE_INTOVF:
- fputs(_("\nError: FPE_INTOVF (Integer: "
- "overflow)"), stdout);
- break;
-
- case FPE_FLTDIV:
- fputs(_("\nError: FPE_FLTDIV (Float: "
- "divide by zero)"), stdout);
- break;
-
- case FPE_FLTOVF:
- fputs(_("\nError: FPE_FLTOVF (Float: "
- "overflow)"), stdout);
- break;
-
- case FPE_FLTUND:
- fputs(_("\nError: FPE_FLTUND (Float: "
- "underflow)"), stdout);
- break;
-
- case FPE_FLTRES:
- fputs(_("\nError: FPE_FLTRES (Float: "
- "inexact result)"), stdout);
- break;
-
- case FPE_FLTINV:
- fputs(_("\nError: FPE_FLTINV (Float: "
- "invalid operation)"), stdout);
- break;
-
- case FPE_FLTSUB:
- fputs(_("\nError: FPE_FLTSUB (Float: "
- "subscript out of range)"), stdout);
- break;
-
- default:
- fputs(_("\nError: A general SIGFPE signal "
- "was encountered."), stdout);
- break;
-
- }
-
- abort ();
-}
-
-/* Signal handler for SIGFPE using 'signal'. */
-static void
-s_sigfpe_handler (int signum)
-{
- signal (SIGFPE, &s_sigfpe_handler);
- mask_signal ();
- sa_sigfpe_handler (signum, NULL, NULL);
-}
-
-/* Signal handler for SIGILL using 'sigaction'. */
-static void
-sa_sigill_handler (int signum, siginfo_t* info, void* ucontext)
-{
- printf (bug_msg, VERSION);
- _dump_history ();
-
- if (!info)
- abort();
-
- sigaction (SIGILL, &sig_ill, NULL);
-
- switch (info->si_code) {
-
- case ILL_ILLOPC:
- fputs(_("\nError: ILL_ILLOPC "
- "(Illegal Opcode)"), stdout);
- break;
-
- case ILL_ILLOPN:
- fputs(_("\nError: ILL_ILLOPN "
- "(Illegal Operand)"), stdout);
- break;
-
- case ILL_ILLADR:
- fputs(_("\nError: ILL_ILLADR "
- "(Illegal addressing mode)"), stdout);
- break;
-
- case ILL_ILLTRP:
- fputs(_("\nError: ILL_ILLTRP "
- "(Illegal Trap)"), stdout);
- break;
-
- case ILL_PRVOPC:
- fputs(_("\nError: ILL_PRVOPC "
- "(Privileged Opcode)"), stdout);
- break;
-
- case ILL_PRVREG:
- fputs(_("\nError: ILL_PRVREG "
- "(Privileged Register)"), stdout);
- break;
-
- case ILL_COPROC:
- fputs(_("\nError: ILL_COPROC "
- "(Coprocessor Error)"), stdout);
- break;
-
- case ILL_BADSTK:
- fputs(_("\nError: ILL_BADSTK "
- "(Internal Stack Error)"), stdout);
- break;
-
- default:
- fputs(_("\nError: A general SIGILL "
- "signal was encountered."), stdout);
- break;
- }
-
- abort ();
-}
-
-/* Signal handler for SIGILL using 'signal'. */
-static void
-s_sigill_handler (int signum)
-{
- signal (SIGILL, &s_sigill_handler);
- mask_signal ();
- sa_sigill_handler (signum, NULL, NULL);
-}
-
-static char*
-_readline (const char* prompt, const StrList* possibilities)
-{
- char* line;
-
- readline_state.possibilities = possibilities;
- readline_state.cur_pos = NULL;
- readline_state.in_readline = 1;
-
- if (sigsetjmp (readline_state.jmp_state,1))
- return NULL;
-
- wipe_line ();
-#ifdef HAVE_LIBREADLINE
- if (!opt_script_mode) {
- /* XXX: why isn't prompt const? */
- line = readline ((char*) prompt);
- if (line)
- _add_history_unique (line);
- } else
-#endif
- {
- fputs (prompt, stdout);
- fflush (stdout);
- line = (char*) malloc (256);
- if (fgets (line, 256, stdin) && strcmp (line, "") != 0) {
-#ifndef HAVE_LIBREADLINE
- /* Echo the input line, to be consistent with
- how readline-5.2 works. */
- fputs (line, stdout);
- fflush (stdout);
-#endif
- line [strlen (line) - 1] = 0; /* kill trailing CR */
- } else {
- free (line);
- line = NULL;
- }
- }
-
- readline_state.in_readline = 0;
- return line;
-}
-
-static PedExceptionOption
-option_get_next (PedExceptionOption options, PedExceptionOption current)
-{
- PedExceptionOption i;
-
- if (current == 0)
- i = PED_EXCEPTION_OPTION_FIRST;
- else
- i = current * 2;
-
- for (; i <= options; i *= 2) {
- if (options & i)
- return i;
- }
- return 0;
-}
-
-static void
-_print_exception_text (PedException* ex)
-{
- StrList* text;
-
- wipe_line ();
-
- if (ex->type == PED_EXCEPTION_BUG) {
- printf (bug_msg, VERSION);
- text = str_list_create ("\n", ex->message, "\n\n", NULL);
- } else {
- text = str_list_create (
- _(ped_exception_get_type_string (ex->type)),
- ": ", ex->message, "\n", NULL);
- }
-
- str_list_print_wrap (text, screen_width (), 0, 0);
- str_list_destroy (text);
-}
-
-static PedExceptionOption
-exception_handler (PedException* ex)
-{
- PedExceptionOption opt;
-
- _print_exception_text (ex);
-
- /* only one choice? Take it ;-) */
- opt = option_get_next (ex->options, 0);
- if (!option_get_next (ex->options, opt))
- return opt;
-
- /* script-mode: don't handle the exception */
- if (opt_script_mode || (!isatty (0) && !pretend_input_tty))
- return PED_EXCEPTION_UNHANDLED;
-
- got_ctrl_c = 0;
-
- do {
- opt = command_line_get_ex_opt ("", ex->options);
- } while (opt == PED_EXCEPTION_UNHANDLED
- && (isatty (0) || pretend_input_tty) && !got_ctrl_c);
-
- if (got_ctrl_c) {
- got_ctrl_c = 0;
- opt = PED_EXCEPTION_UNHANDLED;
- }
-
- return opt;
-}
-
-void
-command_line_push_word (const char* word)
-{
- command_line = str_list_append (command_line, word);
-}
-
-char*
-command_line_pop_word ()
-{
- char* result;
- StrList* next;
-
- PED_ASSERT (command_line != NULL, return NULL);
-
- result = str_list_convert_node (command_line);
- next = command_line->next;
-
- str_list_destroy_node (command_line);
- command_line = next;
- return result;
-}
-
-void
-command_line_flush ()
-{
- str_list_destroy (command_line);
- command_line = NULL;
-}
-
-char*
-command_line_peek_word ()
-{
- if (command_line)
- return str_list_convert_node (command_line);
- else
- return NULL;
-}
-
-int
-command_line_get_word_count ()
-{
- return str_list_length (command_line);
-}
-
-static int
-_str_is_spaces (const char* str)
-{
- while (isspace (*str))
- str++;
-
- return *str == 0;
-}
-
-/* "multi_word mode" is the "normal" mode... many words can be typed,
- * delimited by spaces, etc.
- * In single-word mode, only one word is parsed per line.
- * Leading and trailing spaces are removed. For example: " a b c "
- * is a single word "a b c". The motivation for this mode is partition
- * names, etc. In single-word mode, the empty string is a word.
- * (but not in multi-word mode).
- */
-void
-command_line_push_line (const char* line, int multi_word)
-{
- int quoted = 0;
- char quote_char = 0;
- char this_word [256];
- int i;
-
- do {
- while (*line == ' ')
- line++;
-
- i = 0;
- for (; *line; line++) {
- if (*line == ' ' && !quoted) {
- if (multi_word)
- break;
-
- /* single word: check for trailing spaces + eol */
- if (_str_is_spaces (line))
- break;
- }
-
- if (!quoted && strchr ("'\"", *line)) {
- quoted = 1;
- quote_char = *line;
- continue;
- }
-
- if (quoted && *line == quote_char) {
- quoted = 0;
- continue;
- }
-
- /* hack: escape characters */
- if (quoted && line[0] == '\\' && line[1])
- line++;
-
- this_word [i++] = *line;
- }
- if (i || !multi_word) {
- this_word [i] = 0;
- command_line_push_word (this_word);
- }
- } while (*line && multi_word);
-}
-
-static char*
-realloc_and_cat (char* str, const char* append)
-{
- int length = strlen (str) + strlen (append) + 1;
- char* new_str = realloc (str, length);
-
- strcat (new_str, append);
- return new_str;
-}
-
-static char*
-_construct_prompt (const char* head, const char* def,
- const StrList* possibilities)
-{
- char* prompt = strdup (head);
-
- if (def && possibilities)
- PED_ASSERT (str_list_match_any (possibilities, def),
- return NULL);
-
- if (possibilities && str_list_length (possibilities) < 8) {
- const StrList* walk;
-
- if (strlen (prompt))
- prompt = realloc_and_cat (prompt, " ");
-
- for (walk = possibilities; walk; walk = walk->next) {
- if (walk != possibilities)
- prompt = realloc_and_cat (prompt, "/");
-
- if (def && str_list_match_node (walk, def) == 2) {
- prompt = realloc_and_cat (prompt, "[");
- prompt = realloc_and_cat (prompt, def);
- prompt = realloc_and_cat (prompt, "]");
- } else {
- char* text = str_list_convert_node (walk);
- prompt = realloc_and_cat (prompt, text);
- free (text);
- }
- }
- prompt = realloc_and_cat (prompt, "? ");
- } else if (def) {
- if (strlen (prompt))
- prompt = realloc_and_cat (prompt, " ");
- prompt = realloc_and_cat (prompt, "[");
- prompt = realloc_and_cat (prompt, def);
- prompt = realloc_and_cat (prompt, "]? ");
- } else {
- if (strlen (prompt))
- prompt = realloc_and_cat (prompt, " ");
- }
-
- return prompt;
-}
-
-void
-command_line_prompt_words (const char* prompt, const char* def,
- const StrList* possibilities, int multi_word)
-{
- char* line;
- char* real_prompt;
- char* _def = (char*) def;
- int _def_needs_free = 0;
-
- if (!def && str_list_length (possibilities) == 1) {
- _def = str_list_convert_node (possibilities);
- _def_needs_free = 1;
- }
-
- if (opt_script_mode) {
- if (_def)
- command_line_push_line (_def, 0);
- return;
- }
-
- do {
- real_prompt = _construct_prompt (prompt, _def, possibilities);
- line = _readline (real_prompt, possibilities);
- free (real_prompt);
- if (!line)
- break;
-
- if (!strlen (line)) {
- if (_def)
- command_line_push_line (_def, 0);
- } else {
- command_line_push_line (line, multi_word);
- }
- free (line);
- } while (!command_line_get_word_count () && !_def);
-
- if (_def_needs_free)
- free (_def);
-}
-
-/**
- * Get a word from command line.
- *
- * \param possibilities a StrList of valid strings, NULL if all are valid.
- * \param multi_word whether multiple words are allowed.
- *
- * \return The word(s), or NULL if empty.
- */
-char*
-command_line_get_word (const char* prompt, const char* def,
- const StrList* possibilities, int multi_word)
-{
- do {
- if (command_line_get_word_count ()) {
- char* result = command_line_pop_word ();
- StrList* result_node;
-
- if (!possibilities)
- return result;
-
- result_node = str_list_match (possibilities, result);
- if (result_node == NULL)
- error (0, 0, _("invalid token: %s"), result);
- free (result);
- if (result_node)
- return str_list_convert_node (result_node);
-
- command_line_flush ();
- if (opt_script_mode)
- return NULL;
- }
-
- command_line_prompt_words (prompt, def, possibilities,
- multi_word);
- } while (command_line_get_word_count ());
-
- return NULL;
-}
-
-int
-command_line_get_integer (const char* prompt, int* value)
-{
- char def_str [10];
- char* input;
- int valid;
-
- snprintf (def_str, 10, "%d", *value);
- input = command_line_get_word (prompt, *value ? def_str : NULL,
- NULL, 1);
- if (!input)
- return 0;
- valid = sscanf (input, "%d", value);
- free (input);
- return valid;
-}
-
-int
-command_line_get_sector (const char* prompt, PedDevice* dev, PedSector* value,
- PedGeometry** range)
-{
- char* def_str;
- char* input;
- int valid;
-
- def_str = ped_unit_format (dev, *value);
- input = command_line_get_word (prompt, *value ? def_str : NULL,
- NULL, 1);
-
- /* def_str might have rounded *value a little bit. If the user picked
- * the default, make sure the selected sector is identical to the
- * default.
- */
- if (input && *value && !strcmp (input, def_str)) {
- if (range) {
- *range = ped_geometry_new (dev, *value, 1);
- ped_free (def_str);
- return *range != NULL;
- }
-
- ped_free (def_str);
- return 1;
- }
-
- ped_free (def_str);
- if (!input) {
- *value = 0;
- if (range)
- *range = NULL;
- return 0;
- }
-
- valid = ped_unit_parse (input, dev, value, range);
-
- free (input);
- return valid;
-}
-
-int
-command_line_get_state (const char* prompt, int* value)
-{
- char* def_word;
- char* input;
-
- if (*value)
- def_word = str_list_convert_node (on_list);
- else
- def_word = str_list_convert_node (off_list);
- input = command_line_get_word (prompt, def_word, on_off_list, 1);
- free (def_word);
- if (!input)
- return 0;
- if (str_list_match_any (on_list, input))
- *value = 1;
- else
- *value = 0;
- free (input);
- return 1;
-}
-
-int
-command_line_get_device (const char* prompt, PedDevice** value)
-{
- char* def_dev_name = *value ? (*value)->path : NULL;
- char* dev_name;
- PedDevice* dev;
-
- dev_name = command_line_get_word (prompt, def_dev_name, NULL, 1);
- if (!dev_name)
- return 0;
-
- dev = ped_device_get (dev_name);
- free (dev_name);
- if (!dev)
- return 0;
-
- *value = dev;
- return 1;
-}
-
-int
-command_line_get_disk (const char* prompt, PedDisk** value)
-{
- PedDevice* dev = *value ? (*value)->dev : NULL;
-
- if (!command_line_get_device (prompt, &dev))
- return 0;
-
- if (dev != (*value)->dev) {
- PedDisk* new_disk = ped_disk_new (dev);
- if (!new_disk)
- return 0;
- *value = new_disk;
- }
- return 1;
-}
-
-int
-command_line_get_partition (const char* prompt, PedDisk* disk,
- PedPartition** value)
-{
- PedPartition* part;
-
- /* Flawed logic, doesn't seem to work?!
- check = ped_disk_next_partition (disk, part);
- part = ped_disk_next_partition (disk, check);
-
- if (part == NULL) {
-
- *value = check;
- printf (_("The (only) primary partition has "
- "been automatically selected\n"));
- return 1;
-
- } else {
- */
- int num = (*value) ? (*value)->num : 0;
-
- if (!command_line_get_integer (prompt, &num)) {
- ped_exception_throw (PED_EXCEPTION_ERROR,
- PED_EXCEPTION_CANCEL,
- _("Expecting a partition number."));
- return 0;
- }
-
- part = ped_disk_get_partition (disk, num);
-
- if (!part) {
- ped_exception_throw (PED_EXCEPTION_ERROR,
- PED_EXCEPTION_CANCEL,
- _("Partition doesn't exist."));
- return 0;
- }
-
- *value = part;
- return 1;
- //}
-}
-
-int
-command_line_get_fs_type (const char* prompt, const PedFileSystemType*(* value))
-{
- char* fs_type_name;
- PedFileSystemType* fs_type;
-
- fs_type_name = command_line_get_word (prompt,
- *value ? (*value)->name : NULL,
- fs_type_list, 1);
- if (!fs_type_name) {
- ped_exception_throw (PED_EXCEPTION_ERROR, PED_EXCEPTION_CANCEL,
- _("Expecting a file system type."));
- return 0;
- }
-
- fs_type = ped_file_system_type_get (fs_type_name);
- if (!fs_type) {
- ped_exception_throw (PED_EXCEPTION_ERROR, PED_EXCEPTION_CANCEL,
- _("Unknown file system type \"%s\"."),
- fs_type_name);
- return 0;
- }
-
- free (fs_type_name);
- *value = fs_type;
- return 1;
-}
-
-int
-command_line_get_disk_type (const char* prompt, const PedDiskType*(* value))
-{
- char* disk_type_name;
-
- disk_type_name = command_line_get_word (prompt,
- *value ? (*value)->name : NULL,
- disk_type_list, 1);
- if (!disk_type_name) {
- ped_exception_throw (PED_EXCEPTION_ERROR, PED_EXCEPTION_CANCEL,
- _("Expecting a disk label type."));
- return 0;
- }
-
- *value = ped_disk_type_get (disk_type_name);
- free (disk_type_name);
- PED_ASSERT (*value != NULL, return 0);
- return 1;
-}
-
-int
-command_line_get_part_flag (const char* prompt, const PedPartition* part,
- PedPartitionFlag* flag)
-{
- StrList* opts = NULL;
- PedPartitionFlag walk = 0;
- char* flag_name;
-
- while ( (walk = ped_partition_flag_next (walk)) ) {
- if (ped_partition_is_flag_available (part, walk)) {
- const char* walk_name;
-
- walk_name = ped_partition_flag_get_name (walk);
- opts = str_list_append (opts, walk_name);
- opts = str_list_append_unique (opts, _(walk_name));
- }
- }
-
- flag_name = command_line_get_word (prompt, NULL, opts, 1);
- str_list_destroy (opts);
-
- if (flag_name) {
- *flag = ped_partition_flag_get_by_name (flag_name);
- ped_free (flag_name);
- return 1;
- } else
- return 0;
-}
-
-static int
-_can_create_primary (const PedDisk* disk)
-{
- int i;
-
- for (i = 1; i <= ped_disk_get_max_primary_partition_count (disk); i++) {
- if (!ped_disk_get_partition (disk, i))
- return 1;
- }
-
- return 0;
-}
-
-static int
-_can_create_extended (const PedDisk* disk)
-{
- if (!_can_create_primary (disk))
- return 0;
-
- if (!ped_disk_type_check_feature (disk->type, PED_DISK_TYPE_EXTENDED))
- return 0;
-
- if (ped_disk_extended_partition (disk))
- return 0;
-
- return 1;
-}
-
-static int
-_can_create_logical (const PedDisk* disk)
-{
- if (!ped_disk_type_check_feature (disk->type, PED_DISK_TYPE_EXTENDED))
- return 0;
-
- return ped_disk_extended_partition (disk) != 0;
-}
-
-int
-command_line_get_part_type (const char* prompt, const PedDisk* disk,
- PedPartitionType* type)
-{
- StrList* opts = NULL;
- char* type_name;
-
- if (_can_create_primary (disk)) {
- opts = str_list_append_unique (opts, "primary");
- opts = str_list_append_unique (opts, _("primary"));
- }
- if (_can_create_extended (disk)) {
- opts = str_list_append_unique (opts, "extended");
- opts = str_list_append_unique (opts, _("extended"));
- }
- if (_can_create_logical (disk)) {
- opts = str_list_append_unique (opts, "logical");
- opts = str_list_append_unique (opts, _("logical"));
- }
- if (!opts) {
- ped_exception_throw (
- PED_EXCEPTION_ERROR, PED_EXCEPTION_CANCEL,
- _("Can't create any more partitions."));
- return 0;
- }
-
- type_name = command_line_get_word (prompt, NULL, opts, 1);
- str_list_destroy (opts);
-
- if (!type_name) {
- ped_exception_throw (
- PED_EXCEPTION_ERROR, PED_EXCEPTION_CANCEL,
- _("Expecting a partition type."));
- return 0;
- }
-
- if (!strcmp (type_name, "primary")
- || !strcmp (type_name, _("primary"))) {
- *type = 0;
- }
- if (!strcmp (type_name, "extended")
- || !strcmp (type_name, _("extended"))) {
- *type = PED_PARTITION_EXTENDED;
- }
- if (!strcmp (type_name, "logical")
- || !strcmp (type_name, _("logical"))) {
- *type = PED_PARTITION_LOGICAL;
- }
-
- free (type_name);
- return 1;
-}
-
-PedExceptionOption
-command_line_get_ex_opt (const char* prompt, PedExceptionOption options)
-{
- StrList* options_strlist = NULL;
- PedExceptionOption opt;
- char* opt_name;
-
- for (opt = option_get_next (options, 0); opt;
- opt = option_get_next (options, opt)) {
- options_strlist = str_list_append_unique (options_strlist,
- _(ped_exception_get_option_string (opt)));
- options_strlist = str_list_append_unique (options_strlist,
- ped_exception_get_option_string (opt));
- }
-
- opt_name = command_line_get_word (prompt, NULL, options_strlist, 1);
- if (!opt_name)
- return PED_EXCEPTION_UNHANDLED;
- str_list_destroy (options_strlist);
-
- opt = PED_EXCEPTION_OPTION_FIRST;
- while (1) {
- if (strcmp (opt_name,
- ped_exception_get_option_string (opt)) == 0)
- break;
- if (strcmp (opt_name,
- _(ped_exception_get_option_string (opt))) == 0)
- break;
- opt = option_get_next (options, opt);
- }
- free (opt_name);
- return opt;
-}
-
-int
-command_line_get_unit (const char* prompt, PedUnit* unit)
-{
- StrList* opts = NULL;
- PedUnit walk;
- char* unit_name;
- const char* default_unit_name;
-
- for (walk = PED_UNIT_FIRST; walk <= PED_UNIT_LAST; walk++)
- opts = str_list_append (opts, ped_unit_get_name (walk));
-
- default_unit_name = ped_unit_get_name (ped_unit_get_default ());
- unit_name = command_line_get_word (prompt, default_unit_name, opts, 1);
- str_list_destroy (opts);
-
- if (unit_name) {
- *unit = ped_unit_get_by_name (unit_name);
- free (unit_name);
- return 1;
- } else
- return 0;
-}
-
-int
-command_line_is_integer ()
-{
- char* word;
- int is_integer;
- int scratch;
-
- word = command_line_peek_word ();
- if (!word)
- return 0;
-
- is_integer = sscanf (word, "%d", &scratch);
- free (word);
- return is_integer;
-}
-
-static int
-init_ex_opt_str ()
-{
- int i;
- PedExceptionOption opt;
-
- for (i = 0; (1 << i) <= PED_EXCEPTION_OPTION_LAST; i++) {
- opt = (1 << i);
- ex_opt_str [i]
- = str_list_create (
- ped_exception_get_option_string (opt),
- _(ped_exception_get_option_string (opt)),
- NULL);
- if (!ex_opt_str [i])
- return 0;
- }
-
- ex_opt_str [i] = NULL;
- return 1;
-}
-
-static void
-done_ex_opt_str ()
-{
- int i;
-
- for (i=0; ex_opt_str [i]; i++)
- str_list_destroy (ex_opt_str [i]);
-}
-
-static int
-init_state_str ()
-{
- on_list = str_list_create_unique (_("on"), "on", NULL);
- off_list = str_list_create_unique (_("off"), "off", NULL);
- on_off_list = str_list_join (str_list_duplicate (on_list),
- str_list_duplicate (off_list));
- return 1;
-}
-
-static void
-done_state_str ()
-{
- str_list_destroy (on_list);
- str_list_destroy (off_list);
- str_list_destroy (on_off_list);
-}
-
-static int
-init_fs_type_str ()
-{
- PedFileSystemType* walk;
-
- fs_type_list = NULL;
-
- for (walk = ped_file_system_type_get_next (NULL); walk;
- walk = ped_file_system_type_get_next (walk))
- {
- fs_type_list = str_list_insert (fs_type_list, walk->name);
- if (!fs_type_list)
- return 0;
- }
-
- return 1;
-}
-
-static int
-init_disk_type_str ()
-{
- PedDiskType* walk;
-
- disk_type_list = NULL;
-
- for (walk = ped_disk_type_get_next (NULL); walk;
- walk = ped_disk_type_get_next (walk))
- {
- disk_type_list = str_list_insert (disk_type_list, walk->name);
- if (!disk_type_list)
- return 0;
- }
-
- return 1;
-}
-
-int
-init_ui ()
-{
- if (!init_ex_opt_str ()
- || !init_state_str ()
- || !init_fs_type_str ()
- || !init_disk_type_str ())
- 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);
-
- sig_segv.sa_sigaction = &sa_sigsegv_handler;
- sig_int.sa_sigaction = &sa_sigint_handler;
- sig_fpe.sa_sigaction = &sa_sigfpe_handler;
- sig_ill.sa_sigaction = &sa_sigill_handler;
-
- sig_segv.sa_mask =
- sig_int.sa_mask =
- sig_fpe.sa_mask =
- sig_ill.sa_mask = curr;
-
- sig_segv.sa_flags =
- sig_int.sa_flags =
- sig_fpe.sa_flags =
- sig_ill.sa_flags = SA_SIGINFO;
-
- sigaction (SIGSEGV, &sig_segv, NULL);
- sigaction (SIGINT, &sig_int, NULL);
- sigaction (SIGFPE, &sig_fpe, NULL);
- sigaction (SIGILL, &sig_ill, NULL);
-#else
- signal (SIGSEGV, s_sigsegv_handler);
- signal (SIGINT, s_sigint_handler);
- signal (SIGFPE, s_sigfpe_handler);
- signal (SIGILL, s_sigill_handler);
-#endif /* SA_SIGINFO */
-
- return 1;
-}
-
-void
-done_ui ()
-{
- ped_exception_set_handler (NULL);
- done_ex_opt_str ();
- done_state_str ();
- str_list_destroy (fs_type_list);
- str_list_destroy (disk_type_list);
-}
-
-void
-help_msg ()
-{
- fputs (_(usage_msg), stdout);
-
- putchar ('\n');
- fputs (_("OPTIONs:"), stdout);
- putchar ('\n');
- print_options_help ();
-
- putchar ('\n');
- fputs (_("COMMANDs:"), stdout);
- putchar ('\n');
- print_commands_help ();
- exit (0);
-}
-
-void
-print_using_dev (PedDevice* dev)
-{
- printf (_("Using %s\n"), dev->path);
-}
-
-int
-interactive_mode (PedDevice** dev, Command* cmd_list[])
-{
- StrList* list;
- StrList* command_names = command_get_names (cmd_list);
-
- commands = cmd_list; /* FIXME yucky, nasty, evil hack */
-
- fputs (prog_name, stdout);
-
- print_using_dev (*dev);
-
- list = str_list_create (_(banner_msg), NULL);
- str_list_print_wrap (list, screen_width (), 0, 0);
- str_list_destroy (list);
-
- while (1) {
- char* word;
- Command* cmd;
-
- while (!command_line_get_word_count ()) {
- if (feof (stdin)) {
- putchar ('\n');
- return 1;
- }
- command_line_prompt_words ("(parted)", NULL,
- command_names, 1);
- }
-
- word = command_line_pop_word ();
- if (word) {
- cmd = command_get (commands, word);
- free (word);
- if (cmd) {
- if (!command_run (cmd, dev))
- command_line_flush ();
- } else
- print_commands_help ();
- }
- }
-
- return 1;
-}
-
-
-int
-non_interactive_mode (PedDevice** dev, Command* cmd_list[],
- int argc, char* argv[])
-{
- int i;
- Command* cmd;
-
- commands = cmd_list; /* FIXME yucky, nasty, evil hack */
-
- for (i = 0; i < argc; i++)
- command_line_push_line (argv [i], 1);
-
- while (command_line_get_word_count ()) {
- char* word;
-
- word = command_line_pop_word ();
- if (!word)
- break;
-
- cmd = command_get (commands, word);
- free (word);
- if (!cmd) {
- help_msg ();
- goto error;
- }
- if (!(cmd->non_interactive)) {
- fputs(_("This command does not make sense in "
- "non-interactive mode.\n"), stdout);
- exit(1);
- goto error;
- }
-
- if (!command_run (cmd, dev))
- goto error;
- }
- return 1;
-
-error:
- return 0;
-}