Re: quasi-[OT] Adobe Flash

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



On Saturday, October 23, 2010 14:44:25 Patrick O'Callaghan wrote:
> On Sat, 2010-10-23 at 12:27 +0100, Marko Vojinovic wrote:
> > On Saturday, October 23, 2010 04:27:45 Patrick O'Callaghan wrote:
> > > On Thu, 2010-10-21 at 21:33 -0600, Petrus de Calguarium wrote:
> > > > Fortunately, Suvayu's brilliant script gets around that and manages
> > > > to access the file, even though it is already deleted, while
> > > > Patrick's suggestion of hard linking to it does not work, because it
> > > > is already deleted, unless he also has some ingenious trick up his
> > > > sleeve to "get a handle on" the deleted file.
> > > 
> > > Yes, it's a neat trick. However the 'cp' will terminate when it reaches
> > > the end of the input file, even if it's still being written to by the
> > > flash process. That would explain why the output is sometimes
> > > truncated. Getting round that would need a copy process that waits to
> > > see if there's more output, either by polling or by using inotify. IOW
> > > something conceptually similar to "tail -f".
> > 
> > Just to follow that idea, would something like
> > 
> > tail -f /proc/<pid>/fd/<file_id>   > /tmp/flashfile.flv
> > 
> > work? (Maybe with a couple more switches to tail, to start from the
> > beginning of the file, etc...)
> 
> I suspect that 'tail' is designed for text files (it has options for how
> many lines to output etc.) 'man tail' is not very clear on whether it
> can work for binary files, e.g. what happens when it gets a null byte in
> the stream? Some experimentation is in order.
> 
> Also, 'tail -f' will sit forever waiting for input, even if nothing is
> writing to the file. The present case is slightly different in that we
> can assume (until Adobe changes it again ...) that a single process is
> writing to the Flash buffer file, hence the idea of using inotify to
> notice when the writer has gone. However on second thoughts that may not
> be necessary. Given that the /proc file will disappear when the writer
> dies, it would be enough to loop until getting an error (EIO?, not
> sure).

Well, without wasting much time on this, I tried to copy a random .jpg file I 
had lying around, using the following:

tail -q --bytes=1G file1.jpg  >  file2.jpg

That produced file2.jpg which was exactly the same as file1.jpg. This suggests 
that tail would work correctly for binary files (or at least this one that I 
tried :-) ).

Looking at man tail, I found the following to be useful for this particular 
purpose:

 --bytes  enables us to specify the initial number of bytes that are to be 
read (starting from the bottom of the file). Like in my example above, a big 
enough value (1G) would ensure the file is being read from the very beginning.

 -q disables any headings and stuff that might corrupt a binary file.

 -f would keep reading the file and appending the output until tail dies.

 --pid would enable tail to monitor the process that writes to the file and 
terminate itself automatically when the write is complete.

Granted, I have no idea what happens if tail receives a null byte, but I guess 
it should ignore it, since (with -f) it will keep watching if the file gets 
appended subsequently. So it should not terminate after a null, by design. One 
should examine the source code of tail or experiment with various binary 
inputs to determine exact behavior, but I have a feeling it should work.

So, given the <pid> and <file_id> information, hopefully this should Just Work:

tail -f -q --bytes=1G --pid=<pid>  /proc/<pid>/fd/<file_id>   > /tmp/flashfile.flv

Haven't tried it, though :-) . I guess the one gigabyte size value is bigger 
than any flash file one can find to download from Internet, so it should be ok.

As for the <pid>, my guess is that the process that opens the file for writing 
is the only one allowed to actually write to it, since otherwise one can get a 
race condition and data might get corrupted. Once that process dies, tail will 
die along with it, leaving a clean /tmp/flashfile.flv as a result. At least that 
is my theory. ;-)

Now, all that is needed is that someone write a script and try it out. I am 
not very versatile with extracting <pid> and <file_id> and such stuff, but 
otherwise the script should be trivial. :-)

Best, :-)
Marko

-- 
users mailing list
users@xxxxxxxxxxxxxxxxxxxxxxx
To unsubscribe or change subscription options:
https://admin.fedoraproject.org/mailman/listinfo/users
Guidelines: http://fedoraproject.org/wiki/Mailing_list_guidelines


[Index of Archives]     [Current Fedora Users]     [Fedora Desktop]     [Fedora SELinux]     [Yosemite News]     [Yosemite Photos]     [KDE Users]     [Fedora Tools]     [Fedora Docs]

  Powered by Linux