libaacs | branch: master | npzacs <[email protected]> | Wed May 2 14:54:38 2012 +0300| [fed9d7b6f962659185c62525c3327d3be96256e3] | committer: npzacs
Added non-volatile cache > http://git.videolan.org/gitweb.cgi/libaacs.git/?a=commit;h=fed9d7b6f962659185c62525c3327d3be96256e3 --- src/file/keydbcfg.c | 77 +++++++++++++++++++++++++++++++++++++++++++++++++++ src/file/keydbcfg.h | 3 ++ 2 files changed, 80 insertions(+), 0 deletions(-) diff --git a/src/file/keydbcfg.c b/src/file/keydbcfg.c index 115a241..b3bdf92 100644 --- a/src/file/keydbcfg.c +++ b/src/file/keydbcfg.c @@ -402,6 +402,83 @@ int keycache_find(const char *type, const uint8_t *disc_id, uint8_t *key, unsign return result; } +static char *_cache_file(const char *name) +{ + const char *cache_dir = get_cache_home(); + + if (!cache_dir) { + return NULL; + } + + return str_printf("%s/%s/%s", cache_dir, CFG_DIR, name); +} + +int cache_save(const char *name, uint32_t version, const uint8_t *data, uint32_t len) +{ + int result = 0; + char *file = _cache_file(name); + + if (file) { + if (_mkpath(file)) { + FILE *fp = fopen(file, "w"); + + if (fp) { + if (fwrite(&version, 1, 4, fp) == 4 && + fwrite(&len, 1, 4, fp) == 4 && + fwrite(data, 1, len, fp) == len) { + DEBUG(DBG_FILE, "Wrote %d bytes to %s\n", len + 8, file); + result = 1; + + } else { + DEBUG(DBG_FILE, "Error writing to %s\n", file); + } + + fclose(fp); + } + } + + X_FREE(file); + } + + return result; +} + +int cache_get(const char *name, uint32_t *version, uint32_t *len, uint8_t *buf) +{ + int result = 0; + char *file = _cache_file(name); + + *version = *len = 0; + + if (file) { + FILE *fp = fopen(file, "r"); + + if (fp) { + DEBUG(DBG_FILE, "Reading %s\n", file); + + if (fread(version, 1, 4, fp) == 4 && + fread(len, 1, 4, fp) == 4 && + (!buf || fread(buf, 1, *len, fp) == *len)) { + + DEBUG(DBG_FILE, "Read %d bytes from %s, version %d\n", 8 + (buf ? *len : 0), file, *version); + result = 1; + + } else { + DEBUG(DBG_FILE, "Error reading from %s\n", file); + } + + fclose(fp); + + } else { + DEBUG(DBG_FILE, "%s not found\n", file); + } + + X_FREE(file); + } + + return result; +} + static char *_find_config_file(void) { static const char cfg_file_name[] = CFG_FILE_NAME; diff --git a/src/file/keydbcfg.h b/src/file/keydbcfg.h index 249186c..8c2cf83 100644 --- a/src/file/keydbcfg.h +++ b/src/file/keydbcfg.h @@ -125,4 +125,7 @@ AACS_PRIVATE int keycache_save(const char *type, const uint8_t *disc_id, AACS_PRIVATE int keycache_find(const char *type, const uint8_t *disc_id, uint8_t *key, unsigned int len); +AACS_PRIVATE int cache_get(const char *name, uint32_t *version, uint32_t *len, uint8_t *buf); /* use buf=NULL to get version and size */ +AACS_PRIVATE int cache_save(const char *name, uint32_t version, const uint8_t *data, uint32_t len); + #endif _______________________________________________ libaacs-devel mailing list [email protected] http://mailman.videolan.org/listinfo/libaacs-devel
