Skip to content

Commit

Permalink
Browse files Browse the repository at this point in the history
settings: use gzip for the mux/service settings
  • Loading branch information
perexg committed Feb 11, 2016
1 parent 68958ae commit dfaef76
Show file tree
Hide file tree
Showing 5 changed files with 93 additions and 28 deletions.
17 changes: 1 addition & 16 deletions src/epgdb.c
Expand Up @@ -345,22 +345,7 @@ static void epg_save_tsk_callback ( void *p, int dearmed )
if (fd >= 0) {
#if ENABLE_ZLIB
if (config.epg_compress) {
r = tvh_write(fd, "\xff\xffGZIP00\x00\x00\x00\x00", 12);
if (!r)
r = tvh_gzip_deflate_fd(fd, sb->sb_data, sb->sb_ptr, &size, 3) < 0;
if (!r && size > UINT_MAX)
r = 1;
if (!r) {
r = lseek(fd, 8, SEEK_SET) != (off_t)8;
if (!r) {
uint8_t data2[4];
data2[0] = (sb->sb_ptr >> 24) & 0xff;
data2[1] = (sb->sb_ptr >> 16) & 0xff;
data2[2] = (sb->sb_ptr >> 8) & 0xff;
data2[3] = (sb->sb_ptr & 0xff);
r = tvh_write(fd, data2, 4);
}
}
r = tvh_gzip_deflate_fd_header(fd, sb->sb_data, sb->sb_ptr, 3) < 0;
} else
#endif
r = tvh_write(fd, sb->sb_data, sb->sb_ptr);
Expand Down
19 changes: 19 additions & 0 deletions src/htsmsg_binary.c
Expand Up @@ -104,6 +104,10 @@ htsmsg_binary_des0(htsmsg_t *msg, const uint8_t *buf, size_t len)
}
break;

case HMF_BOOL:
f->hmf_bool = datalen == 1 ? buf[0] : 0;
break;

default:
free(n);
free(f);
Expand Down Expand Up @@ -173,6 +177,11 @@ htsmsg_binary_count(htsmsg_t *msg)
u64 = u64 >> 8;
}
break;

case HMF_BOOL:
if (f->hmf_bool) len++;
break;

}
}
return len;
Expand Down Expand Up @@ -216,6 +225,11 @@ htsmsg_binary_write(htsmsg_t *msg, uint8_t *ptr)
u64 = u64 >> 8;
}
break;

case HMF_BOOL:
l = f->hmf_bool ? 1 : 0;
break;

default:
abort();
}
Expand Down Expand Up @@ -252,6 +266,11 @@ htsmsg_binary_write(htsmsg_t *msg, uint8_t *ptr)
u64 = u64 >> 8;
}
break;

case HMF_BOOL:
if (f->hmf_bool)
ptr[0] = 1;
break;
}
ptr += l;
}
Expand Down
62 changes: 50 additions & 12 deletions src/settings.c
Expand Up @@ -28,6 +28,7 @@
#include <dirent.h>

#include "htsmsg.h"
#include "htsmsg_binary.h"
#include "htsmsg_json.h"
#include "settings.h"
#include "tvheadend.h"
Expand Down Expand Up @@ -133,7 +134,9 @@ hts_settings_save(htsmsg_t *record, const char *pathfmt, ...)
va_list ap;
htsbuf_queue_t hq;
htsbuf_data_t *hd;
int ok, r;
int ok, r, pack;
void *msgdata;
size_t msglen;

if(settingspath == NULL)
return;
Expand All @@ -157,18 +160,37 @@ hts_settings_save(htsmsg_t *record, const char *pathfmt, ...)
}

/* Store data */
#if ENABLE_ZLIB
pack = strstr(path, "/muxes/") != NULL && /* ugly, redesign API */
strstr(path, "/networks/") != NULL &&
strstr(path, "/input/") != NULL;
#else
pack = 0;
#endif
ok = 1;
htsbuf_queue_init(&hq, 0);
htsmsg_json_serialize(record, &hq, 1);
TAILQ_FOREACH(hd, &hq.hq_q, hd_link)
if(tvh_write(fd, hd->hd_data + hd->hd_data_off, hd->hd_data_len)) {
tvhlog(LOG_ALERT, "settings", "Failed to write file \"%s\" - %s",
tmppath, strerror(errno));
ok = 0;
break;

if (!pack) {
htsbuf_queue_init(&hq, 0);
htsmsg_json_serialize(record, &hq, 1);
TAILQ_FOREACH(hd, &hq.hq_q, hd_link)
if(tvh_write(fd, hd->hd_data + hd->hd_data_off, hd->hd_data_len)) {
tvhlog(LOG_ALERT, "settings", "Failed to write file \"%s\" - %s",
tmppath, strerror(errno));
ok = 0;
break;
}
htsbuf_queue_flush(&hq);
} else {
#if ENABLE_ZLIB
r = htsmsg_binary_serialize(record, &msgdata, &msglen, 0x10000);
if (!r) {
r = tvh_gzip_deflate_fd_header(fd, msgdata, msglen, 3);
if (r)
ok = 0;
}
#endif
}
close(fd);
htsbuf_queue_flush(&hq);

/* Move */
if(ok) {
Expand All @@ -194,8 +216,10 @@ hts_settings_load_one(const char *filename)
{
ssize_t n, size;
char *mem;
uint8_t *unpacked;
fb_file *fp;
htsmsg_t *r = NULL;
uint32_t orig;

/* Open */
if (!(fp = fb_open(filename, 1, 0))) return NULL;
Expand All @@ -207,8 +231,22 @@ hts_settings_load_one(const char *filename)
if (n >= 0) mem[n] = 0;

/* Decode */
if(n == size)
r = htsmsg_json_deserialize(mem);
if(n == size) {
if (size > 12 && memcmp(mem, "\xff\xffGZIP00", 8) == 0) {
#if ENABLE_ZLIB
orig = (mem[8] << 24) | (mem[9] << 16) | (mem[10] << 8) | mem[11];
if (orig > 0) {
unpacked = tvh_gzip_inflate((uint8_t *)mem + 12, size - 12, orig);
if (unpacked) {
r = htsmsg_binary_deserialize(unpacked, orig, NULL);
free(unpacked);
}
}
#endif
} else {
r = htsmsg_json_deserialize(mem);
}
}

/* Close */
fb_close(fp);
Expand Down
1 change: 1 addition & 0 deletions src/tvheadend.h
Expand Up @@ -794,6 +794,7 @@ char *regexp_escape ( const char *str );
uint8_t *tvh_gzip_inflate ( const uint8_t *data, size_t size, size_t orig );
uint8_t *tvh_gzip_deflate ( const uint8_t *data, size_t orig, size_t *size );
int tvh_gzip_deflate_fd ( int fd, const uint8_t *data, size_t orig, size_t *size, int speed );
int tvh_gzip_deflate_fd_header ( int fd, const uint8_t *data, size_t orig, int speed );
#endif

/* URL decoding */
Expand Down
22 changes: 22 additions & 0 deletions src/zlib.c
Expand Up @@ -152,3 +152,25 @@ int tvh_gzip_deflate_fd ( int fd, const uint8_t *data, size_t orig, size_t *size

return r;
}

int tvh_gzip_deflate_fd_header ( int fd, const uint8_t *data, size_t orig, int speed )
{
uint8_t data2[4];
size_t size;
int r;

r = tvh_write(fd, "\xff\xffGZIP00\x00\x00\x00\x00", 12);
if (r)
return 1;
r = tvh_gzip_deflate_fd(fd, data, orig, &size, 3) < 0;
if (r || size > UINT_MAX)
return 1;
r = lseek(fd, 8, SEEK_SET) != (off_t)8;
if (r)
return 1;
data2[0] = (orig >> 24) & 0xff;
data2[1] = (orig >> 16) & 0xff;
data2[2] = (orig >> 8) & 0xff;
data2[3] = (orig & 0xff);
return tvh_write(fd, data2, 4);
}

0 comments on commit dfaef76

Please sign in to comment.