ソースを参照

delete and read command, testdata

Kajetan Johannes Hammerle 6 年 前
コミット
8d812c2b2a
8 ファイル変更256 行追加74 行削除
  1. 1 1
      Client.c
  2. 21 50
      ClientMain.c
  3. 1 2
      Server.c
  4. 232 19
      ServerMain.c
  5. 1 0
      mails/Gusi/Kajetan/0/H
  6. BIN
      mails/Gusi/mailcounter
  7. 0 1
      mails/b/a/0/c
  8. 0 1
      mails/b/a/2/c

+ 1 - 1
Client.c

@@ -45,7 +45,7 @@ static void* serverHandler(void* data)
             {
                 if(package >= 0 && package < c->hIndex)
                 {
-                    printf("Received package %d from server\n", package);
+                    //printf("Received package %d from server\n", package);
                     c->handlers[package](&in);
                 }
                 else

+ 21 - 50
ClientMain.c

@@ -227,54 +227,6 @@ void waitForData()
         }
         
         stringRemove(&s);
-        
-        /*if(type == -1)
-        {
-            break;
-        }
-        else if(type >= 0 && type < 4)
-        {
-            Stream out;
-            streamInit(&out, 16);
-            streamWriteInt(&out, type);
-            
-            switch(type)
-            {
-                case 0:
-                    printf("first number: ");
-                    streamWriteInt(&out, readInt());
-                    printf("second number: ");
-                    streamWriteInt(&out, readInt());
-                    break;
-                case 1:
-                    printf("text: ");
-                    char buffer[128];
-                    fgets(buffer, 128, stdin);
-                    if(strlen(buffer) == 127 && buffer[126] != '\n')
-                    {
-                        clearInput();
-                    }
-                    streamWriteChars(&out, buffer);
-                    break;
-                case 2:
-                    for(int i = 0; i < 260; i++)
-                    {
-                        streamWriteInt(&out, i);
-                    }
-                    break;
-            }
-            
-            if(clientSendData(&client, &out) == -1)
-            {
-                streamRemove(&out);
-                break;
-            }
-            streamRemove(&out);
-        }
-        else
-        {
-            printf("%d is not a valid package number\n", type);
-        }*/
     }
 }
 
@@ -292,13 +244,31 @@ void packageList(Stream* in)
     {
         return;
     }
+    if(number == 1)
+    {
+        printf("\nYou have %d mail.\n", number);
+    }
+    else
+    {
+        printf("\nYou have %d mails.\n", number);
+    }
     
     char c;
     while(streamGetChar(in, &c) != -1)
     {
-        printf("%c", c);
+        fputc(c, stdout);
+    }
+    fputc('\n', stdout);
+}
+
+void packageReadDel(Stream* in)
+{
+    char c;
+    while(streamGetChar(in, &c) != -1)
+    {
+        fputc(c, stdout);
     }
-    printf("\n");
+    fputc('\n', stdout);
 }
 
 int main(int argc, char** argv)
@@ -321,6 +291,7 @@ int main(int argc, char** argv)
     
     clientRegisterHandler(&client, packageAnswer);
     clientRegisterHandler(&client, packageList);
+    clientRegisterHandler(&client, packageReadDel);
 
     waitForData();
 

+ 1 - 2
Server.c

@@ -7,7 +7,6 @@
 #include <netinet/in.h>
 #include <arpa/inet.h>
 #include <sys/types.h>
-#define __USE_POSIX199506
 #include <signal.h>  
 #include "SocketUtils.h"
 
@@ -181,7 +180,7 @@ static void* clientHandler(void* data)
             {
                 if(package >= 0 && package < s->hIndex)
                 {
-                    printf("Received package %d from %d\n", package, id);
+                    //printf("Received package %d from %d\n", package, id);
                     if(s->handlers[package](id, s->clientSockets[id], &in))
                     {
                         break;

+ 232 - 19
ServerMain.c

@@ -52,6 +52,11 @@ int getMailCounter()
     return counter;
 }
 
+int isSpecialFolder(char* folder)
+{
+    return strcmp(folder, ".") == 0 || strcmp(folder, "..") == 0;
+}
+
 Server server;
 
 void interruptHandler(int signal)
@@ -70,7 +75,7 @@ void ensureBufferSize(char** data, int* size, int minSize)
             newSize *= 2;
         }
         
-        printf("Resize from %d to %d\n", *size, newSize);
+        //printf("Resize from %d to %d\n", *size, newSize);
         
         char* newData = malloc(sizeof(char) * newSize);
         memcpy(newData, *data, *size);
@@ -91,6 +96,16 @@ void packageSendFailAnswer(int clientSocket)
     streamRemove(&out);
 }
 
+void packageSendOkAnswer(int clientSocket)
+{
+    Stream out;
+    streamInit(&out, 16);
+    streamWriteInt(&out, 0);
+    streamWriteChars(&out, "OK\n");
+    serverSend(clientSocket, &out);
+    streamRemove(&out);
+}
+
 int createDirectory(char* path)
 {
     DIR* dir = opendir(path);
@@ -123,10 +138,10 @@ int createDirectory(char* path)
 
 void storeMail(char* sender, char* receiver, char* subject, char* message)
 {
-    printf("sender: %s\n", sender);
+    /*printf("sender: %s\n", sender);
     printf("receiver: %s\n", receiver);
     printf("subject: %s\n", subject);
-    printf("message: %s\n", message);
+    printf("message: %s\n", message);*/
     
     if(createDirectory(receiver) == -1)
     {
@@ -362,12 +377,7 @@ int packageSend(int client, int clientSocket, Stream* in)
             
     free(message);
 
-    Stream out;
-    streamInit(&out, 16);
-    streamWriteInt(&out, 0);
-    streamWriteChars(&out, "OK\n");
-    serverSend(clientSocket, &out);
-    streamRemove(&out);
+    packageSendOkAnswer(clientSocket);
     return 0;
 }
 
@@ -495,6 +505,102 @@ int packageList(int client, int clientSocket, Stream* in)
     return 0;
 }
 
+void readMail(char* user, int number, Stream* out)
+{
+    DIR* dir = opendir(user);
+    if(dir == NULL)
+    {
+        streamWriteChars(out, "ERR\n");
+        return;
+    }
+    assert(chdir(user) == 0);
+    
+    char buffer[12];
+    snprintf(buffer, 12, "%d", number);
+    
+    struct dirent* senders;
+    senders = readdir(dir);
+    while(senders != NULL)
+    {
+        if(strcmp(senders->d_name, ".") != 0 && strcmp(senders->d_name, "..") != 0)
+        {
+            if(chdir(senders->d_name) == 0)
+            {
+                DIR* innerDir = opendir(buffer);
+                if(innerDir != NULL)
+                {
+                    struct dirent* mail;
+                    mail = readdir(innerDir);
+                    while(mail != NULL && (strcmp(mail->d_name, ".") == 0 || strcmp(mail->d_name, "..") == 0))
+                    {
+                        mail = readdir(innerDir);
+                    }
+                    
+                    if(mail != NULL)
+                    {
+                        assert(chdir(buffer) == 0);
+                        FILE* file = fopen(mail->d_name, "r");
+                        if(file != NULL)
+                        {
+                            struct stat stats;
+                            if(stat(mail->d_name, &stats) == 0)
+                            {
+                                char* filebuffer = malloc(sizeof(char) * (stats.st_size + 1));
+                                if(fgets(filebuffer, stats.st_size + 1, file) != NULL)
+                                {
+                                    streamWriteChars(out, "OK\n");
+                                    streamWriteChars(out, filebuffer);
+                                    streamWriteChar(out, '\n');
+                                }
+                                else
+                                {
+                                    streamWriteChars(out, "ERR\n");
+                                }
+                            }
+                            else
+                            {
+                                streamWriteChars(out, "ERR\n");
+                            }
+                            
+                            if(fclose(file) == EOF)
+                            {
+                                perror("cannot close file");
+                            }
+                        }
+                        else
+                        {
+                            streamWriteChars(out, "ERR\n");
+                        }
+                    }
+                    else
+                    {
+                        streamWriteChars(out, "ERR\n");
+                    }
+                    
+                    if(closedir(innerDir) == -1)
+                    {
+                        perror("cannot close innerDir");
+                    }
+                    if(closedir(dir) == -1)
+                    {
+                        perror("cannot close dir");
+                    }
+                    return;
+                }
+                
+                assert(chdir("../") == 0);
+            }
+        }
+        senders = readdir(dir);
+    }
+    
+    if(closedir(dir) == -1)
+    {
+        perror("cannot close dir");
+    }
+    streamWriteChars(out, "ERR\n");
+}
+
 int packageRead(int client, int clientSocket, Stream* in)
 {
     char c;
@@ -560,19 +666,113 @@ int packageRead(int client, int clientSocket, Stream* in)
         return 0;
     }
     
-    printf("user: %s\n", user);
-    printf("number: %d\n", number);
-
     Stream out;
     streamInit(&out, 16);
-    streamWriteInt(&out, 0);
-    streamWriteChars(&out, "OK\n");
+    streamWriteInt(&out, 2);
+    char workingPath[256];
+    if(getcwd(workingPath, 256) != NULL)
+    {
+        readMail(user, number, &out);
+        assert(chdir(workingPath) == 0);
+    }
+    else
+    {
+        streamWriteChars(&out, "ERR\n");
+    }
     serverSend(clientSocket, &out);
     streamRemove(&out);
     
     return 0;
 }
 
+int deleteMail(char* user, int number)
+{
+    DIR* dir = opendir(user);
+    if(dir == NULL)
+    {
+        return 0;
+    }
+    assert(chdir(user) == 0);
+    
+    char buffer[12];
+    snprintf(buffer, 12, "%d", number);
+    
+    int rValue = 0;
+    
+    struct dirent* senders;
+    senders = readdir(dir);
+    while(senders != NULL)
+    {
+        if(strcmp(senders->d_name, ".") != 0 && strcmp(senders->d_name, "..") != 0)
+        {
+            if(chdir(senders->d_name) == 0)
+            {
+                DIR* innerDir = opendir(buffer);
+                if(innerDir != NULL)
+                {
+                    if(chdir(buffer) == -1)
+                    {
+                        perror("cannot change dir");
+                        if(closedir(innerDir) == -1)
+                        {
+                            perror("cannot close innerDir");
+                        }
+                        break;
+                    }
+                    
+                    rValue = 1;
+                    
+                    struct dirent* mail;
+                    mail = readdir(innerDir);
+                    while(mail != NULL)
+                    {
+                        if(!isSpecialFolder(mail->d_name) && remove(mail->d_name) == -1)
+                        {
+                            perror("cannot delete file");
+                            rValue = 0;
+                        }
+                        mail = readdir(innerDir);
+                    }
+                    
+                    if(closedir(innerDir) == -1)
+                    {
+                        perror("cannot close innerDir");
+                        rValue = 0;
+                    }
+                    
+                    if(chdir("../") == 0)
+                    {
+                        if(rmdir(buffer) == -1)
+                        {
+                            perror("cannot remove dir");
+                            rValue = 0;
+                        }
+                    }
+                    else
+                    {
+                        perror("cannot change dir");
+                        rValue = 0;
+                    }
+                    break;
+                }
+                
+                if(chdir("../") == -1)
+                {
+                    perror("cannot change dir");
+                    break;
+                }
+            }
+        }
+        senders = readdir(dir);
+    }
+    
+    if(closedir(dir) == -1)
+    {
+        perror("cannot close dir");
+    }
+    return rValue;
+}
+
 int packageDelete(int client, int clientSocket, Stream* in)
 {
     char c;
@@ -638,13 +838,26 @@ int packageDelete(int client, int clientSocket, Stream* in)
         return 0;
     }
     
-    printf("user: %s\n", user);
-    printf("number: %d\n", number);
-
     Stream out;
     streamInit(&out, 16);
-    streamWriteInt(&out, 0);
-    streamWriteChars(&out, "OK\n");
+    streamWriteInt(&out, 2);
+    char workingPath[256];
+    if(getcwd(workingPath, 256) != NULL)
+    {
+        if(deleteMail(user, number))
+        {
+            streamWriteChars(&out, "OK\n");
+        }
+        else
+        {
+            streamWriteChars(&out, "ERR\n");
+        }
+        assert(chdir(workingPath) == 0);
+    }
+    else
+    {
+        streamWriteChars(&out, "ERR\n");
+    }
     serverSend(clientSocket, &out);
     streamRemove(&out);
     return 0;

+ 1 - 0
mails/Gusi/Kajetan/0/H

@@ -0,0 +1 @@
+Hallo Gusi, das ist ein Test.

BIN
mails/Gusi/mailcounter


+ 0 - 1
mails/b/a/0/c

@@ -1 +0,0 @@
-d

+ 0 - 1
mails/b/a/2/c

@@ -1 +0,0 @@
-dgdfg