master 24.16
g8bpq 2 years ago
parent b4f82c7d83
commit 84cbedbe9c

Binary file not shown.

Binary file not shown.

File diff suppressed because it is too large Load Diff

@ -398,7 +398,7 @@ int SendHeader(char * Reply, char * Key)
}
void ConvertTitletoUTF8(char * Title, char * UTF8Title, int Len)
void ConvertTitletoUTF8(WebMailInfo * WebMail, char * Title, char * UTF8Title, int Len)
{
if (WebIsUTF8(Title, (int)strlen(Title)) == FALSE)
{
@ -414,15 +414,26 @@ void ConvertTitletoUTF8(char * Title, char * UTF8Title, int Len)
wlen = MultiByteToWideChar(CP_ACP, 0, Title, len, BufferW, origlen * 2);
len = WideCharToMultiByte(CP_UTF8, 0, BufferW, wlen, UTF8Title, origlen * 2, NULL, NULL);
#else
int left = Len - 1;
int len = origlen;
iconv_t * icu = NULL;
size_t left = Len - 1;
size_t len = origlen;
iconv_t * icu = WebMail->iconv_toUTF8;
if (WebMail->iconv_toUTF8 == NULL)
icu = WebMail->iconv_toUTF8 = iconv_open("UTF-8//IGNORE", "CP1252");
if (icu == (iconv_t)-1)
{
strcpy(UTF8Title, Title);
WebMail->iconv_toUTF8 = NULL;
return;
}
if (icu == NULL)
icu = iconv_open("UTF-8//IGNORE", "CP1252");
char * orig = UTF8Title;
iconv(icu, NULL, NULL, NULL, NULL); // Reset State Machine
iconv(icu, &Title, &len, (char ** __restrict__)&UTF8Title, &left);
#endif
}
else

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

@ -1193,7 +1193,7 @@ along with LinBPQ/BPQ32. If not, see http://www.gnu.org/licenses
// Add SDRAngel rig control (11)
// Add option to specify config and data directories on linbpq (12)
// Allow zero resptime (send RR immediately) (13)
// Fix corruptions in Webmail, eg in displaying 7+ files (13)
// Fix corruptions in Webmail on 64 bit builds, eg in displaying 7+ files (15)
#define CKernel

Binary file not shown.

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

@ -3332,8 +3332,6 @@ VOID SendLocation()
SendReportMsg((char *)&AXMSG.DEST, Len + 16);
printf("M0LTEMap %d\n", M0LTEMap);
if (M0LTEMap)
SendDataToPktMap("");

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

@ -599,7 +599,9 @@ VOID ProcessChatLine(ChatCIRCUIT * conn, struct UserInfo * user, char* OrigBuffe
Buffer = BufferB;
#else
int left = 65536;
size_t left = 65536;
size_t clen = len;
UCHAR * BufferBP = BufferB;
struct user_t * icu = conn->u.user;
@ -614,7 +616,7 @@ VOID ProcessChatLine(ChatCIRCUIT * conn, struct UserInfo * user, char* OrigBuffe
}
iconv(icu->iconv_toUTF8, NULL, NULL, NULL, NULL); // Reset State Machine
iconv(icu->iconv_toUTF8, &Buffer, &len, (char ** __restrict__)&BufferBP, &left);
iconv(icu->iconv_toUTF8, &Buffer, &clen, (char ** __restrict__)&BufferBP, &left);
}
else
{
@ -622,7 +624,7 @@ VOID ProcessChatLine(ChatCIRCUIT * conn, struct UserInfo * user, char* OrigBuffe
link_toUTF8 = iconv_open("UTF-8//IGNORE", "CP1252");
iconv(link_toUTF8, NULL, NULL, NULL, NULL); // Reset State Machine
iconv(link_toUTF8, &Buffer, &len, (char ** __restrict__)&BufferBP, &left);
iconv(link_toUTF8, &Buffer, &clen, (char ** __restrict__)&BufferBP, &left);
}
len = 65536 - left;
Buffer = BufferB;
@ -1938,7 +1940,7 @@ void put_text(ChatCIRCUIT * circuit, USER * user, UCHAR * buf)
{
UCHAR BufferB[4096];
// Text is UTF-8 internally. If use doen't want UTF-8. convert to Node's locale
// Text is UTF-8 internally. If user doen't want UTF-8. convert to Node's locale
if (circuit->u.user->rtflags & u_noUTF8)
{
@ -1959,9 +1961,9 @@ void put_text(ChatCIRCUIT * circuit, USER * user, UCHAR * buf)
BufferB[blen + 2] = 0;
#else
int left = 4096;
size_t left = 4096;
UCHAR * BufferBP = BufferB;
int len = strlen(buf) + 1;
size_t len = strlen(buf) + 1;
struct user_t * icu = circuit->u.user;
if (icu->iconv_fromUTF8 == NULL)

@ -177,9 +177,9 @@ int _MYTIMEZONE = 0;
/* #define F_PWD 0x1000 */
UCHAR BPQDirectory[260];
UCHAR LogDirectory[260];
UCHAR ConfigDirectory[260];
extern UCHAR BPQDirectory[260];
extern UCHAR LogDirectory[260];
extern UCHAR ConfigDirectory[260];
// overrides from params
UCHAR LogDir[260] = "";
@ -743,7 +743,6 @@ int main(int argc, char * argv[])
ConnectionInfo * conn;
struct stat STAT;
PEXTPORTDATA PORTVEC;
UCHAR LogDir[260];
#ifdef WIN32
@ -820,6 +819,7 @@ int main(int argc, char * argv[])
case 'l':
strcpy(LogDir, optarg);
printf("cc %s\n", LogDir);
break;
case 'c':
@ -861,12 +861,12 @@ int main(int argc, char * argv[])
strcpy(ConfigDirectory, BPQDirectory);
strcpy(LogDirectory, BPQDirectory);
Consoleprintf("Current Directory is %s", BPQDirectory);
if (LogDir[0])
{
strcpy(LogDirectory, LogDir);
Consoleprintf("Log Directory is %s", LogDirectory);
}
if (DataDir[0])
{
@ -889,6 +889,8 @@ int main(int argc, char * argv[])
}
}
Consoleprintf("Log Directory is %s", LogDirectory);
// Make sure logs directory exists
sprintf(LogDir, "%s/logs", LogDirectory);

@ -1,8 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<Project ToolsVersion="15.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
<LocalDebuggerCommand>C:\Dev\Msdev2005\projects\bpq32\BPQMail\x64\Debug\LinBPQ.exe</LocalDebuggerCommand>
<LocalDebuggerWorkingDirectory>c:\linbpq</LocalDebuggerWorkingDirectory>
<DebuggerFlavor>WindowsLocalDebugger</DebuggerFlavor>
</PropertyGroup>
</Project>

@ -0,0 +1,120 @@
[General]
HostParams0=|0||||
HostParams1=|0||||
HostParams2=|0||||
HostParams3=|0||||
HostParams4=|0||||
HostParams5=|0||||
HostParams6=|0||||
HostParams7=|0||||
HostParams8=|0||||
HostParams9=|0||||
HostParams10=|0||||
HostParams11=|0||||
HostParams12=|0||||
HostParams13=|0||||
HostParams14=|0||||
HostParams15=|0||||
Split=50
ChatMode=1
AutoTeletext=0
Bells=1
StripLF=1
AlertBeep=1
ConnectBeep=1
AlertInterval=300
CurrentHost=0 0 0 0 0 0 0 0 0 0
YAPPPath=
MaxRXSize=100000
listenPort=8015
listenEnable=0
listenCText=
convUTF8=0
PTT=None
PTTBAUD=19200
PTTMode=19200
CATHex=1
PTTOffString=
PTTOnString=
pttGPIOPin=17
pttGPIOPinR=17
CM108Addr=0xD8C:0x08
HamLibPort=4532
HamLibHost=127.0.0.1
FLRigPort=12345
FLRigHost=127.0.0.1
AGWEnable=0
AGWMonEnable=0
AGWTermCall=
AGWBeaconDest=
AGWBeaconPath=
AGWBeaconInterval=0
AGWBeaconPorts=
AGWBeaconText=
AGWHost=127.0.0.1
AGWPort=8000
AGWPaclen=80
AGWToCalls=
KISSEnable=0
MYCALL=
KISSHost=127.0.0.1
KISSMode=0
KISSPort=8100
KISSSerialPort=None
KISSBAUD=19200
VARAEnable=0
VARATermCall=
VARAHost=127.0.0.1
VARAPort=8300
VARAInit=
VARAPath=C:\\VARA\\VARA.exe
VARAHostHF=127.0.0.1
VARAPortHF=8300
VARAPathHF=C:\\VARA\\VARA.exe
VARAHostFM=127.0.0.1
VARAPortFM=8300
VARAPathFM=C:\\VARA\\VARAFM.exe
VARAHostSAT=127.0.0.1
VARAPortSAT=8300
VARAPathSAT=C:\\VARA\\VARASAT.exe
VARA500=0
VARA2300=1
VARA2750=0
VARAHF=1
VARAFM=0
VARASAT=0
TabType=1 1 1 1 1 1 1 2 2 0
AutoConnect=0 0 0 0 0 0 0 0 0 0
monBackground=@Variant(\0\0\0\x43\x1\xff\xff\xff\xff\xff\xff\xff\xff\0\0)
monRxText=@Variant(\0\0\0\x43\x1\xff\xff\0\0\0\0\xff\xff\0\0)
monTxText=@Variant(\0\0\0\x43\x1\xff\xff\xff\xff\0\0\0\0\0\0)
monOtherText=@Variant(\0\0\0\x43\x1\xff\xff\0\0\0\0\0\0\0\0)
termBackground=@Variant(\0\0\0\x43\x1\xff\xff\xff\xff\xff\xff\xff\xff\0\0)
outputText=@Variant(\0\0\0\x43\x1\xff\xff\0\0\0\0\xff\xff\0\0)
EchoText=@Variant(\0\0\0\x43\x1\xff\xff\0\0\0\0\0\0\0\0)
WarningText=@Variant(\0\0\0\x43\x1\xff\xff\xff\xff\0\0\0\0\0\0)
inputBackground=@Variant(\0\0\0\x43\x1\xff\xff\xff\xff\xff\xff\xff\xff\0\0)
inputText=@Variant(\0\0\0\x43\x1\xff\xff\0\0\0\0\0\0\0\0)
useBeep=false
geometry=@ByteArray(\x1\xd9\xd0\xcb\0\x3\0\0\0\0\x2\x39\0\0\0\xab\0\0\x5\x45\0\0\x3\x64\0\0\x2\x39\0\0\0\xab\0\0\x5\x45\0\0\x3\x64\0\0\0\0\0\0\0\0\a\x80\0\0\x2\x39\0\0\0\xab\0\0\x5\x45\0\0\x3\x64)
windowState=@ByteArray(\0\0\0\xff\0\0\0\0\xfd\0\0\0\0\0\0\x3\r\0\0\x2\xa4\0\0\0\x4\0\0\0\x4\0\0\0\b\0\0\0\b\xfc\0\0\0\x1\0\0\0\x3\0\0\0\x1\0\0\0\x16\0m\0\x61\0i\0n\0T\0o\0o\0l\0\x62\0\x61\0r\0\0\0\0\0\xff\xff\xff\xff\0\0\0\0\0\0\0\0)
ConnectWAV=C:/OneDrive/Dev/Source/bpq32/CommonSource/Ring.wav
[AX25_A]
Retries=10
Maxframe=4
Paclen=128
FrackTime=8
IdleTime=180
SlotTime=100
Persist=128
RespTime=1500
TXFrmMode=1
FrameCollector=6
ExcludeCallsigns=
ExcludeAPRSFrmType=
KISSOptimization=0
DynamicFrack=0
BitRecovery=0
IPOLL=80
MyDigiCall=

Binary file not shown.

@ -10,14 +10,14 @@
#endif
#define KVers 6,0,24,14
#define KVerstring "6.0.24.14\0"
#define KVers 6,0,24,15
#define KVerstring "6.0.24.15\0"
#ifdef CKernel
#define Vers KVers
#define Verstring KVerstring
#define Datestring "Sepember 2023"
#define Datestring "October 2023"
#define VerComments "G8BPQ Packet Switch (C Version)" KVerstring
#define VerCopyright "Copyright © 2001-2023 John Wiseman G8BPQ\0"
#define VerDesc "BPQ32 Switch\0"

@ -44,7 +44,7 @@ BOOL OkToKillMessage(BOOL SYSOP, char * Call, struct MsgInfo * Msg);
int DisplayWebForm(struct HTTPConnectionInfo * Session, struct MsgInfo * Msg, char * FileName, char * XML, char * Reply, char * RawMessage, int RawLen);
struct HTTPConnectionInfo * AllocateWebMailSession();
VOID SaveNewMessage(struct HTTPConnectionInfo * Session, char * MsgPtr, char * Reply, int * RLen, char * Rest, int InputLen);
void ConvertTitletoUTF8(char * Title, char * UTF8Title, int Len);
void ConvertTitletoUTF8(WebMailInfo * WebMail, char * Title, char * UTF8Title, int Len);
char *stristr (char *ch1, char *ch2);
char * ReadTemplate(char * FormSet, char * DirName, char * FileName);
VOID DoStandardTemplateSubsitutions(struct HTTPConnectionInfo * Session, char * txtFile);
@ -935,7 +935,7 @@ int SendWebMailHeaderEx(char * Reply, char * Key, struct HTTPConnectionInfo * Se
EncodedTitle = doXMLTransparency(Msg->title);
memset(UTF8Title, 0, 4096); // In case convert fails part way through
ConvertTitletoUTF8(EncodedTitle, UTF8Title, 4095);
ConvertTitletoUTF8(Session->WebMail, EncodedTitle, UTF8Title, 4095);
free(EncodedTitle);
@ -1011,7 +1011,7 @@ int ViewWebMailMessage(struct HTTPConnectionInfo * Session, char * Reply, int Nu
// make sure title is UTF 8 encoded
memset(UTF8Title, 0, 4096); // In case convert fails part way through
ConvertTitletoUTF8(Msg->title, UTF8Title, 4095);
ConvertTitletoUTF8(Session->WebMail, Msg->title, UTF8Title, 4095);
// if a B2 message diplay B2 Header instead of a locally generated one
@ -1248,21 +1248,28 @@ int ViewWebMailMessage(struct HTTPConnectionInfo * Session, char * Reply, int Nu
msgLen = len - 1; // exclude NULL
#else
int left = 2 * msgLen;
int len = msgLen;
size_t left = 2 * msgLen;
size_t len = msgLen;
int ret;
UCHAR * BufferBP = BufferB;
char * orig = MsgBytes;
MsgBytes[msgLen] = 0;
iconv_t * icu = NULL;
iconv_t * icu = Session->WebMail->iconv_toUTF8;
if (icu == NULL)
icu = iconv_open("UTF-8//IGNORE", "CP1252");
iconv(icu, NULL, NULL, NULL, NULL); // Reset State Machine
ret = iconv(icu, &MsgBytes, &len, (char ** __restrict__)&BufferBP, &left);
icu = Session->WebMail->iconv_toUTF8 = iconv_open("UTF-8//IGNORE", "CP1252");
if (icu == (iconv_t) -1)
{
Session->WebMail->iconv_toUTF8 = NULL;
strcpy(BufferB, MsgBytes);
}
else
{
iconv(icu, NULL, NULL, NULL, NULL); // Reset State Machine
ret = iconv(icu, &MsgBytes, &len, (char ** __restrict__)&BufferBP, &left);
}
free(Save);
Save = MsgBytes = BufferB;
msgLen = strlen(MsgBytes);
@ -1413,6 +1420,11 @@ void FreeWebMailFields(WebMailInfo * WebMail)
SaveReply = WebMail->Reply;
SaveRlen = WebMail->RLen;
#ifndef WIN32
if (WebMail->iconv_toUTF8)
iconv_close(WebMail->iconv_toUTF8);
#endif
memset(WebMail, 0, sizeof(WebMailInfo));
WebMail->Reply = SaveReply;
@ -6133,7 +6145,7 @@ int ProcessWebmailWebSock(char * MsgPtr, char * OutBuffer)
EncodedTitle = doXMLTransparency(Msg->title);
memset(UTF8Title, 0, 4096); // In case convert fails part way through
ConvertTitletoUTF8(EncodedTitle, UTF8Title, 4095);
ConvertTitletoUTF8(Session->WebMail, EncodedTitle, UTF8Title, 4095);
free(EncodedTitle);

@ -22,6 +22,10 @@
#define LIBCONFIG_STATIC
#include <libconfig.h>
#ifndef WIN32
#include <iconv.h>
#endif
#include "compatbits.h"
#ifndef LINBPQ
@ -1011,6 +1015,11 @@ typedef struct WEBMAILINFO
BOOL Packet;
int CurrentMessageIndex; // Index of message currently displayed (for Prev and Next)
#ifdef WIN32
void * iconv_toUTF8; // Used on Linux for char set conversion
#else
iconv_t * iconv_toUTF8; // Used on Linux for char set conversion
#endif
}WebMailInfo;

File diff suppressed because it is too large Load Diff

@ -1,498 +0,0 @@
/*
Copyright 2001-2015 John Wiseman G8BPQ
This file is part of LinBPQ/BPQ32.
LinBPQ/BPQ32 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 3 of the License, or
(at your option) any later version.
LinBPQ/BPQ32 is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with LinBPQ/BPQ32. If not, see http://www.gnu.org/licenses
*/
//
// DLL to provide BPQEther support for G8BPQ switch in a Linux environment,
// Normally uses a Raw socket, but that can't send to other apps on same machine.
// so can use a TAP device instead (or maybe as well??)
#include <stdio.h>
#include "CHeaders.h"
#include <sys/socket.h>
#include <linux/if_packet.h>
#include <linux/if_ether.h>
#include <linux/if_arp.h>
extern char * PortConfig[33];
extern int tap_fd;
typedef struct PCAPStruct
{
UCHAR EthSource[6];
UCHAR EthDest[6];
short EtherType;
BOOL RLITX;
BOOL RLIRX;
BOOL Promiscuous;
int s; /*socketdescriptor*/
struct sockaddr_ll socket_address; /*target address*/
} PCAPINFO, *PPCAPINFO ;
PCAPINFO PCAPInfo[32];
// on linux default to broadcast
short udpport=0;
unsigned int OurInst = 0;
BOOL GotMsg;
DWORD n;
char Adapter[256];
static BOOL ReadConfigFile(int Port);
static int ProcessLine(char * buf,int Port, BOOL CheckPort);
int WritetoConsoleLocal(char * buff);
int ExtProc(int fn, int port,unsigned char * buff)
{
int len,txlen=0,res;
char txbuff[500];
unsigned char rxbuff[1600];
PCAPINFO * IF = &PCAPInfo[port];
if (IF->s == 0)
return 0;
switch (fn)
{
case 1: // poll
res = recvfrom(IF->s, rxbuff, ETH_FRAME_LEN, 0, NULL, NULL);
if (res == -1)
{
if (errno == 11)
return 0; //Resource temporarily unavailable
perror("Eth RX");
return 0;
}
if (res == 0)
/* Timeout elapsed */
return 0;
if (rxbuff[13] != 0xff)
return 0;
if (IF->RLIRX)
// RLI MODE - An extra 3 bytes before len, seem to be 00 00 41
{
len=rxbuff[18]*256 + rxbuff[17];
if ((len < 16) || (len > 320)) return 0; // Probably BPQ Mode Frame
len-=3;
memcpy(&buff[7],&rxbuff[19],len);
len+=5;
}
else
{
len=rxbuff[15]*256 + rxbuff[14];
if ((len < 16) || (len > 320)) return 0; // Probably RLI Mode Frame
len-=3;
memcpy(&buff[7],&rxbuff[16],len);
len+=5;
}
buff[5]=(len & 0xff);
buff[6]=(len >> 8);
return 1;
case 2: // send
if (IF->RLITX)
// RLI MODE - An extra 3 bytes before len, seem to be 00 00 41
{
txlen=(buff[6]<<8) + buff[5]; // BPQEther is DOS-based - chain word is 2 bytes
txlen-=2;
txbuff[16]=0x41;
txbuff[17]=(txlen & 0xff);
txbuff[18]=(txlen >> 8);
if (txlen < 1 || txlen > 400)
return 0;
memcpy(&txbuff[19],&buff[7],txlen);
}
else
{
txlen=(buff[6]<<8) + buff[5]; // BPQEther is DOS-based - chain word is 2 bytes
txlen-=2;
txbuff[14]=(txlen & 0xff);
txbuff[15]=(txlen >> 8);
if (txlen < 1 || txlen > 400)
return 0;
memcpy(&txbuff[16],&buff[7],txlen);
}
memcpy(&txbuff[0], &IF->EthDest[0],6);
memcpy(&txbuff[6], &IF->EthSource[0],6);
memcpy(&txbuff[12], &IF->EtherType,2);
txlen+=14;
if (txlen < 60) txlen = 60;
// Send down the packet
res = sendto(IF->s, txbuff, txlen, 0,
(const struct sockaddr *)&IF->socket_address, sizeof(struct sockaddr_ll));
if (res < 0)
{
perror("Eth Send");
return 3;
}
// if (tap_fd)
// write(tap_fd, txbuff, txlen);
return (0);
case 3: // CHECK IF OK TO SEND
return (0); // OK
case 4: // reinit
return 0;
case 5: // reinit
return 0;
}
return (0);
}
UINT ETHERExtInit(struct PORTCONTROL * PortEntry)
{
// Can have multiple ports, each mapping to a different Ethernet Adapter
// The Adapter number is in IOADDR
//
int i=0;
u_int netmask;
char buf[256];
int n;
struct ifreq ifr;
size_t if_name_len;
PCAPINFO * IF;
int port = PortEntry->PORTNUMBER;
u_long param=1;
struct ifreq buffer;
WritetoConsoleLocal("BPQEther ");
//
// Read config
//
if (!ReadConfigFile(port))
return (FALSE);
if_name_len = strlen(Adapter);
IF = &PCAPInfo[port];
IF->s = socket(AF_PACKET, SOCK_RAW, htons(ETH_P_BPQ));
if (IF->s == -1)
{
perror("Open Ether Socket");
IF->s = 0;
}
else
{
ioctl(IF->s, FIONBIO, &param);
memcpy(ifr.ifr_name, Adapter, if_name_len);
ifr.ifr_name[if_name_len] = 0;
if (ioctl(IF->s, SIOCGIFINDEX,&ifr) == -1)
perror("Get IF Number");
// Get MAC Address
memset(&buffer, 0x00, sizeof(buffer));
strcpy(buffer.ifr_name, Adapter);
ioctl(IF->s, SIOCGIFHWADDR, &buffer);
memcpy(IF->EthSource, buffer.ifr_hwaddr.sa_data, 6);
}
n=sprintf(buf,"Using %s = Interface %d\n", Adapter, ifr.ifr_ifindex);
WritetoConsoleLocal(buf);
/*prepare sockaddr_ll*/
/*RAW communication*/
IF->socket_address.sll_family = PF_PACKET;
/*we don't use a protocoll above ethernet layer ->just use anything here*/
IF->socket_address.sll_protocol = htons(ETH_P_IP);
//index of the network device
IF->socket_address.sll_ifindex = ifr.ifr_ifindex;
/*ARP hardware identifier is ethernet*/
IF->socket_address.sll_hatype = ARPHRD_ETHER;
/*target is another host*/
IF->socket_address.sll_pkttype = PACKET_BROADCAST;
/*address length*/
IF->socket_address.sll_halen = ETH_ALEN;
/*MAC - begin*/
memcpy(IF->socket_address.sll_addr, IF->EthDest, 6);
IF->socket_address.sll_addr[6] = 0x00;/*not used*/
IF->socket_address.sll_addr[7] = 0x00;/*not used*/
// n=sprintf(buf,"Using %s Adapter = Interface %d\r", ifr.ifr_ifindex);
// WritetoConsole(buf);
return ((int) ExtProc);
}
static BOOL ReadConfigFile(int Port)
{
//TYPE 1 08FF # Ethernet Type
//ETH 1 FF:FF:FF:FF:FF:FF # Target Ethernet AddrMAP G8BPQ-7 10.2.77.1 # IP 93 for compatibility
//ADAPTER 1 \Device\NPF_{21B601E8-8088-4F7D-96 29-EDE2A9243CF4} # Adapter Name
char buf[256],errbuf[256];
char * Config;
Config = PortConfig[Port];
PCAPInfo[Port].Promiscuous = 1; // Default
PCAPInfo[Port].EtherType=htons(0x08FF); // Default
memset(PCAPInfo[Port].EthDest, 0xff, 6);
if (Config)
{
// Using config from bpq32.cfg
char * ptr1 = Config, * ptr2;
ptr2 = strchr(ptr1, 13);
while(ptr2)
{
memcpy(buf, ptr1, ptr2 - ptr1);
buf[ptr2 - ptr1] = 0;
ptr1 = ptr2 + 2;
ptr2 = strchr(ptr1, 13);
strcpy(errbuf,buf); // save in case of error
if (!ProcessLine(buf, Port, FALSE))
{
WritetoConsoleLocal("BPQEther - Bad config record ");
WritetoConsoleLocal(errbuf);
WritetoConsoleLocal("\n");
}
}
return (TRUE);
}
n=sprintf(buf,"No config info found in bpq32.cfg\n");
WritetoConsoleLocal(buf);
return (FALSE);
}
static int ProcessLine(char * buf, int Port, BOOL CheckPort)
{
char * ptr;
char * p_port;
char * p_mac;
char * p_Adapter;
char * p_type;
int port;
int a,b,c,d,e,f,num;
ptr = strtok(buf, " \t\n\r");
if(ptr == NULL) return (TRUE);
if(*ptr =='#') return (TRUE); // comment
if(*ptr ==';') return (TRUE); // comment
if (CheckPort)
{
p_port = strtok(NULL, " \t\n\r");
if (p_port == NULL) return (FALSE);
port = atoi(p_port);
if (Port != port) return TRUE; // Not for us
}
if(_stricmp(ptr,"ADAPTER") == 0)
{
p_Adapter = strtok(NULL, " \t\n\r");
strcpy(Adapter,p_Adapter);
return (TRUE);
}
if(_stricmp(ptr,"TYPE") == 0)
{
p_type = strtok(NULL, " \t\n\r");
if (p_type == NULL) return (FALSE);
num=sscanf(p_type,"%x",&a);
if (num != 1) return FALSE;
PCAPInfo[Port].EtherType=htons(a);
return (TRUE);
}
if(_stricmp(ptr,"promiscuous") == 0)
{
ptr = strtok(NULL, " \t\n\r");
if (ptr == NULL) return (FALSE);
PCAPInfo[Port].Promiscuous = atoi(ptr);
return (TRUE);
}
if(_stricmp(ptr,"RXMODE") == 0)
{
p_port = strtok(NULL, " \t\n\r");
if (p_port == NULL) return (FALSE);
if(_stricmp(p_port,"RLI") == 0)
{
PCAPInfo[Port].RLIRX=TRUE;
return (TRUE);
}
if(_stricmp(p_port,"BPQ") == 0)
{
PCAPInfo[Port].RLIRX=FALSE;
return (TRUE);
}
return FALSE;
}
if(_stricmp(ptr,"TXMODE") == 0)
{
p_port = strtok(NULL, " \t\n\r");
if (p_port == NULL) return (FALSE);
if(_stricmp(p_port,"RLI") == 0)
{
PCAPInfo[Port].RLITX=TRUE;
return (TRUE);
}
if(_stricmp(p_port,"BPQ") == 0)
{
PCAPInfo[Port].RLITX=FALSE;
return (TRUE);
}
return FALSE;
}
if(_stricmp(ptr,"DEST") == 0)
{
p_mac = strtok(NULL, " \t\n\r");
if (p_mac == NULL) return (FALSE);
num=sscanf(p_mac,"%x-%x-%x-%x-%x-%x",&a,&b,&c,&d,&e,&f);
if (num != 6) return FALSE;
PCAPInfo[Port].EthDest[0]=a;
PCAPInfo[Port].EthDest[1]=b;
PCAPInfo[Port].EthDest[2]=c;
PCAPInfo[Port].EthDest[3]=d;
PCAPInfo[Port].EthDest[4]=e;
PCAPInfo[Port].EthDest[5]=f;
// strcpy(Adapter,p_Adapter);
return (TRUE);
}
if(_stricmp(ptr,"SOURCE") == 0) // not used, but ignore
return (TRUE);
//
// Bad line
//
return (FALSE);
}
Loading…
Cancel
Save

Powered by TurnKey Linux.