*/
#include <stdlib.h>
#include <stdio.h>
-#include <pwd.h>
#include <string.h>
-
-// === IMPORTS ===
- int Bank_GetMinAllowedBalance(int ID);
- int Bank_GetUserBalance(int ID);
- int Bank_AlterUserBalance(int ID, int Delta);
- int Bank_GetUserByUnixID(int UnixID);
- int Bank_GetUserByName(const char *Name);
- int Bank_AddUser(int UnixID);
+#include <openssl/sha.h>
+#include "common.h"
// === PROTOTYPES ===
-void Init_Cokebank(void);
+void Init_Cokebank(const char *Argument);
int Transfer(int SourceUser, int DestUser, int Ammount, const char *Reason);
int GetBalance(int User);
char *GetUserName(int User);
int GetUserID(const char *Username);
int GetUserAuth(const char *Username, const char *Password);
+ int GetMaxID(void);
+
+// === GLOBALS ===
+FILE *gBank_LogFile;
// === CODE ===
/**
* \brief Load the cokebank database
*/
-void Init_Cokebank(void)
+void Init_Cokebank(const char *Argument)
{
-
+ gBank_File = fopen(Argument, "rb+");
+ if( !gBank_File ) {
+ gBank_File = fopen(Argument, "wb+");
+ }
+ if( !gBank_File ) {
+ perror("Opening coke bank");
+ }
+
+ gBank_LogFile = fopen("cokebank.log", "a");
+ if( !gBank_LogFile ) gBank_LogFile = stdout;
+
+ fseek(gBank_File, 0, SEEK_END);
+ giBank_NumUsers = ftell(gBank_File) / sizeof(gaBank_Users[0]);
+ fseek(gBank_File, 0, SEEK_SET);
+ gaBank_Users = malloc( giBank_NumUsers * sizeof(gaBank_Users[0]) );
+ fread(gaBank_Users, sizeof(gaBank_Users[0]), giBank_NumUsers, gBank_File);
}
/**
*/
int Transfer(int SourceUser, int DestUser, int Ammount, const char *Reason)
{
- if( Bank_GetUserBalance(SourceUser) - Ammount < Bank_GetMinAllowedBalance(SourceUser) )
+ int srcBal = Bank_GetUserBalance(SourceUser);
+ int dstBal = Bank_GetUserBalance(DestUser);
+
+ if( srcBal - Ammount < Bank_GetMinAllowedBalance(SourceUser) )
return 1;
- if( Bank_GetUserBalance(DestUser) + Ammount < Bank_GetMinAllowedBalance(DestUser) )
+ if( dstBal + Ammount < Bank_GetMinAllowedBalance(DestUser) )
return 1;
Bank_AlterUserBalance(DestUser, Ammount);
Bank_AlterUserBalance(SourceUser, -Ammount);
+ fprintf(gBank_LogFile, "ACCT #%i{%i} -= %ic [to #%i] (%s)\n", SourceUser, srcBal, Ammount, DestUser, Reason);
+ fprintf(gBank_LogFile, "ACCT #%i{%i} += %ic [from #%i] (%s)\n", DestUser, dstBal, Ammount, SourceUser, Reason);
return 0;
}
+int GetFlags(int User)
+{
+ return Bank_GetUserFlags(User);
+}
+
/**
* \brief Get the balance of the passed user
*/
int GetBalance(int User)
{
- return 0;
+ return Bank_GetUserBalance(User);;
}
/**
*/
char *GetUserName(int User)
{
- return NULL;
+ return Bank_GetUserName(User);
}
/**
*/
int GetUserID(const char *Username)
{
- struct passwd *pwd;
int ret;
- // Get user ID
- pwd = getpwnam(Username);
- if( !pwd ) {
- return -1;
- }
-
// Get internal ID (or create new user)
- ret = Bank_GetUserByUnixID(pwd->pw_uid);
+ ret = Bank_GetUserByName(Username);
if( ret == -1 ) {
- ret = Bank_AddUser(pwd->pw_uid);
+ ret = Bank_AddUser(Username);
}
return ret;
}
-/**
- * \brief Authenticate a user
- * \return User ID, or -1 if authentication failed
- */
-int GetUserAuth(const char *Username, const char *Password)
+int GetMaxID(void)
{
- if( strcmp(Username, "test") == 0 )
- return Bank_GetUserByName("test");
- return -1;
+ return giBank_NumUsers;
}