summaryrefslogtreecommitdiffstats
path: root/disk-utils/cfdisk.c
diff options
context:
space:
mode:
authorKarel Zak2014-10-01 11:38:49 +0200
committerKarel Zak2014-10-01 11:38:49 +0200
commiteef63970238a20d769e41e1261c4790b772d5b00 (patch)
treee1b49aa16d3a2b5ae5fecbc2f8cd089175d5a5a8 /disk-utils/cfdisk.c
parentsu: print proper core dump message when killed (diff)
downloadkernel-qcow2-util-linux-eef63970238a20d769e41e1261c4790b772d5b00.tar.gz
kernel-qcow2-util-linux-eef63970238a20d769e41e1261c4790b772d5b00.tar.xz
kernel-qcow2-util-linux-eef63970238a20d769e41e1261c4790b772d5b00.zip
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>
Diffstat (limited to 'disk-utils/cfdisk.c')
-rw-r--r--disk-utils/cfdisk.c66
1 files changed, 37 insertions, 29 deletions
diff --git a/disk-utils/cfdisk.c b/disk-utils/cfdisk.c
index ef4e3ffb9..e07278ffb 100644
--- a/disk-utils/cfdisk.c
+++ b/disk-utils/cfdisk.c
@@ -72,9 +72,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
@@ -119,6 +119,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 */
@@ -221,8 +226,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
@@ -230,7 +235,8 @@ static void resize(void)
}
touchwin(stdscr);
- DBG(UI, ul_debug("ui: resize refresh COLS=%d, LINES=%d", COLS, LINES));
+ DBG(UI, ul_debug("ui: resize refresh ui_cols=%zu, ui_lines=%zu",
+ ui_cols, ui_lines));
ui_resize = 0;
}
@@ -546,10 +552,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();
@@ -559,7 +565,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;
@@ -570,12 +576,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);
@@ -583,13 +589,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);
@@ -700,7 +706,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)
@@ -854,11 +860,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;
@@ -871,15 +877,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 */
@@ -1219,7 +1225,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);
@@ -1252,11 +1258,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;
@@ -1619,9 +1625,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 */
@@ -1917,7 +1923,9 @@ static int ui_run(struct cfdisk *cf)
{
int rc = 0;
- DBG(UI, ul_debug("start COLS=%d, LINES=%d", COLS, LINES));
+ ui_lines = LINES;
+ ui_cols = COLS;
+ DBG(UI, ul_debug("start cols=%zu, lines=%zu", ui_cols, ui_lines));
if (!fdisk_has_label(cf->cxt) || cf->zero_start) {
rc = ui_create_label(cf);