[sisyphus] продолжение истории с slmodem и kppp

Artem =?iso-8859-1?q?u2u_=CE=C1_nm=2Eru?=
Пн Сен 19 02:18:43 MSD 2005


Доброго времени суток.
Напомню, что проблема состояла в том, что по нажатии кнопки disconnect в 
kppp,
демон pppd умирал, но kppp не вешал трубку.
После сегодняшних упражнений выяснил, что ,при дисконнекте, чтобы 
повесить трубку модема,
необходимо сделать что-то вроде
echo "ATH" > /dev/ttySLM0
Одна из грабель по этому поводу (обнаруженная позднее). В дефолтных 
настройках kppp
строка hangup выглядит так: "+++ATH". Но slmodem такую строку не 
принимает (проверял вручную
из терминала kppp). Slmodem после +++ выдает OK, после чего можно делать 
ATH. Но если же сделать
+++ATH - то никакой ответной реакции не будет. Ковыряние в исходниках 
показало, что HANGUP в kppp
выполняется в 2 приема - сначала выполняется строка escape "+++" -  
затем, когда модем оказывается в
командном режиме - выполняется непосредственно "ATH". Подозреваю, что 
"+++ATH" в качестве hangup -
не совсем корректная вещь? Данная строка дефолтная и содержится в 
pppdata.cpp, линия 759

 const QString PPPData::modemHangupStr() 
{                                                      
  return readConfig(cmodemgroup, HANGUPSTR_KEY, 
"+++ATH");                                     
}

Просьба community проверить подобное поведение на своих slmodem.

Основная же проблема решается 2-мя способами, но какой из них правильнее 
- я не знаю, поэтому спрашиваю совета.
1. Добавление
  if(Modem::modem->opentty())
    Modem::modem->hangup() ;
в метод
void KPPPWidget::delayedDisconnect() {
  // this is where the actual disconnection takes place
(файл kpppwidget.cpp)
2. Добавление
  if(Modem::modem->opentty())
    Modem::modem->hangup() ;
в обработчик сигнала
 void KPPPWidget::sigPPPDDied() {
  kdDebug(5002) << "Received a SIGUSR1" << endl;
(тот же файл)

Вот собственно - и вопрос: в каком случае более правильное исправление? 
В обработчике нажатия клавиши disconnect ? Или в обработчике сигнала, 
уведомляющего о том, что pppd - "сдох" (посылается сигнал SIGUSR1). ?
Насколько я понимаю - SIGUSR1 посылает "рутовая" часть kppp - 
пользовательской ? В debug log при этом след. сообщения:
It was pppd that died
pppd exited with return value 16
Sending 28779 a SIGUSR1
<skip>
kppp: Received a SIGUSR1


P.S. kdenetwork-kppp-3.4.1-alt1

С уважением. Артем.



Подробная информация о списке рассылки Sisyphus