On Tue, Feb 20, 2001 at 03:04:38PM +0300, Dmitriy Ovsaynnikov wrote:
>
> Пытались организовать туннель PPTP over Ethernet под Intel Solaris
> 2.7. При этом использовали pptpd-1.0.1 и ppp-2.3.11. Работает все
> замечательно, но при закрытии сессии pptpd умирает с сообщением:
> -------------
> sol1 pppd[3808]: local IP address 192.168.1.1
> sol1 pppd[3808]: remote IP address 192.168.1.6
> sol1 pptpd[3807]: CTRL: Error with select(), quitting
> sol1 pptpd[3807]: CTRL: Client 192.168.7.11 control connection finished
> sol1 pppd[3808]: Modem hangup
> sol1 pppd[3808]: Connection terminated.
> sol1 pppd[3808]: Connect time 0.3 minutes.
> sol1 pppd[3808]: Sent 895 bytes, received 830 bytes.
> sol1 pppd[3808]: Exit.
> -------------
> После этого pptpd умирает, и дальнейшие вызовы не обслуживаются.
> Такая же комбинация на FreeBSD 4.2 работает без проблем.
> Судя по исходникам pptpctrl.c, строка 240
> -----
> switch (select(maxfd + 1, &fds, NULL, NULL, &idleTime)) {
> case -1: /* Error with select() */
> if (errno != EINTR)
> syslog(LOG_ERR, " CTRL: Error with select(), quitting ");
> goto leave_clear_call;
> ------
> Если посмотреть код ошибки с которым он вылетает, то это 9
> #define EBADF 9 /* Bad file number */
> ----
> Где еще и что можно посмотреть?
Нужно найти место раньше select'а , где закрывается сессия
и в месте закрытия дескиптора добавить или поправить код вынесения
дескриптора из fds FD_CLR, или при обратке switch тупо пройтись fstat'ом
по всем fds, вынося инвалидные, и вернуться на select.
Это известная фича *BSD select, который тихо игнорирует ситуацию,
когда среди fds есть уже несуществующие. Зато fstat на открытый fd
может в *BSD вернуть EBADF, поэтому в лоб fstat'ом по fd проходить нельзя.
--
Regards,
Yury July
=============================================================================
"inet-admins" Internet access mailing list. Maintained by East Connection ISP.
Mail "unsubscribe inet-admins" to Majordomo@info.east.ru if you want to quit.
Archive is accessible on http://info.east.ru/rus/inetadm.html