Bug 6257 - irattach logs bad error message on TIOCSETD failure
Summary: irattach logs bad error message on TIOCSETD failure
Status: CLOSED FIXED
Alias: None
Product: Sisyphus
Classification: Development
Component: irda-utils (show other bugs)
Version: unstable
Hardware: all Linux
: P2 normal
Assignee: Nobody's working on this, feel free to take it
QA Contact: qa-sisyphus
URL:
Keywords:
Depends on:
Blocks:
 
Reported: 2005-03-12 18:58 MSK by Sergey Vlasov
Modified: 2006-12-17 23:18 MSK (History)
1 user (show)

See Also:


Attachments
irda-utils-0.9.16-alt-irattach-daemonize.patch (844 bytes, patch)
2006-09-02 23:55 MSD, Sergey Vlasov
no flags Details | Diff

Note You need to log in before you can comment on or make changes to this bug.
Description Sergey Vlasov 2005-03-12 18:58:30 MSK
В irda-utils-0.9.16/irattach/irattach.c есть следующий код:

	if (ioctl(ttyfd, TIOCSETD, &irdadisc) < 0){
		fprintf(stderr,  
			 "Maybe you don't have IrDA support in your kernel?\n");
		syslog(LOG_ERR, "irattach: tty: set_disc(%d): %s\n", 
			irdadisc, strerror(errno));
		clean_exit(-1);
	}

Если вызов TIOCSETD завершается с ошибкой (например, в случае проблем с
загрузкой модуля irtty_sir), сообщение об этом должно писаться в syslog - оно
туда и записывается, но с неверным кодом ошибки:

irattach: tty: set_disc(11): Bad file descriptor

Т.е., создаётся впечатление, что вызов TIOCSETD вернул в errno код ошибки EBADF,
хотя strace показывает другую ситуацию:

ioctl(3, TIOCSETD, [11])          = -1 EINVAL (Invalid argument)
write(2, "Maybe you don\'t have IrDA suppor"..., 50) = -1 EBADF (Bad file
descriptor)

Дело в том, что ещё раньше irattach вызывает fork_now(), где в том числе
закрываются все открытые ранее файловые дескрипторы, в том числе и
stdin/stdout/stderr. Поэтому fprintf(stderr, ...) завершается с ошибкой, и этот
код ошибки затирает код, полученный ранее от TIOCSETD.

Вообще закрытие дескрипторов 0, 1, 2 чревато странными проблемами; обычно в
подобных случаях открывают /dev/null (см., например, man 3 daemon).
Comment 1 Michael Shigorin 2006-08-10 11:06:48 MSD
А можно патчик для тупых новых майнтейнеров? :)
Comment 2 Michael Shigorin 2006-09-02 23:33:56 MSD
Найти ничего готового не вышло, читать daemon() чуточку выходит за рамки
намеченного на ближайшие три месяца... попросил в sisyphus@, кому нетрудно. 
Comment 3 Damir Shayhutdinov 2006-09-02 23:39:09 MSD
запись в stderr наверное оставлена для тех случаев. когда сервер запускается с
отладкой, и stderr не закрывается. 
Перестановка строчек syslog и fprintf должна решить проблему.
Comment 4 Sergey Vlasov 2006-09-02 23:55:59 MSD
Created attachment 1615 [details]
irda-utils-0.9.16-alt-irattach-daemonize.patch

- irattach: daemonize properly:
  + close fds up to sysconf(_SC_OPEN_MAX) instead of hardcoded 64;
  + redirect stdin/out/err to /dev/null instead of leaving them closed (#6257).
Comment 5 at@altlinux.org 2006-09-03 15:29:56 MSD
Мужыки EBADF получился из-за fprintf(stderr), если fd=2 уже закрыт.
Переставьте syslog и fprintf местами либо сохраняйте errno.
man errno |col -b |grep -A33 ^NOTES
Comment 6 at@altlinux.org 2006-09-03 15:46:58 MSD
Кстати у syslog() есть формат %m.
Comment 7 Michael Shigorin 2006-09-03 21:43:35 MSD
Да уже приложил приложенное.  Надо в апстрим закинуть вместе с твоей/Lost's
рекомендацией.
Comment 8 Michael Shigorin 2006-09-03 22:15:07 MSD
Учтено в 0.9.16-alt3 и закинуто в апстрим:
http://sourceforge.net/tracker/index.php?func=detail&aid=1551560&group_id=5616&atid=305616

Всем спасибо :-)