diff --git a/docs/html/config_dvr.html b/docs/html/config_dvr.html index 703ef47a..2cc9836a 100644 --- a/docs/html/config_dvr.html +++ b/docs/html/config_dvr.html @@ -81,12 +81,12 @@
- - - + + +
Common examples:
644 == rw-r--r--
664 == rw-rw-r-- (default)
666 == rw-rw-rw-
0644 == rw-r--r--
0664 == rw-rw-r-- (default)
0666 == rw-rw-rw-
- Note that your default user umask applies, so 666 with umask 002 will produce 664. + Note that your default user umask applies, so 666 with umask 0002 will produce 0664. See also Directory permissions in Subdirectory Options. @@ -113,12 +113,12 @@
- - - + + +
Common examples:
755 == rwxr--r--
775 == rwxrwxr-- (default)
777 == rwxrwxrwx
0755 == rwxr--r--
0775 == rwxrwxr-- (default)
0777 == rwxrwxrwx
- Note that your default user umask applies, so 777 with umask 002 will produce 775. + Note that your default user umask applies, so 0777 with umask 0002 will produce 0775. See also File permissions in Recording File Options. diff --git a/src/dvr/dvr_db.c b/src/dvr/dvr_db.c index 70e3983e..ca43c3c5 100644 --- a/src/dvr/dvr_db.c +++ b/src/dvr/dvr_db.c @@ -1090,7 +1090,7 @@ dvr_init(void) struct stat st; uint32_t u32; dvr_config_t *cfg; - + dvr_iov_max = sysconf(_SC_IOV_MAX); /* Default settings */ @@ -1133,9 +1133,55 @@ dvr_init(void) htsmsg_get_s32(m, "post-extra-time", &cfg->dvr_extra_time_post); htsmsg_get_u32(m, "retention-days", &cfg->dvr_retention_days); tvh_str_set(&cfg->dvr_storage, htsmsg_get_str(m, "storage")); - htsmsg_get_s32(m, "file-permissions", &cfg->dvr_muxcnf.m_file_permissions); - htsmsg_get_s32(m, "directory-permissions", &cfg->dvr_muxcnf.m_directory_permissions); + +//IH + +/* THIS IS WHERE IT ALL GOES HORRIBLY WRONG + * + * I need to pass tvh_str_set a type char**, but I'm genuinely guessing, and that's not good even if it compiles! + * + */ + + tvhlog(LOG_INFO, "loading", "%s Before load octal file-permission \"%o\"", cfg->dvr_config_name, cfg->dvr_muxcnf.m_file_permissions); + + tvhlog(LOG_INFO, "loading", "calling tvh_str_set"); + +// This is embarassingly poor code. Sorry. + char placeholder[5]; // Yes, I know it should be at the start of the function + char *placeholderptr; // Ditto + + placeholderptr = placeholder; + +// tvhlog(LOG_INFO, "loading", "placeholder \"%s\"", placeholder); +// tvhlog(LOG_INFO, "loading", "placeholderptr \"%i\"", &placeholderptr); +// tvhlog(LOG_INFO, "loading", "placeholder \"%i\"", &placeholder); + + tvh_str_set(&placeholderptr, htsmsg_get_str(m, "file-permissions")); + +// tvhlog(LOG_INFO, "loading", "copying cfg"); + +// Thought: we know that strtol will return a type that can be cast to int +// What if someone manually enters 123456789 in the config file? What then? +// Worth checking if strtol returns > int size then throw error and revert to default as it's clearly invalid? +// Isn't the same true of editing it to be "file perms : abolloxstring" or "boolean-flags : aaargh"? It's their fault... + + cfg->dvr_muxcnf.m_file_permissions = (int)strtol(placeholder,NULL,0); + +// tvhlog(LOG_INFO, "loading", "%s Loaded octal placeholder file-permission \"%o\"", cfg->dvr_config_name,cfg->dvr_muxcnf.m_file_permissions); +// tvhlog(LOG_INFO, "loading", "%s After load octal file-permission \"%o\"", cfg->dvr_config_name,cfg->dvr_muxcnf.m_file_permissions); + +// tvhlog(LOG_INFO, "loading", "%s Before load octal dir-permission \"%o\"", cfg->dvr_config_name,cfg->dvr_muxcnf.m_directory_permissions); + +// THIS WILL BREAK AS WELL. Amateur. + + tvh_str_set(&placeholderptr, htsmsg_get_str(m, "directory-permissions")); + cfg->dvr_muxcnf.m_directory_permissions = (int)strtol(placeholder,NULL,0); + +// tvhlog(LOG_INFO, "loading", "%s Loaded octal directory-permission \"%o\"", cfg->dvr_config_name,cfg->dvr_muxcnf.m_directory_permissions); +// tvhlog(LOG_INFO, "loading", "%s After load octal directory-permission \"%o\"", cfg->dvr_config_name,cfg->dvr_muxcnf.m_directory_permissions); + + if(!htsmsg_get_u32(m, "day-dir", &u32) && u32) cfg->dvr_flags |= DVR_DIR_PER_DAY; @@ -1316,9 +1362,9 @@ dvr_config_create(const char *name) cfg->dvr_dup_detect_episode = 1; // detect dup episodes /* Default recording file and directory permissions */ - /* Note that these are decimal literal equivalents of the octal - they get converted later. Yes, it's a kludge. Sue me. */ - cfg->dvr_muxcnf.m_file_permissions = 664; - cfg->dvr_muxcnf.m_directory_permissions = 775; + + cfg->dvr_muxcnf.m_file_permissions = 0664; + cfg->dvr_muxcnf.m_directory_permissions = 0775; LIST_INSERT_HEAD(&dvrconfigs, cfg, config_link); @@ -1358,12 +1404,27 @@ static void dvr_save(dvr_config_t *cfg) { htsmsg_t *m = htsmsg_create_map(); + char buffer[5]; //IH - leading zero, three octal digits plus terminating null if (cfg->dvr_config_name != NULL && strlen(cfg->dvr_config_name) != 0) htsmsg_add_str(m, "config_name", cfg->dvr_config_name); htsmsg_add_str(m, "storage", cfg->dvr_storage); - htsmsg_add_u32(m, "file-permissions", cfg->dvr_muxcnf.m_file_permissions); - htsmsg_add_u32(m, "directory-permissions", cfg->dvr_muxcnf.m_directory_permissions); + +// tvhlog(LOG_INFO, "saving", "****** To be written: file-permission decimal \"%i\"", cfg->dvr_muxcnf.m_file_permissions); +// tvhlog(LOG_INFO, "saving", "****** equivalent to octal \"%o\"", cfg->dvr_muxcnf.m_file_permissions); +// tvhlog(LOG_INFO, "saving", "****** To be written: directory-permission decimal \"%i\"", cfg->dvr_muxcnf.m_directory_permissions); +// tvhlog(LOG_INFO, "saving", "****** equivalent to octal \"%o\"", cfg->dvr_muxcnf.m_directory_permissions); + + snprintf(buffer,5,"%o",cfg->dvr_muxcnf.m_file_permissions); + htsmsg_add_str(m, "file-permissions", buffer); + +// tvhlog(LOG_INFO, "saving", "****** Saved file-permission as string \"%s\"", buffer); + + snprintf(buffer,5,"%o",cfg->dvr_muxcnf.m_directory_permissions); + htsmsg_add_str(m, "directory-permissions", buffer); + +// tvhlog(LOG_INFO, "saving", "****** Saved directory-permission as string \"%s\"", buffer); + htsmsg_add_u32(m, "container", cfg->dvr_mc); htsmsg_add_u32(m, "cache", cfg->dvr_muxcnf.m_cache); htsmsg_add_u32(m, "rewrite-pat", diff --git a/src/dvr/dvr_rec.c b/src/dvr/dvr_rec.c index 2d9938ab..25814e81 100644 --- a/src/dvr/dvr_rec.c +++ b/src/dvr/dvr_rec.c @@ -204,15 +204,7 @@ pvr_generate_filename(dvr_entry_t *de, const streaming_start_t *ss) free(title); } -// Very ugly hack alert! -// Convert my nasty stored-as-decimal permissions into literal octal equivalent (i.e. 777 => 0777) - - int decimal_perms = cfg->dvr_muxcnf.m_directory_permissions; - int octal_perms = ((decimal_perms / 100) << 6) | ((decimal_perms % 100 / 10) << 3) | (decimal_perms % 10); - -// Create directory path - - if(makedirs(path, octal_perms) != 0) { + if(makedirs(path, cfg->dvr_muxcnf.m_directory_permissions) != 0) { return -1; } diff --git a/src/muxer/muxer_pass.c b/src/muxer/muxer_pass.c index abde3689..b9bc3b5e 100644 --- a/src/muxer/muxer_pass.c +++ b/src/muxer/muxer_pass.c @@ -378,14 +378,9 @@ pass_muxer_open_file(muxer_t *m, const char *filename) int fd; pass_muxer_t *pm = (pass_muxer_t*)m; -// Very ugly hack alert! -// Convert my nasty stored-as-decimal permissions into literal octal equivalent (i.e. 777 => 0777) - - int decimal_perms = pm->m_config.m_file_permissions; - int octal_perms = ((decimal_perms / 100) << 6) | ((decimal_perms % 100 / 10) << 3) | (decimal_perms % 10); - - tvhlog(LOG_DEBUG, "pass", "Creating file \"%s\" with octal permissions \"%o\"", filename, octal_perms); - fd = open(filename, O_WRONLY | O_CREAT | O_TRUNC, octal_perms); + tvhlog(LOG_DEBUG, "pass", "Creating file \"%s\" with file permissions \"%o\"", filename, pm->m_config.m_file_permissions); + + fd = open(filename, O_WRONLY | O_CREAT | O_TRUNC, pm->m_config.m_file_permissions); if(fd < 0) { pm->pm_error = errno; diff --git a/src/muxer/tvh/mkmux.c b/src/muxer/tvh/mkmux.c index a810cb35..35b03507 100644 --- a/src/muxer/tvh/mkmux.c +++ b/src/muxer/tvh/mkmux.c @@ -1050,13 +1050,10 @@ mk_mux_open_file(mk_mux_t *mkm, const char *filename, int permissions) { int fd; -// Very ugly hack alert! -// Convert my nasty stored-as-decimal permissions into literal octal equivalent (i.e. 777 => 0777) + tvhlog(LOG_DEBUG, "mkv", "Creating file \"%s\" with file permissions \"%o\"", filename, permissions); + + fd = open(filename, O_WRONLY | O_CREAT | O_TRUNC, permissions); - int octal_perms = ((permissions / 100) << 6) | ((permissions % 100 / 10) << 3) | (permissions % 10); - - tvhlog(LOG_DEBUG, "mkv", "Creating file \"%s\" with octal permissions \"%o\"", filename, octal_perms); - fd = open(filename, O_WRONLY | O_CREAT | O_TRUNC, octal_perms); if(fd < 0) { mkm->error = errno; tvhlog(LOG_ERR, "mkv", "%s: Unable to create file, open failed -- %s", diff --git a/src/tvheadend.h b/src/tvheadend.h index ace8a63e..852ceab9 100644 --- a/src/tvheadend.h +++ b/src/tvheadend.h @@ -628,6 +628,13 @@ int rmtree ( const char *path ); char *regexp_escape ( const char *str ); +//IH +// Helper functions to convert between string/decimal literals and octal notation (i.e. 777 => 0777 => 777) +// Potentially superseded by other methods + +int decimal_to_octal ( const int decimal ); +int octal_to_decimal ( const int octal ); + #define SKEL_DECLARE(name, type) type *name; #define SKEL_ALLOC(name) do { if (!name) name = calloc(1, sizeof(*name)); } while (0) #define SKEL_USED(name) do { name = NULL; } while (0) diff --git a/src/utils.c b/src/utils.c index 6eab4ec7..f8d45f60 100644 --- a/src/utils.c +++ b/src/utils.c @@ -473,3 +473,25 @@ regexp_escape(const char* str) *b = 0; return tmp; } + +//IH - no longer needed? Delete afterwards as required. I think snprintf and strtol have superseded them, though + +int +decimal_to_octal(const int decimal) +{ + int octal; + + octal = ((decimal / 100) * 64) | ((decimal % 100 / 10) * 8) | (decimal % 10); + + return octal; +} + +int +octal_to_decimal(const int octal) +{ + int decimal; + + decimal = ((octal / 64) * 100) | ((octal % 64 / 8) * 10) | (octal % 8); + + return decimal; +} diff --git a/src/webui/extjs.c b/src/webui/extjs.c index 9e369644..81f60c73 100755 --- a/src/webui/extjs.c +++ b/src/webui/extjs.c @@ -970,6 +970,7 @@ extjs_dvr(http_connection_t *hc, const char *remain, void *opaque) int flags = 0; dvr_config_t *cfg; epg_broadcast_t *e; + char buffer[5]; //IH - leading zero, three octal digits plus terminating null if(op == NULL) op = "loadSettings"; @@ -1126,8 +1127,15 @@ extjs_dvr(http_connection_t *hc, const char *remain, void *opaque) r = htsmsg_create_map(); htsmsg_add_str(r, "storage", cfg->dvr_storage); htsmsg_add_str(r, "container", muxer_container_type2txt(cfg->dvr_mc)); - htsmsg_add_u32(r, "filePermissions", cfg->dvr_muxcnf.m_file_permissions); - htsmsg_add_u32(r, "dirPermissions", cfg->dvr_muxcnf.m_directory_permissions); + +//IH Convert integer permissions to an octal-format string and store it in the config file + + snprintf(buffer,5,"%o",cfg->dvr_muxcnf.m_file_permissions); + htsmsg_add_str(r, "filePermissions", buffer); + snprintf(buffer,5,"%o",cfg->dvr_muxcnf.m_directory_permissions); + htsmsg_add_str(r, "dirPermissions", buffer); +// + htsmsg_add_u32(r, "cache", cfg->dvr_muxcnf.m_cache); htsmsg_add_u32(r, "rewritePAT", !!(cfg->dvr_muxcnf.m_flags & MC_REWRITE_PAT)); @@ -1168,13 +1176,31 @@ extjs_dvr(http_connection_t *hc, const char *remain, void *opaque) if((s = http_arg_get(&hc->hc_req_args, "container")) != NULL) dvr_container_set(cfg,s); - - if((s = http_arg_get(&hc->hc_req_args, "filePermissions")) != NULL) - dvr_file_permissions_set(cfg,atoi(s)); +//IH +// Convert the octal string permissions to integer + +// Theoretical risk of overflowing the (int) cast from long, but this shouldn't ever happen in normal use +// Only if someone's been dicking about with the config by hand +// and then a plague be upon their houses + + if((s = http_arg_get(&hc->hc_req_args, "filePermissions")) != NULL) + dvr_file_permissions_set(cfg,(int)strtol(s,NULL,0)); + +// tvhlog(LOG_INFO, "extjs.c", "****** Testing string \"%s\"", s); +// tvhlog(LOG_INFO, "extjs.c", "****** Testing decimal \"%i\"", (int)strtol(s,NULL,0)); +// tvhlog(LOG_INFO, "extjs.c", "****** Testing octal \"%o\"", (int)strtol(s,NULL,0)); + +// tvhlog(LOG_INFO, "extjs.c", "****** Line 1190+ - File permissions set to decimal \"%i\"", cfg->dvr_muxcnf.m_file_permissions); +// tvhlog(LOG_INFO, "extjs.c", "****** Line 1190+ - equivalent to octal \"%o\"", cfg->dvr_muxcnf.m_file_permissions); + if((s = http_arg_get(&hc->hc_req_args, "dirPermissions")) != NULL) - dvr_directory_permissions_set(cfg,atoi(s)); - + dvr_directory_permissions_set(cfg,(int)strtol(s,NULL,0)); + +// tvhlog(LOG_INFO, "extjs.c", "****** Line 1190+ = Dir permissions set to decimal \"%i\"", cfg->dvr_muxcnf.m_directory_permissions); +// tvhlog(LOG_INFO, "extjs.c", "****** Line 1190+ = equivalent to octal \"%o\"", cfg->dvr_muxcnf.m_directory_permissions); + + if((s = http_arg_get(&hc->hc_req_args, "cache")) != NULL) dvr_mux_cache_set(cfg,atoi(s)); diff --git a/src/webui/static/app/dvr.js b/src/webui/static/app/dvr.js index 63fde3f5..9b9163bf 100644 --- a/src/webui/static/app/dvr.js +++ b/src/webui/static/app/dvr.js @@ -829,15 +829,15 @@ tvheadend.dvrsettings = function() { name : 'storage' }); -/* NB: recordingPermissions is defined as a TextField for validation purposes (leading zeros), but is ultimately a decimal number */ +/* NB: recordingPermissions is defined as a TextField for validation purposes (leading zeros), but is ultimately a number */ var recordingPermissions = new Ext.form.TextField({ - regex : /^[0-7]{3}$/, + regex : /^[0][0-7]{3}$/, maskRe : /[0-7]/, width : 100, allowBlank : false, - blankText : 'You must provide a value - use octal chmod notation, e.g. 664', - fieldLabel : 'File permissions (octal, e.g. 664)', + blankText : 'You must provide a value - use octal chmod notation, e.g. 0664', + fieldLabel : 'File permissions (octal, e.g. 0664)', name : 'filePermissions' }); @@ -865,15 +865,15 @@ tvheadend.dvrsettings = function() { /* Subdirectories and filename handling */ -/* NB: directoryPermissions is defined as a TextField for validation purposes (leading zeros), but is ultimately a decimal number */ +/* NB: directoryPermissions is defined as a TextField for validation purposes (leading zeros), but is ultimately a number */ var directoryPermissions = new Ext.form.TextField({ - regex : /^[0-7]{3}$/, + regex : /^[0][0-7]{3}$/, maskRe : /[0-7]/, width : 100, allowBlank : false, - blankText : 'You must provide a value - use octal chmod notation, e.g. 775', - fieldLabel : 'Directory permissions (octal, e.g. 775)', + blankText : 'You must provide a value - use octal chmod notation, e.g. 0775', + fieldLabel : 'Directory permissions (octal, e.g. 0775)', name : 'dirPermissions' });