É difícil responder à sua pergunta exata porque não é necessariamente um erro tentar criar um arquivo que já existe. Dito isto, acho que você poderia resolver seu problema imediato com
bash-3.2# cat who.d
#include <fcntl.h>
syscall::open:entry
/arg1 & O_CREAT/
{
/* arg0 might not be paged-in yet */
self->pathp = arg0;
}
syscall::open:return
/self->pathp && basename(copyinstr(self->pathp)) == $$1/
{
printf("%s opened %s\n", execname, copyinstr(self->pathp));
/* free the thread-local storage */
self->pathp = NULL;
}
bash-3.2# dtrace -Cqs who.d testFile
touch opened testFile
^C
bash-3.2#
Não há dúvidas de que alguns casos de limite serão perdidos, por exemplo, um arquivo que foi aberto e depois renomeado.
Se for importante encontrar apenas o primeiro open()
, experimente o provedor fbt para procurar uma chamada de função que esteja presente apenas se o arquivo de destino ainda não existir. Normalmente, isso seria uma alocação inode (mas não um vnode). No entanto, acho que seria um trabalho difícil escrever algo robusto e, claro, não seria estável no que diz respeito às alterações do SO.