Несколько раз поднималась тема сохранения видео из flashplayer'а. Вот менее монстрообразный костыль.
unlinkfix.c:
// gcc -fPIC -c -o unlinkfix.o unlinkfix.c
// gcc -shared -o unlinkfix.so unlinkfix.o -ldl
#define _GNU_SOURCE
#include <dlfcn.h>
#define _FCNTL_H
#include <bits/fcntl.h>
#include <stdio.h>
#include <unistd.h>
extern int errno;
int (*_unlink)(const char *pathname);
int (*_fclose)(FILE *fp);
int unlink(const char *pathname){
//printf("unlink `%s`\n", pathname);
_unlink = (int (*)(const char *pathname)) dlsym(RTLD_NEXT, "unlink");
if (!strncmp(pathname, "/tmp/FlashXX", 12)){
return 0;
}else{
return _unlink(pathname);
}
}
int fclose(FILE *fp){
int fd = fileno(fp);
char buf[4096];
char fdpath[512];
int len;
//printf("fclose fd=%d, ", fd);
_unlink = (int (*)(const char *pathname)) dlsym(RTLD_NEXT, "unlink");
_fclose = (int (*)(FILE *fp)) dlsym(RTLD_NEXT, "fclose");
sprintf(fdpath, "/proc/%d/fd/%d", getpid(), fd);
len = readlink(fdpath, buf, 4096);
if (len > 0){
buf[len] = 0;
//printf("`%s`", buf);
if (!strncmp(buf, "/tmp/FlashXX", 12)){
//printf(", removing it");
_unlink(buf);
}
//printf("\n");
}
return _fclose(fp);
}
Makefile:
all:
gcc -fPIC -c -o unlinkfix64.o unlinkfix.c
gcc -shared -o unlinkfix64.so unlinkfix64.o -ldl
gcc -m32 -fPIC -c -o unlinkfix32.o unlinkfix.c
gcc -m32 -shared -o unlinkfix32.so unlinkfix32.o -ldl
Получившиеся .so загрузить через LD_PRELOAD.
Две версии нужны для плагинов разной разрядности.