Bug 6257 - irattach logs bad error message on TIOCSETD failure
: irattach logs bad error message on TIOCSETD failure
Status: CLOSED FIXED
: Sisyphus
(All bugs in Sisyphus/irda-utils)
: unstable
: all Linux
: P2 normal
Assigned To:
:
:
:
:
:
  Show dependency tree
 
Reported: 2005-03-12 18:58 by
Modified: 2006-12-17 23:18 (History)


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


Note

You need to log in before you can comment on or make changes to this bug.


Description From 2005-03-12 18:58:30
В 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 From 2006-08-10 11:06:48 -------
А можно патчик для тупых новых майнтейнеров? :)
------- Comment #2 From 2006-09-02 23:33:56 -------
Найти ничего готового не вышло, читать daemon() чуточку выходит за рамки
намеченного на ближайшие три месяца... попросил в sisyphus@, кому нетрудно. 
------- Comment #3 From 2006-09-02 23:39:09 -------
запись в stderr наверное оставлена для тех случаев. когда сервер запускается с
отладкой, и stderr не закрывается. 
Перестановка строчек syslog и fprintf должна решить проблему.
------- Comment #4 From 2006-09-02 23:55:59 -------
Created an attachment (id=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 From 2006-09-03 15:29:56 -------
Мужыки EBADF получился из-за fprintf(stderr), если fd=2 уже закрыт.
Переставьте syslog и fprintf местами либо сохраняйте errno.
man errno |col -b |grep -A33 ^NOTES
------- Comment #6 From 2006-09-03 15:46:58 -------
Кстати у syslog() есть формат %m.
------- Comment #7 From 2006-09-03 21:43:35 -------
Да уже приложил приложенное.  Надо в апстрим закинуть вместе с твоей/Lost's
рекомендацией.
------- Comment #8 From 2006-09-03 22:15:07 -------
Учтено в 0.9.16-alt3 и закинуто в апстрим:
http://sourceforge.net/tracker/index.php?func=detail&aid=1551560&group_id=5616&atid=305616

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