X-Git-Url: https://git.ucc.asn.au/?a=blobdiff_plain;f=src%2Fserver%2Fserver.c;h=f0d7d46efe5af9596a13c3b87d6537aa36ea072a;hb=ec400f11ebc2e81079e464145915fb2d25602fbc;hp=04f1c399156110a2759794400e0feb81b28d81f4;hpb=21ed7a19f1f3e046c2985043e7fbe054b65cb4e4;p=tpg%2Fopendispense2.git diff --git a/src/server/server.c b/src/server/server.c index 04f1c39..f0d7d46 100644 --- a/src/server/server.c +++ b/src/server/server.c @@ -296,22 +296,23 @@ void Server_ParseClientCommand(tClient *Client, char *CommandString) { char *command, *args; int i; - #if 0 - char **argList; - int numArgs = 0; - #endif + + if( giDebugLevel >= 2 ) + Debug(Client, "Server_ParseClientCommand: (CommandString = '%s')", CommandString); if( Server_int_ParseArgs(1, CommandString, &command, &args, NULL) ) { // Is this an error? (just ignore for now) - args = ""; + //args = ""; } // Find command for( i = 0; i < NUM_COMMANDS; i++ ) { - if(strcmp(CommandString, gaServer_Commands[i].Name) == 0) { + if(strcmp(command, gaServer_Commands[i].Name) == 0) { + if( giDebugLevel >= 2 ) + Debug(Client, "CMD %s - \"%s\"", command, args); gaServer_Commands[i].Function(Client, args); return ; } @@ -394,7 +395,11 @@ void Server_Cmd_AUTOAUTH(tClient *Client, char *Args) { char *username; - Server_int_ParseArgs(0, Args, &username, NULL); + if( Server_int_ParseArgs(0, Args, &username, NULL) ) + { + sendf(Client->Socket, "407 AUTOAUTH takes 1 argument\n"); + return ; + } // Check if trusted if( !Client->bIsTrusted ) { @@ -415,6 +420,8 @@ void Server_Cmd_AUTOAUTH(tClient *Client, char *Args) // You can't be an internal account if( Bank_GetFlags(Client->UID) & USER_FLAG_INTERNAL ) { + if(giDebugLevel) + Debug(Client, "Autoauth as '%s', not allowed", username); Client->UID = -1; sendf(Client->Socket, "401 Auth Failure\n"); return ; @@ -465,6 +472,32 @@ void Server_Cmd_SETEUSER(tClient *Client, char *Args) sendf(Client->Socket, "200 User set\n"); } +/** + * \brief Send an item status to the client + * \param Client Who to? + * \param Item Item to send + */ +void Server_int_SendItem(tClient *Client, tItem *Item) +{ + char *status = "avail"; + + if( Item->Handler->CanDispense ) + { + switch(Item->Handler->CanDispense(Client->UID, Item->ID)) + { + case 0: status = "avail"; break; + case 1: status = "sold"; break; + default: + case -1: status = "error"; break; + } + } + + sendf(Client->Socket, + "202 Item %s:%i %s %i %s\n", + Item->Handler->Name, Item->ID, status, Item->Price, Item->Name + ); +} + /** * \brief Enumerate the items that the server knows about */ @@ -488,10 +521,7 @@ void Server_Cmd_ENUMITEMS(tClient *Client, char *Args) for( i = 0; i < giNumItems; i ++ ) { if( gaItems[i].bHidden ) continue; - sendf(Client->Socket, - "202 Item %s:%i %i %s\n", - gaItems[i].Handler->Name, gaItems[i].ID, gaItems[i].Price, gaItems[i].Name - ); + Server_int_SendItem( Client, &gaItems[i] ); } sendf(Client->Socket, "200 List end\n"); @@ -553,10 +583,7 @@ void Server_Cmd_ITEMINFO(tClient *Client, char *Args) return ; } - sendf(Client->Socket, - "202 Item %s:%i %i %s\n", - item->Handler->Name, item->ID, item->Price, item->Name - ); + Server_int_SendItem( Client, item ); } void Server_Cmd_DISPENSE(tClient *Client, char *Args) @@ -1163,9 +1190,20 @@ int sendf(int Socket, const char *Format, ...) int Server_int_ParseArgs(int bUseLongLast, char *ArgStr, ...) { va_list args; - char savedChar = *ArgStr; + char savedChar; char **dest; va_start(args, ArgStr); + + // Check for null + if( !ArgStr ) + { + while( (dest = va_arg(args, char **)) ) + *dest = NULL; + va_end(args); + return 1; + } + + savedChar = *ArgStr; while( (dest = va_arg(args, char **)) ) { @@ -1180,37 +1218,42 @@ int Server_int_ParseArgs(int bUseLongLast, char *ArgStr, ...) do { *dest = NULL; } while( (dest = va_arg(args, char **)) ); + va_end(args); return -1; } - // Set destination - *dest = ArgStr; - if( *ArgStr == '"' ) { + ArgStr ++; + *dest = ArgStr; // Read until quote while( *ArgStr && *ArgStr != '"' ) ArgStr ++; } else { + // Set destination + *dest = ArgStr; // Read until a space while( *ArgStr && *ArgStr != ' ' && *ArgStr != '\t' ) ArgStr ++; } savedChar = *ArgStr; // savedChar is used to un-mangle the last string *ArgStr = '\0'; + ArgStr ++; } + va_end(args); // Oops, extra arguments, and greedy not set - if( savedChar == ' ' && bUseLongLast ) + if( (savedChar == ' ' || savedChar == '\t') && !bUseLongLast ) { return -1; + } // Un-mangle last - if(bUseLongLast) + if(bUseLongLast) { + ArgStr --; *ArgStr = savedChar; - - va_end(args); + } return 0; // Success! }