PDA

View Full Version : b5 shmem questions


Mouton
09-08-2003, 08:57 PM
ULONG ulClientIp;
how does one convert that to a string ?

A: struct in_addr temp; temp.s_addr = pOnlineData->OnlineData.ulClientIp; strcpy(ip, inet_ntoa(temp));

-----

using DC_GET_ONLINEDATA, i get a ONLINEDATA struct containing only the Uid. What's the easiest way to get the primary group of that user ? I see only opening userfile and checking there..?

A: DC_USERFILE_OPEN, pUserFile->Gid, DC_USERFILE_CLOSE

-----

How can I know what local offsets needs to be set and what local offsets will contain the resulting struct after a SendMessage for each of the DC_xxx messages ?
I tried divination, like for my DC_GET_ONLINEDATA, I used:

PDC_ONLINEDATA pOnlineData = (PDC_ONLINEDATA)lpMessage->lpContext;
lpMessage->dwIdentifier = DC_GET_ONLINEDATA;
pOnlineData->iOffset = 0;
pOnlineData->dwSharedMemorySize = 4096;

but how do i know how i need to fill the pOnlineData->dwSharedMemorySize ?? This number is a random choice of a multiple of 2!
and my guess that the pOnlineData returned is at lpContext is pretty obvious here, since it's the only thing it should return, but how about the other messages ..?

-----

dwReturn = SendMessage(hIoFTPD, WM_KILL, iPos, (LPARAM)hMemory);

this returns 1 :\ should return 0... how can i use that message ?

-----

how can i get all the users on the site using shmem ? atm, i open UserIdTable and fetch all users from there.

-----

darkone
09-09-2003, 09:05 AM
1) Create temporary in_addr type structure;

InAddr.s_addr = ulClientIp;
strcpy(ip, inet_ntoa(InAddr));

2) Yes, open the userfile (one should create local cache, so you don't have to open same userfile more than once [it's possible, but uses more resources])

3) dwSharedMemorySize contains amount of memory your shared memory chunk contains (you must fill it yourself). If you have too little memory & paths don't fit, dwReturn value will be equal to amount of memory required to complete action successfully.

4) WM_KILL message is executed instantly by message handler thread (it's not dispatched to worker threads like datacopy messages are) - it returns 0 if client was killed, 1 on error

Mouton
09-09-2003, 09:55 AM
// Initial setup for DC_GET_ONLINEDATA
lpMessage->dwIdentifier = DC_GET_ONLINEDATA;
PDC_ONLINEDATA pOnlineData = (PDC_ONLINEDATA)lpMessage->lpContext;
pOnlineData->iOffset = iPos;
pOnlineData->dwSharedMemorySize = 4096;

char username[64]="Unknown",pwd[_MAX_PWD + 1];

// Send Message
dwReturn = SendMessage(hIoFTPD, WM_SHMEM, NULL, (LPARAM)hMemory);
if (!dwReturn) {
// Wait until processed (5 secs)
WaitForSingleObject(hEvent, 5000);

if (nPos == 1024) {
printf("Error on kill: %i.\n",iPos);fflush(stdout);
return 1;
}

strcpy(pwd,pOnlineData->OnlineData.szVirtualPath);
resolveUidToName(pOnlineData->OnlineData.Uid,username);

dwReturn = SendMessage(hIoFTPD, WM_KILL, iPos, (LPARAM)hMemory);
if (!dwReturn) {
printf("%s was kicked from %s\n",username,pwd);
} else {
printf("Error on kill: couldn't kill #%i (%s).\n",iPos,username);fflush(stdout);
return 1;
}
}


I get: Error on kill: couldn't kill #0 (nomaster).
What's wrong ? How can i debug that ?

darkone
09-09-2003, 10:47 AM
there was minor bug it seems :)