3 * UCC (University [of WA] Computer Club) Electronic Accounting System
4 * - Cokebank (Basic Version)
6 * bank.c - Actual bank database
8 * This file is licenced under the 3-clause BSD Licence. See the file COPYING
19 static int GetUnixID(const char *Username);
27 int Bank_GetUserByName(const char *Username)
31 uid = GetUnixID(Username);
33 // Expensive search :(
34 for( i = 0; i < giBank_NumUsers; i ++ )
36 if( gaBank_Users[i].UnixID == uid )
43 int Bank_GetUserBalance(int ID)
45 if( ID < 0 || ID >= giBank_NumUsers )
48 return gaBank_Users[ID].Balance;
51 int Bank_GetUserFlags(int ID)
53 if( ID < 0 || ID >= giBank_NumUsers )
56 return gaBank_Users[ID].Flags;
59 int Bank_AlterUserBalance(int ID, int Delta)
62 if( ID < 0 || ID >= giBank_NumUsers )
66 gaBank_Users[ID].Balance += Delta;
69 fseek(gBank_File, ID*sizeof(gaBank_Users[0]), SEEK_SET);
70 fwrite(&gaBank_Users[ID], sizeof(gaBank_Users[0]), 1, gBank_File);
75 int Bank_SetUserBalance(int ID, int Value)
78 if( ID < 0 || ID >= giBank_NumUsers )
82 gaBank_Users[ID].Balance = Value;
85 fseek(gBank_File, ID*sizeof(gaBank_Users[0]), SEEK_SET);
86 fwrite(&gaBank_Users[ID], sizeof(gaBank_Users[0]), 1, gBank_File);
91 int Bank_GetMinAllowedBalance(int ID)
93 if( ID < 0 || ID >= giBank_NumUsers )
96 // printf("gaBank_Users[%i].Flags = 0x%x\n", ID, gaBank_Users[ID].Flags);
98 switch( gaBank_Users[ID].Flags & FLAG_TYPEMASK )
100 case USER_TYPE_NORMAL: return 0;
101 case USER_TYPE_COKE: return -2000;
102 case USER_TYPE_WHEEL: return -10000;
103 case USER_TYPE_GOD: return INT_MIN;
109 * \brief Create a new user in our database
111 int Bank_AddUser(const char *Username)
114 int uid = GetUnixID(Username);
116 // Can has moar space plz?
117 tmp = realloc(gaBank_Users, (giBank_NumUsers+1)*sizeof(gaBank_Users[0]));
118 if( !tmp ) return -1;
122 gaBank_Users[giBank_NumUsers].UnixID = uid;
123 gaBank_Users[giBank_NumUsers].Balance = 0;
124 gaBank_Users[giBank_NumUsers].Flags = 0;
126 if( strcmp(Username, COKEBANK_DEBT_ACCT) == 0 ) {
127 gaBank_Users[giBank_NumUsers].Flags = USER_TYPE_GOD; // No minium
129 else if( strcmp(Username, "root") == 0 ) {
130 gaBank_Users[giBank_NumUsers].Flags = USER_TYPE_GOD; // No minium
134 fseek(gBank_File, giBank_NumUsers*sizeof(gaBank_Users[0]), SEEK_SET);
135 fwrite(&gaBank_Users[giBank_NumUsers], sizeof(gaBank_Users[0]), 1, gBank_File);
144 // Unix user dependent code
145 // TODO: Modify to keep its own list of usernames
147 char *Bank_GetUserName(int ID)
151 if( ID < 0 || ID >= giBank_NumUsers )
154 if( gaBank_Users[ID].UnixID == -1 )
155 return strdup(COKEBANK_SALES_ACCT);
157 if( gaBank_Users[ID].UnixID == -2 )
158 return strdup(COKEBANK_DEBT_ACCT);
160 pwd = getpwuid(gaBank_Users[ID].UnixID);
161 if( !pwd ) return NULL;
163 return strdup(pwd->pw_name);
166 static int GetUnixID(const char *Username)
170 if( strcmp(Username, COKEBANK_SALES_ACCT) == 0 ) { // Pseudo account that sales are made into
173 else if( strcmp(Username, COKEBANK_DEBT_ACCT) == 0 ) { // Pseudo acount that money is added from
179 pwd = getpwnam(Username);
180 if( !pwd ) return -1;