[mythtv] mutliple storage directories idea... ?

Michael T. Dean mtdean at thirdcontact.com
Fri Nov 4 14:13:32 EST 2005


Joseph A. Caputo wrote:

>On Thursday 03 November 2005 21:51, Michael T. Dean wrote:
>  
>
>>I was looking for a way to derive the basename from the pathname even 
>>in  
>>the situation where the basename contains directory information 
>>(allowing recordings to be stored in subdirectories of the recordings 
>>directory).  So, just taking the filename doesn't work.
>>    
>>
>Sorry to come late to the party...
>
No problem.  The more the merrier...

> IIUC, you have a pathname and you 
>want to somehow determine which part of it is the basename (which may 
>or may not include an arbitrary number of levels tail-end directories).  
>Do I have that correct?  Is the pathname you're parsing an absolute 
>path?  If so I have some ideas...
>  
>
It's the pathname field in the ProgramInfo class, and, specifically, the 
use of it to derive a basename on line 1222.

http://svn.mythtv.org/trac/browser/trunk/mythtv/libs/libmythtv/programinfo.cpp?rev=7720#L1217

The current code assumes that the basename is the filename at the end of 
pathname.  However--like you said--I would like for it to allow the 
inclusion of "an arbitrary number of levels" of subdirectory information 
(to allow for grouping of recordings, or--more importantly--the use of 
multiple filesystems for storage of recordings (although it does require 
manually moving the files after recording).

AIUI, the pathname may be an absolute path /or/ may be a "myth://" 
path.  Therefore, and because of the possibility of multiple 
RecordFilePrefixes when using multiple backends, we can't just strip the 
RecordFilePrefix.  We could check for "myth://" and if not there, 
attempt to strip all possible RecordFilePrefixes but that would not be 
very elegant and would likely require querying the DB (which defeats the 
purpose of deriving the basename from pathname in the first place).  
And, even if we did this, we wouldn't be handling the situation where 
the pathname is a "myth://" path, so files in subdirectories that were 
recorded by remote backends would always be streamed--even if they're 
available through a network filesystem.

The only "sure-fire" approaches I can think of are to a) add an explicit 
basename field to ProgramInfo in addition to the pathname field or b) 
disable the code that derives basename from pathname and query the DB 
every time GetRecordBasename is called.  I've done b) in my tree and it 
seems to work quite well, but I wasn't willing to call it "ready for 
primetime," so I was hoping for some dialog.  It may also have an effect 
on videos not recorded by Myth, but I haven't looked into that (and I 
don't use the Internal player for my non-Myth videos).

Also, I want to ensure that this doesn't cause any additional security 
concerns over the current solution.  Bruce had some concerns about this, 
but I don't think the extent of the change was obvious, since at the 
point he replied, most of the information about the the proposed change 
was spread out over several posts in the thread--and I never explicitly 
asked, "is there a way to derive basename from pathname if we allow 
subdirectory information in basenames?"  I think he may have thought I 
was proposing the use of an absolute pathname, instead, and I completely 
agree this would be a major security problem.  We've had part of a 
dialog offline, but he hasn't yet replied to my reply from yesterday.  
However, the approach he proposed is significantly better than mine, and 
he indicated he has some code already.  See 
http://www.gossamer-threads.com/lists/mythtv/dev/158425#158425 .

Attached is a patch that shows b) (but doesn't fix indentation to make 
the true extent of the change more obvious).  Sorry if this post is too 
long, but I'm trying to group together much of the information that's 
spread throughout this thread.

Mike
-------------- next part --------------
Index: libs/libmythtv/programinfo.cpp
===================================================================
--- libs/libmythtv/programinfo.cpp	(revision 7682)
+++ libs/libmythtv/programinfo.cpp	(working copy)
@@ -1218,10 +1218,6 @@
 {
     QString retval = "";
 
-    if (!pathname.isEmpty())
-        retval = pathname.section('/', -1);
-    else
-    {
         MSqlQuery query(MSqlQuery::InitCon());
         query.prepare("SELECT basename FROM recorded "
                       "WHERE chanid = :CHANID AND "
@@ -1238,7 +1234,6 @@
             query.next();
             retval = query.value(0).toString();
         }
-    }
 
     return retval;
 }               


More information about the mythtv-dev mailing list