return read4_little_endian(p->size4);
}
-char *line_ptr, /* interactive input */
- line_buffer[LINE_LENGTH];
-
int nowarn = 0; /* no warnings for fdisk -l/-s */
void toggle_units(struct fdisk_context *cxt)
}
}
-static void maybe_exit(struct fdisk_context *cxt, int rc, int *asked)
-{
- char line[LINE_LENGTH];
-
- assert(cxt);
- assert(cxt->label);
-
- putchar('\n');
- if (asked)
- *asked = 0;
-
- if (fdisk_label_is_changed(cxt->label)) {
- fprintf(stderr, _("Do you really want to quit? "));
-
- if (!fgets(line, LINE_LENGTH, stdin) || rpmatch(line) == 1)
- goto leave;
- if (asked)
- *asked = 1;
- return;
- }
-leave:
- fdisk_free_context(cxt);
- exit(rc);
-}
-
-/* read line; return 0 or first char */
-int read_line(struct fdisk_context *cxt, int *asked)
-{
- line_ptr = line_buffer;
- if (!fgets(line_buffer, LINE_LENGTH, stdin)) {
- maybe_exit(cxt, 1, asked);
- return 0;
- }
- if (asked)
- *asked = 0;
- while (*line_ptr && !isgraph(*line_ptr))
- line_ptr++;
- return *line_ptr;
-}
-
-char read_char(struct fdisk_context *cxt, char *mesg)
-{
- do {
- fputs(mesg, stdout);
- fflush (stdout); /* requested by niles@scyld.com */
-
- } while (!read_line(cxt, NULL));
-
- return *line_ptr;
-}
-
-char read_chars(struct fdisk_context *cxt, char *mesg)
-{
- int rc, asked = 0;
-
- do {
- fputs(mesg, stdout);
- fflush (stdout); /* niles@scyld.com */
- rc = read_line(cxt, &asked);
- } while (asked);
-
- if (!rc) {
- *line_ptr = '\n';
- line_ptr[1] = 0;
- }
- return *line_ptr;
-}
-
-/* deprecated in favour of fdisk_ask_number() */
-unsigned int
-read_int_with_suffix(struct fdisk_context *cxt,
- unsigned int low, unsigned int dflt, unsigned int high,
- unsigned int base, char *mesg, int *is_suffix_used)
-{
- unsigned int res;
- int default_ok = 1;
- int absolute = 0;
- static char *ms = NULL;
- static size_t mslen = 0;
-
- if (!ms || strlen(mesg)+100 > mslen) {
- mslen = strlen(mesg)+200;
- ms = xrealloc(ms,mslen);
- }
-
- if (dflt < low || dflt > high)
- default_ok = 0;
-
- if (default_ok)
- snprintf(ms, mslen, _("%s (%u-%u, default %u): "),
- mesg, low, high, dflt);
- else
- snprintf(ms, mslen, "%s (%u-%u): ",
- mesg, low, high);
-
- while (1) {
- int use_default = default_ok;
-
- /* ask question and read answer */
- while (read_chars(cxt, ms) != '\n' && !isdigit(*line_ptr)
- && *line_ptr != '-' && *line_ptr != '+')
- continue;
-
- if (*line_ptr == '+' || *line_ptr == '-') {
- int minus = (*line_ptr == '-');
- int suflen;
-
- absolute = 0;
- res = atoi(line_ptr + 1);
-
- while (isdigit(*++line_ptr))
- use_default = 0;
-
- while (isspace(*line_ptr))
- line_ptr++;
-
- suflen = strlen(line_ptr) - 1;
-
- while(isspace(*(line_ptr + suflen)))
- *(line_ptr + suflen--) = '\0';
-
- if ((*line_ptr == 'C' || *line_ptr == 'c') &&
- *(line_ptr + 1) == '\0') {
- /*
- * Cylinders
- */
- if (fdisk_context_use_cylinders(cxt))
- res *= cxt->geom.heads * cxt->geom.sectors;
- } else if (*line_ptr &&
- *(line_ptr + 1) == 'B' &&
- *(line_ptr + 2) == '\0') {
- /*
- * 10^N
- */
- if (*line_ptr == 'K')
- absolute = 1000;
- else if (*line_ptr == 'M')
- absolute = 1000000;
- else if (*line_ptr == 'G')
- absolute = 1000000000;
- else
- absolute = -1;
- } else if (*line_ptr &&
- *(line_ptr + 1) == '\0') {
- /*
- * 2^N
- */
- if (*line_ptr == 'K')
- absolute = 1 << 10;
- else if (*line_ptr == 'M')
- absolute = 1 << 20;
- else if (*line_ptr == 'G')
- absolute = 1 << 30;
- else
- absolute = -1;
- } else if (*line_ptr != '\0')
- absolute = -1;
-
- if (absolute == -1) {
- printf(_("Unsupported suffix: '%s'.\n"), line_ptr);
- printf(_("Supported: 10^N: KB (KiloByte), MB (MegaByte), GB (GigaByte)\n"
- " 2^N: K (KibiByte), M (MebiByte), G (GibiByte)\n"));
- continue;
- }
-
- if (absolute && res) {
- unsigned long long bytes;
- unsigned long unit;
-
- bytes = (unsigned long long) res * absolute;
- unit = cxt->sector_size * fdisk_context_get_units_per_sector(cxt);
- bytes += unit/2; /* round */
- bytes /= unit;
- res = bytes;
- }
- if (minus)
- res = -res;
- res += base;
- } else {
- res = atoi(line_ptr);
- while (isdigit(*line_ptr)) {
- line_ptr++;
- use_default = 0;
- }
- }
- if (use_default) {
- printf(_("Using default value %u\n"), dflt);
- return dflt;
- }
- if (res >= low && res <= high)
- break;
- else
- printf(_("Value out of range.\n"));
- }
- if (is_suffix_used)
- *is_suffix_used = absolute > 0;
- return res;
-}
-
-/*
- * Print the message MESG, then read an integer in LOW..HIGH.
- * If the user hits Enter, DFLT is returned, provided that is in LOW..HIGH.
- * Answers like +10 are interpreted as offsets from BASE.
- *
- * There is no default if DFLT is not between LOW and HIGH.
- */
-unsigned int
-read_int(struct fdisk_context *cxt,
- unsigned int low, unsigned int dflt, unsigned int high,
- unsigned int base, char *mesg)
-{
- return read_int_with_suffix(cxt, low, dflt, high, base, mesg, NULL);
-}
-
-
static void toggle_dos_compatibility_flag(struct fdisk_context *cxt)
{
struct fdisk_label *lb = fdisk_context_get_label(cxt, "dos");