From: Jaroslav Kysela Date: Thu, 11 Feb 2016 12:52:57 +0000 (+0100) Subject: settings: merge mux config / service config into one file X-Git-Tag: v4.2.1~1037 X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=68958ae98e2de8ebfc7d4571b2b4cf9e0abf3f27;p=thirdparty%2Ftvheadend.git settings: merge mux config / service config into one file --- diff --git a/src/input/mpegts/iptv/iptv_mux.c b/src/input/mpegts/iptv/iptv_mux.c index 94ab7315e..368f5cf57 100644 --- a/src/input/mpegts/iptv/iptv_mux.c +++ b/src/input/mpegts/iptv/iptv_mux.c @@ -268,7 +268,7 @@ iptv_mux_config_save ( mpegts_mux_t *mm, char *filename, size_t fsize ) char ubuf2[UUID_HEX_SIZE]; htsmsg_t *c = htsmsg_create_map(); mpegts_mux_save(mm, c); - snprintf(filename, fsize, "input/iptv/networks/%s/muxes/%s/config", + snprintf(filename, fsize, "input/iptv/networks/%s/muxes/%s", idnode_uuid_as_str(&mm->mm_network->mn_id, ubuf1), idnode_uuid_as_str(&mm->mm_id, ubuf2)); return c; @@ -282,7 +282,7 @@ iptv_mux_delete ( mpegts_mux_t *mm, int delconf ) char ubuf2[UUID_HEX_SIZE]; if (delconf) - hts_settings_remove("input/iptv/networks/%s/muxes/%s/config", + hts_settings_remove("input/iptv/networks/%s/muxes/%s", idnode_uuid_as_str(&mm->mm_network->mn_id, ubuf1), idnode_uuid_as_str(&mm->mm_id, ubuf2)); @@ -321,7 +321,7 @@ iptv_mux_display_name ( mpegts_mux_t *mm, char *buf, size_t len ) iptv_mux_t * iptv_mux_create0 ( iptv_network_t *in, const char *uuid, htsmsg_t *conf ) { - htsmsg_t *c, *e; + htsmsg_t *c, *c2, *e; htsmsg_field_t *f; iptv_service_t *ms; char ubuf1[UUID_HEX_SIZE]; @@ -348,9 +348,12 @@ iptv_mux_create0 ( iptv_network_t *in, const char *uuid, htsmsg_t *conf ) (mpegts_mux_t*)im); /* Services */ - c = hts_settings_load_r(1, "input/iptv/networks/%s/muxes/%s/services", - idnode_uuid_as_str(&in->mn_id, ubuf1), - idnode_uuid_as_str(&im->mm_id, ubuf2)); + c2 = NULL; + c = htsmsg_get_map(conf, "services"); + if (c == NULL) + c = c2 = hts_settings_load_r(1, "input/iptv/networks/%s/muxes/%s/services", + idnode_uuid_as_str(&in->mn_id, ubuf1), + idnode_uuid_as_str(&im->mm_id, ubuf2)); if (c) { HTSMSG_FOREACH(f, c) { if (!(e = htsmsg_field_get_map(f))) continue; @@ -365,7 +368,7 @@ iptv_mux_create0 ( iptv_network_t *in, const char *uuid, htsmsg_t *conf ) if (ms) iptv_bouquet_trigger(in, 0); } - htsmsg_destroy(c); + htsmsg_destroy(c2); return im; } diff --git a/src/input/mpegts/iptv/iptv_service.c b/src/input/mpegts/iptv/iptv_service.c index 5b5cc40b0..554e35b71 100644 --- a/src/input/mpegts/iptv/iptv_service.c +++ b/src/input/mpegts/iptv/iptv_service.c @@ -25,36 +25,16 @@ extern const idclass_t mpegts_service_class; static htsmsg_t * iptv_service_config_save ( service_t *s, char *filename, size_t fsize ) { - mpegts_mux_t *mm = ((mpegts_service_t *)s)->s_dvb_mux; - htsmsg_t *c = htsmsg_create_map(); - char ubuf0[UUID_HEX_SIZE]; - char ubuf1[UUID_HEX_SIZE]; - char ubuf2[UUID_HEX_SIZE]; - - service_save(s, c); - snprintf(filename, fsize, "input/iptv/networks/%s/muxes/%s/services/%s", - idnode_uuid_as_str(&mm->mm_network->mn_id, ubuf0), - idnode_uuid_as_str(&mm->mm_id, ubuf1), - idnode_uuid_as_str(&s->s_id, ubuf2)); - return c; + mpegts_mux_t *mm = ((mpegts_service_t *)s)->s_dvb_mux; + idnode_changed(&mm->mm_id); + return NULL; } static void iptv_service_delete ( service_t *s, int delconf ) { - iptv_service_t *is = (iptv_service_t *)s; - mpegts_mux_t *mm = is->s_dvb_mux; - char ubuf0[UUID_HEX_SIZE]; - char ubuf1[UUID_HEX_SIZE]; - char ubuf2[UUID_HEX_SIZE]; - - /* Remove config */ - if (delconf && s->s_type == STYPE_STD) - hts_settings_remove("input/iptv/networks/%s/muxes/%s/services/%s", - idnode_uuid_as_str(&mm->mm_network->mn_id, ubuf0), - idnode_uuid_as_str(&mm->mm_id, ubuf1), - idnode_uuid_as_str(&s->s_id, ubuf2)); - + mpegts_mux_t *mm = ((mpegts_service_t *)s)->s_dvb_mux; + idnode_changed(&mm->mm_id); /* Note - do no pass the delconf flag - another file location */ mpegts_service_delete(s, 0); } diff --git a/src/input/mpegts/mpegts_mux.c b/src/input/mpegts/mpegts_mux.c index bb44d7e9a..834718243 100644 --- a/src/input/mpegts/mpegts_mux.c +++ b/src/input/mpegts/mpegts_mux.c @@ -694,6 +694,7 @@ mpegts_mux_delete ( mpegts_mux_t *mm, int delconf ) gtimer_disarm(&mm->mm_update_pids_timer); /* Free memory */ + idnode_save_check(&mm->mm_id, 1); idnode_unlink(&mm->mm_id); free(mm->mm_provider_network_name); free(mm->mm_crid_authority); @@ -1174,7 +1175,20 @@ mpegts_mux_create0 void mpegts_mux_save ( mpegts_mux_t *mm, htsmsg_t *c ) { - idnode_save(&mm->mm_id, c); + mpegts_service_t *ms; + htsmsg_t *root = htsmsg_create_map(); + htsmsg_t *services = htsmsg_create_map(); + htsmsg_t *e; + char ubuf[UUID_HEX_SIZE]; + + idnode_save(&mm->mm_id, root); + LIST_FOREACH(ms, &mm->mm_services, s_dvb_mux_link) { + e = htsmsg_create_map(); + service_save((service_t *)ms, e); + htsmsg_add_msg(services, idnode_uuid_as_str(&ms->s_id, ubuf), e); + } + htsmsg_add_msg(root, "services", services); + htsmsg_add_msg(c, "config", root); } int diff --git a/src/input/mpegts/mpegts_mux_dvb.c b/src/input/mpegts/mpegts_mux_dvb.c index 88c1ef325..2c3d86053 100644 --- a/src/input/mpegts/mpegts_mux_dvb.c +++ b/src/input/mpegts/mpegts_mux_dvb.c @@ -903,7 +903,7 @@ dvb_mux_config_save ( mpegts_mux_t *mm, char *filename, size_t fsize ) char ubuf2[UUID_HEX_SIZE]; htsmsg_t *c = htsmsg_create_map(); mpegts_mux_save(mm, c); - snprintf(filename, fsize, "input/dvb/networks/%s/muxes/%s/config", + snprintf(filename, fsize, "input/dvb/networks/%s/muxes/%s", idnode_uuid_as_str(&mm->mm_network->mn_id, ubuf1), idnode_uuid_as_str(&mm->mm_id, ubuf2)); return c; @@ -978,7 +978,7 @@ dvb_mux_create0 const idclass_t *idc; mpegts_mux_t *mm; dvb_mux_t *lm; - htsmsg_t *c, *e; + htsmsg_t *c, *c2, *e; htsmsg_field_t *f; dvb_fe_delivery_system_t delsys; char ubuf1[UUID_HEX_SIZE]; @@ -1046,15 +1046,19 @@ dvb_mux_create0 if (!conf) return lm; /* Services */ - c = hts_settings_load_r(1, "input/dvb/networks/%s/muxes/%s/services", - idnode_uuid_as_str(&ln->mn_id, ubuf1), - idnode_uuid_as_str(&mm->mm_id, ubuf2)); + c2 = NULL; + c = htsmsg_get_map(conf, "services"); + if (c == NULL) + c = c2 = hts_settings_load_r(1, "input/dvb/networks/%s/muxes/%s/services", + idnode_uuid_as_str(&ln->mn_id, ubuf1), + idnode_uuid_as_str(&mm->mm_id, ubuf2)); + if (c) { HTSMSG_FOREACH(f, c) { if (!(e = htsmsg_get_map_by_field(f))) continue; mpegts_service_create1(f->hmf_name, (mpegts_mux_t *)lm, 0, 0, e); } - htsmsg_destroy(c); + htsmsg_destroy(c2); } if (ln->ln_type == DVB_TYPE_S) { diff --git a/src/input/mpegts/mpegts_service.c b/src/input/mpegts/mpegts_service.c index 76ff2b6b7..2fc68f359 100644 --- a/src/input/mpegts/mpegts_service.c +++ b/src/input/mpegts/mpegts_service.c @@ -272,17 +272,9 @@ mpegts_service_is_enabled(service_t *t, int flags) static htsmsg_t * mpegts_service_config_save ( service_t *t, char *filename, size_t fsize ) { - htsmsg_t *c = htsmsg_create_map(); mpegts_service_t *s = (mpegts_service_t*)t; - char ubuf0[UUID_HEX_SIZE]; - char ubuf1[UUID_HEX_SIZE]; - char ubuf2[UUID_HEX_SIZE]; - service_save(t, c); - snprintf(filename, fsize, "input/dvb/networks/%s/muxes/%s/services/%s", - idnode_uuid_as_str(&s->s_dvb_mux->mm_network->mn_id, ubuf0), - idnode_uuid_as_str(&s->s_dvb_mux->mm_id, ubuf1), - idnode_uuid_as_str(&s->s_id, ubuf2)); - return c; + idnode_changed(&s->s_dvb_mux->mm_id); + return NULL; } /* @@ -672,16 +664,8 @@ mpegts_service_delete ( service_t *t, int delconf ) { mpegts_service_t *ms = (mpegts_service_t*)t, *mms; mpegts_mux_t *mm = ms->s_dvb_mux; - char ubuf0[UUID_HEX_SIZE]; - char ubuf1[UUID_HEX_SIZE]; - char ubuf2[UUID_HEX_SIZE]; - - /* Remove config */ - if (delconf && t->s_type == STYPE_STD) - hts_settings_remove("input/dvb/networks/%s/muxes/%s/services/%s", - idnode_uuid_as_str(&mm->mm_network->mn_id, ubuf0), - idnode_uuid_as_str(&mm->mm_id, ubuf1), - idnode_uuid_as_str(&t->s_id, ubuf2)); + + idnode_changed(&mm->mm_id); /* Free memory */ if (t->s_type == STYPE_STD) diff --git a/src/settings.c b/src/settings.c index 0b00e684a..e3e508d03 100644 --- a/src/settings.c +++ b/src/settings.c @@ -133,7 +133,7 @@ hts_settings_save(htsmsg_t *record, const char *pathfmt, ...) va_list ap; htsbuf_queue_t hq; htsbuf_data_t *hd; - int ok; + int ok, r; if(settingspath == NULL) return; @@ -172,7 +172,14 @@ hts_settings_save(htsmsg_t *record, const char *pathfmt, ...) /* Move */ if(ok) { - rename(tmppath, path); + r = rename(tmppath, path); + if (r && errno == EISDIR) { + rmtree(path); + r = rename(tmppath, path); + } + if (r) + tvhlog(LOG_ALERT, "settings", "Unable to rename file \"%s\" to \"%s\" - %s", + tmppath, path, strerror(errno)); /* Delete tmp */ } else