implement with glib

This commit is contained in:
ailin-nemui 2018-02-12 22:15:08 +01:00
commit 9c3532f542

View file

@ -29,7 +29,6 @@
#include "settings.h" #include "settings.h"
#include "default-config.h" #include "default-config.h"
#include <openssl/sha.h>
#include <signal.h> #include <signal.h>
#define SETTINGS_AUTOSAVE_TIMEOUT (1000*60*60) /* 1 hour */ #define SETTINGS_AUTOSAVE_TIMEOUT (1000*60*60) /* 1 hour */
@ -48,7 +47,8 @@ static int timeout_tag;
static int config_last_modifycounter; static int config_last_modifycounter;
static time_t config_last_mtime; static time_t config_last_mtime;
static long config_last_size; static long config_last_size;
static unsigned char config_last_checksum[SHA_DIGEST_LENGTH]; static guint8 *config_last_checksum;
static gsize config_last_checksum_length;
static SETTINGS_REC *settings_get(const char *key, SettingType type) static SETTINGS_REC *settings_get(const char *key, SettingType type)
{ {
@ -662,14 +662,17 @@ void sig_term(int n)
raise(SIGTERM); raise(SIGTERM);
} }
static int file_checksum(const char *fname, const unsigned char *old_checksum, static int file_checksum(const char *fname, const guint8 *old_checksum, gsize old_checksum_length,
unsigned char *checksum) guint8 **checksum_out, gsize *checksum_length_out)
{ {
SHA_CTX c; GChecksum *c;
unsigned char buf[512], tmp[SHA_DIGEST_LENGTH]; unsigned char buf[512];
guint8 *checksum;
gsize checksum_length;
int f, ret; int f, ret;
static GChecksumType checksum_type = G_CHECKSUM_SHA1;
if (!SHA1_Init(&c)) { if ((c = g_checksum_new(checksum_type)) == NULL) {
return FALSE; return FALSE;
} }
@ -678,18 +681,23 @@ static int file_checksum(const char *fname, const unsigned char *old_checksum,
return FALSE; return FALSE;
while ((ret = read(f, buf, sizeof(buf))) > 0) { while ((ret = read(f, buf, sizeof(buf))) > 0) {
SHA1_Update(&c, buf, ret); g_checksum_update(c, buf, ret);
} }
close(f); close(f);
if (checksum == NULL) { checksum = g_new0(guint8, g_checksum_type_get_length(checksum_type));
checksum = tmp; g_checksum_get_digest(c, checksum, &checksum_length);
g_checksum_free(c);
if (checksum_out != NULL && checksum_length_out != NULL) {
g_free(*checksum_out);
*checksum_out = checksum;
*checksum_length_out = checksum_length;
} }
SHA1_Final(checksum, &c);
if (old_checksum != NULL) { if (old_checksum != NULL) {
return memcmp(checksum, old_checksum, SHA_DIGEST_LENGTH) == 0; return old_checksum_length == checksum_length &&
memcmp(checksum, old_checksum, checksum_length) == 0;
} }
return TRUE; return TRUE;
} }
@ -706,7 +714,7 @@ static void irssi_config_save_state(const char *fname)
/* save modify time, file size and checksum */ /* save modify time, file size and checksum */
config_last_mtime = statbuf.st_mtime; config_last_mtime = statbuf.st_mtime;
config_last_size = statbuf.st_size; config_last_size = statbuf.st_size;
file_checksum(fname, NULL, config_last_checksum); file_checksum(fname, NULL, 0, &config_last_checksum, &config_last_checksum_length);
} }
int irssi_config_is_changed(const char *fname) int irssi_config_is_changed(const char *fname)
@ -721,7 +729,7 @@ int irssi_config_is_changed(const char *fname)
return config_last_mtime != statbuf.st_mtime && return config_last_mtime != statbuf.st_mtime &&
(config_last_size != statbuf.st_size || (config_last_size != statbuf.st_size ||
file_checksum(fname, config_last_checksum, NULL)); file_checksum(fname, config_last_checksum, config_last_checksum_length, NULL, NULL));
} }
static CONFIG_REC *parse_configfile(const char *fname) static CONFIG_REC *parse_configfile(const char *fname)
@ -919,4 +927,10 @@ void settings_deinit(void)
g_hash_table_destroy(settings); g_hash_table_destroy(settings);
if (mainconfig != NULL) config_close(mainconfig); if (mainconfig != NULL) config_close(mainconfig);
if (config_last_checksum != NULL) {
g_free(config_last_checksum);
config_last_checksum = NULL;
config_last_checksum_length = 0;
}
} }