|
@@ -1,3 +1,4 @@
|
|
|
|
+#define _POSIX_C_SOURCE 1
|
|
#include <stdio.h>
|
|
#include <stdio.h>
|
|
#include <unistd.h>
|
|
#include <unistd.h>
|
|
#include <stdlib.h>
|
|
#include <stdlib.h>
|
|
@@ -6,6 +7,7 @@
|
|
#include <dirent.h>
|
|
#include <dirent.h>
|
|
#include <sys/stat.h>
|
|
#include <sys/stat.h>
|
|
#include <sys/types.h>
|
|
#include <sys/types.h>
|
|
|
|
+#include <sys/file.h>
|
|
#include <fcntl.h>
|
|
#include <fcntl.h>
|
|
#include <dirent.h>
|
|
#include <dirent.h>
|
|
#include <assert.h>
|
|
#include <assert.h>
|
|
@@ -14,6 +16,7 @@
|
|
int getMailCounter()
|
|
int getMailCounter()
|
|
{
|
|
{
|
|
FILE* test = fopen("mailcounter", "r+");
|
|
FILE* test = fopen("mailcounter", "r+");
|
|
|
|
+ flock(fileno(test), LOCK_EX);
|
|
if(test == NULL)
|
|
if(test == NULL)
|
|
{
|
|
{
|
|
if(creat("mailcounter", S_IRUSR | S_IWUSR | S_IRGRP | S_IROTH) == -1)
|
|
if(creat("mailcounter", S_IRUSR | S_IWUSR | S_IRGRP | S_IROTH) == -1)
|
|
@@ -44,6 +47,7 @@ int getMailCounter()
|
|
{
|
|
{
|
|
return 0;
|
|
return 0;
|
|
}
|
|
}
|
|
|
|
+ flock(fileno(test), LOCK_UN);
|
|
if(fclose(test) == EOF)
|
|
if(fclose(test) == EOF)
|
|
{
|
|
{
|
|
return 0;
|
|
return 0;
|
|
@@ -158,19 +162,25 @@ void storeMail(char* sender, char* receiver, char* subject, char* message)
|
|
char buffer[12];
|
|
char buffer[12];
|
|
snprintf(buffer, 12, "%d", id);
|
|
snprintf(buffer, 12, "%d", id);
|
|
|
|
|
|
- if(createDirectory(buffer) == -1)
|
|
|
|
|
|
+ if(creat(buffer, S_IRUSR | S_IWUSR | S_IRGRP | S_IROTH) == -1)
|
|
{
|
|
{
|
|
return;
|
|
return;
|
|
}
|
|
}
|
|
|
|
|
|
- if(creat(subject, S_IRUSR | S_IWUSR | S_IRGRP | S_IROTH) == -1)
|
|
|
|
|
|
+ FILE* file = fopen(buffer, "w");
|
|
|
|
+ if(file == NULL)
|
|
{
|
|
{
|
|
|
|
+ perror("cant open file");
|
|
return;
|
|
return;
|
|
}
|
|
}
|
|
- FILE* file = fopen(subject, "w");
|
|
|
|
- if(file == NULL)
|
|
|
|
|
|
+ if(fputs(subject, file) == EOF)
|
|
{
|
|
{
|
|
- perror("cant open file");
|
|
|
|
|
|
+ perror("cant write to file");
|
|
|
|
+ return;
|
|
|
|
+ }
|
|
|
|
+ if(fputc('\n', file) == EOF)
|
|
|
|
+ {
|
|
|
|
+ perror("cant write to file");
|
|
return;
|
|
return;
|
|
}
|
|
}
|
|
if(fputs(message, file) == EOF)
|
|
if(fputs(message, file) == EOF)
|
|
@@ -192,48 +202,17 @@ void storeMail(char* sender, char* receiver, char* subject, char* message)
|
|
|
|
|
|
int packageSend(int client, int clientSocket, Stream* in)
|
|
int packageSend(int client, int clientSocket, Stream* in)
|
|
{
|
|
{
|
|
- char c;
|
|
|
|
- int i;
|
|
|
|
- const char* error = "invalid SEND package\n";
|
|
|
|
-
|
|
|
|
- // sender
|
|
|
|
- i = 0;
|
|
|
|
- char sender[9];
|
|
|
|
- while(1)
|
|
|
|
- {
|
|
|
|
- if(streamGetChar(in, &c) != -1)
|
|
|
|
- {
|
|
|
|
- if(c == '\n')
|
|
|
|
- {
|
|
|
|
- sender[i] = '\0';
|
|
|
|
- break;
|
|
|
|
- }
|
|
|
|
- else
|
|
|
|
- {
|
|
|
|
- if(i == 8)
|
|
|
|
- {
|
|
|
|
- printf("%s", error);
|
|
|
|
- packageSendFailAnswer(clientSocket);
|
|
|
|
- return 0;
|
|
|
|
- }
|
|
|
|
- sender[i] = c;
|
|
|
|
- i++;
|
|
|
|
- }
|
|
|
|
- }
|
|
|
|
- else
|
|
|
|
- {
|
|
|
|
- printf("%s", error);
|
|
|
|
- packageSendFailAnswer(clientSocket);
|
|
|
|
- return 0;
|
|
|
|
- }
|
|
|
|
- }
|
|
|
|
- if(strlen(sender) == 0)
|
|
|
|
|
|
+ char* user = serverGetUser(&server, client);
|
|
|
|
+ if(user == NULL)
|
|
{
|
|
{
|
|
- printf("%s", error);
|
|
|
|
packageSendFailAnswer(clientSocket);
|
|
packageSendFailAnswer(clientSocket);
|
|
return 0;
|
|
return 0;
|
|
}
|
|
}
|
|
|
|
|
|
|
|
+ char c;
|
|
|
|
+ int i;
|
|
|
|
+ const char* error = "invalid SEND package\n";
|
|
|
|
+
|
|
// receiver
|
|
// receiver
|
|
i = 0;
|
|
i = 0;
|
|
char receiver[9];
|
|
char receiver[9];
|
|
@@ -265,7 +244,7 @@ int packageSend(int client, int clientSocket, Stream* in)
|
|
return 0;
|
|
return 0;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
- if(strlen(receiver) == 0)
|
|
|
|
|
|
+ if(strlen(receiver) == 0 || isSpecialFolder(receiver))
|
|
{
|
|
{
|
|
printf("%s", error);
|
|
printf("%s", error);
|
|
packageSendFailAnswer(clientSocket);
|
|
packageSendFailAnswer(clientSocket);
|
|
@@ -371,7 +350,7 @@ int packageSend(int client, int clientSocket, Stream* in)
|
|
char workingPath[256];
|
|
char workingPath[256];
|
|
if(getcwd(workingPath, 256) != NULL)
|
|
if(getcwd(workingPath, 256) != NULL)
|
|
{
|
|
{
|
|
- storeMail(sender, receiver, subject, message);
|
|
|
|
|
|
+ storeMail(user, receiver, subject, message);
|
|
assert(chdir(workingPath) == 0);
|
|
assert(chdir(workingPath) == 0);
|
|
}
|
|
}
|
|
|
|
|
|
@@ -383,8 +362,8 @@ int packageSend(int client, int clientSocket, Stream* in)
|
|
|
|
|
|
void sendMailList(char* user, Stream* out)
|
|
void sendMailList(char* user, Stream* out)
|
|
{
|
|
{
|
|
- DIR* dir = opendir(user);
|
|
|
|
- if(dir == NULL)
|
|
|
|
|
|
+ DIR* receiverDir = opendir(user);
|
|
|
|
+ if(receiverDir == NULL)
|
|
{
|
|
{
|
|
streamWriteInt(out, 0);
|
|
streamWriteInt(out, 0);
|
|
return;
|
|
return;
|
|
@@ -395,48 +374,69 @@ void sendMailList(char* user, Stream* out)
|
|
streamWriteInt(out, 0);
|
|
streamWriteInt(out, 0);
|
|
int counter = 0;
|
|
int counter = 0;
|
|
|
|
|
|
- struct dirent* pDir = readdir(dir);
|
|
|
|
- while(pDir != NULL)
|
|
|
|
|
|
+ struct dirent* receiverIterator = readdir(receiverDir);
|
|
|
|
+ while(receiverIterator != NULL)
|
|
{
|
|
{
|
|
- if(strcmp(pDir->d_name, ".") != 0 && strcmp(pDir->d_name, "..") != 0)
|
|
|
|
|
|
+ if(!isSpecialFolder(receiverIterator->d_name))
|
|
{
|
|
{
|
|
- DIR* innerdir = opendir(pDir->d_name);
|
|
|
|
- if(innerdir != NULL)
|
|
|
|
|
|
+ DIR* senderDir = opendir(receiverIterator->d_name);
|
|
|
|
+ if(senderDir != NULL)
|
|
{
|
|
{
|
|
- assert(chdir(pDir->d_name) == 0);
|
|
|
|
|
|
+ assert(chdir(receiverIterator->d_name) == 0);
|
|
|
|
|
|
- struct dirent* idDir = readdir(innerdir);
|
|
|
|
- while(idDir != NULL)
|
|
|
|
|
|
+ struct dirent* senderIterator = readdir(senderDir);
|
|
|
|
+ while(senderIterator != NULL)
|
|
{
|
|
{
|
|
- if(strcmp(idDir->d_name, ".") != 0 && strcmp(idDir->d_name, "..") != 0)
|
|
|
|
|
|
+ if(!isSpecialFolder(senderIterator->d_name))
|
|
{
|
|
{
|
|
|
|
+ // mails found
|
|
counter++;
|
|
counter++;
|
|
- DIR* innerIdDir = opendir(idDir->d_name);
|
|
|
|
- if(innerIdDir != NULL)
|
|
|
|
|
|
+ // reading subject from first line
|
|
|
|
+ FILE* file = fopen(senderIterator->d_name, "r");
|
|
|
|
+ if(file != NULL)
|
|
{
|
|
{
|
|
- struct dirent* mails = readdir(innerIdDir);
|
|
|
|
- while(mails != NULL)
|
|
|
|
|
|
+ int size = 16;
|
|
|
|
+ int pos = 0;
|
|
|
|
+ char* buffer = malloc(sizeof(char) * size);
|
|
|
|
+ int data;
|
|
|
|
+ while(1)
|
|
{
|
|
{
|
|
- if(strcmp(mails->d_name, ".") != 0 && strcmp(mails->d_name, "..") != 0)
|
|
|
|
|
|
+ data = fgetc(file);
|
|
|
|
+ if(data == '\n' || data == EOF)
|
|
{
|
|
{
|
|
- streamWriteChars(out, idDir->d_name);
|
|
|
|
- streamWriteChars(out, " - ");
|
|
|
|
- streamWriteChars(out, mails->d_name);
|
|
|
|
- streamWriteChar(out, '\n');
|
|
|
|
|
|
+ ensureBufferSize(&buffer, &size, pos);
|
|
|
|
+ buffer[pos] = '\0';
|
|
|
|
+ break;
|
|
}
|
|
}
|
|
- mails = readdir(innerIdDir);
|
|
|
|
|
|
+ ensureBufferSize(&buffer, &size, pos);
|
|
|
|
+ buffer[pos] = data;
|
|
|
|
+ pos++;
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ streamWriteChars(out, senderIterator->d_name);
|
|
|
|
+ streamWriteChars(out, " - ");
|
|
|
|
+ streamWriteChars(out, buffer);
|
|
|
|
+ free(buffer);
|
|
|
|
+ streamWriteChar(out, '\n');
|
|
|
|
+
|
|
|
|
+ if(fclose(file) == EOF)
|
|
|
|
+ {
|
|
|
|
+ perror("cannot close file");
|
|
}
|
|
}
|
|
- closedir(innerIdDir);
|
|
|
|
|
|
+ }
|
|
|
|
+ else
|
|
|
|
+ {
|
|
|
|
+ streamWriteChars(out, "ERR\n");
|
|
}
|
|
}
|
|
}
|
|
}
|
|
- idDir = readdir(innerdir);
|
|
|
|
|
|
+ senderIterator = readdir(senderDir);
|
|
}
|
|
}
|
|
|
|
|
|
assert(chdir("../") == 0);
|
|
assert(chdir("../") == 0);
|
|
- closedir(innerdir);
|
|
|
|
|
|
+ closedir(senderDir);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
- pDir = readdir(dir);
|
|
|
|
|
|
+ receiverIterator = readdir(receiverDir);
|
|
}
|
|
}
|
|
|
|
|
|
int current = streamGetPosition(out);
|
|
int current = streamGetPosition(out);
|
|
@@ -444,49 +444,14 @@ void sendMailList(char* user, Stream* out)
|
|
streamWriteInt(out, counter);
|
|
streamWriteInt(out, counter);
|
|
streamSetPosition(out, current);
|
|
streamSetPosition(out, current);
|
|
|
|
|
|
- closedir(dir);
|
|
|
|
|
|
+ closedir(receiverDir);
|
|
}
|
|
}
|
|
|
|
|
|
int packageList(int client, int clientSocket, Stream* in)
|
|
int packageList(int client, int clientSocket, Stream* in)
|
|
{
|
|
{
|
|
- char c;
|
|
|
|
- int i;
|
|
|
|
- const char* error = "invalid LIST package\n";
|
|
|
|
-
|
|
|
|
- // user
|
|
|
|
- i = 0;
|
|
|
|
- char user[9];
|
|
|
|
- while(1)
|
|
|
|
|
|
+ char* user = serverGetUser(&server, client);
|
|
|
|
+ if(user == NULL)
|
|
{
|
|
{
|
|
- if(streamGetChar(in, &c) != -1)
|
|
|
|
- {
|
|
|
|
- if(c == '\n')
|
|
|
|
- {
|
|
|
|
- user[i] = '\0';
|
|
|
|
- break;
|
|
|
|
- }
|
|
|
|
- else
|
|
|
|
- {
|
|
|
|
- if(i == 8)
|
|
|
|
- {
|
|
|
|
- printf("%s", error);
|
|
|
|
- packageSendFailAnswer(clientSocket);
|
|
|
|
- return 0;
|
|
|
|
- }
|
|
|
|
- user[i] = c;
|
|
|
|
- i++;
|
|
|
|
- }
|
|
|
|
- }
|
|
|
|
- else
|
|
|
|
- {
|
|
|
|
- printf("%s", error);
|
|
|
|
- packageSendFailAnswer(clientSocket);
|
|
|
|
- return 0;
|
|
|
|
- }
|
|
|
|
- }
|
|
|
|
- if(strlen(user) == 0)
|
|
|
|
- {
|
|
|
|
- printf("%s", error);
|
|
|
|
packageSendFailAnswer(clientSocket);
|
|
packageSendFailAnswer(clientSocket);
|
|
return 0;
|
|
return 0;
|
|
}
|
|
}
|
|
@@ -507,8 +472,8 @@ int packageList(int client, int clientSocket, Stream* in)
|
|
|
|
|
|
void readMail(char* user, int number, Stream* out)
|
|
void readMail(char* user, int number, Stream* out)
|
|
{
|
|
{
|
|
- DIR* dir = opendir(user);
|
|
|
|
- if(dir == NULL)
|
|
|
|
|
|
+ DIR* receiverDir = opendir(user);
|
|
|
|
+ if(receiverDir == NULL)
|
|
{
|
|
{
|
|
streamWriteChars(out, "ERR\n");
|
|
streamWriteChars(out, "ERR\n");
|
|
return;
|
|
return;
|
|
@@ -518,83 +483,56 @@ void readMail(char* user, int number, Stream* out)
|
|
char buffer[12];
|
|
char buffer[12];
|
|
snprintf(buffer, 12, "%d", number);
|
|
snprintf(buffer, 12, "%d", number);
|
|
|
|
|
|
- struct dirent* senders;
|
|
|
|
- senders = readdir(dir);
|
|
|
|
- while(senders != NULL)
|
|
|
|
|
|
+ struct dirent* receiverIterator;
|
|
|
|
+ receiverIterator = readdir(receiverDir);
|
|
|
|
+ while(receiverIterator != NULL)
|
|
{
|
|
{
|
|
- if(strcmp(senders->d_name, ".") != 0 && strcmp(senders->d_name, "..") != 0)
|
|
|
|
|
|
+ if(!isSpecialFolder(receiverIterator->d_name))
|
|
{
|
|
{
|
|
- if(chdir(senders->d_name) == 0)
|
|
|
|
|
|
+ if(chdir(receiverIterator->d_name) == 0)
|
|
{
|
|
{
|
|
- DIR* innerDir = opendir(buffer);
|
|
|
|
- if(innerDir != NULL)
|
|
|
|
|
|
+ FILE* file = fopen(buffer, "r");
|
|
|
|
+ if(file != 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)
|
|
|
|
|
|
+ // skip subject heading
|
|
|
|
+ int data;
|
|
|
|
+ while(1)
|
|
{
|
|
{
|
|
- assert(chdir(buffer) == 0);
|
|
|
|
- FILE* file = fopen(mail->d_name, "r");
|
|
|
|
- if(file != NULL)
|
|
|
|
|
|
+ data = fgetc(file);
|
|
|
|
+ if(data == '\n' || data == EOF)
|
|
{
|
|
{
|
|
- 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");
|
|
|
|
|
|
+ break;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
- else
|
|
|
|
|
|
+ // write data to stream
|
|
|
|
+ while(1)
|
|
{
|
|
{
|
|
- streamWriteChars(out, "ERR\n");
|
|
|
|
|
|
+ data = fgetc(file);
|
|
|
|
+ if(data == EOF)
|
|
|
|
+ {
|
|
|
|
+ break;
|
|
|
|
+ }
|
|
|
|
+ streamWriteChar(out, data);
|
|
}
|
|
}
|
|
|
|
|
|
- if(closedir(innerDir) == -1)
|
|
|
|
|
|
+ if(fclose(file) == EOF)
|
|
{
|
|
{
|
|
- perror("cannot close innerDir");
|
|
|
|
|
|
+ perror("cannot close file");
|
|
}
|
|
}
|
|
- if(closedir(dir) == -1)
|
|
|
|
|
|
+
|
|
|
|
+ if(closedir(receiverDir) == -1)
|
|
{
|
|
{
|
|
- perror("cannot close dir");
|
|
|
|
|
|
+ perror("cannot close receiver dir");
|
|
}
|
|
}
|
|
return;
|
|
return;
|
|
}
|
|
}
|
|
-
|
|
|
|
assert(chdir("../") == 0);
|
|
assert(chdir("../") == 0);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
- senders = readdir(dir);
|
|
|
|
|
|
+ receiverIterator = readdir(receiverDir);
|
|
}
|
|
}
|
|
|
|
|
|
- if(closedir(dir) == -1)
|
|
|
|
|
|
+ if(closedir(receiverDir) == -1)
|
|
{
|
|
{
|
|
perror("cannot close dir");
|
|
perror("cannot close dir");
|
|
}
|
|
}
|
|
@@ -603,48 +541,16 @@ void readMail(char* user, int number, Stream* out)
|
|
|
|
|
|
int packageRead(int client, int clientSocket, Stream* in)
|
|
int packageRead(int client, int clientSocket, Stream* in)
|
|
{
|
|
{
|
|
- char c;
|
|
|
|
- int i;
|
|
|
|
- const char* error = "invalid READ package\n";
|
|
|
|
-
|
|
|
|
- // user
|
|
|
|
- i = 0;
|
|
|
|
- char user[9];
|
|
|
|
- while(1)
|
|
|
|
|
|
+ char* user = serverGetUser(&server, client);
|
|
|
|
+ if(user == NULL)
|
|
{
|
|
{
|
|
- if(streamGetChar(in, &c) != -1)
|
|
|
|
- {
|
|
|
|
- if(c == '\n')
|
|
|
|
- {
|
|
|
|
- user[i] = '\0';
|
|
|
|
- break;
|
|
|
|
- }
|
|
|
|
- else
|
|
|
|
- {
|
|
|
|
- if(i == 8)
|
|
|
|
- {
|
|
|
|
- printf("%s", error);
|
|
|
|
- packageSendFailAnswer(clientSocket);
|
|
|
|
- return 0;
|
|
|
|
- }
|
|
|
|
- user[i] = c;
|
|
|
|
- i++;
|
|
|
|
- }
|
|
|
|
- }
|
|
|
|
- else
|
|
|
|
- {
|
|
|
|
- printf("%s", error);
|
|
|
|
- packageSendFailAnswer(clientSocket);
|
|
|
|
- return 0;
|
|
|
|
- }
|
|
|
|
- }
|
|
|
|
- if(strlen(user) == 0)
|
|
|
|
- {
|
|
|
|
- printf("%s", error);
|
|
|
|
packageSendFailAnswer(clientSocket);
|
|
packageSendFailAnswer(clientSocket);
|
|
return 0;
|
|
return 0;
|
|
}
|
|
}
|
|
|
|
|
|
|
|
+ char c;
|
|
|
|
+ const char* error = "invalid READ package\n";
|
|
|
|
+
|
|
int number;
|
|
int number;
|
|
if(streamGetInt(in, &number) == -1)
|
|
if(streamGetInt(in, &number) == -1)
|
|
{
|
|
{
|
|
@@ -687,8 +593,8 @@ int packageRead(int client, int clientSocket, Stream* in)
|
|
|
|
|
|
int deleteMail(char* user, int number)
|
|
int deleteMail(char* user, int number)
|
|
{
|
|
{
|
|
- DIR* dir = opendir(user);
|
|
|
|
- if(dir == NULL)
|
|
|
|
|
|
+ DIR* receiverDir = opendir(user);
|
|
|
|
+ if(receiverDir == NULL)
|
|
{
|
|
{
|
|
return 0;
|
|
return 0;
|
|
}
|
|
}
|
|
@@ -699,74 +605,26 @@ int deleteMail(char* user, int number)
|
|
|
|
|
|
int rValue = 0;
|
|
int rValue = 0;
|
|
|
|
|
|
- struct dirent* senders;
|
|
|
|
- senders = readdir(dir);
|
|
|
|
- while(senders != NULL)
|
|
|
|
|
|
+ struct dirent* receiverIterator;
|
|
|
|
+ receiverIterator = readdir(receiverDir);
|
|
|
|
+ while(receiverIterator != NULL)
|
|
{
|
|
{
|
|
- if(strcmp(senders->d_name, ".") != 0 && strcmp(senders->d_name, "..") != 0)
|
|
|
|
|
|
+ if(!isSpecialFolder(receiverIterator->d_name))
|
|
{
|
|
{
|
|
- if(chdir(senders->d_name) == 0)
|
|
|
|
|
|
+ if(chdir(receiverIterator->d_name) == 0)
|
|
{
|
|
{
|
|
- DIR* innerDir = opendir(buffer);
|
|
|
|
- if(innerDir != NULL)
|
|
|
|
|
|
+ if(remove(buffer) == 0)
|
|
{
|
|
{
|
|
- if(chdir(buffer) == -1)
|
|
|
|
- {
|
|
|
|
- perror("cannot change dir");
|
|
|
|
- if(closedir(innerDir) == -1)
|
|
|
|
- {
|
|
|
|
- perror("cannot close innerDir");
|
|
|
|
- }
|
|
|
|
- break;
|
|
|
|
- }
|
|
|
|
-
|
|
|
|
rValue = 1;
|
|
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;
|
|
break;
|
|
}
|
|
}
|
|
|
|
+ assert(chdir("../") == 0);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
- senders = readdir(dir);
|
|
|
|
|
|
+ receiverIterator = readdir(receiverDir);
|
|
}
|
|
}
|
|
|
|
|
|
- if(closedir(dir) == -1)
|
|
|
|
|
|
+ if(closedir(receiverDir) == -1)
|
|
{
|
|
{
|
|
perror("cannot close dir");
|
|
perror("cannot close dir");
|
|
}
|
|
}
|
|
@@ -775,48 +633,16 @@ int deleteMail(char* user, int number)
|
|
|
|
|
|
int packageDelete(int client, int clientSocket, Stream* in)
|
|
int packageDelete(int client, int clientSocket, Stream* in)
|
|
{
|
|
{
|
|
- char c;
|
|
|
|
- int i;
|
|
|
|
- const char* error = "invalid DELETE package\n";
|
|
|
|
-
|
|
|
|
- // user
|
|
|
|
- i = 0;
|
|
|
|
- char user[9];
|
|
|
|
- while(1)
|
|
|
|
|
|
+ char* user = serverGetUser(&server, client);
|
|
|
|
+ if(user == NULL)
|
|
{
|
|
{
|
|
- if(streamGetChar(in, &c) != -1)
|
|
|
|
- {
|
|
|
|
- if(c == '\n')
|
|
|
|
- {
|
|
|
|
- user[i] = '\0';
|
|
|
|
- break;
|
|
|
|
- }
|
|
|
|
- else
|
|
|
|
- {
|
|
|
|
- if(i == 8)
|
|
|
|
- {
|
|
|
|
- printf("%s", error);
|
|
|
|
- packageSendFailAnswer(clientSocket);
|
|
|
|
- return 0;
|
|
|
|
- }
|
|
|
|
- user[i] = c;
|
|
|
|
- i++;
|
|
|
|
- }
|
|
|
|
- }
|
|
|
|
- else
|
|
|
|
- {
|
|
|
|
- printf("%s", error);
|
|
|
|
- packageSendFailAnswer(clientSocket);
|
|
|
|
- return 0;
|
|
|
|
- }
|
|
|
|
- }
|
|
|
|
- if(strlen(user) == 0)
|
|
|
|
- {
|
|
|
|
- printf("%s", error);
|
|
|
|
packageSendFailAnswer(clientSocket);
|
|
packageSendFailAnswer(clientSocket);
|
|
return 0;
|
|
return 0;
|
|
}
|
|
}
|
|
|
|
|
|
|
|
+ char c;
|
|
|
|
+ const char* error = "invalid DELETE package\n";
|
|
|
|
+
|
|
int number;
|
|
int number;
|
|
if(streamGetInt(in, &number) == -1)
|
|
if(streamGetInt(in, &number) == -1)
|
|
{
|
|
{
|
|
@@ -869,11 +695,105 @@ int packageQuit(int client, int clientSocket, Stream* in)
|
|
return 1;
|
|
return 1;
|
|
}
|
|
}
|
|
|
|
|
|
|
|
+int packageLogin(int client, int clientSocket, Stream* in)
|
|
|
|
+{
|
|
|
|
+ printf("%d wants to login ...\n", client);
|
|
|
|
+
|
|
|
|
+ char c;
|
|
|
|
+ int i;
|
|
|
|
+ const char* error = "invalid DELETE package\n";
|
|
|
|
+
|
|
|
|
+ // user
|
|
|
|
+ i = 0;
|
|
|
|
+ char user[9];
|
|
|
|
+ while(1)
|
|
|
|
+ {
|
|
|
|
+ if(streamGetChar(in, &c) != -1)
|
|
|
|
+ {
|
|
|
|
+ if(c == '\n')
|
|
|
|
+ {
|
|
|
|
+ user[i] = '\0';
|
|
|
|
+ break;
|
|
|
|
+ }
|
|
|
|
+ else
|
|
|
|
+ {
|
|
|
|
+ if(i == 8)
|
|
|
|
+ {
|
|
|
|
+ printf("%s", error);
|
|
|
|
+ packageSendFailAnswer(clientSocket);
|
|
|
|
+ return 0;
|
|
|
|
+ }
|
|
|
|
+ user[i] = c;
|
|
|
|
+ i++;
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+ else
|
|
|
|
+ {
|
|
|
|
+ printf("%s", error);
|
|
|
|
+ packageSendFailAnswer(clientSocket);
|
|
|
|
+ return 0;
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+ if(strlen(user) == 0)
|
|
|
|
+ {
|
|
|
|
+ printf("%s", error);
|
|
|
|
+ packageSendFailAnswer(clientSocket);
|
|
|
|
+ return 0;
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ // password
|
|
|
|
+ i = 0;
|
|
|
|
+ int buffer = 16;
|
|
|
|
+ char* password = malloc(sizeof(char) * buffer);
|
|
|
|
+ while(1)
|
|
|
|
+ {
|
|
|
|
+ if(streamGetChar(in, &c) != -1)
|
|
|
|
+ {
|
|
|
|
+ if(c == '\n')
|
|
|
|
+ {
|
|
|
|
+ ensureBufferSize(&password, &buffer, i);
|
|
|
|
+ password[i] = '\0';
|
|
|
|
+ break;
|
|
|
|
+ }
|
|
|
|
+ ensureBufferSize(&password, &buffer, i);
|
|
|
|
+ password[i] = c;
|
|
|
|
+ i++;
|
|
|
|
+ }
|
|
|
|
+ else
|
|
|
|
+ {
|
|
|
|
+ printf("%s", error);
|
|
|
|
+ packageSendFailAnswer(clientSocket);
|
|
|
|
+ free(password);
|
|
|
|
+ return 0;
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ printf("%s %s\n", user, password);
|
|
|
|
+ // insert LDAP check here
|
|
|
|
+
|
|
|
|
+ if(serverSetUser(&server, client, user))
|
|
|
|
+ {
|
|
|
|
+ packageSendFailAnswer(clientSocket);
|
|
|
|
+ free(password);
|
|
|
|
+ return 0;
|
|
|
|
+ }
|
|
|
|
+ free(password);
|
|
|
|
+ packageSendOkAnswer(clientSocket);
|
|
|
|
+ return 0;
|
|
|
|
+}
|
|
|
|
+
|
|
int main(int argc, char** argv)
|
|
int main(int argc, char** argv)
|
|
{
|
|
{
|
|
- if(argc < 2)
|
|
|
|
|
|
+ if(argc < 3)
|
|
|
|
+ {
|
|
|
|
+ printf("Usage: %s directory port\n", argv[0]);
|
|
|
|
+ return EXIT_FAILURE;
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ int port = atoi(argv[2]);
|
|
|
|
+ if(port <= 0 || port >= 65536)
|
|
{
|
|
{
|
|
- printf("Usage: %s directory\n", argv[0]);
|
|
|
|
|
|
+ printf("invalid port");
|
|
return EXIT_FAILURE;
|
|
return EXIT_FAILURE;
|
|
}
|
|
}
|
|
|
|
|
|
@@ -882,7 +802,7 @@ int main(int argc, char** argv)
|
|
signal(SIGINT, interruptHandler);
|
|
signal(SIGINT, interruptHandler);
|
|
signal(SIGKILL, interruptHandler);
|
|
signal(SIGKILL, interruptHandler);
|
|
|
|
|
|
- if(serverInit(&server, 3, 6543, argv[1]) == -1)
|
|
|
|
|
|
+ if(serverInit(&server, 3, port, argv[1]) == -1)
|
|
{
|
|
{
|
|
return EXIT_FAILURE;
|
|
return EXIT_FAILURE;
|
|
}
|
|
}
|
|
@@ -892,6 +812,7 @@ int main(int argc, char** argv)
|
|
serverRegisterHandler(&server, packageRead);
|
|
serverRegisterHandler(&server, packageRead);
|
|
serverRegisterHandler(&server, packageDelete);
|
|
serverRegisterHandler(&server, packageDelete);
|
|
serverRegisterHandler(&server, packageQuit);
|
|
serverRegisterHandler(&server, packageQuit);
|
|
|
|
+ serverRegisterHandler(&server, packageLogin);
|
|
|
|
|
|
serverWaitForConnection(&server);
|
|
serverWaitForConnection(&server);
|
|
|
|
|