Skip to content

Commit

Permalink
Browse files Browse the repository at this point in the history
DVR: filename checker - more inteligent logic (keep extension), fixes…
… #3136
  • Loading branch information
perexg committed Oct 9, 2015
1 parent ba732b4 commit dbeee1c
Show file tree
Hide file tree
Showing 3 changed files with 60 additions and 7 deletions.
27 changes: 20 additions & 7 deletions src/dvr/dvr_rec.c
Expand Up @@ -612,7 +612,7 @@ pvr_generate_filename(dvr_entry_t *de, const streaming_start_t *ss)
struct tm tm;
dvr_config_t *cfg;
htsmsg_t *m;
size_t l, j;
size_t l, j, k;
long max;
int dir_dosubs;

Expand Down Expand Up @@ -719,6 +719,7 @@ pvr_generate_filename(dvr_entry_t *de, const streaming_start_t *ss)
max = pathconf(filename, _PC_NAME_MAX);
if (max < 8)
max = NAME_MAX;
max -= 2;
j = strlen(filename);
snprintf(filename + j, sizeof(filename) - j, "/%s", dirsep);
if (filename[j] == '/')
Expand All @@ -735,12 +736,24 @@ pvr_generate_filename(dvr_entry_t *de, const streaming_start_t *ss)
}
/* Check the maximum filename length */
l = strlen(number);
if (l + strlen(filename + j) > max) {
l = j + (max - l);
if (filename[l - 1] == '$') /* not optimal */
filename[l + 1] = '\0';
else
filename[l] = '\0';
k = strlen(filename + j);
if (l + k > max) {
s = (char *)htsstr_substitute_find(filename + j, '$');
if (s == NULL || s - (filename + j) < (l + k) - max) {
cut1:
l = j + (max - l);
if (filename[l - 1] == '$') /* not optimal */
filename[l + 1] = '\0';
else
filename[l] = '\0';
} else {
x = (char *)htsstr_escape_find(filename + j, s - (filename + j) - ((l + k) - max));
if (x == NULL)
goto cut1;
k = strlen(s);
memmove(x, s, k);
x[k] = '\0';
}
}

htsstr_substitute(filename + j, ptmp, sizeof(ptmp), '$', dvr_subs_tally, number, tmp, sizeof(tmp));
Expand Down
35 changes: 35 additions & 0 deletions src/htsstr.c
Expand Up @@ -101,6 +101,26 @@ htsstr_unescape_to(const char *src, char *dst, size_t dstlen)
return res;
}

const char *
htsstr_escape_find(const char *src, size_t upto_index)
{
while (upto_index && *src) {
if (*src == '\\') {
src++;
upto_index--;
if (*src == '\0' || upto_index == 0) {
src--;
break;
}
}
src++;
upto_index--;
}
if (*src)
return src;
return NULL;
}

static void
htsstr_argsplit_add(char ***argv, int *argc, char *s)
{
Expand Down Expand Up @@ -185,6 +205,21 @@ htsstr_argsplit_free(char **argv) {
free(argv);
}

const char *
htsstr_substitute_find(const char *src, int first)
{
while (*src) {
if (*src == '\\') {
src++;
if (*src == '\0')
break;
} else if (*src == first)
return src;
src++;
}
return NULL;
}

char *
htsstr_substitute(const char *src, char *dst, size_t dstlen,
int first, htsstr_substitute_t *sub, const void *aux,
Expand Down
5 changes: 5 additions & 0 deletions src/htsstr.h
Expand Up @@ -27,6 +27,8 @@ char *htsstr_unescape(char *str);

char *htsstr_unescape_to(const char *src, char *dst, size_t dstlen);

const char *htsstr_escape_find(const char *src, size_t upto_index);

char **htsstr_argsplit(const char *str);

void htsstr_argsplit_free(char **argv);
Expand All @@ -36,6 +38,9 @@ typedef struct {
const char *(*getval)(const char *id, const void *aux, char *tmp, size_t tmplen);
} htsstr_substitute_t;

const char *
htsstr_substitute_find(const char *src, int first);

char *
htsstr_substitute(const char *src, char *dst, size_t dstlen,
int first, htsstr_substitute_t *sub, const void *aux,
Expand Down

0 comments on commit dbeee1c

Please sign in to comment.