Fixed up some error reporting
[tpg/opendispense2.git] / src / client / main.c
index 444ab34..1f4485d 100644 (file)
@@ -12,7 +12,8 @@
 #include <stdio.h>
 #include <string.h>
 #include <ctype.h>     // isspace
-#include <unistd.h>    // close
+#include <pwd.h>       // getpwuids
+#include <unistd.h>    // close/getuid
 #include <limits.h>    // INT_MIN/INT_MAX
 #include "common.h"
 
@@ -344,7 +345,6 @@ int main(int argc, char *argv[])
                                break;
                        }
                        printf("%i - %s %3i %s\n", gaItems[i].ID, status, gaItems[i].Price, gaItems[i].Desc);
-                       
                }
 
                printf("\nMay your pink fish bing into the distance.\n");
@@ -385,19 +385,20 @@ int main(int argc, char *argv[])
                        // gsTextArgs[1]: Username
                        // gsTextArgs[2]: Ammount
                        // gsTextArgs[3]: Reason
+                        char   *tmp = NULL;
+                       long int balance = strtol(gsTextArgs[2]+(gsTextArgs[2][0] == '='), &tmp, 10);
+                       if(!tmp || *tmp != '\0') {
+                               fprintf(stderr, "dispense acct: Value must be a decimal number of cents\n");
+                               return RV_ARGUMENTS;
+                       }
                        
                        if( gsTextArgs[2][0] == '=' ) {
                                // Set balance
-                               if( gsTextArgs[2][1] != '0' && atoi(gsTextArgs[2]+1) == 0 ) {
-                                       fprintf(stderr, "Error: Invalid balance to be set\n");
-                                       exit(1);
-                               }
-                               
-                               ret = Dispense_SetBalance(sock, gsTextArgs[1], atoi(gsTextArgs[2]+1), gsTextArgs[3]);
+                               ret = Dispense_SetBalance(sock, gsTextArgs[1], balance, gsTextArgs[3]);
                        }
                        else {
                                // Alter balance
-                               ret = Dispense_AlterBalance(sock, gsTextArgs[1], atoi(gsTextArgs[2]), gsTextArgs[3]);
+                               ret = Dispense_AlterBalance(sock, gsTextArgs[1], balance, gsTextArgs[3]);
                        }
                }
                // On error, quit
@@ -434,8 +435,14 @@ int main(int argc, char *argv[])
                // Authenticate
                ret = Authenticate(sock);
                if(ret) return ret;
-               
-               ret = Dispense_Give(sock, gsTextArgs[1], atoi(gsTextArgs[2]), gsTextArgs[3]);
+
+               char    *tmp = NULL;
+               int amt = strtol(gsTextArgs[2], &tmp, 10);
+               if( !tmp || *tmp != '\0' ) {
+                       fprintf(stderr, "dispense give: Balance is invalid, must be decimal number of cents");
+                       return RV_ARGUMENTS;
+               }
+               ret = Dispense_Give(sock, gsTextArgs[1], amt, gsTextArgs[3]);
 
                close(sock);
        
@@ -637,6 +644,54 @@ int main(int argc, char *argv[])
                close(sock);
                return ret;
        }
+       // Check a user's pin
+       else if(strcmp(gsTextArgs[0], "pincheck") == 0)
+       {
+               if( giTextArgc < 2 || giTextArgc > 3 ) {
+                       fprintf(stderr, "Error: `dispense pincheck` takes one/two arguments\n");
+                       ShowUsage();
+                       return RV_ARGUMENTS;
+               }
+               struct passwd   *pwd = getpwuid( getuid() );
+               gsUserName = strdup(pwd->pw_name);
+               
+               const char *pin = gsTextArgs[1];
+               const char *user = gsUserName;
+               if( giTextArgc == 3 )
+                       user = gsTextArgs[2];
+
+               
+               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;
+       }
+       // Update 'your' pin
+       else if(strcmp(gsTextArgs[0], "pinset") == 0)
+       {
+               if( giTextArgc != 2 ) {
+                       fprintf(stderr, "Error: `dispense pinset` takes one argument\n");
+                       ShowUsage();
+                       return RV_ARGUMENTS;
+               }
+               
+               const char *pin = gsTextArgs[1];
+               
+               sock = OpenConnection(gsDispenseServer, giDispensePort);
+               if( sock < 0 )  return RV_SOCKET_ERROR;
+               ret = Authenticate(sock);
+               if(ret) return ret;
+
+               ret = DispenseSetPin(sock, pin);
+               
+               close(sock);
+               return ret;
+       }
        // Item name / pattern
        else
        {

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