Fixed client returning 0 for error conditions (zero gives specifically)
[tpg/opendispense2.git] / src / client / main.c
index 07fb0b4..342441a 100644 (file)
@@ -30,6 +30,7 @@
 #define USE_AUTOAUTH   1
 
 #define MAX_TXT_ARGS   5       // Maximum number of textual arguments (including command)
+#define DISPENSE_MULTIPLE_MAX  20      // Maximum argument to -c
 
 enum eUI_Modes
 {
@@ -97,6 +98,7 @@ char  *gsEffectiveUser;       //!< '-u' Dispense as another user
 char   *gsUserName;    //!< User that dispense will happen as
 char   *gsUserFlags;   //!< User's flag set
  int   giUserBalance=-1;       //!< User balance (set by Authenticate)
+ int   giDispenseCount = 1;    //!< Number of dispenses to do
 
 // === CODE ===
 int main(int argc, char *argv[])
@@ -134,11 +136,26 @@ int main(int argc, char *argv[])
                        case '?':
                                ShowUsage();
                                return 0;
-                       
+                                       
+                       case 'c':
+                               if( i + 1 >= argc ) {
+                                       fprintf(stderr, "%s: -c takes an argument\n", argv[0]);
+                                       ShowUsage();
+                                       return -1;
+                               }
+                               giDispenseCount = atoi(argv[++i]);
+                               if( giDispenseCount < 1 || giDispenseCount > DISPENSE_MULTIPLE_MAX ) {
+                                       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]);
                                        ShowUsage();
+                                       return -1;
                                }
                                giMinimumBalance = atoi(argv[++i]);
                                break;
@@ -146,6 +163,7 @@ int main(int argc, char *argv[])
                                if( i + 1 >= argc ) {
                                        fprintf(stderr, "%s: -M takes an argument\n", argv[0]);
                                        ShowUsage();
+                                       return -1;
                                }
                                giMaximumBalance = atoi(argv[++i]);
                                break;
@@ -154,6 +172,7 @@ int main(int argc, char *argv[])
                                if( i + 1 >= argc ) {
                                        fprintf(stderr, "%s: -u takes an argument\n", argv[0]);
                                        ShowUsage();
+                                       return -1;
                                }
                                gsEffectiveUser = argv[++i];
                                break;
@@ -162,6 +181,7 @@ int main(int argc, char *argv[])
                                if( i + 1 >= argc ) {
                                        fprintf(stderr, "%s: -H takes an argument\n", argv[0]);
                                        ShowUsage();
+                                       return -1;
                                }
                                gsDispenseServer = argv[++i];
                                break;
@@ -169,6 +189,7 @@ int main(int argc, char *argv[])
                                if( i + 1 >= argc ) {
                                        fprintf(stderr, "%s: -P takes an argument\n", argv[0]);
                                        ShowUsage();
+                                       return -1;
                                }
                                giDispensePort = atoi(argv[++i]);
                                break;
@@ -182,11 +203,7 @@ int main(int argc, char *argv[])
                        case 'n':       // Dry Run / read-only
                                gbDryRun = 1;
                                break;
-                       case '0':       case '1':
-                       case '2':       case '3':
-                       case '4':       case '5':
-                       case '6':       case '7':
-                       case '8':       case '9':
+                       default:
                                if( text_argc + 1 ==  MAX_TXT_ARGS )
                                {
                                        fprintf(stderr, "ERROR: Too many arguments\n");
@@ -217,7 +234,7 @@ int main(int argc, char *argv[])
                // Connect to server
                sock = OpenConnection(gsDispenseServer, giDispensePort);
                if( sock < 0 )  return -1;
-                       // List accounts?
+               // List accounts?
                if( text_argc == 1 ) {
                        ret = Dispense_EnumUsers(sock);
                        close(sock);
@@ -358,7 +375,7 @@ int main(int argc, char *argv[])
                        return -1;
                
                // Do donation
-               ret =Dispense_Donate(sock, atoi(text_args[1]), text_args[2]);
+               ret = Dispense_Donate(sock, atoi(text_args[1]), text_args[2]);
                                
                close(sock);
 
@@ -544,6 +561,7 @@ int main(int argc, char *argv[])
        // Check for a valid item ID
        if( i >= 0 )
        {
+                int j;
                // Connect, Authenticate, dispense and close
                sock = OpenConnection(gsDispenseServer, giDispensePort);
                if( sock < 0 )  return -1;
@@ -551,7 +569,13 @@ int main(int argc, char *argv[])
                Dispense_ItemInfo(sock, gaItems[i].Type, gaItems[i].ID);
                
                Authenticate(sock);
-               ret = DispenseItem(sock, gaItems[i].Type, gaItems[i].ID);
+               for( j = 0; j < giDispenseCount; j ++ ) {
+                       ret = DispenseItem(sock, gaItems[i].Type, gaItems[i].ID);
+                       if( ret )       break;
+               }
+               if( j > 1 ) {
+                       printf("%i items dispensed\n", j);
+               }
                close(sock);
        }
 
@@ -637,11 +661,11 @@ int ShowNCursesUI(void)
                username = pwd->pw_name;
        }
        // Get balance
-       snprintf(balance_str, sizeof balance_str, "$%i.%02i", giUserBalance/100, giUserBalance%100);
+       snprintf(balance_str, sizeof balance_str, "$%i.%02i", giUserBalance/100, abs(giUserBalance)%100);
        
        // Enter curses mode
        initscr();
-       raw(); noecho();
+       cbreak(); noecho();
        
        // Get max index
        maxItemIndex = ShowItemAt(0, 0, 0, -1, 0);
@@ -861,6 +885,8 @@ int ShowItemAt(int Row, int Col, int Width, int Index, int bHilighted)
        // Width = 0, don't print
        if( Width > 0 )
        {
+               // 4 preceding, 5 price
+               int nameWidth = Width - 4 - 5;
                move( Row, Col );
                
                if( Index >= 0 )
@@ -870,26 +896,26 @@ int ShowItemAt(int Row, int Col, int Width, int Index, int bHilighted)
                        {
                        case 0:
                                if( bHilighted )
-                                       printw("-> ");
+                                       printw("->  ");
                                else
-                                       printw("   ");
+                                       printw("    ");
                                break;
                        case 1:
-                               printw("SLD");
+                               printw("SLD ");
                                break;
                        
                        default:
                        case -1:
-                               printw("ERR");
+                               printw("ERR ");
                                break;
                        }
                        
-                       printw(" %s", name);
+                       printw("%-*.*s", nameWidth, nameWidth, name);
                
-                       getyx(stdscr, _y, _x);
+//                     getyx(stdscr, _y, _x);
                        // Assumes max 4 digit prices
-                       times = Width - 5 - (_x - Col); // TODO: Better handling for large prices
-                       while(times--)  addch(' ');
+//                     times = Width - 5 - (_x - Col); // TODO: Better handling for large prices
+//                     while(times--)  addch(' ');
                        
                        printw(" %4i", price);
                }
@@ -1462,6 +1488,12 @@ int Dispense_AlterBalance(int Socket, const char *Username, int Ammount, const c
                printf("Dry Run - No action\n");
                return 0;
        }
+
+       // Sanity
+       if( Ammount == 0 ) {
+               printf("An ammount would be nice\n");
+               return 1;
+       }
        
        sendf(Socket, "ADD %s %i %s\n", Username, Ammount, Reason);
        buf = ReadLine(Socket);
@@ -1537,13 +1569,13 @@ int Dispense_Give(int Socket, const char *Username, int Ammount, const char *Rea
        
        if( Ammount < 0 ) {
                printf("Sorry, you can only give, you can't take.\n");
-               return -1;
+               return 1;
        }
        
        // Fast return on zero
        if( Ammount == 0 ) {
                printf("Are you actually going to give any?\n");
-               return 0;
+               return 1;
        }
        
        // Check for a dry run
@@ -1597,7 +1629,7 @@ int Dispense_Donate(int Socket, int Ammount, const char *Reason)
        // Fast return on zero
        if( Ammount == 0 ) {
                printf("Are you actually going to give any?\n");
-               return 0;
+               return 1;
        }
        
        // Check for a dry run

UCC git Repository :: git.ucc.asn.au