diff options
Diffstat (limited to 'sbin/sysinstall/label.c')
| -rw-r--r-- | sbin/sysinstall/label.c | 394 |
1 files changed, 4 insertions, 390 deletions
diff --git a/sbin/sysinstall/label.c b/sbin/sysinstall/label.c index f7965cfada48..d78eaa2849fa 100644 --- a/sbin/sysinstall/label.c +++ b/sbin/sysinstall/label.c @@ -8,6 +8,10 @@ #include <sys/disklabel.h> #include <ufs/ffs/fs.h> +#include <string.h> +#include <dialog.h> +#include "sysinstall.h" + int disk_size(struct disklabel *); int sectstoMb(int, int); @@ -432,396 +436,6 @@ getfstype(char *fstype) return(FS_OTHER); } -#include <string.h> -#include <dialog.h> -#include "sysinstall.h" - -int disk_size(struct disklabel *); -int sectstoMb(int, int); - -char *partname[MAXPARTITIONS] = {"a", "b", "c", "d", "e", "f", "g", "h"}; - -#define EDITABLES 3 -struct field { - int y; - int x; - int width; - char field[80]; -} field; - -struct field label_fields[MAXPARTITIONS][EDITABLES]; - -void -setup_label_fields(struct disklabel *lbl) -{ - int i; - - for (i=0; i < MAXPARTITIONS; i++) { - label_fields[i][0].y = 4 + (i * 2); - label_fields[i][0].x = 15; - label_fields[i][0].width = 15; - sprintf(label_fields[i][0].field, "%s", - fstypenames[lbl->d_partitions[i].p_fstype]); - label_fields[i][1].y = 4 + (i * 2); - label_fields[i][1].x = 35; - label_fields[i][1].width = 9; - sprintf(label_fields[i][1].field, "%d", - sectstoMb(lbl->d_partitions[i].p_size, lbl->d_secsize)); - label_fields[i][2].y = 4 + (i * 2); - label_fields[i][2].x = 45; - label_fields[i][2].width = 30; - if (mountpoint[i]) - strcpy(label_fields[i][2].field, mountpoint[i]); - } -} - -void -update_label_form(WINDOW *window, struct disklabel *lbl) -{ - int i; - - mvwprintw(window, 2, 2, "Partition"); - mvwprintw(window, 2, 15, "Filesystem Type"); - mvwprintw(window, 2, 35, "Size"); - mvwprintw(window, 2, 45, "Mount point"); - for (i=0; i < MAXPARTITIONS; i++) { - mvwprintw(window, 4+(i*2), 6, "%s", partname[i]); - mvwprintw(window, label_fields[i][0].y, label_fields[i][0].x, "%s", - &label_fields[i][0].field); - mvwprintw(window, label_fields[i][1].y, label_fields[i][1].x, "%s", - &label_fields[i][1].field); - if (label_fields[i][2].field) - mvwprintw(window, label_fields[i][2].y, label_fields[i][2].x, "%s", - &label_fields[i][2].field); - } - wrefresh(window); -} - -int -edit_line(WINDOW *window, int y, int x, char *field, int width, int maxlen) -{ - int len; - int key = 0; - int fpos, dispos, curpos; - int i; - int done = 0; - - len = strlen(field); - if (len < width) { - fpos = len; - curpos = len; - dispos = 0; - } else { - fpos = width; - curpos = width; - dispos = len - width; - }; - - - do { - wattrset(window, item_selected_attr); - wmove(window, y, x); - for (i=0; i < width; i++) - if (i < (len - dispos)) - waddch(window, field[dispos+i]); - else - waddch(window, ' '); - wmove(window, y, x + curpos); - wrefresh(window); - - key = wgetch(window); - switch (key) { - case TAB: - case KEY_BTAB: - case KEY_UP: - case KEY_DOWN: - case ESC: - case '\n': - done = 1; - break; - case KEY_HOME: - if (len < width) { - fpos = len; - curpos = len; - dispos = 0; - } else { - fpos = width; - curpos = width; - dispos = len - width; - }; - break; - case KEY_END: - if (len < width) { - dispos = 0; - curpos = len - 1; - } else { - dispos = len - width - 1; - curpos = width - 1; - } - fpos = len - 1; - break; - case KEY_LEFT: - if ((!curpos) && (!dispos)) { - beep(); - break; - } - if (--curpos < 0) { - curpos = 0; - if (--dispos < 0) - dispos = 0; - } - if (--fpos < 0) - fpos = 0; - break; - case KEY_RIGHT: - if ((curpos + dispos) == len) { - beep(); - break; - } - if ((curpos == (width-1)) && (dispos == (maxlen - width -1))) { - beep(); - break; - } - if (++curpos >= width) { - curpos = width - 1; - dispos++; - } - if (dispos >= len) - dispos = len - 1; - if (++fpos >= len) { - fpos = len; - } - break; - case KEY_BACKSPACE: - case KEY_DC: - if ((!curpos) && (!dispos)) { - beep(); - break; - } - if (fpos > 0) { - memmove(field+fpos-1, field+fpos, len - fpos); - len--; - fpos--; - if (curpos > 0) - --curpos; - if (!curpos) - --dispos; - if (dispos < 0) - dispos = 0; - } else - beep(); - break; - default: - if (len < maxlen - 1) { - memmove(field+fpos+1, field+fpos, len - fpos); - field[fpos] = key; - len++; - fpos++; - if (++curpos == width) { - --curpos; - dispos++; - } - if (len == (maxlen - 1)) { - dispos = (maxlen - width - 1); - } - } else - beep(); - break; - } - } while (!done); - wattrset(window, dialog_attr); - wmove(window, y, x); - for (i=0; i < width; i++) - if (i < (len - dispos)) - waddch(window, field[dispos+i]); - else - waddch(window, ' '); - wmove(window, y, x + curpos); - wrefresh(window); - field[len] = 0; - delwin(window); - refresh(); - return (key); -} - -int -disk_size(struct disklabel *lbl) -{ - int size; - - size = lbl->d_secsize * lbl->d_nsectors * - lbl->d_ntracks * lbl->d_ncylinders; - return (size / 1024 / 1024); -} - -int -sectstoMb(int nsects, int secsize) -{ - int size; - - size = nsects * secsize; - if (size) - size /= 1024 * 1024; - return (size); -} - -int -Mbtosects(int Mb, int secsize) -{ - int nsects; - - nsects = (Mb * 1024 * 1024) / secsize; - return(nsects); -} - -int -rndtocylbdry(int size, int secpercyl) -{ - int nocyls; - - nocyls = size / secpercyl; - if ((nocyls * secpercyl) < size) - nocyls ++; - return (nocyls); -} - -void -default_disklabel(struct disklabel *lbl, int avail_sects, int offset) -{ - int nsects; - - /* Fill in default label entries */ - - lbl->d_magic = DISKMAGIC; - bcopy("INSTALLATION", lbl->d_typename, strlen("INSTALLATION")); - lbl->d_rpm = 3600; - lbl->d_interleave = 1; - lbl->d_trackskew = 0; - lbl->d_cylskew = 0; - lbl->d_magic2 = DISKMAGIC; - lbl->d_checksum = 0; - lbl->d_bbsize = BBSIZE; - lbl->d_sbsize = SBSIZE; - lbl->d_npartitions = 5; - - /* Set up c and d as raw partitions for now */ - lbl->d_partitions[2].p_size = avail_sects; - lbl->d_partitions[2].p_offset = offset; - lbl->d_partitions[2].p_fsize = DEFFSIZE; /* XXX */ - lbl->d_partitions[2].p_fstype = FS_UNUSED; - lbl->d_partitions[2].p_frag = DEFFRAG; - - lbl->d_partitions[3].p_size = lbl->d_secperunit; - lbl->d_partitions[3].p_offset = 0; - lbl->d_partitions[3].p_fsize = DEFFSIZE; - lbl->d_partitions[3].p_fstype = FS_UNUSED; - lbl->d_partitions[3].p_frag = DEFFRAG; - - /* Default root */ - nsects = rndtocylbdry(Mbtosects(DEFROOTSIZE, lbl->d_secsize), - lbl->d_secperunit); - - lbl->d_partitions[0].p_size = nsects; - lbl->d_partitions[0].p_offset = offset; - lbl->d_partitions[0].p_fsize = DEFFSIZE; - lbl->d_partitions[0].p_fstype = FS_BSDFFS; - lbl->d_partitions[0].p_frag = DEFFRAG; - - avail_sects -= nsects; - offset += nsects; - nsects = rndtocylbdry(Mbtosects(DEFSWAPSIZE, lbl->d_secsize), - lbl->d_secperunit); - - lbl->d_partitions[1].p_size = nsects; - lbl->d_partitions[1].p_offset = offset; - lbl->d_partitions[1].p_fsize = DEFFSIZE; - lbl->d_partitions[1].p_fstype = FS_SWAP; - lbl->d_partitions[1].p_frag = DEFFRAG; - - avail_sects -= nsects; - offset += nsects; - nsects = rndtocylbdry(Mbtosects(DEFUSRSIZE, lbl->d_secsize), - lbl->d_secperunit); - - if (avail_sects > nsects) - nsects = avail_sects; - - lbl->d_partitions[4].p_size = nsects; - lbl->d_partitions[4].p_offset = offset; - lbl->d_partitions[4].p_fsize = DEFFSIZE; - lbl->d_partitions[4].p_fstype = FS_BSDFFS; - lbl->d_partitions[4].p_frag = DEFFRAG; - - sprintf(scratch, "%sa", avail_disknames[inst_disk]); - devicename[0] = StrAlloc(scratch); - mountpoint[0] = StrAlloc("/"); - sprintf(scratch, "%sb", avail_disknames[inst_disk]); - devicename[1] = StrAlloc(scratch); - mountpoint[1] = StrAlloc("swap"); - sprintf(scratch, "%se", avail_disknames[inst_disk]); - devicename[2] = StrAlloc(scratch); - mountpoint[2] = StrAlloc("/usr"); -} - -void -edit_disklabel(struct disklabel *lbl) -{ - int key=0; - int x_pos = 0; - int y_pos = 0; - WINDOW *window; - - if (use_shadow) - draw_shadow(stdscr, 1, 1, LINES-3, COLS-5); - - window = newwin(LINES - 2, COLS - 4, 0, 0); - keypad(window, TRUE); - - draw_box(window, 1, 1, LINES - 3, COLS - 5, dialog_attr, border_attr); - wattrset(window, dialog_attr); - - setup_label_fields(lbl); - do { - update_label_form(window, lbl); - key = edit_line(window, label_fields[y_pos][x_pos].y, - label_fields[y_pos][x_pos].x, - label_fields[y_pos][x_pos].field, - label_fields[y_pos][x_pos].width, - 20); - switch(key) { - case KEY_UP: - if (y_pos != 0) - y_pos--; - break; - case KEY_DOWN: - if (y_pos != MAXPARTITIONS) - y_pos++; - break; - case TAB: - x_pos++; - if (x_pos == EDITABLES) - x_pos = 0; - break; - case KEY_BTAB: - x_pos--; - if (x_pos < 0) - x_pos = EDITABLES - 1; - break; - case '\n': - ++y_pos; - if (y_pos == MAXPARTITIONS) { - y_pos = 0; - if (++x_pos == EDITABLES) - x_pos = 0; - } - break; - default: - break; - } - } while (key != '\033'); - dialog_clear(); -} - void display_disklabel(int disk) { |
