PDA

View Full Version : Module stuff


darkone
10-02-2003, 09:22 PM
MessageVariableModule

Initializiation routine: BOOL MessageVariableInit(LPVARIABLE_MODULE)
DeInitialization routine: VOID MessageVariableDeInit(LPVARIABLE_MODULE)

Declaration for InstallMessageVariable procedure is available in
the source\include\Message.h.

szName: Name of variable
lpAllocProc: Procedure to call, when compiling variable. Returns pointer to variable.
lpFreeProc: Procedure to call, when can be freed (may be NULL)
dwRequiredData: B_ANY or combination B_USERFILE, ... (see Message.h for complete list)
dwType: For variables that do not take parameters: C_STRING_VARIABLE, C_FLOAT_VARIABLE, C_INTEGER_VARIABLE,
...: NULL terminated list of functions used for parameter parsing.


To clarify these, here are some examples from ioftpd source code:

$group
LPVOID MessageVariable_Group(LPMESSAGEDATA lpData)
{
return Gid2Group(GETOFFSET(lpData->DataOffsets, DATA_USERFILE)->Gid);
}

InstallMessageVariable("GROUP", MessageVariable_Group, NULL, B_USERFILE, C_STRING_VARIABLE, NULL);

*NOTE* GETOFFSET macro is defined in Message.h

$gid
LPVOID MessageVariable_Gid(LPMESSAGEDATA lpData)
{
return &GETOFFSET(lpData->DataOffsets, DATA_USERFILE)->Gid;
}

InstallMessageVariable("GID", MessageVariable_Gid, NULL, B_USERFILE, C_INTEGER_VARIABLE, NULL);


ip(ip #)
BOOL MessageObject_Ip(LPMESSAGEDATA lpData, INT Argc, LPOBJV Argv)
{
LPUSERFILE lpUserFile;
LPSTR szIpString;
INT i;

// Get userfile
lpUserFile = GETOFFSET(lpData->DataOffsets, DATA_USERFILE);
// Get entry #
if (! Argc ||
Object_Get_Int(lpData, &Argv[0], &i) ||
i < 1 || i > MAX_IPS)
{
i = 1;
}
// Get ip string
IszpString = lpUserFile->Ip[i - 1];
// Append result to output buffer
Put_Buffer_Format(lpData->lpOutBuffer, lpData->szFormat, szIpString);
return FALSE;
}



INT MessageObject_ConvertInteger(LPSTR szArg)
{
PCHAR pCheck;
INT Int;

Int = strtol(szArg, &pCheck, 10);
if (pCheck[0] == '\0' && pCheck != szArg) return Int;
return (ULONG)-1;
}


InstallMessageVariable("IP", MessageObject_Ip, NULL, B_USERFILE, C_STRING_VARIABLE|C_ARGS, MessageObject_ConvertInteger, NULL);

*Note* Use GetProc to find address of procedures such as Put_Buffer_Format, Object_Get_Int, etc..


EventModule

Initializatioun routine: BOO EventInit(LPEVENT_MODULE)
Deinitialization routine: VOID EventDeInit(LPEVENT_MODULE)

BOOL InstallEvent(LPSTR szName, LPVOID lpProc);

szName = Event name
lpProc = Procedure to call on event

BOOL MyEvent(LPEVENT_DATA lpEventData, LPIO_STRING Arguments);

Use ioftpd's string manipulation functions GetStringIndex, GetStringIndexStatic, GetStringRange to parse arguments.

You can either use InitDataOffsets to extract information about current user:

InitDataOffsets(&DataOffsets, lpEventData->lpData, lpEventData->dwData);

Or, use switch as:
switch (lpEventData->dwData)
{
case DT_FTPUSER;
lpFtpUser = (LPFTPUSER)lpEventData->lpData;
break;
case DT_HTTPUSER:
lpHttpUser = (LPHTTPUSER)lpEventData->lpData;
break;
case DT_TELNETUSER:
lpHttpUser = (LPTELNETUSER)lpEventData->lpData;
break;
case DT_USERFILE:
lpHttpUser = (LPUSERFILE)lpEventData->lpData;
break;
}


bleh.. it's all too complicated :) I should do some examples :/