3 * UCC (University [of WA] Computer Club) Electronic Accounting System
5 * cokebank.c - Coke-Bank management
7 * This file is licenced under the 3-clause BSD Licence. See the file COPYING
17 extern int Bank_GetMinAllowedBalance(int ID);
18 extern int Bank_GetUserBalance(int ID);
19 extern int Bank_AlterUserBalance(int ID, int Delta);
20 extern int Bank_GetUserByUnixID(int UnixID);
21 extern int Bank_GetUserUnixID(int ID);
22 extern int Bank_AddUser(int UnixID);
23 extern FILE *gBank_File;
24 extern tUser *gaBank_Users;
25 extern int giBank_NumUsers;
28 void Init_Cokebank(const char *Argument);
29 int Transfer(int SourceUser, int DestUser, int Ammount, const char *Reason);
30 int GetBalance(int User);
31 char *GetUserName(int User);
32 int GetUserID(const char *Username);
33 int GetUserAuth(const char *Username, const char *Password);
37 * \brief Load the cokebank database
39 void Init_Cokebank(const char *Argument)
41 gBank_File = fopen(Argument, "rb+");
43 gBank_File = fopen(Argument, "wb+");
46 perror("Opening coke bank");
49 fseek(gBank_File, 0, SEEK_END);
50 giBank_NumUsers = ftell(gBank_File) / sizeof(gaBank_Users[0]);
51 fseek(gBank_File, 0, SEEK_SET);
52 gaBank_Users = malloc( giBank_NumUsers * sizeof(gaBank_Users[0]) );
53 fread(gaBank_Users, sizeof(gaBank_Users[0]), giBank_NumUsers, gBank_File);
57 * \brief Transfers money from one user to another
58 * \param SourceUser Source user
59 * \param DestUser Destination user
60 * \param Ammount Ammount of cents to move from \a SourceUser to \a DestUser
61 * \param Reason Reason for the transfer (essentially a comment)
62 * \return Boolean failure
64 int Transfer(int SourceUser, int DestUser, int Ammount, const char *Reason)
66 if( Bank_GetUserBalance(SourceUser) - Ammount < Bank_GetMinAllowedBalance(SourceUser) )
68 if( Bank_GetUserBalance(DestUser) + Ammount < Bank_GetMinAllowedBalance(DestUser) )
70 Bank_AlterUserBalance(DestUser, Ammount);
71 Bank_AlterUserBalance(SourceUser, -Ammount);
76 * \brief Get the balance of the passed user
78 int GetBalance(int User)
84 * \brief Return the name the passed user
86 char *GetUserName(int User)
89 int unixid = Bank_GetUserUnixID(User);
92 return strdup(">sales");
95 return strdup(">liability");
97 pwd = getpwuid(unixid);
98 if( !pwd ) return NULL;
100 return strdup(pwd->pw_name);
104 * \brief Get the User ID of the named user
106 int GetUserID(const char *Username)
110 if( strcmp(Username, ">sales") == 0 ) { // Pseudo account that sales are made into
113 else if( strcmp(Username, ">liability") == 0 ) { // Pseudo acount that money is added from
119 pwd = getpwnam(Username);
120 if( !pwd ) return -1;
124 // Get internal ID (or create new user)
125 ret = Bank_GetUserByUnixID(uid);
127 ret = Bank_AddUser(uid);
134 * \brief Authenticate a user
135 * \return User ID, or -1 if authentication failed
137 int GetUserAuth(const char *Username, const char *Password)
140 if( strcmp(Username, "tpg") == 0 )
141 return GetUserID("tpg");