aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorNatanael Copa <ncopa@alpinelinux.org>2018-10-30 10:05:49 +0000
committerNatanael Copa <ncopa@alpinelinux.org>2018-11-07 16:46:10 +0000
commitdc40601472596cd3c5f186c979a76140c5a6a42d (patch)
tree411bf7ac047431068922d0fb465c30da7804ac07
parentdbd6f593cab65c828a4b965f2c8c118a3183319b (diff)
downloadaports-dc40601472596cd3c5f186c979a76140c5a6a42d.tar.bz2
aports-dc40601472596cd3c5f186c979a76140c5a6a42d.tar.xz
main/snownews: rebuild against openssl 1.1
-rw-r--r--main/snownews/APKBUILD11
-rw-r--r--main/snownews/openssl-1.1.patch1674
2 files changed, 1681 insertions, 4 deletions
diff --git a/main/snownews/APKBUILD b/main/snownews/APKBUILD
index c1ef803803..65814340f7 100644
--- a/main/snownews/APKBUILD
+++ b/main/snownews/APKBUILD
@@ -2,18 +2,20 @@
# Maintainer: ScrumpyJack <scrumpyjack@st.ilet.to>
pkgname=snownews
pkgver=1.5.12
-pkgrel=7
+pkgrel=8
pkgdesc="Snownews is a text mode RSS/RDF newsreader"
url="https://kiza.eu/software/snownews/"
arch="all"
license="GPL"
depends="ncurses"
-depends_dev="libintl libressl-dev perl ncurses-dev libxml2-dev readline-dev gettext-dev"
+depends_dev="libintl openssl-dev perl ncurses-dev libxml2-dev readline-dev gettext-dev"
makedepends="$depends_dev"
install=""
subpackages="$pkgname-lang $pkgname-doc"
source="https://kiza.eu/media/software/snownews/${pkgname}-${pkgver}.tar.gz
- configure.patch"
+ configure.patch
+ openssl-1.1.patch
+ "
builddir="$srcdir/$pkgname-$pkgver"
@@ -29,4 +31,5 @@ package() {
}
sha512sums="7a7ccd5ea57f8bbb73f1429ab931a38203e858c74a383c5347e66088b84f6a7240feeee99e179687ce0a7a89c6c1406ce20d6c5d6771d25a0a0301fa5526e220 snownews-1.5.12.tar.gz
-d7ed00a401c1963a5619b0b221ae354e5a8a8423f75313e906f43b5a64c099fac8239d7eb1a34d47c284e96b9ad2965f1ecdad58fb28101f7397143847a5e230 configure.patch"
+d7ed00a401c1963a5619b0b221ae354e5a8a8423f75313e906f43b5a64c099fac8239d7eb1a34d47c284e96b9ad2965f1ecdad58fb28101f7397143847a5e230 configure.patch
+4e5e2b6d2859ed68ced43df31463c1d6a4d817c4cafcf3889cdaed6b744f2d3d061a53395b6e3c72889afefa71371d8e26e777110d6fe9ea3875e1a5e2af4c77 openssl-1.1.patch"
diff --git a/main/snownews/openssl-1.1.patch b/main/snownews/openssl-1.1.patch
new file mode 100644
index 0000000000..c0fb5e86ce
--- /dev/null
+++ b/main/snownews/openssl-1.1.patch
@@ -0,0 +1,1674 @@
+From cff110ac98012042c58694169d5722eb55f60635 Mon Sep 17 00:00:00 2001
+From: Mike Sharov <msharov@users.sourceforge.net>
+Date: Wed, 25 Apr 2018 11:17:06 -0400
+Subject: [PATCH] Make it compile cleanly Fix openssl MD5 hash
+ calculations; context struct is private and must be created
+ with helper functions. Add -Wextra to compile flags and fix all
+ warnings.
+
+---
+ about.c | 125 +++++++++++++-------------
+ configure | 2 +-
+ conversions.c | 222 ++++++++++++++++++++++-------------------------
+ conversions.h | 4 +-
+ digcalc.c | 189 ++++++++++++++--------------------------
+ digcalc.h | 39 +++------
+ interface.c | 2 +-
+ main.c | 10 +--
+ netio.c | 2 +-
+ os-support.c | 26 ++----
+ os-support.h | 6 +-
+ ui-support.c | 2 +-
+ updatecheck.c | 2 -
+ xmlparse.c | 8 +-
+ zlib_interface.c | 41 ++++-----
+ zlib_interface.h | 2 -
+ 16 files changed, 284 insertions(+), 398 deletions(-)
+
+diff --git a/about.c b/about.c
+index 2bff040..753e7db 100644
+--- a/about.c
++++ b/about.c
+@@ -117,15 +117,15 @@ void Snowfall (int christmastree) {
+ int wind = 1; /* 1: wind active, 0: inactive
+ set to 1 here so the first loop run clears it. */
+ int newflake = 0; /* Time until a new flake appears. */
+-
++
+ /* Set ncurses halfdelay mode. */
+ halfdelay (3);
+-
++
+ /* White snowflakes! */
+ /* Doesn't work on white terminal background... obviously.
+ attron (COLOR_PAIR(16));
+ attron (WA_BOLD); */
+-
++
+ while (1) {
+ /* Set up the storm. */
+ if (windtimer == 0) {
+@@ -161,7 +161,7 @@ void Snowfall (int christmastree) {
+ new->oldchar = new->oldchar2 = ' ';
+ new->vspeed = 1+(float)rand() / (float)RAND_MAX * 2;
+ new->hspeed = (1+(float)rand() / (float)RAND_MAX * 7)-4;
+-
++
+ /* Add our new snowflake to the pointer chain. */
+ new->next = NULL;
+ if (first == NULL) {
+@@ -173,7 +173,7 @@ void Snowfall (int christmastree) {
+ new->prev = new->prev->next;
+ new->prev->next = new;
+ }
+-
++
+ /* Set new counter until next snowflake. */
+ newflake = 1+(float)rand() / (float)RAND_MAX * 2;
+ /*
+@@ -181,7 +181,7 @@ void Snowfall (int christmastree) {
+ mvprintw (1,1,"New flake in %d rounds.", newflake);
+ */
+ }
+-
++
+ for (cur = first; cur != NULL; cur = curnext) {
+ curnext = cur->next;
+ /* Draw every snowflake at its coordinates to the screen. */
+@@ -204,7 +204,7 @@ void Snowfall (int christmastree) {
+ if ((cur->oldx < 14) && (cur->oldx > 9) && (cur->oldy < 24) && (cur->oldy > 20)) {
+ attroff (COLOR_PAIR(12));
+ }
+-
++
+ if (christmastree)
+ ChristmasTree();
+ }
+@@ -214,7 +214,7 @@ void Snowfall (int christmastree) {
+ }
+ /* Set new hspeed for flake */
+ cur->hspeed = (1+(float)rand() / (float)RAND_MAX * 7)-4;
+-
++
+ /* Advance every flake downwards by a random amount and to
+ the left or right.
+ Check if the next position would obscure a character on the screen
+@@ -223,7 +223,7 @@ void Snowfall (int christmastree) {
+ if (wind)
+ cur->hspeed += windspeed;
+ cur->x += cur->hspeed;
+-
++
+ if (cur->y > LINES) {
+ if (cur == first) {
+ first = first->next;
+@@ -237,7 +237,7 @@ void Snowfall (int christmastree) {
+ free (cur);
+ continue;
+ }
+-
++
+ /* Only draw if we're still inside the window. */
+ if (cur->y <= LINES) {
+ /*
+@@ -254,12 +254,12 @@ void Snowfall (int christmastree) {
+ cur->oldchar = ' ';
+ }
+ }
+-
++
+ windtimer--;
+ newflake--;
+-
++
+ refresh();
+-
++
+ /* Leave loop if anykey(tm) was pressed. */
+ if (getch() != ERR)
+ break;
+@@ -319,7 +319,7 @@ void xmasAbout (void) {
+ mvaddstr (19, 29, "Fernando J. Pereda, Marco Cova");
+ mvaddstr (20, 29, "Cheng-Lung Sung, Dmitry Petukhov");
+ mvaddstr (21, 29, "Douglas Campos");
+-
++
+ Snowfall(1);
+ }
+
+@@ -331,7 +331,7 @@ void SHDrawGun (int gun_pos) {
+ clrtoeol();
+ move (LINES-2, 0);
+ clrtoeol();
+-
++
+ attron (WA_BOLD);
+ mvaddstr (LINES-3, gun_pos-3, "___/\\___");
+ mvaddstr (LINES-2, gun_pos-3, "|######|");
+@@ -350,27 +350,27 @@ void SHDrawScore (int score, int level) {
+ int i, len;
+ char scorestr[16];
+ char levelstr[16];
+-
++
+ attron (WA_REVERSE);
+ for (i = 0; i < COLS; i++) {
+ mvaddch (0, i, ' ');
+ }
+ mvaddstr (0, 1, "Santa Hunta!");
+-
++
+ snprintf (scorestr, sizeof(scorestr), _("Score: %d"), score);
+ len = strlen (scorestr);
+ mvaddstr (0, COLS-1-len, scorestr);
+-
++
+ snprintf (levelstr, sizeof(levelstr), _("Level: %d"), level);
+ len = strlen (levelstr);
+ mvaddstr (0, COLS/2-len/2, levelstr);
+-
++
+ attroff (WA_REVERSE);
+ }
+
+ void SHClearScreen (void) {
+ int i;
+-
++
+ for (i = 0; i < LINES; i++) {
+ move (i, 0);
+ clrtoeol();
+@@ -386,9 +386,9 @@ void SHDrawProjectile (shot shot) {
+ void SHDrawSanta (santa santa) {
+ int len;
+ char *draw_string;
+-
++
+ len = COLS - santa.x;
+-
++
+ if (santa.anim == 0) {
+ if (santa.x < 0) {
+ draw_string = santa.gfx+abs(santa.x);
+@@ -412,7 +412,7 @@ void SHDrawSanta (santa santa) {
+ } else
+ mvaddnstr (santa.y+1, santa.x, santa.altgfx_line2, len);
+ }
+-
++
+ attron (COLOR_PAIR(10));
+ mvaddch (santa.y, santa.x + santa.length - 1, '*');
+ attroff (COLOR_PAIR(10));
+@@ -445,9 +445,9 @@ int SHAddScore (santa santa) {
+
+ void SHDrawHitScore (scoreDisplay score) {
+ int rand_color;
+-
++
+ rand_color = 10 + ((float)rand() / (float)RAND_MAX * 6);
+-
++
+ attron (WA_BOLD);
+ attron (COLOR_PAIR(rand_color));
+ mvprintw (score.y, score.x, "%d", score.score);
+@@ -472,15 +472,15 @@ void printFinalScore (int score) {
+ int y;
+ int divisor;
+ int digit;
+-
++
+ if (score == 0)
+ number_count = 1;
+ else
+ number_count = log10(score) + 1;
+-
+-
++
++
+ pos = COLS/2 - ((number_count * 8) / 2);
+-
++
+ for (i = 0; i < number_count; i++) {
+ y = 12;
+ divisor = pow (10, number_count-1-i);
+@@ -491,30 +491,30 @@ void printFinalScore (int score) {
+ mvaddstr (y, pos + (i * 8), numbers[digit][j]);
+ y++;
+ }
+- }
++ }
+ refresh();
+ }
+
+ void SHFinalScore (int score) {
+ int rand_color;
+
+- attron (WA_BOLD);
++ attron (WA_BOLD);
+ mvaddstr (9, COLS/2-6, "Final score:");
+ refresh();
+ sleep(1);
+-
+-
++
++
+ for (;;) {
+ if (getch() == 'q')
+ break;
+-
++
+ rand_color = 10 + ((float)rand() / (float)RAND_MAX * 6);
+ attron (WA_BOLD);
+ attron (COLOR_PAIR(rand_color));
+ printFinalScore(score);
+ attroff (COLOR_PAIR(rand_color));
+ attroff (WA_BOLD);
+-
++
+ move (LINES-1, COLS-1);
+ refresh();
+ }
+@@ -530,7 +530,6 @@ void santaHunta (void) {
+ int level = 1;
+ struct timeval before;
+ struct timeval after;
+- struct timeval delay;
+ int draw_loop = 0;
+ long draw_delay = 0;
+ shot shot;
+@@ -538,31 +537,27 @@ void santaHunta (void) {
+ int targets = 0;
+ int hitcount = 0;
+ scoreDisplay scoreDisplay;
+-
++
+ shot.fired = 0;
+ shot.x = 0;
+ shot.y = 0;
+-
++
+ scoreDisplay.rounds = 0;
+-
++
+ /* Set ncurses halfdelay mode.
+ * Max resolution is 1/10sec */
+ halfdelay (1);
+-
+- for (;;) {
++
++ for (;;) {
+ gettimeofday (&before, NULL);
+ input = getch();
+ gettimeofday (&after, NULL);
+
+ if (after.tv_sec > before.tv_sec)
+ after.tv_usec += 1000000;
+-
+- delay.tv_sec = 0;
+- delay.tv_usec = abs(100000 - (after.tv_usec - before.tv_usec));
+
+ if (!targets) {
+ newSanta(&santa, level);
+-
+ targets = 1;
+ }
+
+@@ -576,41 +571,41 @@ void santaHunta (void) {
+
+ if (targets)
+ SHDrawSanta(santa);
+-
++
+ if (santa.anim == 0)
+ santa.anim = 1;
+ else
+ santa.anim = 0;
+-
++
+ if (santa.x >= COLS)
+ targets = 0;
+-
++
+ if (shot.fired)
+ SHDrawProjectile(shot);
+-
++
+ if (scoreDisplay.rounds > 0)
+ SHDrawHitScore(scoreDisplay);
+-
++
+ if (SHHit(shot, santa)) {
+ targets = 0;
+ hitcount++;
+ last_score = SHAddScore(santa);
+ score += last_score;
+-
++
+ scoreDisplay.x = shot.x;
+ scoreDisplay.y = shot.y;
+ scoreDisplay.score = last_score;
+ scoreDisplay.rounds = 20;
+ }
+-
++
+ santa.x += santa.speed;
+-
++
+ scoreDisplay.rounds--;
+-
++
+ shot.y--;
+ if (shot.y == 0)
+ shot.fired = 0;
+-
++
+ if (hitcount == 10) {
+ hitcount = 0;
+ level++;
+@@ -618,7 +613,7 @@ void santaHunta (void) {
+ }
+
+ count++;
+-
++
+ if ((input == KEY_RIGHT) || (input == keybindings.next)) {
+ if (gun_pos < COLS-5)
+ gun_pos++;
+@@ -632,7 +627,7 @@ void santaHunta (void) {
+ mvaddstr (LINES-4, gun_pos-2, "\\***/");
+ attroff (COLOR_PAIR(12));
+ attroff (WA_BOLD);
+-
++
+ shot.x = gun_pos;
+ shot.y = LINES-4;
+ shot.fired = 1;
+@@ -641,33 +636,33 @@ void santaHunta (void) {
+ SHFinalScore(score);
+ break;
+ }
+-
++
+ SHDrawGun(gun_pos);
+ SHDrawScore(score, level);
+ SHDrawStatus();
+-
++
+ refresh();
+ }
+-
++
+ /* Leave halfdelay mode. */
+ cbreak();
+ }
+
+ void UIAbout (void) {
+ int xpos;
+-
++
+ clear(); /* Get the crap off the screen to make room
+ for our wonderful ASCII logo. :) */
+
+ xpos = COLS/2 - 40;
+-
++
+ if (COLS < 80) {
+ mvprintw (0, 0, _("Need at least 80 COLS terminal, sorry!"));
+ refresh();
+ getch();
+ return;
+ }
+-
++
+ if (easterEgg()) {
+ santaHunta();
+ } else {
+@@ -679,7 +674,7 @@ void UIAbout (void) {
+ mvaddstr (6, xpos, "/______ / / ___|___/ \\____/ /__|__/ / ___|___/ \\____ \\ /__|__/ /______ /");
+ mvaddstr (7, xpos, " \\/ \\/ \\/ \\/ \\/");
+ mvprintw (9, COLS/2-(strlen("Version")+strlen(VERSION)+1)/2, "Version %s", VERSION);
+-
++
+ mvaddstr (11, COLS/2-(strlen(_("Brought to you by:")))/2, _("Brought to you by:"));
+ mvaddstr (13, COLS/2-(strlen(_("Main code")))/2, _("Main code"));
+ mvaddstr (14, COLS/2-6, "Oliver Feiler");
+@@ -690,7 +685,7 @@ void UIAbout (void) {
+ mvaddstr (21, COLS/2-32, "Fernando J. Pereda, Marco Cova, Cheng-Lung Sung, Dmitry Petukhov");
+ mvaddstr (22, COLS/2-26, "Douglas Campos, Ray Iwata, Piotr Ozarowski, Yang Huan");
+ mvaddstr (23, COLS/2-15, "Ihar Hrachyshka, Mats Berglund");
+-
++
+ refresh();
+ getch();
+ }
+diff --git a/conversions.c b/conversions.c
+index a6155a1..b17348a 100644
+--- a/conversions.c
++++ b/conversions.c
+@@ -1,6 +1,6 @@
+ /* Snownews - A lightweight console RSS newsreader
+ * $Id: conversions.c 1173 2006-10-14 21:41:42Z kiza $
+- *
++ *
+ * Copyright 2003-2009 Oliver Feiler <kiza@kcore.de> and
+ * Rene Puls <rpuls@gmx.net>
+ *
+@@ -20,8 +20,9 @@
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ *
+ */
+-
+-#include <sys/types.h>
++
++#define _GNU_SOURCE
++#include <sys/types.h>
+ #include <string.h>
+ #include <iconv.h>
+ #include <stdio.h>
+@@ -29,22 +30,12 @@
+ #include <string.h>
+ #include <unistd.h>
+ #include <errno.h>
++#include <time.h>
+ #include <libxml/HTMLparser.h>
+ #include <langinfo.h>
+ #include <openssl/evp.h>
+-
++#include <openssl/md5.h>
+ #include "os-support.h"
+-
+-/* I have no idea what needs to be defined to get strptime() on glibc.
+- * This is stolen from somewhere else and it works for me(tm).
+- * If you know how it's supposed to work, tell me. Manpage says
+- * define _XOPEN_SOURCE for glibc2, but that doesn't work. */
+-#define _XOPEN_SOURCE 500 /* Needed for glibc2 strptime(). What's the 500 for? */
+-#define __USE_XOPEN
+-#include <time.h>
+-#undef __USE_XOPEN
+-#undef _XOPEN_SOURCE
+-
+ #include "conversions.h"
+ #include "config.h"
+ #include "interface.h"
+@@ -57,7 +48,7 @@ extern struct entity *first_entity;
+
+ extern char *forced_target_charset;
+
+-int calcAgeInDays (struct tm * t);
++static int calcAgeInDays (const struct tm* t);
+
+ #ifdef STATIC_CONST_ICONV
+ char * iconvert (const char * inbuf) {
+@@ -72,11 +63,11 @@ char * iconvert (char * inbuf) {
+
+ /*(void)strlcpy(target_charset, nl_langinfo(CODESET), sizeof(target_charset));*/
+ strncpy(target_charset, nl_langinfo(CODESET), sizeof(target_charset));
+-
++
+ /* Take a shortcut. */
+ if (strcasecmp (target_charset, "UTF-8") == 0)
+ return strdup(inbuf);
+-
++
+ inbytesleft = strlen(inbuf);
+ outbytesleft = strlen(inbuf);
+
+@@ -92,20 +83,20 @@ char * iconvert (char * inbuf) {
+ if (cd == (iconv_t) -1) {
+ return NULL;
+ }
+-
++
+ outbuf = malloc (outbytesleft+1);
+ outbuf_first = outbuf;
+
+- if (iconv (cd, &inbuf, &inbytesleft, &outbuf, &outbytesleft) == -1) {
++ if (iconv (cd, &inbuf, &inbytesleft, &outbuf, &outbytesleft) == (size_t)-1) {
+ free(outbuf_first);
+ iconv_close(cd);
+ return NULL;
+ }
+
+ *outbuf = 0;
+-
++
+ iconv_close (cd);
+-
++
+ return outbuf_first;
+ }
+
+@@ -135,18 +126,18 @@ char * UIDejunk (char * feed_description) {
+ unsigned long ch; /* Decoded numeric entity */
+ #endif
+ const htmlEntityDesc *ep; /* For looking up HTML entities */
+-
++
+ /* Gracefully handle passed NULL ptr. */
+ if (feed_description == NULL) {
+ newtext = strdup("(null)");
+ return newtext;
+ }
+-
++
+ /* Make a copy and point *start to it so we can free the stuff again! */
+ text = strdup (feed_description);
+ start = text;
+-
+-
++
++
+ /* If text begins with a tag, discard all of them. */
+ while (1) {
+ if (text[0] == '<') {
+@@ -162,14 +153,14 @@ char * UIDejunk (char * feed_description) {
+ }
+ newtext = malloc (1);
+ newtext[0] = '\0';
+-
++
+ while (1) {
+ /* Strip tags... tagsoup mode. */
+ /* strsep puts everything before "<" into detagged. */
+ detagged = strsep (&text, "<");
+ if (detagged == NULL)
+ break;
+-
++
+ /* Replace <p> and <br> (in all incarnations) with newlines, but only
+ if there isn't already a following newline. */
+ if (text != NULL) {
+@@ -188,12 +179,12 @@ char * UIDejunk (char * feed_description) {
+
+ /* Now append detagged to newtext. */
+ strcat (newtext, detagged);
+-
++
+ /* Advance *text to next position after the closed tag. */
+ htmltag = strsep (&text, ">");
+ if (htmltag == NULL)
+ break;
+-
++
+ if (s_strcasestr(htmltag, "img src") != NULL) {
+ /* attribute = s_strcasestr(htmltag, "alt=");
+ if (attribute == NULL)
+@@ -216,25 +207,25 @@ char * UIDejunk (char * feed_description) {
+ }*/
+ }
+ free (start);
+-
++
+ CleanupString (newtext, 0);
+-
++
+ /* See if there are any entities in the string at all. */
+ if (strchr(newtext, '&') != NULL) {
+ text = strdup (newtext);
+ start = text;
+ free (newtext);
+-
++
+ newtext = malloc (1);
+ newtext[0] = '\0';
+-
++
+ while (1) {
+ /* Strip HTML entities. */
+ detagged = strsep (&text, "&");
+ if (detagged == NULL)
+ break;
+-
+- if (detagged != '\0') {
++
++ if (*detagged) {
+ newtext = realloc (newtext, strlen(newtext)+strlen(detagged)+1);
+ strcat (newtext, detagged);
+ }
+@@ -260,29 +251,29 @@ char * UIDejunk (char * feed_description) {
+ strcat (newtext, "'");
+ continue;
+ }
+-
++
+ /* Decode user defined entities. */
+ found = 0;
+ for (cur_entity = first_entity; cur_entity != NULL; cur_entity = cur_entity->next_ptr) {
+ if (strcmp (entity, cur_entity->entity) == 0) {
+ /* We have found a matching entity. */
+-
++
+ /* If entity_length is more than 1 char we need to realloc
+ more space in newtext. */
+ if (cur_entity->entity_length > 1)
+ newtext = realloc (newtext, strlen(newtext)+cur_entity->entity_length+1);
+-
++
+ /* Append new entity. */
+ strcat (newtext, cur_entity->converted_entity);
+-
++
+ /* Set found flag. */
+ found = 1;
+-
++
+ /* We can now leave the for loop. */
+ break;
+ }
+ }
+-
++
+ /* Try to parse some standard entities. */
+ if (!found) {
+ /* See if it was a numeric entity. */
+@@ -330,7 +321,7 @@ char * UIDejunk (char * feed_description) {
+ break;
+ }
+ free (start);
+- }
++ }
+ return newtext;
+ }
+
+@@ -340,7 +331,7 @@ char * UIDejunk (char * feed_description) {
+ * the 4th version which corrupted some random memory unfortunately...
+ * but this one works. Heureka!
+ */
+-char * WrapText (char * text, int width) {
++char* WrapText (const char* text, unsigned width) {
+ char *newtext;
+ char *textblob; /* Working copy of text. */
+ char *chapter;
+@@ -352,14 +343,14 @@ char * WrapText (char * text, int width) {
+ char *p;
+ int lena, lenb;
+ */
+-
++
+ textblob = strdup (text);
+ start = textblob;
+-
++
+
+ line = malloc (1);
+ line[0] = '\0';
+-
++
+ newtext = malloc(1);
+ memset (newtext, 0, 1);
+
+@@ -371,14 +362,14 @@ char * WrapText (char * text, int width) {
+ while (1) {
+ savepos = chapter;
+ chunk = strsep (&chapter, " ");
+-
++
+ /* Last chunk. */
+ if (chunk == NULL) {
+ if (line != NULL) {
+ newtext = realloc (newtext, strlen(newtext)+strlen(line)+2);
+ strcat (newtext, line);
+ strcat (newtext, "\n");
+-
++
+ /* Faster replacement with memcpy.
+ * Overkill, overcomplicated and smelling of bugs all over.
+ */
+@@ -393,22 +384,22 @@ char * WrapText (char * text, int width) {
+ p++;
+ *p=0;
+ */
+-
++
+ line[0] = '\0';
+ }
+ break;
+ }
+-
++
+ if (strlen(chunk) > width) {
+ /* First copy remaining stuff in line to newtext. */
+ newtext = realloc (newtext, strlen(newtext)+strlen(line)+2);
+ strcat (newtext, line);
+ strcat (newtext, "\n");
+-
++
+ free (line);
+ line = malloc (1);
+ line[0] = '\0';
+-
++
+ /* Then copy chunk with max length of line to newtext. */
+ line = realloc (line, width+1);
+ strncat (line, chunk, width-5);
+@@ -442,10 +433,10 @@ char * WrapText (char * text, int width) {
+ }
+ }
+ }
+-
+- free (line);
+- free (start);
+-
++
++ free (line);
++ free (start);
++
+ return newtext;
+ }
+
+@@ -458,14 +449,14 @@ char *base64encode(char const *inbuf, unsigned int inbuf_size) {
+ unsigned int outbuf_size = 0;
+ int bits = 0;
+ int char_count = 0;
+-
++
+ outbuf = malloc(1);
+-
++
+ while (inbuf_pos < inbuf_size) {
+-
++
+ bits |= *inbuf;
+ char_count++;
+-
++
+ if (char_count == 3) {
+ outbuf = realloc(outbuf, outbuf_size+4);
+ outbuf_size += 4;
+@@ -477,12 +468,12 @@ char *base64encode(char const *inbuf, unsigned int inbuf_size) {
+ bits = 0;
+ char_count = 0;
+ }
+-
++
+ inbuf++;
+ inbuf_pos++;
+ bits <<= 8;
+ }
+-
++
+ if (char_count > 0) {
+ bits <<= 16 - (8 * char_count);
+ outbuf = realloc(outbuf, outbuf_size+4);
+@@ -498,10 +489,10 @@ char *base64encode(char const *inbuf, unsigned int inbuf_size) {
+ }
+ outbuf_pos += 4;
+ }
+-
++
+ outbuf = realloc(outbuf, outbuf_size+1);
+ outbuf[outbuf_pos] = 0;
+-
++
+ return outbuf;
+ }
+
+@@ -531,7 +522,7 @@ char* decodechunked(char * chunked, unsigned int *inputlen) {
+ }
+ *dest = '\0';
+ *inputlen = dest - chunked;
+-
++
+ return chunked;
+ }
+ #endif
+@@ -543,13 +534,13 @@ char* decodechunked(char * chunked, unsigned int *inputlen) {
+ */
+ void CleanupString (char * string, int tidyness) {
+ int len, i;
+-
++
+ /* If we are passed a NULL pointer, leave it alone and return. */
+ if (string == NULL)
+ return;
+-
++
+ len = strlen(string);
+-
++
+ while ((string[0] == '\n' || string [0] == ' ' || string [0] == '\t') &&
+ (len > 0)) {
+ /* len=strlen(string) does not include \0 of string.
+@@ -558,13 +549,13 @@ void CleanupString (char * string, int tidyness) {
+ memmove (string, string+1, len);
+ len--;
+ }
+-
++
+ /* Remove trailing spaces. */
+ while ((len > 1) && (string[len-1] == ' ')) {
+ string[len-1] = 0;
+ len--;
+ }
+-
++
+ len = strlen(string);
+ /* Eat newlines and tabs along the whole string. */
+ for (i = 0; i < len; i++) {
+@@ -574,18 +565,18 @@ void CleanupString (char * string, int tidyness) {
+ if (tidyness == 1 && string[i] == '\n') {
+ string[i] = ' ';
+ }
+- }
++ }
+ }
+
+ /* http://foo.bar/address.rdf -> http:__foo.bar_address.rdf */
+ char * Hashify (const char * url) {
+ int i, len;
+ char *hashed_url;
+-
++
+ hashed_url = strdup(url);
+-
++
+ len = strlen(hashed_url);
+-
++
+ /* Don't allow filenames > 128 chars for teeny weeny
+ * operating systems.
+ */
+@@ -593,7 +584,7 @@ char * Hashify (const char * url) {
+ len = 128;
+ hashed_url[128] = '\0';
+ }
+-
++
+ for (i = 0; i < len; i++) {
+ if (((hashed_url[i] < 32) || (hashed_url[i] > 38)) &&
+ ((hashed_url[i] < 43) || (hashed_url[i] > 46)) &&
+@@ -601,7 +592,7 @@ char * Hashify (const char * url) {
+ ((hashed_url[i] < 97) || (hashed_url[i] > 122)) &&
+ (hashed_url[i] != 0))
+ hashed_url[i] = '_';
+-
++
+ /* Cygwin doesn't seem to like anything besides a-z0-9 in filenames.
+ Zap'em! */
+ #ifdef __CYGWIN__
+@@ -612,31 +603,26 @@ char * Hashify (const char * url) {
+ hashed_url[i] = '_';
+ #endif
+ }
+-
++
+ return hashed_url;
+ }
+
+-char * genItemHash (char ** hashitems, int items) {
+- int i;
+- EVP_MD_CTX mdctx;
+- unsigned char md_value[EVP_MAX_MD_SIZE];
+- unsigned int md_len;
+- char md5_hex[33];
+-
+- EVP_DigestInit(&mdctx, EVP_md5());
+-
+- for (i = 0; i < items; i++) {
+- if (hashitems[i] != NULL)
+- EVP_DigestUpdate(&mdctx, hashitems[i], (size_t) strlen(hashitems[i]));
+- }
+-
+- EVP_DigestFinal_ex(&mdctx, md_value, &md_len);
+- EVP_MD_CTX_cleanup(&mdctx);
+-
+- for (i = 0; i < md_len; i++) {
+- sprintf(&md5_hex[2*i], "%02x", md_value[i]);
+- }
+-
++char * genItemHash (const char* const* hashitems, int items) {
++ EVP_MD_CTX* mdctx = EVP_MD_CTX_new();
++ EVP_DigestInit(mdctx, EVP_md5());
++
++ for (int i = 0; i < items; ++i)
++ if (hashitems[i])
++ EVP_DigestUpdate (mdctx, hashitems[i], strlen(hashitems[i]));
++
++ unsigned char md_value [EVP_MAX_MD_SIZE];
++ unsigned md_len = 0;
++ EVP_DigestFinal_ex (mdctx, md_value, &md_len);
++ EVP_MD_CTX_free (mdctx);
++
++ char md5_hex [MD5_DIGEST_LENGTH*2+1];
++ for (unsigned i = 0; i < md_len; ++i)
++ sprintf (&md5_hex[2*i], "%02x", md_value[i]);
+ return strdup(md5_hex);
+ }
+
+@@ -646,14 +632,14 @@ int ISODateToUnix (char const * const ISODate) {
+ struct tm *t;
+ time_t tt = 0;
+ int time_unix = 0;
+-
++
+ /* Do not crash with an empty tag */
+ if (ISODate == NULL)
+ return 0;
+-
++
+ t = malloc(sizeof(struct tm));
+ gmtime_r(&tt, t);
+-
++
+ /* OpenBSD does not know %F == %Y-%m-%d
+ * <insert inflamatory comment here> */
+ if (strptime(ISODate, "%Y-%m-%dT%T", t)) {
+@@ -669,7 +655,7 @@ int ISODateToUnix (char const * const ISODate) {
+ time_unix = timegm(t);
+ #endif
+ }
+-
++
+ free (t);
+ return time_unix;
+ }
+@@ -680,17 +666,17 @@ int pubDateToUnix (char const * const pubDate) {
+ time_t tt = 0;
+ int time_unix = 0;
+ char *oldlocale;
+-
++
+ /* Do not crash with an empty Tag */
+ if (pubDate == NULL)
+ return 0;
+-
++
+ start_here = pubDate;
+ start_here += 5;
+-
++
+ t = malloc(sizeof(struct tm));
+ gmtime_r(&tt, t);
+-
++
+ #ifdef LOCALEPATH
+ /* Cruft!
+ * Save old locale so we can parse the stupid pubDate format.
+@@ -708,7 +694,7 @@ int pubDateToUnix (char const * const pubDate) {
+ setlocale(LC_TIME, "C");
+ }
+ #endif
+-
++
+ if (strptime(start_here, "%d %b %Y %T", t)) {
+ #ifdef __CYGWIN__
+ time_unix = mktime(t);
+@@ -723,7 +709,7 @@ int pubDateToUnix (char const * const pubDate) {
+ free (oldlocale);
+ }
+ #endif
+-
++
+ free (t);
+ return time_unix;
+ }
+@@ -736,21 +722,21 @@ char * unixToPostDateString (int unixDate) {
+ int strfstr_len = 32;
+ char tmpstr[32];
+ int age;
+-
++
+ time_str = malloc(len);
+ time_strfstr = malloc(strfstr_len);
+-
++
+ unix_t = unixDate;
+ gmtime_r(&unix_t, &t);
+-
++
+ age = calcAgeInDays(&t);
+-
++
+ strftime(time_strfstr, strfstr_len, _(", %H:%M"), &t);
+ strcpy(time_str, _("Posted "));
+ len -= strlen(_("Posted "));
+ if (len <= 0)
+ return NULL;
+-
++
+ if (age == 0) {
+ strncat(time_str, _("today"), len-1);
+ len -= strlen(_("today"));
+@@ -796,15 +782,13 @@ char * unixToPostDateString (int unixDate) {
+ strncat(time_str, time_strfstr, len-1);
+ }
+ free (time_strfstr);
+-
++
+ return time_str;
+ }
+
+-int calcAgeInDays (struct tm * t) {
+- time_t unix_t;
++static int calcAgeInDays (const struct tm* t) {
++ time_t unix_t = time(NULL);
+ struct tm current_t;
+-
+- unix_t = time(NULL);
+ gmtime_r(&unix_t, &current_t);
+
+ /* (((current year - passed year) * 365) + current year day) - passed year day */
+diff --git a/conversions.h b/conversions.h
+index 6816df4..148becc 100644
+--- a/conversions.h
++++ b/conversions.h
+@@ -30,11 +30,11 @@ char * iconvert (const char * inbuf);
+ char * iconvert (char * inbuf);
+ #endif
+ char * UIDejunk (char * feed_description);
+-char * WrapText (char * text, int width);
++char* WrapText (const char* text, unsigned width);
+ char *base64encode(char const *inbuf, unsigned int inbuf_size);
+ void CleanupString (char * string, int tidyness);
+ char * Hashify (const char * url);
+-char * genItemHash (char ** hashitems, int items);
++char* genItemHash (const char* const* hashitems, int items);
+ int ISODateToUnix (char const * const ISODate);
+ int pubDateToUnix (char const * const pubDate);
+ char * unixToPostDateString (int unixDate);
+diff --git a/digcalc.c b/digcalc.c
+index fef39a2..7a99b26 100644
+--- a/digcalc.c
++++ b/digcalc.c
+@@ -15,144 +15,87 @@
+ #include "digcalc.h"
+ #include <openssl/evp.h>
+
+-
+ /* calculate H(A1) as per spec */
+-void DigestCalcHA1(
+- IN char * pszAlg,
+- IN char * pszUserName,
+- IN char * pszRealm,
+- IN char * pszPassword,
+- IN char * pszNonce,
+- IN char * pszCNonce,
+- OUT HASHHEX SessionKey
+- )
++void DigestCalcHA1 (const char* pszAlg, const char* pszUserName, const char* pszRealm,
++ const char* pszPassword, const char* pszNonce, const char* pszCNonce,
++ HASHHEX SessionKey)
+ {
+- EVP_MD_CTX mdctx;
+- unsigned char md_value[EVP_MAX_MD_SIZE];
+- unsigned int md_len;
+- int i;
+- HASH HA1;
+-
+- EVP_DigestInit(&mdctx, EVP_md5());
+- EVP_DigestUpdate(&mdctx, pszUserName, strlen(pszUserName));
+- EVP_DigestUpdate(&mdctx, ":", 1);
+- EVP_DigestUpdate(&mdctx, pszRealm, strlen(pszRealm));
+- EVP_DigestUpdate(&mdctx, ":", 1);
+- EVP_DigestUpdate(&mdctx, pszPassword, strlen(pszPassword));
+- EVP_DigestFinal_ex(&mdctx, md_value, &md_len);
+- EVP_MD_CTX_cleanup(&mdctx);
+-
++ EVP_MD_CTX* mdctx = EVP_MD_CTX_new();
++ EVP_DigestInit (mdctx, EVP_md5());
++ EVP_DigestUpdate (mdctx, pszUserName, strlen(pszUserName));
++ EVP_DigestUpdate (mdctx, ":", 1);
++ EVP_DigestUpdate (mdctx, pszRealm, strlen(pszRealm));
++ EVP_DigestUpdate (mdctx, ":", 1);
++ EVP_DigestUpdate (mdctx, pszPassword, strlen(pszPassword));
++ unsigned char md_value [EVP_MAX_MD_SIZE];
++ unsigned md_len;
++ EVP_DigestFinal_ex (mdctx, md_value, &md_len);
++
+ if (strcmp(pszAlg, "md5-sess") == 0) {
+- EVP_DigestInit(&mdctx, EVP_md5());
+- EVP_DigestUpdate(&mdctx, HA1, HASHLEN);
+- EVP_DigestUpdate(&mdctx, ":", 1);
+- EVP_DigestUpdate(&mdctx, pszNonce, strlen(pszNonce));
+- EVP_DigestUpdate(&mdctx, ":", 1);
+- EVP_DigestUpdate(&mdctx, pszCNonce, strlen(pszCNonce));
+- EVP_DigestFinal_ex(&mdctx, md_value, &md_len);
+- EVP_MD_CTX_cleanup(&mdctx);
+- };
+-
+- for (i = 0; i < md_len; i++) {
+- sprintf(&SessionKey[2*i], "%02x", md_value[i]);
++ EVP_DigestInit (mdctx, EVP_md5());
++ HASH HA1;
++ EVP_DigestUpdate (mdctx, HA1, HASHLEN);
++ EVP_DigestUpdate (mdctx, ":", 1);
++ EVP_DigestUpdate (mdctx, pszNonce, strlen(pszNonce));
++ EVP_DigestUpdate (mdctx, ":", 1);
++ EVP_DigestUpdate (mdctx, pszCNonce, strlen(pszCNonce));
++ EVP_DigestFinal_ex (mdctx, md_value, &md_len);
+ }
++ EVP_MD_CTX_free (mdctx);
++
++ for (unsigned i = 0; i < md_len; ++i)
++ sprintf (&SessionKey[2*i], "%02x", md_value[i]);
+ };
+
+ /* calculate request-digest/response-digest as per HTTP Digest spec */
+ void DigestCalcResponse(
+- IN HASHHEX HA1, /* H(A1) */
+- IN char * pszNonce, /* nonce from server */
+- IN char * pszNonceCount, /* 8 hex digits */
+- IN char * pszCNonce, /* client nonce */
+- IN char * pszQop, /* qop-value: "", "auth", "auth-int" */
+- IN char * pszMethod, /* method from the request */
+- IN char * pszDigestUri, /* requested URL */
+- IN HASHHEX HEntity, /* H(entity body) if qop="auth-int" */
+- OUT HASHHEX Response /* request-digest or response-digest */
++ const HASHHEX HA1, /* H(A1) */
++ const char* pszNonce, /* nonce from server */
++ const char* pszNonceCount, /* 8 hex digits */
++ const char* pszCNonce, /* client nonce */
++ const char* pszQop, /* qop-value: "", "auth", "auth-int" */
++ const char* pszMethod, /* method from the request */
++ const char* pszDigestUri, /* requested URL */
++ const HASHHEX HEntity, /* H(entity body) if qop="auth-int" */
++ HASHHEX Response /* request-digest or response-digest */
+ )
+ {
+- EVP_MD_CTX mdctx;
+- HASHHEX HA2Hex;
+- unsigned char md_value[EVP_MAX_MD_SIZE];
+- unsigned int md_len;
+- int i;
+-
+ /* calculate H(A2) */
+- EVP_DigestInit(&mdctx, EVP_md5());
+- EVP_DigestUpdate(&mdctx, pszMethod, strlen(pszMethod));
+- EVP_DigestUpdate(&mdctx, ":", 1);
+- EVP_DigestUpdate(&mdctx, pszDigestUri, strlen(pszDigestUri));
++ EVP_MD_CTX* mdctx = EVP_MD_CTX_new();
++ EVP_DigestInit (mdctx, EVP_md5());
++ EVP_DigestUpdate (mdctx, pszMethod, strlen(pszMethod));
++ EVP_DigestUpdate (mdctx, ":", 1);
++ EVP_DigestUpdate (mdctx, pszDigestUri, strlen(pszDigestUri));
+ if (strcmp(pszQop, "auth-int") == 0) {
+- EVP_DigestUpdate(&mdctx, ":", 1);
+- EVP_DigestUpdate(&mdctx, HEntity, HASHHEXLEN);
+- };
+- EVP_DigestFinal_ex(&mdctx, md_value, &md_len);
+- EVP_MD_CTX_cleanup(&mdctx);
+-
+- for (i = 0; i < md_len; i++) {
+- sprintf(&HA2Hex[2*i], "%02x", md_value[i]);
++ EVP_DigestUpdate (mdctx, ":", 1);
++ EVP_DigestUpdate (mdctx, HEntity, HASHHEXLEN);
+ }
+-
++ unsigned char md_value [EVP_MAX_MD_SIZE];
++ unsigned md_len = 0;
++ EVP_DigestFinal_ex (mdctx, md_value, &md_len);
++
++ HASHHEX HA2Hex;
++ for (unsigned i = 0; i < md_len; ++i)
++ sprintf (&HA2Hex[2*i], "%02x", md_value[i]);
++
+ /* calculate response */
+- EVP_DigestInit(&mdctx, EVP_md5());
+- EVP_DigestUpdate(&mdctx, HA1, HASHHEXLEN);
+- EVP_DigestUpdate(&mdctx, ":", 1);
+- EVP_DigestUpdate(&mdctx, pszNonce, strlen(pszNonce));
+- EVP_DigestUpdate(&mdctx, ":", 1);
++ EVP_DigestInit (mdctx, EVP_md5());
++ EVP_DigestUpdate (mdctx, HA1, HASHHEXLEN);
++ EVP_DigestUpdate (mdctx, ":", 1);
++ EVP_DigestUpdate (mdctx, pszNonce, strlen(pszNonce));
++ EVP_DigestUpdate (mdctx, ":", 1);
+ if (*pszQop) {
+- EVP_DigestUpdate(&mdctx, pszNonceCount, strlen(pszNonceCount));
+- EVP_DigestUpdate(&mdctx, ":", 1);
+- EVP_DigestUpdate(&mdctx, pszCNonce, strlen(pszCNonce));
+- EVP_DigestUpdate(&mdctx, ":", 1);
+- EVP_DigestUpdate(&mdctx, pszQop, strlen(pszQop));
+- EVP_DigestUpdate(&mdctx, ":", 1);
++ EVP_DigestUpdate (mdctx, pszNonceCount, strlen(pszNonceCount));
++ EVP_DigestUpdate (mdctx, ":", 1);
++ EVP_DigestUpdate (mdctx, pszCNonce, strlen(pszCNonce));
++ EVP_DigestUpdate (mdctx, ":", 1);
++ EVP_DigestUpdate (mdctx, pszQop, strlen(pszQop));
++ EVP_DigestUpdate (mdctx, ":", 1);
+ };
+- EVP_DigestUpdate(&mdctx, HA2Hex, HASHHEXLEN);
+- EVP_DigestFinal_ex(&mdctx, md_value, &md_len);
+- EVP_MD_CTX_cleanup(&mdctx);
+-
+- for (i = 0; i < md_len; i++) {
+- sprintf(&Response[2*i], "%02x", md_value[i]);
+- }
+-
+-#if 0
+- /* This is the old MD5 digest calculator for a reference until I am sure
+- * the new code works for sure */
+- /* *************************** */
+- struct MD5Context Md5Ctx;
+- HASH HA2;
+- HASH RespHash;
+- HASHHEX HA2Hex;
+-
+- /* calculate H(A2) */
+- MD5Init(&Md5Ctx);
+- MD5Update(&Md5Ctx, pszMethod, strlen(pszMethod));
+- MD5Update(&Md5Ctx, ":", 1);
+- MD5Update(&Md5Ctx, pszDigestUri, strlen(pszDigestUri));
+- if (strcmp(pszQop, "auth-int") == 0) {
+- MD5Update(&Md5Ctx, ":", 1);
+- MD5Update(&Md5Ctx, HEntity, HASHHEXLEN);
+- };
+- MD5Final(HA2, &Md5Ctx);
+- CvtHex(HA2, HA2Hex);
+-
+- /* calculate response */
+- MD5Init(&Md5Ctx);
+- MD5Update(&Md5Ctx, HA1, HASHHEXLEN);
+- MD5Update(&Md5Ctx, ":", 1);
+- MD5Update(&Md5Ctx, pszNonce, strlen(pszNonce));
+- MD5Update(&Md5Ctx, ":", 1);
+- if (*pszQop) {
++ EVP_DigestUpdate (mdctx, HA2Hex, HASHHEXLEN);
++ EVP_DigestFinal_ex (mdctx, md_value, &md_len);
++ EVP_MD_CTX_free (mdctx);
+
+- MD5Update(&Md5Ctx, pszNonceCount, strlen(pszNonceCount));
+- MD5Update(&Md5Ctx, ":", 1);
+- MD5Update(&Md5Ctx, pszCNonce, strlen(pszCNonce));
+- MD5Update(&Md5Ctx, ":", 1);
+- MD5Update(&Md5Ctx, pszQop, strlen(pszQop));
+- MD5Update(&Md5Ctx, ":", 1);
+- };
+- MD5Update(&Md5Ctx, HA2Hex, HASHHEXLEN);
+- MD5Final(RespHash, &Md5Ctx);
+- CvtHex(RespHash, Response);
+-#endif
++ for (unsigned i = 0; i < md_len; ++i)
++ sprintf (&Response[2*i], "%02x", md_value[i]);
+ };
+diff --git a/digcalc.h b/digcalc.h
+index e17cdde..86d1cb2 100644
+--- a/digcalc.h
++++ b/digcalc.h
+@@ -18,36 +18,23 @@
+ typedef char HASH[HASHLEN];
+ #define HASHHEXLEN 32
+ typedef char HASHHEX[HASHHEXLEN+1];
+-#define IN
+-#define OUT
+
+ /* calculate H(A1) as per HTTP Digest spec */
+-void DigestCalcHA1(
+- IN char * pszAlg,
+- IN char * pszUserName,
+- IN char * pszRealm,
+- IN char * pszPassword,
+- IN char * pszNonce,
+- IN char * pszCNonce,
+- OUT HASHHEX SessionKey
+- );
++void DigestCalcHA1 (const char* pszAlg, const char* pszUserName, const char* pszRealm,
++ const char* pszPassword, const char* pszNonce, const char* pszCNonce,
++ HASHHEX SessionKey);
+
+ /* calculate request-digest/response-digest as per HTTP Digest spec */
+-void DigestCalcResponse(
+- IN HASHHEX HA1, /* H(A1) */
+- IN char * pszNonce, /* nonce from server */
+- IN char * pszNonceCount, /* 8 hex digits */
+- IN char * pszCNonce, /* client nonce */
+- IN char * pszQop, /* qop-value: "", "auth", "auth-int" */
+- IN char * pszMethod, /* method from the request */
+- IN char * pszDigestUri, /* requested URL */
+- IN HASHHEX HEntity, /* H(entity body) if qop="auth-int" */
+- OUT HASHHEX Response /* request-digest or response-digest */
+- );
+-
+-void CvtHex(
+- IN HASH Bin,
+- OUT HASHHEX Hex
++void DigestCalcResponse (
++ const HASHHEX HA1, /* H(A1) */
++ const char* pszNonce, /* nonce from server */
++ const char* pszNonceCount, /* 8 hex digits */
++ const char* pszCNonce, /* client nonce */
++ const char* pszQop, /* qop-value: "", "auth", "auth-int" */
++ const char* pszMethod, /* method from the request */
++ const char* pszDigestUri, /* requested URL */
++ const HASHHEX HEntity, /* H(entity body) if qop="auth-int" */
++ HASHHEX Response /* request-digest or response-digest */
+ );
+
+ #endif
+diff --git a/interface.c b/interface.c
+index 1fa7a1e..5e798d3 100644
+--- a/interface.c
++++ b/interface.c
+@@ -67,7 +67,7 @@ struct scrolltext {
+ };
+
+ #ifdef SIGWINCH
+-void sig_winch(int p)
++void sig_winch (int p __attribute__((unused)))
+ {
+ resize_dirty = 1;
+ }
+diff --git a/main.c b/main.c
+index c031912..0318178 100644
+--- a/main.c
++++ b/main.c
+@@ -155,15 +155,9 @@ void MainSignalHandler (int sig) {
+ }
+
+ /* Automatic child reaper. */
+-void sigChildHandler (int sig) {
+- int status, child_val;
+-
++static void sigChildHandler (int sig __attribute__((unused))) {
+ /* Wait for any child without blocking */
+- if (waitpid(-1, &status, WNOHANG) < 0)
+- return;
+-
+- if (WIFEXITED(status))
+- child_val = WEXITSTATUS(status);
++ waitpid (-1, NULL, WNOHANG);
+ }
+
+ void printHelp (void) {
+diff --git a/netio.c b/netio.c
+index 5d3bae0..4a08e1e 100644
+--- a/netio.c
++++ b/netio.c
+@@ -129,7 +129,7 @@ int NetPoll (struct feed * cur_ptr, int * my_socket, int rw) {
+ * 0 Connected
+ * -1 Error occured (netio_error is set)
+ */
+-int NetConnect (int * my_socket, char * host, struct feed * cur_ptr, int httpproto, int suppressoutput) {
++int NetConnect (int * my_socket, char * host, struct feed * cur_ptr, int httpproto __attribute__((unused)), int suppressoutput) {
+ char tmp[512];
+ struct sockaddr_in address;
+ struct hostent *remotehost;
+diff --git a/os-support.c b/os-support.c
+index a590a58..8b61f35 100644
+--- a/os-support.c
++++ b/os-support.c
+@@ -39,7 +39,7 @@
+ * The following function was written by François Gouget.
+ */
+ #ifdef SUN
+-char* strsep(char** str, const char* delims)
++char* strsep (char** str, const char* delims)
+ {
+ char* token;
+
+@@ -93,29 +93,21 @@ time_t timegm(struct tm *t)
+ #endif
+
+ /* strcasestr stolen from: http://www.unixpapa.com/incnote/string.html */
+-char *s_strcasestr(char *a, char *b) {
+- size_t l;
++const char* s_strcasestr (const char* a, const char* b) {
++ const size_t lena = strlen(a), lenb = strlen(b);
+ char f[3];
+- int lena = strlen(a);
+- int lenb = strlen(b);
+-
+ snprintf(f, sizeof(f), "%c%c", tolower(*b), toupper(*b));
+- for (l = strcspn(a, f); l != lena; l += strcspn(a + l + 1, f) + 1)
++ for (size_t l = strcspn(a, f); l != lena; l += strcspn(a + l + 1, f) + 1)
+ if (strncasecmp(a + l, b, lenb) == 0)
+- return(a + l);
+- return(NULL);
++ return a + l;
++ return NULL;
+ }
+
+
+ /* Private malloc wrapper. Aborts program execution if malloc fails. */
+-void * s_malloc (size_t size) {
+- void *newmem;
+-
+- newmem = malloc (size);
+-
+- if (newmem == NULL) {
++void* s_malloc (size_t size) {
++ void* newmem = malloc (size);
++ if (!newmem)
+ MainQuit ("Allocating memory", strerror(errno));
+- }
+-
+ return newmem;
+ }
+diff --git a/os-support.h b/os-support.h
+index 3eb1068..d5ef6a1 100644
+--- a/os-support.h
++++ b/os-support.h
+@@ -27,10 +27,10 @@
+ #define OS_SUPPORT_H
+
+ #ifdef SUN
+-char* strsep(char** str, const char* delims);
++char* strsep (char** str, const char* delims);
+ #endif
+
+-char *s_strcasestr(char *a, char *b);
+-void * s_malloc (size_t size);
++const char* s_strcasestr (const char* a, const char* b);
++void* s_malloc (size_t size);
+
+ #endif
+diff --git a/ui-support.c b/ui-support.c
+index cc56c8e..c498833 100644
+--- a/ui-support.c
++++ b/ui-support.c
+@@ -223,7 +223,7 @@ void UISupportDrawHeader (const char * headerstring) {
+
+ mvprintw (0, 1, "* Snownews %s", VERSION);
+ if (headerstring != NULL) {
+- if (strlen(headerstring) > COLS-18)
++ if (strlen(headerstring) > COLS-18u)
+ mvaddnstr (0, 19, headerstring, COLS-20);
+ else
+ mvaddstr (0, COLS-strlen(headerstring)-1, headerstring);
+diff --git a/updatecheck.c b/updatecheck.c
+index e7b55a7..cf328eb 100644
+--- a/updatecheck.c
++++ b/updatecheck.c
+@@ -45,7 +45,6 @@ void AutoVersionCheck (void) {
+ int oldtime;
+ char *versionstring = NULL;
+ char *url;
+- char *freeme;
+
+ update = newFeedStruct();
+
+@@ -77,7 +76,6 @@ void AutoVersionCheck (void) {
+
+ url = strdup ("http://kiza.kcore.de/software/snownews/version");
+ update->feedurl = strdup(url);
+- freeme = url;
+ versionstring = DownloadFeed (url, update, 1);
+ free (url);
+
+diff --git a/xmlparse.c b/xmlparse.c
+index ef93745..11241fb 100644
+--- a/xmlparse.c
++++ b/xmlparse.c
+@@ -183,7 +183,6 @@ void parse_rdf10_item(struct feed *feed, xmlDocPtr doc, xmlNodePtr node)
+ {
+ xmlNodePtr cur;
+ xmlChar *readstatusstring;
+- char **hashitems = NULL;
+ char *guid = NULL;
+ char *date_str = NULL;
+ struct newsitem *item;
+@@ -277,14 +276,9 @@ void parse_rdf10_item(struct feed *feed, xmlDocPtr doc, xmlNodePtr node)
+ <guid> is not saved in the cache, thus we would generate a different
+ hash than the one from the live feed. */
+ if (item->data->hash == NULL) {
+- hashitems = malloc (sizeof(char *) * 4);
+- hashitems[0] = item->data->title;
+- hashitems[1] = item->data->link;
+- hashitems[2] = guid;
+- hashitems[3] = NULL;
++ const char* hashitems[] = { item->data->title, item->data->link, guid, NULL };
+ item->data->hash = genItemHash (hashitems, 3);
+ xmlFree (guid);
+- free (hashitems);
+ }
+
+ /* If saverestore == 1, restore readstatus. */
+diff --git a/zlib_interface.c b/zlib_interface.c
+index 9a9b325..12cdf45 100644
+--- a/zlib_interface.c
++++ b/zlib_interface.c
+@@ -26,7 +26,7 @@
+ #include <zlib.h>
+ #include <string.h>
+
+-int JG_ZLIB_DEBUG = 0;
++static const int JG_ZLIB_DEBUG = 0;
+
+ struct gzip_header {
+ unsigned char magic[2];
+@@ -50,33 +50,33 @@ int jg_zlib_uncompress(void const *in_buf, int in_size,
+ z_stream stream;
+ char *out_buf = NULL;
+ int out_buf_bytes = 0;
+- char tmp_buf[4096];
++ unsigned char tmp_buf[4096];
+ int result;
+ int new_bytes;
+-
++
+ /* Prepare the stream structure. */
+ stream.zalloc = NULL;
+ stream.zfree = NULL;
+ stream.opaque = NULL;
+- stream.next_in = (void *)in_buf;
++ stream.next_in = (void*) in_buf;
+ stream.avail_in = in_size;
+ stream.next_out = tmp_buf;
+ stream.avail_out = sizeof tmp_buf;
+-
++
+ if (out_size != NULL)
+ *out_size = 0;
+-
++
+ if (gzip)
+ result = inflateInit2(&stream, MAX_WBITS + 32); /* UNTESTED */
+ else
+ result = inflateInit2(&stream, -MAX_WBITS);
+-
++
+ if (result != 0) {
+ if (JG_ZLIB_DEBUG)
+ fprintf(stderr, "inflateInit2 failed: %d\n", result);
+ return JG_ZLIB_ERROR_OLDVERSION;
+ }
+-
++
+ do {
+ /* Should be Z_FINISH? */
+ result = inflate(&stream, Z_NO_FLUSH);
+@@ -84,6 +84,7 @@ int jg_zlib_uncompress(void const *in_buf, int in_size,
+ case Z_BUF_ERROR:
+ if (stream.avail_in == 0)
+ goto DONE; /* zlib bug */
++ /* fallthrough */
+ case Z_ERRNO:
+ case Z_NEED_DICT:
+ case Z_MEM_ERROR:
+@@ -114,19 +115,19 @@ int jg_zlib_uncompress(void const *in_buf, int in_size,
+ return JG_ZLIB_ERROR_NODATA;
+ }
+ } while (result != Z_STREAM_END);
+-
++
+ DONE:
+-
++
+ inflateEnd(&stream);
+-
++
+ /* Null-terminate the output buffer so it can be handled like a string. */
+ out_buf = realloc(out_buf, out_buf_bytes + 1);
+ out_buf[out_buf_bytes] = 0;
+-
++
+ /* The returned size does NOT include the additionall null byte! */
+ if (out_size != NULL)
+ *out_size = out_buf_bytes;
+-
++
+ *out_buf_ptr = out_buf;
+
+ return 0;
+@@ -141,24 +142,24 @@ int jg_gzip_uncompress(void const *in_buf, int in_size,
+ struct gzip_header const *header;
+ char *data_start;
+ int offset = sizeof *header;
+-
++
+ header = in_buf;
+-
++
+ if (out_size != NULL)
+ *out_size = 0;
+-
++
+ if ((header->magic[0] != 0x1F) || (header->magic[1] != 0x8B)) {
+ if (JG_ZLIB_DEBUG)
+ fprintf(stderr, "ERROR: Invalid magic bytes for GZIP data\n");
+ return JG_ZLIB_ERROR_BAD_MAGIC;
+ }
+-
++
+ if (header->method != 8) {
+ if (JG_ZLIB_DEBUG)
+ fprintf(stderr, "ERROR: Compression method is not deflate\n");
+ return JG_ZLIB_ERROR_BAD_METHOD;
+ }
+-
++
+ if (header->flags != 0 && header->flags != 8) {
+ if (JG_ZLIB_DEBUG) {
+ snprintf (tmpstring, sizeof(tmpstring), "ERROR: Unsupported flags %d", header->flags);
+@@ -166,7 +167,7 @@ int jg_gzip_uncompress(void const *in_buf, int in_size,
+ }
+ return JG_ZLIB_ERROR_BAD_FLAGS;
+ }
+-
++
+ if (header->flags & 8) {
+ /* skip the file name */
+ while (offset < in_size) {
+@@ -177,7 +178,7 @@ int jg_gzip_uncompress(void const *in_buf, int in_size,
+ offset++;
+ }
+ }
+-
++
+ data_start = (char *)in_buf + offset;
+
+ return jg_zlib_uncompress(data_start, in_size - offset - 8,
+diff --git a/zlib_interface.h b/zlib_interface.h
+index 4644284..cc6f62d 100644
+--- a/zlib_interface.h
++++ b/zlib_interface.h
+@@ -32,8 +32,6 @@ enum JG_ZLIB_ERROR {
+ JG_ZLIB_ERROR_BAD_FLAGS = -6
+ };
+
+-extern int JG_ZLIB_DEBUG;
+-
+ int jg_zlib_uncompress(void const *in_buf, int in_size,
+ void **out_buf_ptr, int *out_size,
+ int gzip);
+--- ./configure.orig 2018-10-30 09:16:43.691589791 +0000
++++ ./configure 2018-10-30 10:02:13.380306557 +0000
+@@ -12,7 +12,7 @@
+ chomp($xmlldflags);
+
+ my $prefix = "/usr/local";
+-my $cflags = "-Wall -Wno-format-y2k -O2 -DLOCALEPATH=\"\\\"\$(LOCALEPATH)\\\"\" -DOS=\\\"$os\\\" $xmlcflags \$(EXTRA_CFLAGS) ";
++my $cflags = "-Wall -O2 -DLOCALEPATH=\"\\\"\$(LOCALEPATH)\\\"\" -DOS=\\\"$os\\\" $xmlcflags \$(EXTRA_CFLAGS) ";
+ my $ldflags = "-lintl -lncursesw -lcrypto $xmlldflags \$(EXTRA_LDFLAGS) ";
+
+ my $use_nls = 1;