Programming Need help with C/C++/Delphi? Ask here and make us all laugh. |
09-08-2003, 08:57 PM
|
#1
|
Posse Member
Ultimate Scripter ioFTPD Administrator
Join Date: Dec 2002
Posts: 1,956
|
b5 shmem questions
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.
-----
|
|
|
09-09-2003, 09:05 AM
|
#2
|
Disabled
FlashFXP Registered User ioFTPD Administrator
Join Date: Dec 2001
Posts: 2,230
|
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
|
|
|
09-09-2003, 09:55 AM
|
#3
|
Posse Member
Ultimate Scripter ioFTPD Administrator
Join Date: Dec 2002
Posts: 1,956
|
Code:
// 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 ?
|
|
|
09-09-2003, 10:47 AM
|
#4
|
Disabled
FlashFXP Registered User ioFTPD Administrator
Join Date: Dec 2001
Posts: 2,230
|
there was minor bug it seems
|
|
|
Thread Tools |
|
Display Modes |
Rate This Thread |
Linear Mode
|
|
Posting Rules
|
You may not post new threads
You may not post replies
You may not post attachments
You may not edit your posts
HTML code is Off
|
|
|
All times are GMT -5. The time now is 10:00 AM.
|