File util-linux-cal-no-terminal.patch of Package util-linux.openSUSE_13.1_Update
From 2a4b073e8b2d34dfadd8306f7d71957687923bdd Mon Sep 17 00:00:00 2001
From: Karel Zak <kzak@redhat.com>
Date: Thu, 12 Mar 2015 11:50:07 +0100
Subject: [PATCH] cal: care about setuprterm() result
References: https://bugzilla.suse.com/show_bug.cgi?id=903440
Signed-off-by: Karel Zak <kzak@redhat.com>
---
misc-utils/cal.c | 59 ++++++++++++++++++++++++++++++++++++--------------------
1 file changed, 38 insertions(+), 21 deletions(-)
Index: misc-utils/cal.c
===================================================================
--- misc-utils/cal.c.orig 2013-07-30 10:39:26.227738447 +0200
+++ misc-utils/cal.c 2015-03-12 14:14:11.716437373 +0100
@@ -72,6 +72,8 @@
#include "mbsalign.h"
#include "strutils.h"
+static int has_term = 0;
+
#if defined(HAVE_LIBNCURSES) || defined(HAVE_LIBNCURSESW)
#ifdef HAVE_NCURSES_H
@@ -82,19 +84,27 @@
#include <term.h> /* include after <curses.h> */
-static void
-my_setupterm(const char *term, int fildes, int *errret) {
- setupterm((char*)term, fildes, errret);
+static int
+setup_terminal(const char *term) {
+ int ret;
+ if (setupterm((char*)term, STDOUT_FILENO, &ret) != OK || ret != 1)
+ return -1;
+ return 0;
}
static void
my_putstring(char *s) {
- putp(s);
+ if (has_term)
+ putp(s);
+ else
+ fputs(s, stdout);
}
static const char *
my_tgetstr(char *s __attribute__ ((__unused__)), char *ss) {
- const char* ret = tigetstr(ss);
+ const char* ret = NULL;
+ if (has_term)
+ ret = tigetstr(ss);
if (!ret || ret==(char*)-1)
return "";
else
@@ -109,19 +119,26 @@
char tcbuffer[4096];
char *strbuf = termbuffer;
-static void
-my_setupterm(const char *term, int fildes, int *errret) {
- *errret = tgetent(tcbuffer, term);
+static int
+setup_terminal(const char *term) {
+ if (tgetent(tcbuffer, term) < 0)
+ return -1;
+ return 0;
}
static void
my_putstring(char *s) {
- tputs (s, 1, putchar);
+ if (has_term)
+ tputs (s, 1, putchar);
+ else
+ fputs(s, stdout);
}
static const char *
my_tgetstr(char *s, char *ss __attribute__ ((__unused__))) {
- const char* ret = tgetstr(s, &strbuf);
+ const char* ret = NULL;
+ if (has_term)
+ ret = tgetstr(s, &strbuf);
if (!ret)
return "";
else
@@ -138,7 +155,6 @@
#endif
-const char *term="";
const char *Senter="", *Sexit="";/* enter and exit standout mode */
int Slen; /* strlen of Senter+Sexit */
char *Hrow; /* pointer to highlighted row in month */
@@ -282,13 +298,15 @@
atexit(close_stdout);
#if defined(HAVE_LIBNCURSES) || defined(HAVE_LIBNCURSESW) || defined(HAVE_LIBTERMCAP)
- if ((term = getenv("TERM"))) {
- int ret;
- my_setupterm(term, 1, &ret);
- if (ret > 0) {
- Senter = my_tgetstr("so","smso");
- Sexit = my_tgetstr("se","rmso");
- Slen = strlen(Senter) + strlen(Sexit);
+ {
+ char *term = getenv("TERM");
+ if (term) {
+ has_term = setup_terminal(term) == 0;
+ if (has_term) {
+ Senter = my_tgetstr("so","smso");
+ Sexit = my_tgetstr("se","rmso");
+ Slen = strlen(Senter) + strlen(Sexit);
+ }
}
}
#endif