Isso pode não ser possível, mas... Eu tenho um aplicativo de terceiros (mumble para os curiosos) que pode ser instruído a abrir um arquivo para gravação (eu forneço o nome) e despejar bytes nele até que seja dito para parar. Ele não abre o arquivo para anexar e se o arquivo já existir muda o nome e tenta novamente. Tudo bem, bom e bastante padrão. Ele pode gravar por horas (e preencherá o disco com prazer, que é o problema).
Eu quero interceptar tudo que ele escreve e ler de outro processo; idealmente, ele nunca chegaria ao disco, mas aceitarei compromissos onde alguns deles chegarem.
A solução óbvia, para ler o arquivo como está escrito, truncate() o que eu leio e leio novamente, não funcionará para mim, porque o arquivo não ficará menor quando eu truncar - mumble não especifica append, então continuará escrevendo de onde parou. Idealmente, eu preciso de alguma maneira de enganá-lo para pensar que ele criou e está escrevendo um arquivo normal, enquanto na verdade está apenas canalizando tudo para mim. Não quero escrever meu próprio código de sistema de arquivos para isso (a menos que seja muito mais fácil do que parece).
Em última análise, eu quero obter o som gravado, fazer um hash e alimentá-lo para /dev/random. Apenas apontar mumble para /dev/random não funciona porque /dev/random existe, então ele não será usado.
existe um truque inteligente para isso? Se não, existe alguma maneira de escrever código de userland que se pareça com um diretório? Se tudo mais falhar, é bastante simples escrever um sistema de arquivos que possa fazer o que eu preciso?
Você pode usar LD_PRELOAD para fazer o mumble carregar uma biblioteca que você especificar antes de todas as outras bibliotecas. Você pode escrever uma pequena biblioteca com custom
open()
/stat()
/etc que, dependendo do nome do arquivo, passa a chamada para a biblioteca C padrão para comportamento padrão ou faz algo especial para enganar o mumble.