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
openSUSE Build Service is sponsored by