diff options
author | Karel Zak <kzak@redhat.com> | 2014-10-01 11:38:49 +0200 |
---|---|---|
committer | Karel Zak <kzak@redhat.com> | 2014-10-24 11:08:48 +0200 |
commit | 16e37abebb5ed7b44f7db9dd6ddd305e1af2549d (patch) | |
tree | b9e428b286662359ea175dd2284a54c2dcf93c99 | |
parent | c29b5d64f92f3c9b25c842006b6bff56e67b1975 (diff) | |
download | util-linux-16e37abebb5ed7b44f7db9dd6ddd305e1af2549d.tar.gz |
cfdisk: don't modify ncurses LINES and COLS
On Sun, Sep 28, 2014 at 01:48:38AM -0700, pv4 wrote:
If ncurses is build with --enable-reentrant, building
util-linux-2.25.1 fails with the folllowing error:
disk-utils/cfdisk.c: In function 'resize':
disk-utils/cfdisk.c:202:9: error: lvalue required as left operand of assignment
LINES = ws.ws_row;
^
disk-utils/cfdisk.c:203:8: error: lvalue required as left operand of assignment
COLS = ws.ws_col;
^
man COLS gives the following:
Depending on the configuration, these may be actual variables,
or macros (see curs_threads(3X)) which provide read-only
access to curses's state. In either case, applications should
treat them as read-only to avoid confusing the library.
Addresses: https://github.com/karelzak/util-linux/issues/125
Signed-off-by: Karel Zak <kzak@redhat.com>
-rw-r--r-- | disk-utils/cfdisk.c | 66 |
1 files changed, 37 insertions, 29 deletions
diff --git a/disk-utils/cfdisk.c b/disk-utils/cfdisk.c index afa3c2460..e7ec78542 100644 --- a/disk-utils/cfdisk.c +++ b/disk-utils/cfdisk.c @@ -71,9 +71,9 @@ #define MENU_PADDING 2 #define TABLE_START_LINE 4 -#define MENU_START_LINE ((size_t) LINES - 5) -#define INFO_LINE ((size_t) LINES - 2) -#define HINT_LINE ((size_t) LINES - 1) +#define MENU_START_LINE (ui_lines - 5) +#define INFO_LINE (ui_lines - 2) +#define HINT_LINE (ui_lines - 1) #define CFDISK_ERR_ESC 5000 @@ -118,6 +118,11 @@ static int ui_get_size(struct cfdisk *cf, const char *prompt, uintmax_t *res, static int ui_enabled; static int ui_resize; +/* ncurses LINES and COLS may be actual variables or *macros*, but we need + * something portable and writable */ +size_t ui_lines; +size_t ui_cols; + /* menu item */ struct cfdisk_menuitem { int key; /* keyboard shortcut */ @@ -199,8 +204,8 @@ static void resize(void) if (ioctl(fileno(stdout), TIOCGWINSZ, &ws) != -1 && ws.ws_row && ws.ws_col) { - LINES = ws.ws_row; - COLS = ws.ws_col; + ui_lines = ws.ws_row; + ui_cols = ws.ws_col; #if HAVE_RESIZETERM resizeterm(ws.ws_row, ws.ws_col); #endif @@ -208,7 +213,8 @@ static void resize(void) } touchwin(stdscr); - DBG(FRONTEND, ul_debug("ui: resize refresh COLS=%d, LINES=%d", COLS, LINES)); + DBG(FRONTEND, ul_debug("ui: resize refresh ui_cols=%zu, ui_lines=%zu", + ui_cols, ui_lines)); ui_resize = 0; } @@ -520,10 +526,10 @@ static int ui_end(void) return -EINVAL; #if defined(HAVE_SLCURSES_H) || defined(HAVE_SLANG_SLCURSES_H) - SLsmg_gotorc(LINES - 1, 0); + SLsmg_gotorc(ui_lines - 1, 0); SLsmg_refresh(); #else - mvcur(0, COLS - 1, LINES-1, 0); + mvcur(0, ui_cols - 1, ui_lines-1, 0); #endif curs_set(1); nl(); @@ -533,7 +539,7 @@ static int ui_end(void) return 0; } -static void ui_vprint_center(int line, int attrs, const char *fmt, va_list ap) +static void ui_vprint_center(size_t line, int attrs, const char *fmt, va_list ap) { size_t width; char *buf = NULL; @@ -544,12 +550,12 @@ static void ui_vprint_center(int line, int attrs, const char *fmt, va_list ap) xvasprintf(&buf, fmt, ap); width = mbs_safe_width(buf); - if (width > (size_t) COLS) { - char *p = strrchr(buf + COLS, ' '); + if (width > (size_t) ui_cols) { + char *p = strrchr(buf + ui_cols, ' '); if (!p) - p = buf + COLS; + p = buf + ui_cols; *p = '\0'; - if (line + 1 >= LINES) + if (line + 1 >= ui_lines) line--; attron(attrs); mvaddstr(line, 0, buf); @@ -557,13 +563,13 @@ static void ui_vprint_center(int line, int attrs, const char *fmt, va_list ap) attroff(attrs); } else { attron(attrs); - mvaddstr(line, (COLS - width) / 2, buf); + mvaddstr(line, (ui_cols - width) / 2, buf); attroff(attrs); } free(buf); } -static void ui_center(int line, const char *fmt, ...) +static void ui_center(size_t line, const char *fmt, ...) { va_list ap; va_start(ap, fmt); @@ -674,7 +680,7 @@ static void resize_on_signal(int dummy __attribute__((__unused__))) static void menu_refresh_size(struct cfdisk *cf) { if (cf->menu && cf->menu->nitems) - cf->menu->page_sz = (cf->menu->nitems / (LINES - 4)) ? LINES - 4 : 0; + cf->menu->page_sz = (cf->menu->nitems / (ui_lines - 4)) ? ui_lines - 4 : 0; } static void menu_update_ignore(struct cfdisk *cf) @@ -828,11 +834,11 @@ static size_t menuitem_get_line(struct cfdisk *cf, size_t idx) if (m->vertical) { if (!m->page_sz) /* small menu */ - return (LINES - (cf->menu->nitems + 1)) / 2 + idx; + return (ui_lines - (cf->menu->nitems + 1)) / 2 + idx; return (idx % m->page_sz) + 1; } else { size_t len = m->width + 4 + MENU_PADDING; /* item width */ - size_t items = COLS / len; /* items per line */ + size_t items = ui_cols / len; /* items per line */ if (items == 0) return 0; @@ -845,15 +851,15 @@ static int menuitem_get_column(struct cfdisk *cf, size_t idx) { if (cf->menu->vertical) { size_t nc = cf->menu->width + MENU_PADDING; - if ((size_t) COLS <= nc) + if ((size_t) ui_cols <= nc) return 0; - return (COLS - nc) / 2; + return (ui_cols - nc) / 2; } else { size_t len = cf->menu->width + 4 + MENU_PADDING; /* item width */ - size_t items = COLS / len; /* items per line */ + size_t items = ui_cols / len; /* items per line */ size_t extra = items < cf->menu->nitems ? /* extra space on line */ - COLS % len : /* - multi-line menu */ - COLS - (cf->menu->nitems * len); /* - one line menu */ + ui_cols % len : /* - multi-line menu */ + ui_cols - (cf->menu->nitems * len); /* - one line menu */ if (items == 0) return 0; /* hmm... no space */ @@ -1193,7 +1199,7 @@ static void ui_draw_partition(struct cfdisk *cf, size_t i) cf->page_sz && curpg < cf->nlines / cf->page_sz) { if (cur) attron(A_REVERSE); - mvaddch(ln, COLS - 1, ACS_DARROW); + mvaddch(ln, ui_cols - 1, ACS_DARROW); mvaddch(ln, 0, ACS_DARROW); if (cur) attroff(A_REVERSE); @@ -1226,11 +1232,11 @@ static int ui_draw_table(struct cfdisk *cf) ui_draw_partition(cf, i); if (curpg != 0) { - mvaddch(TABLE_START_LINE, COLS - 1, ACS_UARROW); + mvaddch(TABLE_START_LINE, ui_cols - 1, ACS_UARROW); mvaddch(TABLE_START_LINE, 0, ACS_UARROW); } if (cf->page_sz && curpg < cf->nlines / cf->page_sz) { - mvaddch(MENU_START_LINE - 1, COLS - 1, ACS_DARROW); + mvaddch(MENU_START_LINE - 1, ui_cols - 1, ACS_DARROW); mvaddch(MENU_START_LINE - 1, 0, ACS_DARROW); } return 0; @@ -1584,9 +1590,9 @@ static int ui_create_label(struct cfdisk *cf) } erase(); - ui_center(LINES - 4, + ui_center(ui_lines - 4, _("Device does not contain a recognized partition table.")); - ui_center(LINES - 3, + ui_center(ui_lines - 3, _("Please, select a type to create a new disk label.")); /* make the new menu active */ @@ -1882,7 +1888,9 @@ static int ui_run(struct cfdisk *cf) { int rc = 0; - DBG(FRONTEND, ul_debug("ui: start COLS=%d, LINES=%d", COLS, LINES)); + ui_lines = LINES; + ui_cols = COLS; + DBG(FRONTEND, ul_debug("start cols=%zu, lines=%zu", ui_cols, ui_lines)); if (!fdisk_dev_has_disklabel(cf->cxt) || cf->zero_start) { rc = ui_create_label(cf); |