diff --git a/src/client/main.c b/src/client/main.c index 2cdc22c6f4fd0fe99d2c63f881be73e581910d08..bd9bbc745dd757f3fad6b1141cd5b34c349630d2 100644 --- a/src/client/main.c +++ b/src/client/main.c @@ -88,7 +88,7 @@ void ShowUsage(void) " dispense give <user> <amount> \"<reason>\"\n" " Give money to another user\n" ); - + if( giTextArgc == 0 || strcmp(gsTextArgs[0], "donate") == 0 ) printf( " dispense donate <amount> \"<reason>\"\n" @@ -222,9 +222,9 @@ int subcommand_acct(void) close(sock); return ret; } - + // gsTextArgs[1]: Username - + // Alter account? if( giTextArgc != 2 ) { @@ -233,11 +233,11 @@ int subcommand_acct(void) ShowUsage(); return RV_ARGUMENTS; } - + // Authentication required ret = Authenticate(sock); if(ret) return ret; - + // gsTextArgs[1]: Username // gsTextArgs[2]: Ammount // gsTextArgs[3]: Reason @@ -247,7 +247,7 @@ int subcommand_acct(void) fprintf(stderr, "dispense acct: Value must be a decimal number of cents\n"); return RV_ARGUMENTS; } - + if( gsTextArgs[2][0] == '=' ) { // Set balance ret = Dispense_ShowUser(sock, gsTextArgs[1]); @@ -263,10 +263,10 @@ int subcommand_acct(void) close(sock); return ret; } - + // Show user information ret = Dispense_ShowUser(sock, gsTextArgs[1]); - + close(sock); return ret; } @@ -280,21 +280,21 @@ int subcommand_acct(void) int subcommand_give(int argc, char *args[]) { int ret; - + if( argc != 3 ) { fprintf(stderr, "`dispense give` takes three arguments\n"); ShowUsage(); return RV_ARGUMENTS; } - + const char *dst_acct = args[0]; const char *amt_str = args[1]; const char *message = args[2]; - + // Connect to server int sock = OpenConnection(gsDispenseServer, giDispensePort); if( sock < 0 ) return RV_SOCKET_ERROR; - + // Authenticate ret = Authenticate(sock); if(ret) return ret; @@ -318,22 +318,22 @@ int subcommand_give(int argc, char *args[]) int subcommand_user(int argc, char *args[]) { int ret; - + // Check argument count if( argc == 0 ) { fprintf(stderr, "Error: `dispense user` requires arguments\n"); ShowUsage(); return RV_ARGUMENTS; } - + // Connect to server int sock = OpenConnection(gsDispenseServer, giDispensePort); if( sock < 0 ) return RV_SOCKET_ERROR; - + // Attempt authentication ret = Authenticate(sock); if(ret) return ret; - + // Add new user? if( strcmp(args[0], "add") == 0 ) { @@ -342,7 +342,7 @@ int subcommand_user(int argc, char *args[]) ShowUsage(); return RV_ARGUMENTS; } - + ret = Dispense_AddUser(sock, args[1]); } // Update a user @@ -353,7 +353,7 @@ int subcommand_user(int argc, char *args[]) ShowUsage(); return RV_ARGUMENTS; } - + ret = Dispense_SetUserType(sock, args[1], args[2], (argc == 3 ? "" : args[3])); } else @@ -373,25 +373,25 @@ int subcommand_user(int argc, char *args[]) int subcommand_donate(int argc, char *args[]) { int ret; - + // Check argument count if( argc != 2 ) { fprintf(stderr, "Error: `dispense donate` requires two arguments\n"); ShowUsage(); return RV_ARGUMENTS; } - + // Connect to server int sock = OpenConnection(gsDispenseServer, giDispensePort); if( sock < 0 ) return RV_SOCKET_ERROR; - + // Attempt authentication ret = Authenticate(sock); if(ret) return ret; - + // Do donation ret = Dispense_Donate(sock, atoi(args[0]), args[1]); - + close(sock); return ret; @@ -416,7 +416,7 @@ int subcommand_refund(int argc, char *args[]) // Connect to server int sock = OpenConnection(gsDispenseServer, giDispensePort); - if(sock < 0) return RV_SOCKET_ERROR; + if(sock < 0) return RV_SOCKET_ERROR; // Attempt authentication ret = Authenticate(sock); @@ -468,7 +468,7 @@ int subcommand_iteminfo(int argc, char *args[]) int sock = OpenConnection(gsDispenseServer, giDispensePort); if( sock < 0 ) return RV_SOCKET_ERROR; - + ret = Dispense_ItemInfo(sock, type, id); close(sock); return ret; @@ -481,7 +481,7 @@ int subcommand_iteminfo(int argc, char *args[]) int subcommand_slot(int argc, char *args[]) { int ret; - + // Check arguments if( argc != 3 ) { fprintf(stderr, "Error: `dispense slot` takes three arguments\n"); @@ -491,7 +491,7 @@ int subcommand_slot(int argc, char *args[]) char *slot_id = args[0]; char *price_str = args[1]; char *newname = args[2]; - + // Parse arguments regmatch_t matches[3]; if( RunRegex(&gUserItemIdentRegex, slot_id, 3, matches, NULL) != 0 ) { @@ -509,7 +509,7 @@ int subcommand_slot(int argc, char *args[]) fprintf(stderr, "Error: Invalid price passed (must be >= 0)\n"); return RV_ARGUMENTS; } - + // -- Sanity for( char *pos = newname; *pos; pos ++ ) { @@ -518,17 +518,17 @@ int subcommand_slot(int argc, char *args[]) return RV_ARGUMENTS; } } - + // Connect & Authenticate int sock = OpenConnection(gsDispenseServer, giDispensePort); if( sock < 0 ) return RV_SOCKET_ERROR; - + ret = Authenticate(sock); if(ret) return ret; - + // Update the slot ret = Dispense_SetItem(sock, item_type, item_id, price, newname); - + close(sock); return ret; } @@ -540,7 +540,7 @@ int subcommand_slot(int argc, char *args[]) int subcommand_pincheck(int argc, char *args[]) { int ret; - + if( argc < 1 || argc > 2 ) { fprintf(stderr, "Error: `dispense pincheck` takes one/two arguments\n"); ShowUsage(); @@ -549,18 +549,18 @@ int subcommand_pincheck(int argc, char *args[]) struct passwd *pwd = getpwuid( getuid() ); gsUserName = strdup(pwd->pw_name); - + const char *pin = args[0]; const char *user = (argc > 1 ? args[1] : gsUserName); - + int sock = OpenConnection(gsDispenseServer, giDispensePort); if( sock < 0 ) return RV_SOCKET_ERROR; - + ret = Authenticate(sock); if(ret) return ret; - + ret = DispenseCheckPin(sock, user, pin); - + close(sock); return ret; } @@ -572,15 +572,15 @@ int subcommand_pincheck(int argc, char *args[]) int subcommand_pinset(int argc, char *args[]) { int ret; - + if( argc != 1 ) { fprintf(stderr, "Error: `dispense pinset` takes one argument\n"); ShowUsage(); return RV_ARGUMENTS; } - + const char *pin = args[0]; - + int sock = OpenConnection(gsDispenseServer, giDispensePort); if( sock < 0 ) return RV_SOCKET_ERROR; @@ -588,7 +588,7 @@ int subcommand_pinset(int argc, char *args[]) if(ret) return ret; ret = DispenseSetPin(sock, pin); - + close(sock); return ret; } @@ -597,7 +597,7 @@ int main(int argc, char *argv[]) { int i, ret = 0; char buffer[BUFSIZ]; - + gsTextArgs[0] = ""; // -- Create regular expressions @@ -667,7 +667,7 @@ int main(int argc, char *argv[]) // Item name / pattern gsItemPattern = gsTextArgs[0]; } - + // Connect to server int sock = OpenConnection(gsDispenseServer, giDispensePort); if( sock < 0 ) return RV_SOCKET_ERROR; @@ -678,10 +678,10 @@ int main(int argc, char *argv[]) // Get items PopulateItemList(sock); - + // Disconnect from server close(sock); - + if( gsItemPattern && gsItemPattern[0] ) { regmatch_t matches[3]; @@ -689,9 +689,13 @@ int main(int argc, char *argv[]) if( strcmp(gsItemPattern, "door") == 0 ) { //confirmation - printf("Confirm to unlock the door? Y/N\n"); char userInput[2] = {'N'}; - fgets(userInput, 2, stdin); + if(isatty(STDIN_FILENO) == 1){ + printf("Confirm to unlock the door? Y/N\n"); + fgets(userInput, 2, stdin); + } else { + userInput[0] = 'Y'; + } if(userInput[0] == 'Y'||userInput[0] == 'y') { // Connect, Authenticate, dispense and close @@ -709,19 +713,19 @@ int main(int argc, char *argv[]) { char *ident; int id; - + // Get and finish ident ident = gsItemPattern + matches[1].rm_so; gsItemPattern[matches[1].rm_eo] = '\0'; // Get ID id = atoi( gsItemPattern + matches[2].rm_so ); - + // Connect, Authenticate, dispense and close sock = OpenConnection(gsDispenseServer, giDispensePort); if( sock < 0 ) return RV_SOCKET_ERROR; - + Dispense_ItemInfo(sock, ident, id); - + ret = Authenticate(sock); if(ret) return ret; ret = DispenseItem(sock, ident, id); @@ -752,13 +756,13 @@ int main(int argc, char *argv[]) // Check if the prefix matched if( gsItemPattern[j] != '\0' ) continue; - + // Prefect match if( gaItems[i].Desc[j] == '\0' ) { best = i; break; } - + // Only one match allowed if( best == -1 ) { best = i; @@ -770,14 +774,14 @@ int main(int argc, char *argv[]) return RV_BAD_ITEM; } } - + // Was a match found? if( best == -1 ) { fprintf(stderr, "No item matches the passed string\n"); return RV_BAD_ITEM; } - + i = best; } } @@ -792,7 +796,7 @@ int main(int argc, char *argv[]) // Add a separator if( i && strcmp(gaItems[i].Type, gaItems[i-1].Type) != 0 ) printf(" ---\n"); - + printf("%2i %s:%i\t%3i %s\n", i, gaItems[i].Type, gaItems[i].ID, gaItems[i].Price, gaItems[i].Desc); } @@ -800,17 +804,17 @@ int main(int argc, char *argv[]) for(;;) { char *buf; - + i = -1; - + fgets(buffer, BUFSIZ, stdin); - + buf = trim(buffer); - + if( buf[0] == 'q' ) break; - + i = atoi(buf); - + if( i != 0 || buf[0] == '0' ) { if( i < 0 || i >= giNumItems ) { @@ -821,8 +825,8 @@ int main(int argc, char *argv[]) } } } - - + + // Check for a valid item ID if( i >= 0 ) { @@ -830,13 +834,13 @@ int main(int argc, char *argv[]) // Connect, Authenticate, dispense and close sock = OpenConnection(gsDispenseServer, giDispensePort); if( sock < 0 ) return RV_SOCKET_ERROR; - + ret = Dispense_ItemInfo(sock, gaItems[i].Type, gaItems[i].ID); if(ret) return ret; - + ret = Authenticate(sock); if(ret) return ret; - + for( j = 0; j < giDispenseCount; j ++ ) { ret = DispenseItem(sock, gaItems[i].Type, gaItems[i].ID); if( ret ) break; @@ -858,9 +862,9 @@ int ParseArguments(int argc, char *argv[]) for( int i = 1; i < argc; i ++ ) { char *arg = argv[i]; - + // If it doesn't start with a '-', or -- has been seen - // XXX: Hack - If parsing "user type", don't parse - options + // XXX: Hack - If parsing "user type", don't parse - options bool hack_usertype = (i > 2 && strcmp(argv[i-2], "user") == 0 && strcmp(argv[i-1], "type") == 0); // XXX: Hack - Treat negative numbers as free bool hack_is_int = (arg[0] == '-' && isdigit(arg[1]) != 0); @@ -871,18 +875,18 @@ int ParseArguments(int argc, char *argv[]) fprintf(stderr, "ERROR: Too many arguments\n"); return RV_ARGUMENTS; } - + gsTextArgs[giTextArgc++] = argv[i]; } else if( arg[1] != '-' ) - { + { switch(arg[1]) { case 'h': case '?': ShowUsage(); exit(0); - + case 'c': if( i + 1 >= argc ) { fprintf(stderr, "%s: -c takes an argument\n", argv[0]); @@ -894,9 +898,9 @@ int ParseArguments(int argc, char *argv[]) fprintf(stderr, "Sorry, only 1-20 can be passed to -c (safety)\n"); return -1; } - + break ; - + case 'm': // Minimum balance if( i + 1 >= argc ) { fprintf(stderr, "%s: -m takes an argument\n", argv[0]); @@ -913,7 +917,7 @@ int ParseArguments(int argc, char *argv[]) } giMaximumBalance = atoi(argv[++i]); break; - + case 'f': // Override Config File if( i + 1 >= argc ) { fprintf(stderr, "%s: -f takes an argument\n", argv[0]); @@ -922,7 +926,7 @@ int ParseArguments(int argc, char *argv[]) } gsConfigFile = argv[++i]; break; - + case 'u': // Override User if( i + 1 >= argc ) { fprintf(stderr, "%s: -u takes an argument\n", argv[0]); @@ -931,7 +935,7 @@ int ParseArguments(int argc, char *argv[]) } gsEffectiveUser = argv[++i]; break; - + case 'H': // Override remote host if( i + 1 >= argc ) { fprintf(stderr, "%s: -H takes an argument\n", argv[0]); @@ -950,7 +954,7 @@ int ParseArguments(int argc, char *argv[]) giDispensePort = atoi(argv[++i]); giDispensePortSet = 1; break; - + // Set slot name/price case 's': if( giTextArgc != 0 ) { @@ -961,7 +965,7 @@ int ParseArguments(int argc, char *argv[]) gsTextArgs[0] = "slot"; // HACK!! giTextArgc ++; break; - + case 'G': // Don't use GUI giUIMode = UI_MODE_BASIC; break; @@ -1024,10 +1028,10 @@ char *trim(char *string) // Increment pointer while it points to a space while( isspace(*string) ) string ++; - + // And repalce trailing spaces with NUL bytes for( int i = strlen(string); i-- && isspace(string[i]); ) string[i] = '\0'; - + return string; }