Fixed most IPC related memory leaks. Queue server is very lean now memory wise.
[fmail.git] / backends / mailbox / fsmailbox.cpp
blob71cb8a66e165d1bef1623b1fcb009531ab82649e
2 #include <libfmail.h>
3 #include <libfmail/socketipc.h>
4 #include <dirent.h>
6 #define MSG_LIST 1
7 #define MSG_STORE 2
8 #define MSG_RETR 3
10 int knhash(char v){
11 if ((v >= 'A') && (v <= 'Z'))
12 return v - 'A';
14 if ((v >= 'a') && (v <= 'z'))
15 return v - 'a';
17 return 255;
20 class FSMailbox : public ProtocolHandler{
21 private:
22 SearchTree<int, 26, &knhash> cmdtree;
23 public:
24 FSMailbox(){
25 cmdtree.Insert("list", MSG_LIST);
26 cmdtree.Insert("store", MSG_STORE);
27 cmdtree.Insert("retr", MSG_RETR);
29 int Handle(Socket *s){
30 IPCMessage *msg;
31 IPC *ipc;
32 int onRun, msgid, n, i, len;
33 char *user, *rcpt, *msglen, buffer[255];
34 FILE *fd;
35 //DIR *dir;
36 struct dirent **dent;
38 printf("Got Client\n");
39 printf("Creating new IPC\n");
41 ipc = new SocketIPC(s);
42 onRun = 1;
44 while(onRun){
45 printf("Waiting for Message\n");
46 if (ipc->PeekMessage()){
47 printf("Got Message\n");
48 msg = ipc->PopMessage();
49 try{
50 msgid = cmdtree.Lookup((char*)msg->GetMessageName());
51 }catch (SearchNotFound){
52 msgid = -1;
54 switch(msgid){
55 case MSG_LIST:
56 user = msg->PopParam();
57 sprintf(buffer, "/tmp/fmail/%s/", user);
58 n = scandir(buffer, &dent, NULL, alphasort);
59 sprintf(buffer, "%i", n);
60 msg = new IPCMessage("ok");
61 msg->PushParam(buffer);
62 ipc->PushMessage(msg);
63 for (i = 0; i < n; i++){
64 msg = new IPCMessage("mailinfo");
65 msg->PushParam(dent[i]->d_name);
66 free(dent[i]);
68 free(dent);
69 break;
70 case MSG_STORE:
71 user = msg->PopParam();
72 rcpt = msg->PopParam();
73 msglen = msg->PopParam();
74 //len = atoi(msglen);
75 len = 1025;
76 fd = fopen("/tmp/fmail/in/1", "w");
77 n = 0;
78 while(n < len){
79 i = ipc->RawRead(buffer, 255);
80 fwrite(buffer, 1, i, fd);
81 if (i == 0)
82 break;
83 n += i;
85 fclose(fd);
86 break;
87 case MSG_RETR:
88 break;
89 case 4:
90 break;
91 default:
92 break;
96 ipc->CloseIPC();
97 delete ipc;
98 return 0;
102 class SimpleLoad : public LoadHandler{
103 public:
104 int Dispatch(Socket *sock, ProtocolHandler *ph){
105 printf("SimpleLoad: Dispatching\n");
106 if (ph)
107 return ph->Handle(sock);
108 return 0;
112 int main(){
113 //BaseServer *serv;
114 LoadHandler *lh;
115 FSMailbox *handler;
116 Socket *s, *client;
117 int r;
119 s = Socket::CreateSocket(SOCKET_INET, 0);
120 s->setAddress("127.0.0.1");
121 s->setPort(14001);
123 s->Bind();
124 s->Listen(10);
126 printf("Creating new FSMailbox\n");
127 handler = new FSMailbox();
129 printf("Creating new SimpleLoad\n");
130 lh = new SimpleLoad();
132 while (1){
133 r = s->Poll(10000, SOCKET_POLL_READ);
134 if (r == SOCKET_POLL_READ){
135 printf("Got new client!\n");
136 client = s->Accept();
137 lh->Dispatch(client, handler);
141 return 0;