LINUX.ORG.RU
ФорумTalks

[ЖЖ] видео с youtube'а снова в /tmp

 


1

3

Несколько раз поднималась тема сохранения видео из 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.

Две версии нужны для плагинов разной разрядности.

★★★★★

Последнее исправление: i-rinat (всего исправлений: 1)
Ответ на: комментарий от Sonsee

> зачем сохранять ролики с ютуба?
ты не поверишь, инет не везде есть =) бывает нужно кому то показать.
А я уже подумал что mencoder отменили и mplayer'ом можно конвертировать, сбил ты мну с толку свом «$1»

FollowTheRabbit
()

Правильное дело делаешь, товарищь! Сделал для себя лучше, поделись с другими! Поддерживаю.

Только вот разметка

 if (!strncmp(pathname, "/tmp/FlashXX", 12)){
   return 0;
    }else{
   return _unlink(pathname);
    }
не красивая.

nanoo_linux
()
Ответ на: комментарий от nanoo_linux

> Сделал для себя лучше, поделись с другими!
Кажется, ты единственный, кто понял идею.

Только вот разметка

LORCODE съедает табы.

i-rinat ★★★★★
() автор топика
Ответ на: комментарий от i-rinat
// 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)
{
	_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;

	_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;
		if (!strncmp(buf, "/tmp/FlashXX", 12)) {
			_unlink(buf);
		}
	}
	return _fclose(fp);
}

умвр. может ты язык не указал? «code=C» в открывающем теге попробуй.

nanoo_linux
()
Ответ на: комментарий от nanoo_linux

Точно, не указал. Учту на будущее. Спасибо.

i-rinat ★★★★★
() автор топика
Ответ на: комментарий от Xenius

> Смотря про какую свободу выбора ты говоришь.

Свобода выбирать между свободными и проприентарными программами. Для меня и firefox и flashplayer одинаково «закрыты»; даже если код программы и открыт, разобраться там сходу весьма затруднительно. Я могу лишь доверять или не доверять авторам.

i-rinat ★★★★★
() автор топика
Ответ на: комментарий от i-rinat

Но если в случае флеш-плеера тебе остаётся полагаться только на adobe, то код такой популярной программы, как firefox очень часто просматривается сторонними разработчиками — в том числе и конкурентами, которые бы постарались поднять шум, обнаружив к этому повод.

Вот например в дебиане мейнтейнер допустил ошибку в libSSL, так сколько шума было.

К тому же, уязвимости в СПО закрываются гораздо оперативней чем в проприетарщине — где от обнаружения таковой до закрытия могут и месяцы пройти.

Xenius ★★★★★
()
Ответ на: комментарий от Xenius

[...] то код такой популярной программы, как firefox очень часто просматривается сторонними разработчиками [...]

В openbsd тоже буча поднялась, когда кто-то там потроллил. Код не просматривался годами, все надеялись, что кто-то уже посмотрел.

Если у меня вдруг возникнет насущное желание посмотреть код, то скорее всего оно будет спровоцировано некорректной работой какого-то блока. Я полезу сначала искать тот кусок кода, а затем буду пытаться в нём разобраться. Максимум это будет около тысячи строк кода. Из семи миллионов в firefox'е. Да и все остальные вряд ли в состоянии на два порядка больше посмотреть. А уж более-менее полный аудит того, что просматривают, могут провести только разработчики, плотно занимающиеся конкретно этим софтом.

К тому же, уязвимости в СПО закрываются гораздо оперативней чем в проприетарщине

Большей частью верно, но это касается только безопасности. А вот до кода, который в kio (kde) кривые tar'ы делает как-то руки не доходят. Не говоря уже о xkb с переключением раскладок при отпускании кнопок, а не при нажатии. Последнему багу уже скоро семь лет будет.

Я не против свободного ПО, напротив, мне очень нравится идея. Но факт наличия открытых исходников или какой-то определённой лицензии сами по себе ничего не дают.

i-rinat ★★★★★
() автор топика
Ответ на: комментарий от i-rinat

> Большей частью верно, но это касается только безопасности. А вот до кода, который в kio (kde) кривые tar'ы делает как-то руки не доходят. Не говоря уже о xkb с переключением раскладок при отпускании кнопок, а не при нажатии.

Я думаю, в проприетарщине таких багов не меньше будет... Неужели я ошибаюсь?

Xenius ★★★★★
()
Ответ на: комментарий от Xenius

> Я думаю, в проприетарщине таких багов не меньше будет.

Я это и имел в виду. Только в другую сторону. В свободном ПО таких багов не меньше (или не сильно меньше), чем в проприентарном. И задержки их исправления не меньше.

i-rinat ★★★★★
() автор топика
Ответ на: комментарий от i-rinat

firefox'а (7,3 млн. строк).

Откуда такие цифры? Можно первоисточник?

В одной презентации приводились примерно такие цифры: 1,7 млн. строк c++ и 1 млн. строк javascript.

sign
()
Ответ на: комментарий от sign

Откуда такие цифры? Можно первоисточник?

Да не вопрос:

rinat@laptop:/tmp/1$ apt-get source iceweasel
Чтение списков пакетов... Готово
Построение дерева зависимостей       
Чтение информации о состоянии... Готово
ВНИМАНИЕ: упаковка iceweasel поддерживается в системе контроля версий Git:
git://git.debian.org/git/pkg-mozilla/iceweasel.git
Необходимо получить 41,4 Mб архивов исходного кода.
Получено:1 http://mirror.yandex.ru/debian/ wheezy/main iceweasel 3.5.18-1 (dsc) [2 778 B]
Получено:2 http://mirror.yandex.ru/debian/ wheezy/main iceweasel 3.5.18-1 (tar) [41,1 MB]
Получено:3 http://mirror.yandex.ru/debian/ wheezy/main iceweasel 3.5.18-1 (diff) [355 kB]                                            
Получено 41,4 MБ за 1мин 28с (466 kБ/c)                                                                                              
dpkg-source: инфо: извлечение iceweasel в iceweasel-3.5.18
dpkg-source: инфо: распаковывается iceweasel_3.5.18.orig.tar.bz2
dpkg-source: инфо: распаковывается iceweasel_3.5.18-1.debian.tar.gz
[...]
тут dpkg накладывал патчи
[...]
rinat@laptop:/tmp/1$ ( find iceweasel-3.5.18/ -type f | xargs cat ) | wc -l
cat: iceweasel-3.5.18/other-licenses/nsis/Contrib/UAC/UAC: Нет такого файла или каталога
cat: Readme.html: Нет такого файла или каталога
7364723
rinat@laptop:/tmp/1$ 

Там что-то с пробелами в именах, не сильно влияет.

i-rinat ★★★★★
() автор топика
Ответ на: комментарий от LongLiveUbuntu

фф некажет h.264, только webm.
Но:
1. видео с рекламой требует флэш.
2. этот webm жрет процессор нехуже флэша, даже на сранном 360p.
3. нету нормального фулскрина.
4. какой то петросян позабавился с сохранением видео.

При этом h.264:
1. просто забивает на рекламу и крутит ролик без нее.
2. играется нативно квиктаймом, используя минимум ресурсов.
3. из чего следует нормальный режим фулскрина.
4. нормально сохраняется по правому клику.

Так, что, пока недопилят этот ололо прорыв тысячелетия под названием webm, гореть ему в уютненьком аду напару с флэшем.
Такие вот дела.

kostian ★★★★☆
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.