Спасибо народу за то, что помогли решить мне эту проблему... Незнаю, чтобы я без вас делал....! Блин, хоть бы ссылочку дали...
Вот патч на kppp из пакета kdeNETWORK-3.2. Дамаю как ставить патчи, знают все....
Код: Выделить всё
diff -urN kdenetwork-3.2.1.orig/kppp/cbtype.h kdenetwork-3.2.1/kppp/cbtype.h
--- kdenetwork-3.2.1.orig/kppp/cbtype.h 1970-01-01 03:00:00.000000000 +0300
+++ kdenetwork-3.2.1/kppp/cbtype.h 2004-04-16 02:01:04.745373912 +0300
@@ -0,0 +1,8 @@
+#ifndef __CBTYPE__H__
+#define __CBTYPE__H__
+
+#define CBTYPE_NONE 0
+#define CBTYPE_ADMIN 1
+#define CBTYPE_USER 2
+
+#endif
diff -urN kdenetwork-3.2.1.orig/kppp/connect.cpp kdenetwork-3.2.1/kppp/connect.cpp
--- kdenetwork-3.2.1.orig/kppp/connect.cpp 2003-09-02 16:58:35.000000000 +0300
+++ kdenetwork-3.2.1/kppp/connect.cpp 2004-04-16 02:01:04.747373608 +0300
@@ -62,6 +62,7 @@
#endif
#include "auth.h"
+#include "cbtype.h"
#include "connect.h"
#include "docking.h"
#include "main.h"
@@ -353,7 +354,7 @@
if(vmain == 4) {
if(!expecting) {
- if(!gpppdata.waitForDialTone()) {
+ if(!gpppdata.waitForDialTone() || gpppdata.waitCallback()) {
QString msg = i18n("Turning off dial tone waiting...");
messg->setText(msg);
emit debugMessage(msg);
@@ -372,6 +373,15 @@
timeout_timer->stop();
timeout_timer->start(gpppdata.modemTimeout()*1000);
+ if(gpppdata.waitCallback()) {
+ QString msg = i18n("Waiting for callback...");
+ messg->setText(msg);
+ emit debugMessage(msg);
+ setExpect(gpppdata.modemRingResp());
+ vmain = 102;
+ return;
+ }
+
QStringList &plist = gpppdata.phonenumbers();
QString bmarg= gpppdata.dialPrefix();
bmarg += *plist.at(dialnumber);
@@ -424,6 +434,7 @@
Modem::modem->setDataMode(false);
vmain = 0;
substate = -1;
+ gpppdata.setWaitCallback(false);
return;
}
@@ -433,6 +444,7 @@
messg->setText(i18n("No Dial Tone"));
vmain = 20;
Modem::modem->unlockdevice();
+ gpppdata.setWaitCallback(false);
return;
}
@@ -442,6 +454,7 @@
messg->setText(i18n("No Carrier"));
vmain = 20;
Modem::modem->unlockdevice();
+ gpppdata.setWaitCallback(false);
return;
}
@@ -458,6 +471,7 @@
"Do NOT connect this modem to a digital phone "
"line or the modem could get permanently "
"damaged"));
+ gpppdata.setWaitCallback(false);
return;
}
@@ -477,6 +491,16 @@
return;
}
}
+
+ // send answer on callback phase
+ if(vmain == 102) {
+ if(!expecting) {
+ writeline(gpppdata.modemAnswerStr());
+ setExpect(gpppdata.modemConnectResp());
+ vmain = 100;
+ return;
+ }
+ }
// execute the script
if(vmain == 2) {
@@ -877,6 +901,7 @@
// starting pppd wasn't successful. Error messages were
// handled by execppp();
if_timeout_timer->stop();
+
this->hide();
messg->setText("");
p_kppp->quit_b->setFocus();
@@ -897,6 +922,7 @@
// this is a "wait until cancel" entry
if(vmain == 20) {
+ gpppdata.setWaitCallback(false);
}
}
@@ -985,6 +1011,7 @@
void ConnectWidget::cancelbutton() {
+ gpppdata.setWaitCallback(false);
Modem::modem->stop();
killTimer(main_timer_ID);
timeout_timer->stop();
@@ -1229,6 +1256,19 @@
{
command += " " + *it;
}
+
+ // Callback settings
+ if(gpppdata.callbackType() && !gpppdata.waitCallback()) {
+ if(!gpppdata.pppdVersionMin(2,4,2)) {
+ command += " +callback";
+ if(gpppdata.callbackType() == CBTYPE_USER)
+ command += " callback " + gpppdata.callbackPhone();
+ } else {
+ command += " callback ";
+ command += (gpppdata.callbackType() == CBTYPE_ADMIN ? "0" : gpppdata.callbackPhone());
+ }
+ } else
+ gpppdata.setWaitCallback(false);
// PAP settings
if(gpppdata.authMethod() == AUTH_PAP) {
@@ -1262,7 +1302,7 @@
}
kapp->flushX();
-
+
return Requester::rq->execPPPDaemon(command);
}
diff -urN kdenetwork-3.2.1.orig/kppp/edit.cpp kdenetwork-3.2.1/kppp/edit.cpp
--- kdenetwork-3.2.1.orig/kppp/edit.cpp 2003-05-15 18:33:54.000000000 +0300
+++ kdenetwork-3.2.1/kppp/edit.cpp 2004-04-16 02:01:04.748373456 +0300
@@ -43,11 +43,12 @@
#include "newwidget.h"
#include "iplined.h"
#include "auth.h"
+#include "cbtype.h"
DialWidget::DialWidget( QWidget *parent, bool isnewaccount, const char *name )
: QWidget(parent, name)
{
- const int GRIDROWS = 6;
+ const int GRIDROWS = 8;
QGridLayout *tl = new QGridLayout(parent, GRIDROWS, 2, 0, KDialog::spacingHint());
@@ -150,10 +151,38 @@
"plain text in the config file, which is\n"
"readable only to you. Make sure nobody\n"
"gains access to this file!"));
-
+
+ cbtype_l = new QLabel(i18n("&Callback type:"), parent);
+ tl->addWidget(cbtype_l, 5, 0);
+
+ cbtype = new QComboBox(parent);
+ cbtype_l->setBuddy(cbtype);
+ cbtype->insertItem(i18n("None"));
+ cbtype->insertItem(i18n("Administrator-defined"));
+ cbtype->insertItem(i18n("User-defined"));
+ connect(cbtype, SIGNAL(highlighted(int)),
+ this, SLOT(cbtypeChanged(int)));
+ tl->addWidget(cbtype, 5, 1);
+ tmp = i18n("Callback type");
+
+ QWhatsThis::add(cbtype_l,tmp);
+ QWhatsThis::add(cbtype,tmp);
+
+ cbphone_l = new QLabel(i18n("Call&back number:"), parent);
+ tl->addWidget(cbphone_l, 6, 0);
+
+ cbphone = new QLineEdit(parent);
+ cbphone_l->setBuddy(cbphone);
+ cbphone->setMaxLength(14);
+ tl->addWidget(cbphone, 6, 1);
+ tmp = i18n("Callback phone number");
+
+ QWhatsThis::add(cbphone_l,tmp);
+ QWhatsThis::add(cbphone,tmp);
+
pppdargs = new QPushButton(i18n("Customize &pppd Arguments..."), parent);
connect(pppdargs, SIGNAL(clicked()), SLOT(pppdargsbutton()));
- tl->addMultiCellWidget(pppdargs, 5, 5, 0, 1, AlignCenter);
+ tl->addMultiCellWidget(pppdargs, 7, 7, 0, 1, AlignCenter);
// Set defaults if editing an existing connection
if(!isnewaccount) {
@@ -177,11 +206,16 @@
auth->setCurrentItem(gpppdata.authMethod());
store_password->setChecked(gpppdata.storePassword());
+ cbtype->setCurrentItem(gpppdata.callbackType());
+ cbphone->setText(gpppdata.callbackPhone());
} else {
// select PAP/CHAP as default
auth->setCurrentItem(AUTH_PAPCHAP);
+ // select NONE as default
+ cbtype->setCurrentItem(CBTYPE_NONE);
}
+ emit cbtypeChanged(cbtype->currentItem());
numbersChanged();
tl->activate();
}
@@ -205,6 +239,8 @@
gpppdata.setPhonenumber(number);
gpppdata.setAuthMethod(auth->currentItem());
gpppdata.setStorePassword(store_password->isChecked());
+ gpppdata.setCallbackType(cbtype->currentItem());
+ gpppdata.setCallbackPhone(cbphone->text());
return true;
}
}
@@ -218,6 +254,10 @@
down->setEnabled(sel != -1 && sel != (int)numbers->count()-1);
}
+void DialWidget::cbtypeChanged(int value) {
+ cbphone_l->setEnabled(value == CBTYPE_USER);
+ cbphone->setEnabled(value == CBTYPE_USER);
+}
void DialWidget::selectionChanged(int) {
numbersChanged();
diff -urN kdenetwork-3.2.1.orig/kppp/edit.h kdenetwork-3.2.1/kppp/edit.h
--- kdenetwork-3.2.1.orig/kppp/edit.h 2003-05-15 18:33:54.000000000 +0300
+++ kdenetwork-3.2.1/kppp/edit.h 2004-04-16 02:01:04.749373304 +0300
@@ -57,6 +57,7 @@
bool save();
void pppdargsbutton();
void numbersChanged();
+ void cbtypeChanged(int);
void selectionChanged(int);
void addNumber();
void delNumber();
@@ -72,6 +73,11 @@
QLabel *auth_l;
QCheckBox *store_password;
+ // callback support
+ QComboBox *cbtype;
+ QLabel *cbtype_l;
+ QLineEdit *cbphone;
+ QLabel *cbphone_l;
// for the phonenumber selection
QPushButton *add, *del, *up, *down;
QListBox *numbers;
diff -urN kdenetwork-3.2.1.orig/kppp/kpppwidget.cpp kdenetwork-3.2.1/kppp/kpppwidget.cpp
--- kdenetwork-3.2.1.orig/kppp/kpppwidget.cpp 2003-11-30 11:48:38.000000000 +0200
+++ kdenetwork-3.2.1/kppp/kpppwidget.cpp 2004-04-16 02:01:04.751373000 +0300
@@ -495,8 +495,11 @@
removedns();
Modem::modem->unlockdevice();
con->pppdDied();
-
- if(!gpppdata.automatic_redial()) {
+
+ Requester::rq->pppdExitStatus();
+ gpppdata.setWaitCallback(gpppdata.callbackType() && Requester::rq->lastStatus == E_CBCP_WAIT);
+
+ if(!gpppdata.automatic_redial() && !gpppdata.waitCallback()) {
quit_b->setFocus();
show();
con_win->stopClock();
@@ -525,7 +528,10 @@
if(KMessageBox::warningYesNo(0, msg, i18n("Error"), i18n("&OK"), i18n("&Details...")) == KMessageBox::No)
PPPL_ShowLog();
} else { /* reconnect on disconnect */
- kdDebug(5002) << "Trying to reconnect... " << endl;
+ if(gpppdata.waitCallback())
+ kdDebug(5002) << "Waiting for callback... " << endl;
+ else
+ kdDebug(5002) << "Trying to reconnect... " << endl;
if(gpppdata.authMethod() == AUTH_PAP ||
gpppdata.authMethod() == AUTH_CHAP ||
@@ -538,7 +544,7 @@
con_win->stopClock();
stopAccounting();
gpppdata.setpppdRunning(false);
- // not in a signal handler !!! KNotifyClient::beep();
+ // not in a signal handler !!! KNotifyClient::beep();
emit cmdl_start();
}
}
diff -urN kdenetwork-3.2.1.orig/kppp/Makefile.in kdenetwork-3.2.1/kppp/Makefile.in
--- kdenetwork-3.2.1.orig/kppp/Makefile.in 2004-03-01 18:03:15.000000000 +0200
+++ kdenetwork-3.2.1/kppp/Makefile.in 2004-04-16 02:01:35.864643064 +0300
@@ -409,6 +409,7 @@
runtests.h \
loginterm.h \
auth.h \
+ cbtype.h \
version.h \
macros.h \
ppplog.h \
diff -urN kdenetwork-3.2.1.orig/kppp/pppdata.cpp kdenetwork-3.2.1/kppp/pppdata.cpp
--- kdenetwork-3.2.1.orig/kppp/pppdata.cpp 2004-01-17 14:54:17.000000000 +0200
+++ kdenetwork-3.2.1/kppp/pppdata.cpp 2004-04-16 02:01:35.865642912 +0300
@@ -43,7 +43,8 @@
caccount(-1), // set the current account index also
suidprocessid(-1), // process ID of setuid child
pppdisrunning(false),
- pppderror(0)
+ pppderror(0),
+ waitcallback(false)
{
}
@@ -897,6 +898,29 @@
return (bool)readNumConfig(cgroup, STORE_PASSWORD_KEY, 1);
}
+int PPPData::callbackType() {
+ return readNumConfig(cgroup, CALLBACK_TYPE_KEY, 0);
+}
+
+void PPPData::setCallbackType(int value) {
+ writeConfig(cgroup, CALLBACK_TYPE_KEY, value);
+}
+
+const QString PPPData::callbackPhone() {
+ return readConfig(cgroup, CALLBACK_PHONE_KEY, "");
+}
+
+void PPPData::setCallbackPhone(const QString &b) {
+ writeConfig(cgroup, CALLBACK_PHONE_KEY, B);
+}
+
+bool PPPData::waitCallback() {
+ return waitcallback;
+}
+
+void PPPData::setWaitCallback(bool value) {
+ waitcallback = value;
+}
const QString PPPData::command_before_connect() {
return readConfig(cgroup, BEFORE_CONNECT_KEY);
diff -urN kdenetwork-3.2.1.orig/kppp/pppdata.h kdenetwork-3.2.1/kppp/pppdata.h
--- kdenetwork-3.2.1.orig/kppp/pppdata.h 2003-07-21 10:38:12.000000000 +0300
+++ kdenetwork-3.2.1/kppp/pppdata.h 2004-04-16 02:01:35.866642760 +0300
@@ -116,6 +116,8 @@
#define STORED_PASSWORD_KEY "Password"
#define STORED_USERNAME_KEY "Username"
#define STORE_PASSWORD_KEY "StorePassword"
+#define CALLBACK_TYPE_KEY "CallbackType"
+#define CALLBACK_PHONE_KEY "CallbackPhone"
#define BEFORE_CONNECT_KEY "BeforeConnect"
#define COMMAND_KEY "Command"
#define DISCONNECT_COMMAND_KEY "DisconnectCommand"
@@ -151,6 +153,7 @@
// pppd errors
#define E_IF_TIMEOUT 1
#define E_PPPD_DIED 2
+#define E_CBCP_WAIT 14
// window position
#define WINPOS_CONWIN_X "WindowPositionConWinX"
@@ -355,6 +358,15 @@
bool storePassword();
void setStorePassword(bool);
+ int callbackType();
+ void setCallbackType(int);
+
+ const QString callbackPhone();
+ void setCallbackPhone(const QString &);
+
+ bool waitCallback();
+ void setWaitCallback(bool);
+
const QString speed();
void setSpeed(const QString &);
@@ -460,6 +472,7 @@
// daemon
int pppderror; // error encounterd running pppd
int pppdVer, pppdMod, pppdPatch; // pppd version
+ bool waitcallback; // callback waiting flag
QStringList phonelist;
};