LINUX.ORG.RU

termcap сегфолтит в арче

 , ,


0

1

Собсно столкнулся с немного странной проблемой при использовании термкапа: при попытке использования каких либо команд тот падает лицом в асфальт, выдавая ошибку сегментации. Поначалу грешил на свой код, но в результате тестов, оказалось, что сегфолтит даже простейший мейник вида:

int main(void)
{
	struct termios	term, cur_term;
	int width;

	tcgetattr(0, &term);
	cur_term = term;
	cur_term.c_lflag &= (unsigned long)~(ICANON | ECHO | ECHONL);
	tcsetattr(0, TCSANOW, &cur_term);
	width = tgetnum("co");
	printf("%d\n", width);
	tcsetattr(0, TCSANOW, &term);
}
сегфолт в данном случае возникает в момент вызова tgetnum, но точно такой же результат возникнет и при вызове любой другой функции из библиотеки. Тестировал в termite, urxvt и xterm. Сам termcap установлен из AUR.

Тот же код вполне адекватно работает под убунтой и макосью. ЧЯДНТ?

Может оно линкуется не с тем, что надо, и падает на обращении к не найденной функции. На арче curses случайно собирается не с отдельной tinfo библиотекой?

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

на шаге вызова tgetnum ломается. с тем выводом, что выше. дальше тока брать termcap из сорцов? или нет смысла?

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

на шаге вызова tgetnum ломается. с тем выводом, что выше.

Я как то подробно расписал. А ты как отмахнулся, либо поленился что ли? Так не пойдёт.

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

брать termcap из сорцов?

Он из AUR, т.е. и так из сорцов. Попробуй переустанови (при этом произойдёт пересборка).

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

facepalm.jpg да уж, как-то тупо вышло. (ノ_<。) работает. скомпилил свой код с tinfo вместо termcap - тоже всё ок вроде, никаких проблем не обнаружил. из чего вопрос собственно: они взаимозаменяемы? и собсно почему в арче так?

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

они взаимозаменяемы? и собсно почему в арче так?

Что то логика хромать начинает по-моему. Если что-то не так с версиями либ, у тебя сегфолта не будет, у тебя просто прога не соберётся. Сегфолт будет только если ты забыл где то память выделить. Так при чём здесь arch?

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

в смысле, что не так? выполнение мейника пошагово происходит без каких либо проблем, при выполнении строки с tgetnum выводится ошибка, которую я писал выше.

Program received signal SIGSEGV, Segmentation fault.
0x00007ffff7fab2ee in ?? () from /usr/lib/libtermcap.so
хоть при переходе next'ом, хоть step'ом. потому я и спросил про сорцы, есть ли смысл компилить сам termcap для дегаба, чтобы иметь возможность попасть внутрь или нет.

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

выводится ошибка, которую я писал выше.

Ты строчки, что выше ошибки написать не можешь? Хотя бы пяток? Телепаты и Кашпировские в отпуску.

Deleted
()
Последнее исправление: Deleted (всего исправлений: 1)
Ответ на: комментарий от Deleted
Starting program: /home/reineke/a.out 

Breakpoint 1, main () at term.c:6
6	{
(gdb) n
10		tcgetattr(0, &term);
(gdb) n
11		cur_term = term;
(gdb) n
12		cur_term.c_lflag &= (unsigned long)~(ICANON | ECHO | ECHONL);
(gdb) n
13		tcsetattr(0, TCSANOW, &cur_term);
(gdb) n
14		tgetent(0, getenv("term"));
(gdb) n
15		width = tgetnum("co");
(gdb) n

Program received signal SIGSEGV, Segmentation fault.
0x00007ffff7fab2ee in ?? () from /usr/lib/libtermcap.so
(gdb) 
Reineke
() автор топика
Ответ на: комментарий от Reineke

из чего вопрос собственно: они взаимозаменяемы?

Вообще, я думал, что приложение линковалось с curses, в котором отсутствовала функция, вынесенная в tinfo. Оно на нём не валилось видимо из-за наличия какой-то дополнительной проверки в коде.

tinfo, насколько я понимаю, предоставляет интерфейс совместимый с termcap, но к базе terminfo. Т.е. это разные вещи, просто API совпадает. Сореджимое тоже более-менее совпадает, terminfo – вроде более новый формат тех же данных.

и собсно почему в арче так?

Неопределённое поведение оно такое. Может в других системах оно как-то инициализируется иначе. На арче оно просто проявилось.

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

Program received signal SIGSEGV, Segmentation fault.

И во всех примерах выделяется память:

Interrogating the Terminal Description

char *buffer = (char *) malloc (strlen (term_buffer));

UNIX & GNU/Linux - System calls - Using tgetnum()

char  *bp;
bp = malloc(sizeof(*bp));
tgetent(bp, term);

PS: zvezdochiot (03.04.2019 15:31:19)

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

Спасибо. Предложение «The emulation ignores the buffer pointer bp.» в мане когда-то сбила с толку.

Бтв, termcap работать корректно всё равно отказывается, tgetnum возвращает -1. Для теста брал код с UNIX & GNU/Linux - System calls - Using tgetnum(). Тот же код, скомпилированный с -ltinfo или с -lncurses (как указано в самом гайде и который как указали выше исопльзует тот же terminfo) вместо -ltermcap работает нормально. Видимо, использовать устаревший termcap всё же не стоит.

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