Note that this will not work without the intervention of someone who actually knows what they're doing ;-)
<table class="hts-doc-text" border="0">
<tr><td>Common examples:</td></tr>
<br>
- <tr><td>644 == rw-r--r--</td></tr>
- <tr><td>664 == rw-rw-r-- (default)</td></tr>
- <tr><td>666 == rw-rw-rw-</td></tr>
+ <tr><td>0644 == rw-r--r--</td></tr>
+ <tr><td>0664 == rw-rw-r-- (default)</td></tr>
+ <tr><td>0666 == rw-rw-rw-</td></tr>
</table>
- 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 <i>Directory permissions</i> in <i>Subdirectory Options</i>.
<table class="hts-doc-text" border="0">
<tr><td>Common examples:</td></tr>
<br>
- <tr><td>755 == rwxr--r--</td></tr>
- <tr><td>775 == rwxrwxr-- (default)</td></tr>
- <tr><td>777 == rwxrwxrwx</td></tr>
+ <tr><td>0755 == rwxr--r--</td></tr>
+ <tr><td>0775 == rwxrwxr-- (default)</td></tr>
+ <tr><td>0777 == rwxrwxrwx</td></tr>
</table>
- 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 <i>File permissions</i> in <i>Recording File Options</i>.
struct stat st;
uint32_t u32;
dvr_config_t *cfg;
-
+
dvr_iov_max = sysconf(_SC_IOV_MAX);
/* Default settings */
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;
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);
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",
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;
}
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;
{
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",
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)
*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;
+}
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";
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));
if((s = http_arg_get(&hc->hc_req_args, "container")) != NULL)
dvr_container_set(cfg,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,atoi(s));
+ 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));
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'
});
/* 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'
});