⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 main.cpp

📁 PPP协议的实现演示
💻 CPP
字号:
#include "globals.h"/***************************************************************************                          main.cpp  -  description                             -------------------    begin                : dim avr 29 18:14:09 CEST 2001    copyright            : (C) 2001 by Birdy57 (Stephane)    email                : birdy57@multimania.com ***************************************************************************//*************************************************************************** *                                                                         * *   This program is free software; you can redistribute it and/or modify  * *   it under the terms of the GNU General Public License as published by  * *   the Free Software Foundation; either version 2 of the License, or     * *   (at your option) any later version.                                   * *                                                                         * ***************************************************************************/#ifdef WIN32#include "..\config.h"#else#include "config.h"#endif#ifdef WIN32#define System 2#else#define System 1#endif#define LKernel 1#include <iostream.h>#include <stdlib.h>#include <sys/types.h>#include <sys/stat.h>#include <fcntl.h>#include <unistd.h>#include "nulldriver.h"#include "cloader.h"#include "cmsgerror.h"#include "ctextlinux.h"#include "ccommand.h"#include "ckernel.h"#include "kernel30.h"#include "crouteurlinux.h"#include "cusermanager.h"#include "threadELV3.h"#ifndef WIN32#include "cgui.h"#endif#ifdef WITH_MODEM#include "modemdriver.h"#endif#ifdef WITH_CABLE#include "CableDriver.h"#endif#ifdef WITH_TUNTAP#include "ctuntapdriver.h"#endif#ifdef WITH_PPP#include "cppp.h"#endif#ifdef WITH_WINTAP#include "cwintap.h"#endif#include <signal.h>// Toutes les classes sont globalesCNullDriver *Input = new CNullDriver;CNullDriver *Output = new CNullDriver;CLoader *Loader;CMsgError *Msg;CMsgError *MsgI;CMsgError *MsgO;CMsgError::CStatus * Status = new CMsgError::CStatus;CCommand *Command = new CCommand;CKernel *Kernel;CRouteur *Routeur;CUserManager *UserManager;char *sIp = new char[200];char *sDns = new char[200];char *sDomain = new char[200];bool bDriver = false;bool bKernel = false;bool bStop = false;bool bAolMerde = false;bool bReady = false;unsigned long i;char Language[3];char sTmp[200];struct in_addr adresse;char *Lan = NULL;bool bGui = false;bool bStart = false;char *Login = NULL;char *PassWord = NULL;CGui *Gui = new CGui;const char *Pid_Filename = "/var/run/pengaol.pid";void Exit(int sig){    unlink(Pid_Filename);    if (sig == 0xff)	bAolMerde = true;    if (!bStop) {	// connection etablie ?	if (bKernel)	    Kernel->Stop();	else if (bDriver) {	    Input->Disconnect();	    Output->Disconnect();	    Msg->Printf("%M%t\n", 78);	    exit(EXIT_SUCCESS);	} else {	    if (bGui)		StopGui();	    delete Loader;	    delete Routeur;	    delete Msg;	    delete MsgI;	    delete MsgO;	    delete UserManager;	    delete Kernel;	    exit(0);	}	bStop = true;    }}#ifndef WIN32void SendSpeedIn(){    char sTmp[200];    sprintf((char *) &sTmp, "G%d", Kernel->GetSpeedIn());    Gui->SendCommand((char *) &sTmp);}void SendSpeedOut(){    char sTmp[200];    sprintf((char *) &sTmp, "H%d", Kernel->GetSpeedOut());    Gui->SendCommand((char *) &sTmp);}void SendInfo(char *stexte){    char sTmp[200];    if (strlen(stexte) < 190) {	sprintf((char *) &sTmp, "I%s", stexte);	Gui->SendCommand((char *) &sTmp);    }}void DonneUser(){    Gui->SendCommand("UserList");    UserManager->ListUserGui();    Gui->SendCommand("EndOfList");}void AddGuiUser(char *stexte){    char sTmp[200];    if (strlen(stexte) < 190) {	sprintf((char *) &sTmp, "%s", stexte);	Gui->SendCommand((char *) &sTmp);    }}void BuddyClear(){    Gui->SendCommand("D");}void BuddyAdd(char *stexte){    char sTmp[200];    if (strlen(stexte) < 190) {	sprintf((char *) &sTmp, "E%s", stexte);	Gui->SendCommand((char *) &sTmp);    }}void GuiMess(char *stexte){    char sTmp[200];    if (strlen(stexte) < 190) {	sprintf((char *) &sTmp, "M%s", stexte);	Gui->SendCommand((char *) &sTmp);    }}void Start(char *sLogin){    Login = sLogin;    if ((PassWord = UserManager->GetPass(Login)) == NULL)	Msg->Printf("%M%t\n", 146);    else	bStart = true;}void KillUser(char *Login, char *PassWord){    UserManager->DeleteUser(Login);}void SaveUser(char *Login, char *PassWord){    UserManager->AddUser(Login, PassWord);}void Killpid(){    int pid;    char pidbuff[6];    int fd_pid;    fd_pid = open(Pid_Filename, O_RDWR);    if (fd_pid < 0) {	fprintf(stderr, "Peng is not running \n");	exit(1);    }    while (read(fd_pid, &pidbuff, 6) == 0);    pid = atoi(pidbuff);    kill(pid, SIGTERM);    close(fd_pid);    unlink(Pid_Filename);}void Regpid(){    char pid[6];    int fd_pid;    fd_pid = open(Pid_Filename, O_RDWR | O_CREAT, 600);    if (fd_pid < 0) {	fprintf(stderr, "Pid: Write Error \n");	exit(1);    }    sprintf(pid, "%i", getpid());    write(fd_pid, pid, 6);    close(fd_pid);}#endifint main(int argc, char *argv[]){    int i = 0;    int longindex;    int option;    char *optstring = "a:c:d:iklmrsvx";    struct option longopts[] = {	{"adduser", 2, NULL, 'a'},	{"connect", 1, NULL, 'c'},	{"deluser", 1, NULL, 'd'},	{"listdriver", 0, NULL, 'i'},	{"kill", 0, NULL, 'k'},	{"listuser", 0, NULL, 'l'},	{"makeinit", 0, NULL, 'm'},	{"restore", 0, NULL, 'r'},	{"still", 0, NULL, 's'},	{"version", 0, NULL, 'v'},	{"log", 0, NULL, 'x'},	{NULL, 0, NULL, 0},    };    Loader = new CLoader;#ifdef WITH_PPP    Loader->AddDriver(new CPpp);#endif#ifdef WITH_TUNTAP    Loader->AddDriver(new CTunTapDriver);#endif#ifdef WITH_CABLE    Loader->AddDriver(new CCableDriver);#endif#ifdef WITH_MODEM    Loader->AddDriver(new CModemDriver);#endif    UserManager = new CUserManager;    if (!bReady) {	Msg = new CTextLinux;	MsgI = new CTextLinux;	MsgO = new CTextLinux;	if (System == 1) {#ifndef WIN32	    /*Msg=new CTextLinux;	       MsgI=new CTextLinux;	       MsgO=new CTextLinux; */	    Routeur = new CRouteurLinux;	    (void) signal(SIGINT, Exit);	    (void) signal(SIGKILL, Exit);#endif	} else {	    /*Msg=new CMsgError;	       MsgI=new CMsgError;	       MsgO=new CMsgError; */	    //Routeur=new CRouteurWin;	}	Lan = getenv("LANG");	if (Lan != NULL)	    memcpy(&Language, getenv("LANG"), 2);	else {	    memcpy(&Language, "en", 2);	}	Language[2] = 0;	Language[0] = tolower(Language[0]);	Language[1] = tolower(Language[1]);	if (!Msg->	    Load("/etc/Pengaol/PengMessages.txt", (char *) &Language)) {	    printf("Error loading Msg for your lang assuming English\n");	    if (!Msg->Load("/etc/Pengaol/PengMessages.txt", "en")) {		printf("Error loading Msg FATAL !!\n");		exit(0);	    }	}    }    bReady = true;    // Traitement des options    Command->Set(argc, argv);    Msg->SetMessage(true);      // mode verbose    Msg->GetFastLoad(Status);    MsgI->SetFastLoad(Status);    MsgO->SetFastLoad(Status);    UserManager->GetMsg(Msg);    Loader->SetMessage(MsgI,MsgO);    while ((option =	    getopt_long(argc, argv, optstring, longopts,			&longindex)) != -1) {	switch (option) {	case 'a':	    if (!(UserManager->AddUser(argv[2], argv[3])))		Msg->Printf("%M%t\n", UserManager->GetErrorNbr());	    else		Msg->Printf("%M%t\n", 143);	    exit(0);	case 'b':	    Loader->SetConfigFile(optarg);	    exit(0);	case 'c':	    Login = optarg;	    if ((PassWord = UserManager->GetPass(Login)) == NULL) {		Msg->Printf("%M%t\n", 146);		exit(0);	    }	    break;	case 'd':	    if (!(UserManager->DeleteUser(optarg)))		Msg->Printf("%M%t\n", UserManager->GetErrorNbr());	    else		Msg->Printf("%M%t\n", 144);	    exit(0);	case 'i':	    fprintf(stdout, "Drivers list\n");	    Loader->ListDriver();	    Loader->MakeConfig(false); 	    exit(0);	case 'k':	    Killpid();	    exit(0);	case 'l':	    fprintf(stdout, "User list: \n");	    if (!(UserManager->ListUser()))		Msg->Printf("%M%t\n", UserManager->GetErrorNbr());	    exit(0);	case 'm':	    if (!Loader->MakeConfig(true))		Msg->Printf("%M%t\n", Loader->GetErrorNbr());	    else		Msg->Printf("%M%t\n", 50);	    exit(0);	case 'r':	    if (!Loader->LoadDriver()) {		Msg->Printf("%M%t\n", 51);		exit(0);	    }	    Input = Loader->GetDriverIn();	    Output = Loader->GetDriverOut();	    Routeur->SetDriver(Input, Output);	    Routeur->SetInfo(sIp, sDns, sDomain);	    Routeur->SetMsg(Msg);	    Routeur->Stop();	    exit(0);	case 's':	    sleep(10);	    break;	case 'v':	    fprintf(stdout, "Peng lite 1.0.5 (GPL)\n");	    exit(0);	case 'x':# ifdef WITH_DEBUG	    Msg->SetLog(true); 	    Msg->SetDebug(true);# else	    fprintf(stderr, "Compilez avec Debug pour loguer\n");	    exit(0);# endif	    break;	case '?':	    fprintf(stdout,		    "usage: peng [-c login] [-a login password] [-d login password] [-b Configfile] [-ilmrvx] \n");	    exit(0);	}    }    // charge les drivers    if (!Loader->LoadDriver()) {	Msg->Printf("%M%t\n", 51);	exit(0);    }    // Memorise les drivers recut    Input = Loader->GetDriverIn();    Output = Loader->GetDriverOut();    bDriver = true;    // Lance la connection    Msg->Printf("%M%S%t\n", 52);    if (!Input->Connect()) {	Msg->Printf("%M%S%t\n", 5);	unlink(Pid_Filename);	exit(0);    }    if (!Output->Connect()) {	Msg->Printf("%M%S%t\n", 21);	Input->Disconnect();	unlink(Pid_Filename);	exit(0);    }    // Donne la vitesse de connection si possible    if (Input->GetSpeed())	Msg->Printf("%M%S%t:%d\n", 53, Input->GetSpeed());    Msg->Printf("%CT4%d", Input->GetSpeed());    // Charge et initialise le noyau    if (LKernel == 1)	Kernel = new Kernel30;    else	Kernel = new CKernel;    Kernel->SetSpeed(56600);    Kernel->SetDriver(Input, Output);    Kernel->SetMessage(MsgI, MsgO);    // Negociation de la connection et connection au drivers    Input->Flush();    if (!Kernel->Connect(Login, PassWord)) {	Msg->Printf("%M%S%t\n", Kernel->GetErrorNbr());	Input->Disconnect();	Output->Disconnect();    } else {	Kernel->GetIp(sIp);	Kernel->GetDns(sDns);	Kernel->GetDomainName(sDomain);	Msg->Printf("%M%t%s\n", 74, sIp);	Msg->Printf("%M%t%s\n", 75, sDns);	Msg->Printf("%M%t%s\n", 76, sDomain);	Regpid();	Routeur->SetDriver(Input, Output);	Routeur->SetInfo(sIp, sDns, sDomain);	Routeur->SetMsg(Msg);	if (!Routeur->Start()) {	    Input->Disconnect();	    Output->Disconnect();	    Msg->Printf("%M%S%t\n", Routeur->GetErrorNbr());	} else {	    // Demarrer le kernel	    Msg->Printf("%M%S%t%s\n", 57, Kernel->GetName());	    bKernel = true;	    // Demarrage du prog auto	    if (strstr(Loader->GetStart(), "None") == NULL) {		sprintf((char *) &sTmp, "%s &\n", Loader->GetStart());		system((char *) &sTmp);	    }	    Kernel->SetLoader(Loader);	    Kernel->Start();	    if (bStop)		Msg->Printf("%M%S%t\n", 79);	    else		Msg->Printf("%M%S%t\n", 80);	    Kernel->Stop();	    Input->Disconnect();	    Output->Disconnect();	    if (!Routeur->Stop())		Msg->Printf("%M%S%t\n", 73);	}    }    Loader->MakeConfig(false);    Loader->KillDriver();    if (bGui)	StopGui();    delete Loader;    delete Routeur;    delete Msg;    delete MsgI;    delete MsgO;    delete UserManager;    delete Kernel;    if (bAolMerde)	unlink(Pid_Filename);    exit(-1);    exit(0);}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -