aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMatt Strapp <matt@mattstrapp.net>2022-04-25 18:10:23 -0500
committerMatt Strapp <matt@mattstrapp.net>2022-04-25 18:10:23 -0500
commit44d6af73fa1dcfd04b8153433da5280387e2f98d (patch)
tree408e025d415421b5318e442fad64ef4ccaa979b5
parentA (diff)
downloadcsci4211-44d6af73fa1dcfd04b8153433da5280387e2f98d.tar
csci4211-44d6af73fa1dcfd04b8153433da5280387e2f98d.tar.gz
csci4211-44d6af73fa1dcfd04b8153433da5280387e2f98d.tar.bz2
csci4211-44d6af73fa1dcfd04b8153433da5280387e2f98d.tar.lz
csci4211-44d6af73fa1dcfd04b8153433da5280387e2f98d.tar.xz
csci4211-44d6af73fa1dcfd04b8153433da5280387e2f98d.tar.zst
csci4211-44d6af73fa1dcfd04b8153433da5280387e2f98d.zip
more
Signed-off-by: Matt Strapp <matt@mattstrapp.net>
-rw-r--r--.gitignore5
-rw-r--r--include/server.hpp2
-rw-r--r--include/util.hpp17
-rw-r--r--src/server.cpp105
-rw-r--r--src/util.cpp335
5 files changed, 225 insertions, 239 deletions
diff --git a/.gitignore b/.gitignore
index 5a65a47..888487a 100644
--- a/.gitignore
+++ b/.gitignore
@@ -89,4 +89,7 @@ dkms.conf
.dccache
client
-server \ No newline at end of file
+server
+
+fileDB
+userDB \ No newline at end of file
diff --git a/include/server.hpp b/include/server.hpp
index ab77ad8..f660514 100644
--- a/include/server.hpp
+++ b/include/server.hpp
@@ -22,6 +22,6 @@ void sendMessageToName(char *name, Header header, char *message);
void prepareMessage(int i, Header header, char *message);
void printServerCommand(int i);
-void DoServer(int svrPort);
+void DoServer(int port);
#endif
diff --git a/include/util.hpp b/include/util.hpp
index 10887df..51783a1 100644
--- a/include/util.hpp
+++ b/include/util.hpp
@@ -82,7 +82,6 @@ bool loginQuery(const char *database, char *username, char *password);
bool usernameQuery(const char *database, char *username);
void recordEntry(const char *database, char *key, char *value);
-void clearDatabase(const char *database);
int buf2file(BYTE *buf, int nbytes, char *filename);
int file2buf(char *filename, BYTE *buf);
@@ -117,19 +116,19 @@ public:
void displayContents(bool tab); // helper to print contents of class
};
-inline bool operator==(const Header &lfs, const Header &rhs) {
+inline bool operator==(const Header &lhs, const Header &rhs) {
bool result = true;
- result &= lfs.m_direction == rhs.m_direction;
- result &= lfs.m_flag == rhs.m_flag;
- result &= lfs.m_recipient == rhs.m_recipient;
- result &= lfs.m_trace == rhs.m_trace;
- result &= lfs.m_command == rhs.m_command;
+ result &= lhs.m_direction == rhs.m_direction;
+ result &= lhs.m_flag == rhs.m_flag;
+ result &= lhs.m_recipient == rhs.m_recipient;
+ result &= lhs.m_trace == rhs.m_trace;
+ result &= lhs.m_command == rhs.m_command;
for (int i = 0; i < MAX_USERNAME_LEN; i++)
- result &= lfs.m_name[i] == rhs.m_name[i];
+ result &= lhs.m_name[i] == rhs.m_name[i];
- result &= lfs.m_size == rhs.m_size;
+ result &= lhs.m_size == rhs.m_size;
return result;
}
diff --git a/src/server.cpp b/src/server.cpp
index 270a350..b5e5757 100644
--- a/src/server.cpp
+++ b/src/server.cpp
@@ -1,10 +1,10 @@
-#include "server.hpp"
+#include "server.hpp"
#define MAX_CONCURRENCY_LIMIT 40000 // overkill
#define POLL_TIMEOUT 1000 // Milliseconds
#define S2C_SERVICE_FREQ 1.0 // Seconds
-#define USER_DATABASE "user_database.txt"
-#define FILE_DATABASE "file_database.txt"
+#define USER_DATABASE "userDB"
+#define FILE_DATABASE "fileDB"
#define FILES_DIR "files"
int nConns; // total # of data sockets
@@ -28,7 +28,7 @@ void RemoveConnection(int i) {
Log("[%s] %d active connections after removal", NAME, nConns);
}
-void DoServer(int svrPort) {
+void DoServer(int port) {
int maxConcurrency = 20; // TODO: Change this to be a #define
int listenFD = socket(AF_INET, SOCK_STREAM, 0);
if (listenFD < 0) {
@@ -39,7 +39,7 @@ void DoServer(int svrPort) {
struct sockaddr_in serverAddr;
memset(&serverAddr, 0, sizeof(struct sockaddr_in));
serverAddr.sin_family = AF_INET;
- serverAddr.sin_port = htons((unsigned short)svrPort);
+ serverAddr.sin_port = htons((unsigned short)port);
serverAddr.sin_addr.s_addr = htonl(INADDR_ANY);
int optval = 1;
@@ -52,13 +52,15 @@ void DoServer(int svrPort) {
signal(SIGPIPE, SIG_IGN);
if (bind(listenFD, (struct sockaddr *)&serverAddr, sizeof(serverAddr)) != 0) {
- Error("[%s] Cannot bind to port %d.", NAME, svrPort);
+ Error("[%s] Cannot bind to port %d.", NAME, port);
}
if (listen(listenFD, 16) != 0) {
- Error("[%s] Cannot listen to port %d.", NAME, svrPort);
+ Error("[%s] Cannot listen to port %d.", NAME, port);
}
+ Log("[%s] Listening at 127.0.0.1:%d", NAME, port);
+
nConns = 0;
memset(peers, 0, sizeof(peers));
peers[0].fd = listenFD;
@@ -124,8 +126,7 @@ void DoServer(int svrPort) {
if (connStat[i].recInitHeader == false) {
if (Recv_NonBlocking(peers[i].fd, buf[i], &connStat[i], &peers[i]) <
0) {
- Log("[%s] Line %d: Removing connection %d", NAME, __LINE__,
- i);
+ Log("[%s] Line %d: Removing connection %d", NAME, __LINE__, i);
RemoveConnection(i);
goto NEXT_CONNECTION;
}
@@ -145,8 +146,7 @@ void DoServer(int svrPort) {
connStat[i].expectingHeader =
true; // flag needed for processing below
if (processReception(i) != 0) {
- Log("[%s] Line %d: Removing connection %d", NAME, __LINE__,
- i);
+ Log("[%s] Line %d: Removing connection %d", NAME, __LINE__, i);
RemoveConnection(i);
goto NEXT_CONNECTION;
}
@@ -158,16 +158,14 @@ void DoServer(int svrPort) {
if (connStat[i].direction == C2S) {
if (Recv_NonBlocking(peers[i].fd, buf[i], &connStat[i], &peers[i]) <
0) {
- Log("[%s] Line %d: Removing connection %d", NAME, __LINE__,
- i);
+ Log("[%s] Line %d: Removing connection %d", NAME, __LINE__, i);
RemoveConnection(i);
goto NEXT_CONNECTION;
}
if (connStat[i].nToDo == 0) {
if (processReception(i) != 0) {
- Log("[%s] Line %d: Removing connection %d", NAME,
- __LINE__, i);
+ Log("[%s] Line %d: Removing connection %d", NAME, __LINE__, i);
RemoveConnection(i);
goto NEXT_CONNECTION;
}
@@ -315,7 +313,7 @@ void doServerCommand(int i) {
outHeader.m_command = REGISTER;
memcpy(outHeader.m_name, NAME, strlen(NAME));
strcat(message, "Cannot register username [");
- strcat(message, username);
+ strncat(message, username, MAX_USERNAME_LEN);
strcat(message, "]. Username already registered.\n");
strcat(message,
"\tUsernames may only contain characters a-z, A-Z, or 0-9.\n");
@@ -323,14 +321,14 @@ void doServerCommand(int i) {
outHeader.m_size = strlen(message);
sendMessageToId(connStat[i].id, false, outHeader, message);
} else {
- Log("[---- : %s] Successful registration (usr, pswd): %s %s",
- com2str(header.m_command), username, password);
+ Log("[---- : %s] Successful registration of user %s",
+ com2str(header.m_command), username);
recordEntry(USER_DATABASE, username, password);
outHeader.setFlags(S2C, SUCCESS, PUB, SIGN);
outHeader.m_command = REGISTER;
memcpy(outHeader.m_name, NAME, strlen(NAME));
strcat(message, "Successfully registered ");
- strcat(message, username);
+ strncat(message, username, MAX_USERNAME_LEN);
strcat(message, ".");
outHeader.m_size = strlen(message);
sendMessageToId(connStat[i].id, false, outHeader, message);
@@ -351,7 +349,7 @@ void doServerCommand(int i) {
outHeader.m_command = LOGIN;
memcpy(outHeader.m_name, NAME, strlen(NAME));
strcat(message, "Login failed. ");
- strcat(message, username);
+ strncat(message, username, MAX_USERNAME_LEN);
strcat(message, " is logged in on another device.");
outHeader.m_size = strlen(message);
sendMessageToId(connStat[i].id, false, outHeader, message);
@@ -367,20 +365,20 @@ void doServerCommand(int i) {
connStat[x].isLoggedIn = true;
}
}
- Log("[%s : %s] Successful login (usr, pswd): %s %s", connStat[i].name,
- com2str(header.m_command), username, password);
+ Log("[%s : %s] Successful login", connStat[i].name,
+ com2str(header.m_command));
outHeader.setFlags(S2C, SUCCESS, PUB, SIGN);
outHeader.m_command = LOGIN;
memcpy(outHeader.m_name, NAME, strlen(NAME));
strcat(message, "Welcome ");
- strcat(message, username);
+ strncat(message, username, MAX_USERNAME_LEN);
strcat(message, ".");
outHeader.m_size = strlen(message);
sendMessageToId(connStat[i].id, true, outHeader, message);
}
} else {
- Log("[---- : %s] Login failed (usr, pswd): %s %s",
- com2str(header.m_command), username, password);
+ Log("[---- : %s] Login failed: %s",
+ com2str(header.m_command), username);
outHeader.setFlags(S2C, FAIL, PUB, SIGN);
outHeader.m_command = LOGIN;
memcpy(outHeader.m_name, NAME, strlen(NAME));
@@ -406,7 +404,7 @@ void doServerCommand(int i) {
memcpy(outHeader.m_name, NAME, strlen(NAME));
strcat(message, "Goodbye ");
strcat(message, connStat[i].name);
- strcat(message, ". Come back soon.");
+ strcat(message, ".");
outHeader.m_size = strlen(message);
sendMessageToId(connStat[i].id, false, outHeader, message);
} else {
@@ -475,7 +473,7 @@ void doServerCommand(int i) {
if ((connStat[x].direction == C2S) &&
(connStat[x].linkType == MESSAGE_LINK) &&
(connStat[x].id == connStat[i].id)) {
- strcat(connStat[i].name, connStat[x].name);
+ strncat(connStat[i].name, connStat[x].name, MAX_USERNAME_LEN);
connStat[i].isLoggedIn = connStat[x].isLoggedIn;
foundActiveUser = true;
s2cConnNumb = x;
@@ -484,7 +482,7 @@ void doServerCommand(int i) {
}
if (s2cConnNumb == -1) {
- Log("Enexpected state. Recieved %s on new connection without S2C "
+ Log("Unexpected state. Received %s on new connection without S2C "
"connection for messages.",
com2str(header.m_command));
} else if (!connStat[i].isLoggedIn) {
@@ -565,8 +563,8 @@ void doServerCommand(int i) {
connStat[i].direction = S2C;
connStat[i].linkType = FILE_LINK;
connStat[i].lastTime = currentTime;
- // no need for shouldClose. Client will close connection and periodic ping will
- // detect closure
+ // no need for shouldClose. Client will close connection and periodic ping
+ // will detect closure
snprintf(server_filename, sizeof(server_filename), "%s/%d_", FILES_DIR,
fileId);
@@ -715,8 +713,7 @@ void prepareMessage(int i, Header header, char *message) {
peers[i].events |= POLLWRNORM;
} else {
- Log("[%s] WARNING: attempted to write to C2S connection %d", NAME,
- i);
+ Log("[%s] WARNING: attempted to write to C2S connection %d", NAME, i);
}
}
@@ -741,48 +738,18 @@ int main(int argc, char **argv) {
}
if (strcmp("reset", argv[1]) == 0) {
- Log("Resetting server databases");
- clearDatabase(USER_DATABASE);
- clearDatabase(FILE_DATABASE);
-
- int status;
- pid_t cpid;
-
- if ((cpid = fork()) == -1) {
- perror("fork");
- return 1;
- }
-
- if (cpid == 0) { // Child process executes "rm -rf users"
- char command[40] = "rm -rf files"; // only way this worked
- char *args[5] = {NULL};
- args[0] = strtok(command, " ");
- for (int i = 1; i < 3; i++)
- args[i] = strtok(NULL, " ");
- execvp(args[0], args);
- return 0;
- } else { // Parent process waits for "rm -rf users" to finish
- pid_t rpid;
- int status;
- if ((rpid = wait(NULL)) == -1)
- perror("wait");
- else {
- Log("Clearing file storage");
- if (mkdir(FILES_DIR, S_IRWXU | S_IRWXG | S_IRWXO) != 0) {
- perror("mkdir");
- return -1;
- }
- }
- return 0;
- }
+ Log("Clearing databases");
+ if (remove(USER_DATABASE) != 0)
+ Error("Error deleting %s", USER_DATABASE);
+ if (remove(FILE_DATABASE) != 0)
+ Error("Error deleting %s", FILE_DATABASE);
+ exit(EXIT_SUCCESS);
}
- // Make files directory if it doesn't exist
- DIR *pDir;
+ // Make directory if it doesn't exist
struct stat s;
if (stat("files", &s) != 0) {
- // The files directory doesn't exist
if (mkdir("files", S_IRWXU | S_IRWXG | S_IRWXO) != 0) {
perror("mkdir");
return -1;
diff --git a/src/util.cpp b/src/util.cpp
index 142fcbd..dc95441 100644
--- a/src/util.cpp
+++ b/src/util.cpp
@@ -1,16 +1,17 @@
-#include <string>
-#include <string.h>
#include <cstddef>
-#include <stdio.h>
#include <stdarg.h>
-#include <time.h>
+#include <stdio.h>
+#include <string.h>
+#include <string>
#include <sys/timeb.h>
+#include <time.h>
#include "util.hpp"
-#define VALID_CHARACTERS "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789"
+#define VALID_CHARACTERS \
+ "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789"
-enum Command parse_command(char* line){
+enum Command parse_command(char *line) {
/* Find a valid command in the first word of the line (case sensitive)
args:
line (char*): string of characters from the input file
@@ -18,130 +19,154 @@ enum Command parse_command(char* line){
returns:
(command): Returns the found command. Returns else if first word is invalid.
*/
- if (line == NULL){
+ if (line == NULL) {
return INVALID;
}
- char* rest;
- char* tok = strtok_r(line, " ", &rest);
+ char *rest;
+ char *tok = strtok_r(line, " ", &rest);
- if (tok == NULL){
+ if (tok == NULL) {
return INVALID;
}
// REGISTER [username] [password]
- if (strcmp(tok, "REGISTER") == 0){
- char* username = strtok_r(rest, " ", &rest);
- if(!isValidUsername(username)) return INVALID;
+ if (strcmp(tok, "REGISTER") == 0) {
+ char *username = strtok_r(rest, " ", &rest);
+ if (!isValidUsername(username))
+ return INVALID;
- char* password = strtok_r(rest, " ", &rest);
- if(password == NULL) return INVALID;
- if(!isValidPassword(password)) return INVALID;
+ char *password = strtok_r(rest, " ", &rest);
+ if (password == NULL)
+ return INVALID;
+ if (!isValidPassword(password))
+ return INVALID;
- char* misc = strtok_r(rest, " ", &rest);
- if(misc != NULL) return INVALID;
+ char *misc = strtok_r(rest, " ", &rest);
+ if (misc != NULL)
+ return INVALID;
return REGISTER;
}
// LOGIN [username] [password]
- if (strcmp(tok, "LOGIN") == 0){
- char* username = strtok_r(rest, " ", &rest);
- if(!isValidUsername(username)) return INVALID;
+ if (strcmp(tok, "LOGIN") == 0) {
+ char *username = strtok_r(rest, " ", &rest);
+ if (!isValidUsername(username))
+ return INVALID;
- char* password = strtok_r(rest, " ", &rest);
- if(password == NULL) return INVALID;
- if(!isValidPassword(password)) return INVALID;
+ char *password = strtok_r(rest, " ", &rest);
+ if (password == NULL)
+ return INVALID;
+ if (!isValidPassword(password))
+ return INVALID;
- char* misc = strtok_r(rest, " ", &rest);
- if(misc != NULL) return INVALID;
+ char *misc = strtok_r(rest, " ", &rest);
+ if (misc != NULL)
+ return INVALID;
return LOGIN;
}
// LOGOUT
- if (strcmp(tok, "LOGOUT") == 0){
- char* misc = strtok_r(rest, " ", &rest);
- if(misc != NULL) return INVALID;
+ if (strcmp(tok, "LOGOUT") == 0) {
+ char *misc = strtok_r(rest, " ", &rest);
+ if (misc != NULL)
+ return INVALID;
return LOGOUT;
}
// SEND [msg]
- if (strcmp(tok, "SEND") == 0){
- if (int(strlen(rest) == 0)) return INVALID;
+ if (strcmp(tok, "SEND") == 0) {
+ if (int(strlen(rest) == 0))
+ return INVALID;
return SEND;
}
// SEND2 [username] [msg]
- if (strcmp(tok, "SEND2") == 0){
- char* username = strtok_r(rest, " ", &rest);
- if(!isValidUsername(username)) return INVALID;
+ if (strcmp(tok, "SEND2") == 0) {
+ char *username = strtok_r(rest, " ", &rest);
+ if (!isValidUsername(username))
+ return INVALID;
- if (int(strlen(rest) == 0)) return INVALID;
+ if (int(strlen(rest) == 0))
+ return INVALID;
return SEND2;
}
// SENDA [msg]
- if (strcmp(tok, "SENDA") == 0){
- if (int(strlen(rest) == 0)) return INVALID;
+ if (strcmp(tok, "SENDA") == 0) {
+ if (int(strlen(rest) == 0))
+ return INVALID;
return SENDA;
}
// SENDA2 [username] [msg]
- if (strcmp(tok, "SENDA2") == 0){
- char* username = strtok_r(rest, " ", &rest);
- if(!isValidUsername(username)) return INVALID;
+ if (strcmp(tok, "SENDA2") == 0) {
+ char *username = strtok_r(rest, " ", &rest);
+ if (!isValidUsername(username))
+ return INVALID;
- if (int(strlen(rest) == 0)) return INVALID;
+ if (int(strlen(rest) == 0))
+ return INVALID;
return SENDA2;
}
// SENDF [local file]
- if (strcmp(tok, "SENDF") == 0){
- char* file_name = strtok_r(rest, " ", &rest);
- if(file_name == NULL) return INVALID;
+ if (strcmp(tok, "SENDF") == 0) {
+ char *file_name = strtok_r(rest, " ", &rest);
+ if (file_name == NULL)
+ return INVALID;
- if (int(strlen(rest) != 0)) return INVALID;
+ if (int(strlen(rest) != 0))
+ return INVALID;
return SENDF;
}
// SENDF2 [username] [local file]
- if (strcmp(tok, "SENDF2") == 0){
- char* username = strtok_r(rest, " ", &rest);
- if(!isValidUsername(username)) return INVALID;
+ if (strcmp(tok, "SENDF2") == 0) {
+ char *username = strtok_r(rest, " ", &rest);
+ if (!isValidUsername(username))
+ return INVALID;
- char* file_name = strtok_r(rest, " ", &rest);
- if(file_name == NULL) return INVALID;
+ char *file_name = strtok_r(rest, " ", &rest);
+ if (file_name == NULL)
+ return INVALID;
- if (int(strlen(rest) != 0)) return INVALID;
+ if (int(strlen(rest) != 0))
+ return INVALID;
return SENDF2;
}
// LIST
- if (strcmp(tok, "LIST") == 0){
- char* misc = strtok_r(rest, " ", &rest);
- if(misc != NULL) return INVALID;
+ if (strcmp(tok, "LIST") == 0) {
+ char *misc = strtok_r(rest, " ", &rest);
+ if (misc != NULL)
+ return INVALID;
return LIST;
}
// DELAY
- if (strcmp(tok, "DELAY") == 0){
- char* delay_time = strtok_r(rest, " ", &rest);
- if(delay_time == NULL) return INVALID;
+ if (strcmp(tok, "DELAY") == 0) {
+ char *delay_time = strtok_r(rest, " ", &rest);
+ if (delay_time == NULL)
+ return INVALID;
std::string str(delay_time);
std::size_t found = str.find_first_not_of("0123456789");
- if(found != std::string::npos) return INVALID;
+ if (found != std::string::npos)
+ return INVALID;
- if (int(strlen(rest) != 0)) return INVALID;
+ if (int(strlen(rest) != 0))
+ return INVALID;
return DELAY;
}
@@ -150,8 +175,7 @@ enum Command parse_command(char* line){
return INVALID;
}
-
-bool isValidUsername(char* username){
+bool isValidUsername(char *username) {
/* Helper function to check if a username string is valid
args:
username (char*): Username to be tested.
@@ -159,52 +183,58 @@ bool isValidUsername(char* username){
returns:
bool: Username is valid ? true, false
*/
- if(username == NULL) return false;
- else if ((strlen(username) > MAX_USERNAME_LEN)||(strlen(username) < MIN_USERNAME_LEN)) return false;
- else{
+ if (username == NULL)
+ return false;
+ else if ((strlen(username) > MAX_USERNAME_LEN) ||
+ (strlen(username) < MIN_USERNAME_LEN))
+ return false;
+ else {
std::string str(username);
std::size_t found = str.find_first_not_of(VALID_CHARACTERS);
- if(found != std::string::npos) return false;
+ if (found != std::string::npos)
+ return false;
}
return true;
}
-
-bool isValidPassword(char* password){
- if(password == NULL) return false;
- else if ((strlen(password) > MAX_PASSWORD_LEN)||(strlen(password) < MIN_PASSWORD_LEN)) return false;
- else{
+bool isValidPassword(char *password) {
+ if (password == NULL)
+ return false;
+ else if ((strlen(password) > MAX_PASSWORD_LEN) ||
+ (strlen(password) < MIN_PASSWORD_LEN))
+ return false;
+ else {
std::string str(password);
std::size_t found = str.find_first_not_of(VALID_CHARACTERS);
- if(found != std::string::npos) return false;
+ if (found != std::string::npos)
+ return false;
}
return true;
}
-
-void Error(const char * format, ...) {
- char msg[4096];
- va_list argptr;
- va_start(argptr, format);
- vsprintf(msg, format, argptr);
- va_end(argptr);
- fprintf(stderr, "Error: %s\n", msg);
- exit(-1);
+void Error(const char *format, ...) {
+ char msg[4096];
+ va_list argptr;
+ va_start(argptr, format);
+ vsprintf(msg, format, argptr);
+ va_end(argptr);
+ fprintf(stderr, "Error: %s\n", msg);
+ exit(-1);
}
-void Log(const char * format, ...) {
- char msg[2048];
- va_list argptr;
- va_start(argptr, format);
- vsprintf(msg, format, argptr);
- va_end(argptr);
- fprintf(stderr, "%s\n", msg);
+void Log(const char *format, ...) {
+ char msg[2048];
+ va_list argptr;
+ va_start(argptr, format);
+ vsprintf(msg, format, argptr);
+ va_end(argptr);
+ fprintf(stderr, "%s\n", msg);
}
// convert buf[0:3] to int
-void buf2i(BYTE * buf, int &i){
+void buf2i(BYTE *buf, int &i) {
// No way to avoid Segmentation fault. Some bytes may be 0
i = 0;
i += buf[3];
@@ -214,7 +244,7 @@ void buf2i(BYTE * buf, int &i){
}
// convert int to buf[4] where buf[0] contains MSB's and buf[3] contains LSB's
-void i2buf(int &i, BYTE * buf){
+void i2buf(int &i, BYTE *buf) {
// No way to avoid Segmentation fault. Some bytes may be 0
buf[0] = (BYTE)((i & 0xFF000000) >> 24);
buf[1] = (BYTE)((i & 0x00FF0000) >> 16);
@@ -222,36 +252,24 @@ void i2buf(int &i, BYTE * buf){
buf[3] = (BYTE)(i & 0x000000FF);
}
-const char * com2str(enum Command command){
- const char * com2str[] = {"REGISTER",
- "LOGIN",
- "LOGOUT",
- "SEND",
- "SEND2",
- "SENDA",
- "SENDA2",
- "SENDF",
- "SENDF2",
- "LIST",
- "DELAY",
- "GETF",
- "PING",
- "CONNECT",
- "",
- "INVALID"
- };
- return com2str[command];
+const char *com2str(enum Command command) {
+ const char *com2str[] = {"REGISTER", "LOGIN", "LOGOUT", "SEND",
+ "SEND2", "SENDA", "SENDA2", "SENDF",
+ "SENDF2", "LIST", "DELAY", "GETF",
+ "PING", "CONNECT", "", "INVALID"};
+ return com2str[command];
}
// Computes the difference between times a and b in seconds
// a - b = result
-double timeDifference(struct timeb a, struct timeb b){
- return (a.time + a.millitm / (double) 1000.0f) - (b.time + b.millitm / (double) 1000.0f);
+double timeDifference(struct timeb a, struct timeb b) {
+ return (a.time + a.millitm / (double)1000.0f) -
+ (b.time + b.millitm / (double)1000.0f);
}
-int getNumEntries(const char* database){
- FILE* fp = fopen(database, "r");
- if (!fp){
+int getNumEntries(const char *database) {
+ FILE *fp = fopen(database, "r");
+ if (!fp) {
Log("Username check failed to open the file: %s", database);
return -1;
}
@@ -259,9 +277,9 @@ int getNumEntries(const char* database){
int numEntries = 0;
char line[LINE_SIZE] = {0};
- while(fgets(line, LINE_SIZE, fp) != NULL){
- char* new_line_pos = strchr(line, '\n');
- if(new_line_pos != NULL)
+ while (fgets(line, LINE_SIZE, fp) != NULL) {
+ char *new_line_pos = strchr(line, '\n');
+ if (new_line_pos != NULL)
*new_line_pos = 0;
// Including blank lines as entries. Don't use any blank lines.
numEntries++;
@@ -272,28 +290,30 @@ int getNumEntries(const char* database){
return numEntries;
}
-// User/password is in registry: true
-// User/password is not in registry: false
-bool loginQuery(const char * database, char* username, char* password){
- FILE* fp = fopen(database, "r");
- if (!fp){
- Log("Registry check failed to open the file: %s", database);
+bool loginQuery(const char *database, char *username, char *password) {
+ FILE *fp = fopen(database, "r");
+ if (!fp) {
+ Log("Could not open user file: %s", database);
return false;
}
char line[LINE_SIZE] = {0};
- while(fgets(line, LINE_SIZE, fp) != NULL){
- char* new_line_pos = strchr(line, '\n');
- if(new_line_pos != NULL)
+ while (fgets(line, LINE_SIZE, fp) != NULL) {
+ char *new_line_pos = strchr(line, '\n');
+ if (new_line_pos != NULL)
*new_line_pos = 0;
- char* rest;
- char* usr = strtok_r(line, " ", &rest);
- char* pswd = strtok_r(rest, " ", &rest);
+ char *rest;
+ char *usr = strtok_r(line, " ", &rest);
+ char *pswd = strtok_r(rest, " ", &rest);
- //Log("username: |%s| Password: |%s|", usr, pswd);
+ if (usr == NULL || pswd == NULL) {
+ Log("Registry check failed to parse the file: %s", database);
+ fclose(fp);
+ return false;
+ }
- if((strcmp(username, usr) == 0) && (strcmp(password, pswd) == 0)){
+ if ((strcmp(username, usr) == 0) && (strcmp(password, pswd) == 0)) {
fclose(fp);
return true;
}
@@ -307,25 +327,26 @@ bool loginQuery(const char * database, char* username, char* password){
// User is in registry: true
// User is not in registry: false
-bool usernameQuery(const char * database, char* username){
- FILE* fp = fopen(database, "r");
- if (!fp){
+bool usernameQuery(const char *database, char *username) {
+ FILE *fp = fopen(database, "r");
+ if (!fp) {
Log("Username check failed to open the file: %s", database);
return false;
}
char line[LINE_SIZE] = {0};
- while(fgets(line, LINE_SIZE, fp) != NULL){
- char* new_line_pos = strchr(line, '\n');
- if(new_line_pos != NULL)
+ while (fgets(line, LINE_SIZE, fp) != NULL) {
+ char *new_line_pos = strchr(line, '\n');
+ if (new_line_pos != NULL)
*new_line_pos = 0;
- char* rest;
- char* usr = strtok_r(line, " ", &rest);
+ char *rest;
+ char *usr = strtok_r(line, " ", &rest);
- //Log("username: |%s|", usr);
+ if (usr == NULL)
+ continue;
- if(strcmp(username, usr) == 0){
+ if (strcmp(username, usr) == 0) {
fclose(fp);
return true;
}
@@ -337,10 +358,10 @@ bool usernameQuery(const char * database, char* username){
return false;
}
-void recordEntry(const char * database, char* key, char* value){
- FILE* fp = fopen(database, "a");
+void recordEntry(const char *database, char *key, char *value) {
+ FILE *fp = fopen(database, "a");
- if (!fp){
+ if (!fp) {
Log("Registry append failed to open the file: %s", database);
return;
}
@@ -355,41 +376,37 @@ void recordEntry(const char * database, char* key, char* value){
fclose(fp);
}
-void clearDatabase(const char * database){
- FILE* fp = fopen(database, "w");
- fclose(fp);
-}
-
-
-int buf2file(BYTE* buf, int nbytes, char* filename){
- FILE* f = fopen(filename, "w");
- if(!f) return -1;
+int buf2file(BYTE *buf, int nbytes, char *filename) {
+ FILE *f = fopen(filename, "w");
+ if (!f)
+ return -1;
fwrite(buf, 1, nbytes, f);
fclose(f);
return 0;
}
-
-int file2buf(char* filename, BYTE* buf){
- FILE* f = fopen(filename, "r");
- if(!f){
+int file2buf(char *filename, BYTE *buf) {
+ FILE *f = fopen(filename, "r");
+ if (!f) {
Log("Error: Cannot open %s", filename);
return -1;
}
fseek(f, 0, SEEK_END); // jump to end of file
- long nbytes = ftell(f); // find current offset on file f
+ long nbytes = ftell(f); // find current offset on file f
fseek(f, 0, SEEK_SET); // jump to beginning of file
- if(nbytes > MAX_REQUEST_SIZE){
+ if (nbytes > MAX_REQUEST_SIZE) {
Log("Error: File %s is too big: %d", filename, nbytes);
+ fclose(f);
return -1;
}
int nread = fread(buf, 1, nbytes, f);
- if(nread != nbytes){
+ if (nread != nbytes) {
Log("Error: Byte count mismatch with fread: %d, %d", nbytes, nread);
+ fclose(f);
return -1;
}