diff options
author | Keith M Wesolowski <wesolows@foobazco.org> | 2014-08-20 20:04:47 +0000 |
---|---|---|
committer | Keith M Wesolowski <wesolows@foobazco.org> | 2014-08-20 20:04:47 +0000 |
commit | 5f00496ef2e39b976b062f196ff01a99fd4864a4 (patch) | |
tree | 20be9cbc8f4b7ed3e616ce23552728083801e846 /usr/src/cmd/parted/ui.c | |
parent | af59b1a40df03681c1c8129aea7b1f5f52f2bcea (diff) | |
parent | 86bb58aec7165f8a0303564575c65e5a2ad58bf1 (diff) | |
download | illumos-joyent-release-20140821.tar.gz |
[illumos-gate merge]20140821release-20140821
commit 86bb58aec7165f8a0303564575c65e5a2ad58bf1
5095 panic when adding a duplicate dbuf to dn_dbufs
commit 60a61f7adabc73a7a0cb70d200ac2a6735f4a6e8
5092 env files don't need to define LOCKNAME by default
5091 illumos.sh env file's LOCKNAME definition is busted
commit 5e3f545c431ec4bce3e1b52f3f81bc9befe501f2
4989 removal of ntfsprogs and parted
commit ba3594ba9b5dd4c846c472a8d657edcb7c8109ac
5066 remove support for non-ANSI compilation
5068 Remove SCCSID() macro from <macros.h>
commit d8ccf998f9c944b8cf27ed840c376f9b79ebce5c
5087 8-bit inline atomic {add,or,and} use wrong reg constraints on x86
Manifests:
usr/src/pkg/manifests/SUNWntfsprogs.mf (torch library)
usr/src/pkg/manifests/SUNWparted.mf (torch headers)
usr/src/pkg/manifests/system-file-system-ntfsprogs.mf
usr/src/pkg/manifests/system-storage-parted.mf
Diffstat (limited to 'usr/src/cmd/parted/ui.c')
-rw-r--r-- | usr/src/cmd/parted/ui.c | 1542 |
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; -} |