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.
This commit is contained in:
parent
83a049de95
commit
cff110ac98
125
about.c
125
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();
|
||||
}
|
||||
|
|
|
@ -12,7 +12,7 @@ my $xmlldflags = `xml2-config --libs`;
|
|||
chomp($xmlldflags);
|
||||
|
||||
my $prefix = "/usr/local";
|
||||
my $cflags = "-Wall -Wno-format-y2k -O2 -DLOCALEPATH=\"\\\"\$(LOCALEPATH)\\\"\" -DOS=\\\"$os\\\" $xmlcflags \$(EXTRA_CFLAGS) ";
|
||||
my $cflags = "-Wall -Wextra -O2 -DLOCALEPATH=\"\\\"\$(LOCALEPATH)\\\"\" -DOS=\\\"$os\\\" $xmlcflags \$(EXTRA_CFLAGS) ";
|
||||
my $ldflags = "\$(EXTRA_LDFLAGS) -lncurses -lcrypto $xmlldflags ";
|
||||
|
||||
my $use_nls = 1;
|
||||
|
|
220
conversions.c
220
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];
|
||||
char * genItemHash (const char* const* hashitems, int items) {
|
||||
EVP_MD_CTX* mdctx = EVP_MD_CTX_new();
|
||||
EVP_DigestInit(mdctx, EVP_md5());
|
||||
|
||||
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]);
|
||||
}
|
||||
|
||||
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, ¤t_t);
|
||||
|
||||
/* (((current year - passed year) * 365) + current year day) - passed year day */
|
||||
|
|
|
@ -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);
|
||||
|
|
189
digcalc.c
189
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;
|
||||
EVP_DigestUpdate (mdctx, HA2Hex, HASHHEXLEN);
|
||||
EVP_DigestFinal_ex (mdctx, md_value, &md_len);
|
||||
EVP_MD_CTX_free (mdctx);
|
||||
|
||||
/* 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) {
|
||||
|
||||
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]);
|
||||
};
|
||||
|
|
39
digcalc.h
39
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
|
||||
|
|
|
@ -67,7 +67,7 @@ struct scrolltext {
|
|||
};
|
||||
|
||||
#ifdef SIGWINCH
|
||||
void sig_winch(int p)
|
||||
void sig_winch (int p __attribute__((unused)))
|
||||
{
|
||||
resize_dirty = 1;
|
||||
}
|
||||
|
|
10
main.c
10
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) {
|
||||
|
|
2
netio.c
2
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;
|
||||
|
|
26
os-support.c
26
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;
|
||||
}
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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);
|
||||
|
||||
|
|
|
@ -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. */
|
||||
|
|
|
@ -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,
|
||||
|
|
|
@ -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);
|
||||
|
|
Loading…
Reference in New Issue