|
@@ -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;
|