|
@@ -12,11 +12,12 @@
|
|
|
#include <dirent.h>
|
|
|
#include <assert.h>
|
|
|
#include "Server.h"
|
|
|
+#include "String.h"
|
|
|
+#include <string.h>
|
|
|
|
|
|
int getMailCounter()
|
|
|
{
|
|
|
FILE* test = fopen("mailcounter", "r+");
|
|
|
- flock(fileno(test), LOCK_EX);
|
|
|
if(test == NULL)
|
|
|
{
|
|
|
if(creat("mailcounter", S_IRUSR | S_IWUSR | S_IRGRP | S_IROTH) == -1)
|
|
@@ -29,6 +30,7 @@ int getMailCounter()
|
|
|
return 0;
|
|
|
}
|
|
|
}
|
|
|
+ flock(fileno(test), LOCK_EX);
|
|
|
|
|
|
int counter;
|
|
|
if(fread(&counter, sizeof(int), 1, test) == 0)
|
|
@@ -69,18 +71,16 @@ void interruptHandler(int signal)
|
|
|
exit(EXIT_SUCCESS);
|
|
|
}
|
|
|
|
|
|
-void ensureBufferSize(char** data, int* size, int minSize)
|
|
|
+void ensureBufferIndex(char** data, int* size, int index)
|
|
|
{
|
|
|
- if(minSize >= *size)
|
|
|
+ if(index >= *size)
|
|
|
{
|
|
|
int newSize = *size;
|
|
|
- while(newSize <= minSize)
|
|
|
+ while(newSize <= index)
|
|
|
{
|
|
|
newSize *= 2;
|
|
|
}
|
|
|
|
|
|
-
|
|
|
-
|
|
|
char* newData = malloc(sizeof(char) * newSize);
|
|
|
memcpy(newData, *data, *size);
|
|
|
|
|
@@ -94,7 +94,6 @@ void packageSendFailAnswer(int clientSocket)
|
|
|
{
|
|
|
Stream out;
|
|
|
streamInit(&out, 16);
|
|
|
- streamWriteInt(&out, 0);
|
|
|
streamWriteChars(&out, "ERR\n");
|
|
|
serverSend(clientSocket, &out);
|
|
|
streamRemove(&out);
|
|
@@ -104,7 +103,6 @@ void packageSendOkAnswer(int clientSocket)
|
|
|
{
|
|
|
Stream out;
|
|
|
streamInit(&out, 16);
|
|
|
- streamWriteInt(&out, 0);
|
|
|
streamWriteChars(&out, "OK\n");
|
|
|
serverSend(clientSocket, &out);
|
|
|
streamRemove(&out);
|
|
@@ -142,11 +140,6 @@ int createDirectory(char* path)
|
|
|
|
|
|
void storeMail(char* sender, char* receiver, char* subject, char* message)
|
|
|
{
|
|
|
-
|
|
|
- printf("receiver: %s\n", receiver);
|
|
|
- printf("subject: %s\n", subject);
|
|
|
- printf("message: %s\n", message);*/
|
|
|
-
|
|
|
if(createDirectory(receiver) == -1)
|
|
|
{
|
|
|
return;
|
|
@@ -165,7 +158,7 @@ void storeMail(char* sender, char* receiver, char* subject, char* message)
|
|
|
if(creat(buffer, S_IRUSR | S_IWUSR | S_IRGRP | S_IROTH) == -1)
|
|
|
{
|
|
|
return;
|
|
|
- }
|
|
|
+ }
|
|
|
|
|
|
FILE* file = fopen(buffer, "w");
|
|
|
if(file == NULL)
|
|
@@ -173,6 +166,26 @@ void storeMail(char* sender, char* receiver, char* subject, char* message)
|
|
|
perror("cant open file");
|
|
|
return;
|
|
|
}
|
|
|
+ if(fputs(sender, file) == EOF)
|
|
|
+ {
|
|
|
+ perror("cant write to file");
|
|
|
+ return;
|
|
|
+ }
|
|
|
+ if(fputc('\n', file) == EOF)
|
|
|
+ {
|
|
|
+ perror("cant write to file");
|
|
|
+ return;
|
|
|
+ }
|
|
|
+ if(fputs(receiver, file) == EOF)
|
|
|
+ {
|
|
|
+ perror("cant write to file");
|
|
|
+ return;
|
|
|
+ }
|
|
|
+ if(fputc('\n', file) == EOF)
|
|
|
+ {
|
|
|
+ perror("cant write to file");
|
|
|
+ return;
|
|
|
+ }
|
|
|
if(fputs(subject, file) == EOF)
|
|
|
{
|
|
|
perror("cant write to file");
|
|
@@ -209,151 +222,65 @@ int packageSend(int client, int clientSocket, Stream* in)
|
|
|
return 0;
|
|
|
}
|
|
|
|
|
|
- char c;
|
|
|
- int i;
|
|
|
- const char* error = "invalid SEND package\n";
|
|
|
-
|
|
|
+ int length;
|
|
|
+
|
|
|
|
|
|
- i = 0;
|
|
|
- char receiver[9];
|
|
|
- while(1)
|
|
|
+ String receiver;
|
|
|
+ stringInit(&receiver);
|
|
|
+ stringReadStreamLine(&receiver, in);
|
|
|
+ length = stringGetLength(&receiver);
|
|
|
+ if(length == 0 || length > 8)
|
|
|
{
|
|
|
- if(streamGetChar(in, &c) != -1)
|
|
|
- {
|
|
|
- if(c == '\n')
|
|
|
- {
|
|
|
- receiver[i] = '\0';
|
|
|
- break;
|
|
|
- }
|
|
|
- else
|
|
|
- {
|
|
|
- if(i == 8)
|
|
|
- {
|
|
|
- printf("%s", error);
|
|
|
- packageSendFailAnswer(clientSocket);
|
|
|
- return 0;
|
|
|
- }
|
|
|
- receiver[i] = c;
|
|
|
- i++;
|
|
|
- }
|
|
|
- }
|
|
|
- else
|
|
|
- {
|
|
|
- printf("%s", error);
|
|
|
- packageSendFailAnswer(clientSocket);
|
|
|
- return 0;
|
|
|
- }
|
|
|
- }
|
|
|
- if(strlen(receiver) == 0 || isSpecialFolder(receiver))
|
|
|
- {
|
|
|
- printf("%s", error);
|
|
|
packageSendFailAnswer(clientSocket);
|
|
|
+ stringRemove(&receiver);
|
|
|
return 0;
|
|
|
}
|
|
|
|
|
|
|
|
|
- i = 0;
|
|
|
- char subject[81];
|
|
|
- while(1)
|
|
|
- {
|
|
|
- if(streamGetChar(in, &c) != -1)
|
|
|
- {
|
|
|
- if(c == '\n')
|
|
|
- {
|
|
|
- subject[i] = '\0';
|
|
|
- break;
|
|
|
- }
|
|
|
- else
|
|
|
- {
|
|
|
- if(i == 80)
|
|
|
- {
|
|
|
- printf("%s", error);
|
|
|
- packageSendFailAnswer(clientSocket);
|
|
|
- return 0;
|
|
|
- }
|
|
|
- subject[i] = c;
|
|
|
- i++;
|
|
|
- }
|
|
|
- }
|
|
|
- else
|
|
|
- {
|
|
|
- printf("%s", error);
|
|
|
- packageSendFailAnswer(clientSocket);
|
|
|
- return 0;
|
|
|
- }
|
|
|
- }
|
|
|
- if(strlen(subject) == 0)
|
|
|
+ String subject;
|
|
|
+ stringInit(&subject);
|
|
|
+ stringReadStreamLine(&subject, in);
|
|
|
+ length = stringGetLength(&subject);
|
|
|
+ if(length == 0 || length > 80)
|
|
|
{
|
|
|
- printf("%s", error);
|
|
|
packageSendFailAnswer(clientSocket);
|
|
|
+ stringRemove(&subject);
|
|
|
return 0;
|
|
|
}
|
|
|
|
|
|
|
|
|
- i = 0;
|
|
|
+ int index = 0;
|
|
|
int buffer = 16;
|
|
|
char* message = malloc(sizeof(char) * buffer);
|
|
|
- while(1)
|
|
|
+
|
|
|
+ String sMessage;
|
|
|
+ stringInit(&sMessage);
|
|
|
+ while(streamHasData(in))
|
|
|
{
|
|
|
- if(streamGetChar(in, &c) != -1)
|
|
|
- {
|
|
|
- if(c == '\n')
|
|
|
- {
|
|
|
- char n1;
|
|
|
- if(streamGetChar(in, &n1) == -1)
|
|
|
- {
|
|
|
- printf("%s", error);
|
|
|
- packageSendFailAnswer(clientSocket);
|
|
|
- free(message);
|
|
|
- return 0;
|
|
|
- }
|
|
|
- char n2;
|
|
|
- if(streamGetChar(in, &n2) == -1)
|
|
|
- {
|
|
|
- printf("%s", error);
|
|
|
- packageSendFailAnswer(clientSocket);
|
|
|
- free(message);
|
|
|
- return 0;
|
|
|
- }
|
|
|
-
|
|
|
- if(n1 == '.' && n2 == '\n')
|
|
|
- {
|
|
|
- ensureBufferSize(&message, &buffer, i);
|
|
|
- message[i] = '\0';
|
|
|
- break;
|
|
|
- }
|
|
|
- else
|
|
|
- {
|
|
|
- ensureBufferSize(&message, &buffer, i + 2);
|
|
|
- message[i] = c;
|
|
|
- i++;
|
|
|
- message[i] = n1;
|
|
|
- i++;
|
|
|
- message[i] = n2;
|
|
|
- i++;
|
|
|
- continue;
|
|
|
- }
|
|
|
- }
|
|
|
- ensureBufferSize(&message, &buffer, i);
|
|
|
- message[i] = c;
|
|
|
- i++;
|
|
|
- }
|
|
|
- else
|
|
|
+ stringReadStreamLine(&sMessage, in);
|
|
|
+ if(stringCompare(&sMessage, ".") || buffer > 60)
|
|
|
{
|
|
|
- printf("%s", error);
|
|
|
- packageSendFailAnswer(clientSocket);
|
|
|
- free(message);
|
|
|
- return 0;
|
|
|
+ break;
|
|
|
}
|
|
|
+ int length = stringGetLength(&sMessage);
|
|
|
+
|
|
|
+ ensureBufferIndex(&message, &buffer, index + length);
|
|
|
+ memcpy(message + index, sMessage.data, length);
|
|
|
+ index += length;
|
|
|
+ message[index] = '\n';
|
|
|
+ index++;
|
|
|
}
|
|
|
+ stringRemove(&sMessage);
|
|
|
|
|
|
char workingPath[256];
|
|
|
if(getcwd(workingPath, 256) != NULL)
|
|
|
{
|
|
|
- storeMail(user, receiver, subject, message);
|
|
|
+ storeMail(user, receiver.data, subject.data, message);
|
|
|
assert(chdir(workingPath) == 0);
|
|
|
}
|
|
|
|
|
|
+ stringRemove(&receiver);
|
|
|
+ stringRemove(&subject);
|
|
|
free(message);
|
|
|
|
|
|
packageSendOkAnswer(clientSocket);
|
|
@@ -365,15 +292,13 @@ void sendMailList(char* user, Stream* out)
|
|
|
DIR* receiverDir = opendir(user);
|
|
|
if(receiverDir == NULL)
|
|
|
{
|
|
|
- streamWriteInt(out, 0);
|
|
|
+ streamWriteChars(out, "0\n");
|
|
|
return;
|
|
|
}
|
|
|
assert(chdir(user) == 0);
|
|
|
|
|
|
- int counterPos = streamGetPosition(out);
|
|
|
- streamWriteInt(out, 0);
|
|
|
+
|
|
|
int counter = 0;
|
|
|
-
|
|
|
struct dirent* receiverIterator = readdir(receiverDir);
|
|
|
while(receiverIterator != NULL)
|
|
|
{
|
|
@@ -391,32 +316,80 @@ void sendMailList(char* user, Stream* out)
|
|
|
{
|
|
|
|
|
|
counter++;
|
|
|
+ }
|
|
|
+ senderIterator = readdir(senderDir);
|
|
|
+ }
|
|
|
+
|
|
|
+ assert(chdir("../") == 0);
|
|
|
+ closedir(senderDir);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ receiverIterator = readdir(receiverDir);
|
|
|
+ }
|
|
|
+
|
|
|
+
|
|
|
+ char buffer[12];
|
|
|
+ snprintf(buffer, 12, "%d", counter);
|
|
|
+ streamWriteChars(out, buffer);
|
|
|
+ streamWriteChar(out, '\n');
|
|
|
+
|
|
|
+
|
|
|
+ assert(chdir("../") == 0);
|
|
|
+ closedir(receiverDir);
|
|
|
+ receiverDir = opendir(user);
|
|
|
+ if(receiverDir == NULL)
|
|
|
+ {
|
|
|
+ return;
|
|
|
+ }
|
|
|
+ assert(chdir(user) == 0);
|
|
|
+
|
|
|
+ receiverIterator = readdir(receiverDir);
|
|
|
+ while(receiverIterator != NULL)
|
|
|
+ {
|
|
|
+ if(!isSpecialFolder(receiverIterator->d_name))
|
|
|
+ {
|
|
|
+ DIR* senderDir = opendir(receiverIterator->d_name);
|
|
|
+ if(senderDir != NULL)
|
|
|
+ {
|
|
|
+ assert(chdir(receiverIterator->d_name) == 0);
|
|
|
+
|
|
|
+ struct dirent* senderIterator = readdir(senderDir);
|
|
|
+ while(senderIterator != NULL)
|
|
|
+ {
|
|
|
+ if(!isSpecialFolder(senderIterator->d_name))
|
|
|
+ {
|
|
|
|
|
|
FILE* file = fopen(senderIterator->d_name, "r");
|
|
|
if(file != NULL)
|
|
|
{
|
|
|
- int size = 16;
|
|
|
- int pos = 0;
|
|
|
- char* buffer = malloc(sizeof(char) * size);
|
|
|
+ streamWriteChars(out, senderIterator->d_name);
|
|
|
+ streamWriteChars(out, " - ");
|
|
|
+
|
|
|
+
|
|
|
+ int skip = 0;
|
|
|
int data;
|
|
|
while(1)
|
|
|
{
|
|
|
data = fgetc(file);
|
|
|
if(data == '\n' || data == EOF)
|
|
|
{
|
|
|
- ensureBufferSize(&buffer, &size, pos);
|
|
|
- buffer[pos] = '\0';
|
|
|
- break;
|
|
|
+ skip++;
|
|
|
+ if(skip == 2)
|
|
|
+ {
|
|
|
+ break;
|
|
|
+ }
|
|
|
}
|
|
|
- ensureBufferSize(&buffer, &size, pos);
|
|
|
- buffer[pos] = data;
|
|
|
- pos++;
|
|
|
}
|
|
|
|
|
|
- streamWriteChars(out, senderIterator->d_name);
|
|
|
- streamWriteChars(out, " - ");
|
|
|
- streamWriteChars(out, buffer);
|
|
|
- free(buffer);
|
|
|
+ while(1)
|
|
|
+ {
|
|
|
+ data = fgetc(file);
|
|
|
+ if(data == '\n' || data == EOF)
|
|
|
+ {
|
|
|
+ break;
|
|
|
+ }
|
|
|
+ streamWriteChar(out, data);
|
|
|
+ }
|
|
|
streamWriteChar(out, '\n');
|
|
|
|
|
|
if(fclose(file) == EOF)
|
|
@@ -438,12 +411,7 @@ void sendMailList(char* user, Stream* out)
|
|
|
}
|
|
|
receiverIterator = readdir(receiverDir);
|
|
|
}
|
|
|
-
|
|
|
- int current = streamGetPosition(out);
|
|
|
- streamSetPosition(out, counterPos);
|
|
|
- streamWriteInt(out, counter);
|
|
|
- streamSetPosition(out, current);
|
|
|
-
|
|
|
+
|
|
|
closedir(receiverDir);
|
|
|
}
|
|
|
|
|
@@ -458,7 +426,6 @@ int packageList(int client, int clientSocket, Stream* in)
|
|
|
|
|
|
Stream out;
|
|
|
streamInit(&out, 16);
|
|
|
- streamWriteInt(&out, 1);
|
|
|
char workingPath[256];
|
|
|
if(getcwd(workingPath, 256) != NULL)
|
|
|
{
|
|
@@ -470,7 +437,7 @@ int packageList(int client, int clientSocket, Stream* in)
|
|
|
return 0;
|
|
|
}
|
|
|
|
|
|
-void readMail(char* user, int number, Stream* out)
|
|
|
+void readMail(char* user, char* number, Stream* out)
|
|
|
{
|
|
|
DIR* receiverDir = opendir(user);
|
|
|
if(receiverDir == NULL)
|
|
@@ -480,9 +447,6 @@ void readMail(char* user, int number, Stream* out)
|
|
|
}
|
|
|
assert(chdir(user) == 0);
|
|
|
|
|
|
- char buffer[12];
|
|
|
- snprintf(buffer, 12, "%d", number);
|
|
|
-
|
|
|
struct dirent* receiverIterator;
|
|
|
receiverIterator = readdir(receiverDir);
|
|
|
while(receiverIterator != NULL)
|
|
@@ -491,20 +455,12 @@ void readMail(char* user, int number, Stream* out)
|
|
|
{
|
|
|
if(chdir(receiverIterator->d_name) == 0)
|
|
|
{
|
|
|
- FILE* file = fopen(buffer, "r");
|
|
|
+ FILE* file = fopen(number, "r");
|
|
|
if(file != NULL)
|
|
|
{
|
|
|
-
|
|
|
- int data;
|
|
|
- while(1)
|
|
|
- {
|
|
|
- data = fgetc(file);
|
|
|
- if(data == '\n' || data == EOF)
|
|
|
- {
|
|
|
- break;
|
|
|
- }
|
|
|
- }
|
|
|
+ streamWriteChars(out, "OK\n");
|
|
|
|
|
|
+ int data;
|
|
|
while(1)
|
|
|
{
|
|
|
data = fgetc(file);
|
|
@@ -548,50 +504,36 @@ int packageRead(int client, int clientSocket, Stream* in)
|
|
|
return 0;
|
|
|
}
|
|
|
|
|
|
- char c;
|
|
|
- const char* error = "invalid READ package\n";
|
|
|
-
|
|
|
- int number;
|
|
|
- if(streamGetInt(in, &number) == -1)
|
|
|
- {
|
|
|
- printf("%s", error);
|
|
|
- packageSendFailAnswer(clientSocket);
|
|
|
- return 0;
|
|
|
- }
|
|
|
-
|
|
|
- if(streamGetChar(in, &c) == -1)
|
|
|
- {
|
|
|
- printf("%s", error);
|
|
|
- packageSendFailAnswer(clientSocket);
|
|
|
- return 0;
|
|
|
- }
|
|
|
- else if(c != '\n')
|
|
|
+
|
|
|
+ String number;
|
|
|
+ stringInit(&number);
|
|
|
+ stringReadStreamLine(&number, in);
|
|
|
+ if(stringGetLength(&number) == 0)
|
|
|
{
|
|
|
- printf("%s", error);
|
|
|
packageSendFailAnswer(clientSocket);
|
|
|
+ stringRemove(&number);
|
|
|
return 0;
|
|
|
}
|
|
|
|
|
|
Stream out;
|
|
|
streamInit(&out, 16);
|
|
|
- streamWriteInt(&out, 2);
|
|
|
char workingPath[256];
|
|
|
if(getcwd(workingPath, 256) != NULL)
|
|
|
{
|
|
|
- readMail(user, number, &out);
|
|
|
+ readMail(user, number.data, &out);
|
|
|
assert(chdir(workingPath) == 0);
|
|
|
}
|
|
|
else
|
|
|
{
|
|
|
streamWriteChars(&out, "ERR\n");
|
|
|
}
|
|
|
+ stringRemove(&number);
|
|
|
serverSend(clientSocket, &out);
|
|
|
streamRemove(&out);
|
|
|
-
|
|
|
return 0;
|
|
|
}
|
|
|
|
|
|
-int deleteMail(char* user, int number)
|
|
|
+int deleteMail(char* user, char* number)
|
|
|
{
|
|
|
DIR* receiverDir = opendir(user);
|
|
|
if(receiverDir == NULL)
|
|
@@ -600,9 +542,6 @@ int deleteMail(char* user, int number)
|
|
|
}
|
|
|
assert(chdir(user) == 0);
|
|
|
|
|
|
- char buffer[12];
|
|
|
- snprintf(buffer, 12, "%d", number);
|
|
|
-
|
|
|
int rValue = 0;
|
|
|
|
|
|
struct dirent* receiverIterator;
|
|
@@ -613,7 +552,7 @@ int deleteMail(char* user, int number)
|
|
|
{
|
|
|
if(chdir(receiverIterator->d_name) == 0)
|
|
|
{
|
|
|
- if(remove(buffer) == 0)
|
|
|
+ if(remove(number) == 0)
|
|
|
{
|
|
|
rValue = 1;
|
|
|
break;
|
|
@@ -640,37 +579,23 @@ int packageDelete(int client, int clientSocket, Stream* in)
|
|
|
return 0;
|
|
|
}
|
|
|
|
|
|
- char c;
|
|
|
- const char* error = "invalid DELETE package\n";
|
|
|
-
|
|
|
- int number;
|
|
|
- if(streamGetInt(in, &number) == -1)
|
|
|
- {
|
|
|
- printf("%s", error);
|
|
|
- packageSendFailAnswer(clientSocket);
|
|
|
- return 0;
|
|
|
- }
|
|
|
-
|
|
|
- if(streamGetChar(in, &c) == -1)
|
|
|
- {
|
|
|
- printf("%s", error);
|
|
|
- packageSendFailAnswer(clientSocket);
|
|
|
- return 0;
|
|
|
- }
|
|
|
- else if(c != '\n')
|
|
|
+
|
|
|
+ String number;
|
|
|
+ stringInit(&number);
|
|
|
+ stringReadStreamLine(&number, in);
|
|
|
+ if(stringGetLength(&number) == 0)
|
|
|
{
|
|
|
- printf("%s", error);
|
|
|
packageSendFailAnswer(clientSocket);
|
|
|
+ stringRemove(&number);
|
|
|
return 0;
|
|
|
}
|
|
|
|
|
|
Stream out;
|
|
|
streamInit(&out, 16);
|
|
|
- streamWriteInt(&out, 2);
|
|
|
char workingPath[256];
|
|
|
if(getcwd(workingPath, 256) != NULL)
|
|
|
{
|
|
|
- if(deleteMail(user, number))
|
|
|
+ if(deleteMail(user, number.data))
|
|
|
{
|
|
|
streamWriteChars(&out, "OK\n");
|
|
|
}
|
|
@@ -684,101 +609,85 @@ int packageDelete(int client, int clientSocket, Stream* in)
|
|
|
{
|
|
|
streamWriteChars(&out, "ERR\n");
|
|
|
}
|
|
|
+ stringRemove(&number);
|
|
|
serverSend(clientSocket, &out);
|
|
|
streamRemove(&out);
|
|
|
return 0;
|
|
|
}
|
|
|
|
|
|
-int packageQuit(int client, int clientSocket, Stream* in)
|
|
|
-{
|
|
|
- printf("%d wants to disconnect ...\n", client);
|
|
|
- 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";
|
|
|
+ int length;
|
|
|
|
|
|
-
|
|
|
- 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)
|
|
|
+
|
|
|
+ String user;
|
|
|
+ stringInit(&user);
|
|
|
+ stringReadStreamLine(&user, in);
|
|
|
+ length = stringGetLength(&user);
|
|
|
+ if(length == 0 || length > 8)
|
|
|
{
|
|
|
- printf("%s", error);
|
|
|
packageSendFailAnswer(clientSocket);
|
|
|
+ stringRemove(&user);
|
|
|
return 0;
|
|
|
}
|
|
|
|
|
|
|
|
|
- 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;
|
|
|
- }
|
|
|
- }
|
|
|
+ String password;
|
|
|
+ stringInit(&password);
|
|
|
+ stringReadStreamLine(&password, in);
|
|
|
|
|
|
- printf("%s %s\n", user, password);
|
|
|
+ printf("%s %s\n", user.data, password.data);
|
|
|
|
|
|
|
|
|
- if(serverSetUser(&server, client, user))
|
|
|
+ stringRemove(&password);
|
|
|
+
|
|
|
+ if(serverSetUser(&server, client, user.data))
|
|
|
{
|
|
|
packageSendFailAnswer(clientSocket);
|
|
|
- free(password);
|
|
|
+ stringRemove(&user);
|
|
|
return 0;
|
|
|
}
|
|
|
- free(password);
|
|
|
packageSendOkAnswer(clientSocket);
|
|
|
+ stringRemove(&user);
|
|
|
+ return 0;
|
|
|
+}
|
|
|
+
|
|
|
+int package(int client, int clientSocket, Stream* in)
|
|
|
+{
|
|
|
+ if(streamHasData(in))
|
|
|
+ {
|
|
|
+ String s;
|
|
|
+ stringInit(&s);
|
|
|
+ stringReadStreamLine(&s, in);
|
|
|
+ int r = 0;
|
|
|
+ if(stringCompare(&s, "SEND"))
|
|
|
+ {
|
|
|
+ r = packageSend(client, clientSocket, in);
|
|
|
+ }
|
|
|
+ else if(stringCompare(&s, "LIST"))
|
|
|
+ {
|
|
|
+ r = packageList(client, clientSocket, in);
|
|
|
+ }
|
|
|
+ else if(stringCompare(&s, "READ"))
|
|
|
+ {
|
|
|
+ r = packageRead(client, clientSocket, in);
|
|
|
+ }
|
|
|
+ else if(stringCompare(&s, "DEL"))
|
|
|
+ {
|
|
|
+ r = packageDelete(client, clientSocket, in);
|
|
|
+ }
|
|
|
+ else if(stringCompare(&s, "LOGIN"))
|
|
|
+ {
|
|
|
+ r = packageLogin(client, clientSocket, in);
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ printf("Invalid package from %d\n", client);
|
|
|
+ r = 1;
|
|
|
+ }
|
|
|
+ stringRemove(&s);
|
|
|
+ return r;
|
|
|
+ }
|
|
|
return 0;
|
|
|
}
|
|
|
|
|
@@ -807,12 +716,7 @@ int main(int argc, char** argv)
|
|
|
return EXIT_FAILURE;
|
|
|
}
|
|
|
|
|
|
- serverRegisterHandler(&server, packageSend);
|
|
|
- serverRegisterHandler(&server, packageList);
|
|
|
- serverRegisterHandler(&server, packageRead);
|
|
|
- serverRegisterHandler(&server, packageDelete);
|
|
|
- serverRegisterHandler(&server, packageQuit);
|
|
|
- serverRegisterHandler(&server, packageLogin);
|
|
|
+ serverRegisterHandler(&server, package);
|
|
|
|
|
|
serverWaitForConnection(&server);
|
|
|
|