示例#1
0
文件: bank.c 项目: yufangfred/hm
void handle_user_logout(Bank* bank, char* args) {
    char send_msg[MAX_LINE_SIZE + 1];
    memset(send_msg, 0, MAX_LINE_SIZE);

    if ((char*)hash_table_find(bank->logged_user_ht, args) == NULL)  {
        strcat(send_msg, "No user logged in");
    } else {
        strcat(send_msg, "OK");
        hash_table_del(bank->logged_user_ht, args);
    }

    bank_encrypt(bank, send_msg, strlen(send_msg));
    bank_send(bank, send_msg, strlen(send_msg));
    return;
}
示例#2
0
文件: bank.c 项目: yufangfred/hm
void bank_deposit(Bank* bank, char* name, char* amt) {
    if (!name || !amt) {
        printf("Usage: deposit <user-name> <amt>\n");
        return;
    }
   if (check_username(name) || check_amt(amt)) {
        printf("Usage: deposit <user-name> <amt>\n");
        return;
    }
   if (!hash_table_find(bank->user_balance_ht, name)) {
       printf("No such user\n");
       return;
   }
	
	// handle name
	char card_name[MAX_CARD_NAME_SIZE + 1];
   memset(card_name, 0, MAX_CARD_NAME_SIZE);
   strcat(card_name, name);
   strcat(card_name, ".card");


	// handle balance
	int amount = 0; 
	int balance = 0;   
	sscanf(amt, "%d", &amount);		
   sscanf((char*)hash_table_find(bank->user_balance_ht, name), "%d", &balance);

    if (balance + amount < 0) {
        printf("Too rich for this program\n");
        return;
    }

    balance += amount;
	 char* tmp;
    tmp = (char*)malloc(64);
    sprintf(tmp, "%d", balance);
    hash_table_del(bank->user_balance_ht, name);
    hash_table_add(bank->user_balance_ht, name, tmp);

    printf("$%d added to %s's account\n", amount, name);
}
示例#3
0
文件: bank.c 项目: evanqi/atm
void bank_process_remote_command(Bank *bank, char *command, size_t len)
{
    // ASSUME everything valid (checked in atm)
    char *comm = calloc(2, sizeof(char)); // w = withdrawal, u = user exists?, b = balance, p = user pin
    char *name = calloc(MAX_NAME_SIZE, sizeof(char));
    char *pin = calloc(MAX_PIN_SIZE, sizeof(char));
    char *amt = calloc(MAX_AMT_SIZE, sizeof(char));

    unsigned char *back = (unsigned char *)calloc(10000, sizeof(unsigned char));

    do_crypt(bank, (unsigned char *)command, back, 0);

    sscanf((char*)back, "%s %s %s %s", comm, name, pin, amt);
    free(back); 
    if(strcmp(comm, "u") == 0)
    {
	if(hash_table_find(bank->user_bal,name) == NULL)
	{
	    send_no(bank);
	    return;
	}
	else
	{
	    send_yes(bank);
	    return;
	}
    }
    else if(strcmp(comm, "b") == 0)
    {
	if(hash_table_find(bank->user_bal, name) == NULL)
	{
	    send_no_user(bank);
	    return;
	}
	char* balance = (char *)hash_table_find(bank->user_bal, name);
	send_balance(bank, balance);
	return;
    }
    else if(strcmp(comm, "p") == 0)
    {
	if(hash_table_find(bank->user_bal, name) == NULL)
	{
	    send_no_user(bank);
	    return;
	}

	char* pin_from_hash = (char *) hash_table_find(bank->user_pin, name);
	if(pin_from_hash == NULL)
	{
	    send_no_pin(bank);
	    return;
	}

	if(strcmp(pin_from_hash, pin) == 0)
	{
	    send_yes(bank);
	    return;
	}
	else
	{
	    send_no(bank);
	    return;
	}
    }
    else if(strcmp(comm, "w") == 0)
    {
	if(hash_table_find(bank->user_bal, name) == NULL)
	{
	    send_no_user(bank);
	    return;
	}

    char *p;
    unsigned int amt_w = (unsigned int)strtoul(amt, &p, 10);
	unsigned int curr_amt = (unsigned int) strtoul((char *)hash_table_find(bank->user_bal, name), NULL, 10);

	if(curr_amt < amt_w)
	{
	    send_no_fund(bank);
	    return;
	}
	unsigned int new_amt = curr_amt - amt_w;

	char *new_amt_char = calloc(MAX_AMT_SIZE, sizeof(char));
	sprintf(new_amt_char, "%u", new_amt);

	hash_table_del(bank->user_bal, name);
	hash_table_add(bank->user_bal, name,new_amt_char);
	send_yes(bank);
	return;
    }    
}
示例#4
0
文件: bank.c 项目: evanqi/atm
void bank_process_local_command(Bank *bank, char *command, size_t len)
{

    char *comm = (char *)calloc(MAX_COMMAND_SIZE, sizeof(char));
    char *name = (char *)calloc(MAX_COMMAND_SIZE, sizeof(char));
    char *misc = (char *)calloc(MAX_COMMAND_SIZE, sizeof(char));
    char *misc_two = (char *)calloc(MAX_COMMAND_SIZE, sizeof(char));

    char temp_comm[MAX_LINE_SIZE];
    char temp_name[MAX_LINE_SIZE];
    char temp_misc[MAX_LINE_SIZE];
    char temp_misc_two[MAX_LINE_SIZE];

    if(strlen(command) >= MAX_LINE_SIZE)
    {
        printf("Invalid command\n");
        return;
    }

    sscanf(command, "%s %s %s %s", temp_comm,temp_name,temp_misc,temp_misc_two);
    
    if(strlen(temp_comm) < 1 || strlen(temp_comm) >= MAX_COMMAND_SIZE)
    {
        printf("Invalid command\n");
        return;
    }

    strncpy(comm, temp_comm, strlen(temp_comm) + 1);

    if(strcmp(comm, "create-user") == 0)
    {
        if(strlen(temp_name) < 1 || strlen(temp_misc) < 1 || strlen(temp_misc_two) < 1 || strlen(temp_name) >= MAX_NAME_SIZE)
        {
            printf("Usage: create-user <user-name> <pin> <balance>\n");
            return;
        }

        strncpy(name, temp_name, strlen(temp_name) + 1);

        if(check_username(name) == 0)
        {
            printf("Usage: create-user <user-name> <pin> <balance>\n");
            return;
        }

        if(hash_table_find(bank->user_bal, name) != NULL)
        {
            printf("%s already exists\n", name);
            return;
        }

        if(strlen(temp_misc) != 4 || strlen(temp_misc_two) > 10)
        {
            printf("Usage: create-user <user-name> <pin> <balance>\n");
            return;
        }

        strncpy(misc, temp_misc, strlen(temp_misc) + 1);
        if(check_pin(misc) == 0)
        {
            printf("Usage: create-user <user-name> <pin> <balance>\n");
            return;
        }

        strncpy(misc_two, temp_misc_two, strlen(temp_misc_two) + 1);
        if(check_bal(misc_two) == 0)
        {
            printf("Usage: create-user <user-name> <pin> <balance>\n");
            return;
        }

         // create card
         int filelen = strlen(name) + 6;
         char cardfile[filelen];
         memset(cardfile, '\0', filelen);
         strncpy(cardfile, name, strlen(name));
         strncat(cardfile, ".card", 5);
         FILE *card = fopen(cardfile, "w");
         if(card == NULL){
             printf("Error creating card file for user %s\n", name);
             remove(cardfile);
             return;
        }
	unsigned char *buff = (unsigned char *)calloc(BLOCK_SIZE+1, sizeof(char));
	do_crypt(bank, (unsigned char *)misc, buff, 1);
	fputs((char *)buff, card);
        fclose(card);

        hash_table_add(bank->user_bal, name, misc_two); //username balance
        hash_table_add(bank->user_pin, name, misc);	//username pin

        printf("Created user %s\n", name);
        return;
    } 
    else if(strcmp(comm, "deposit") == 0)
    {
        if(strlen(temp_name) < 1 || strlen(temp_misc) < 1 || strlen(temp_name) >= MAX_NAME_SIZE)
        {
            printf("Usage: deposit <user-name> <amt>\n");
            return;
        }

        strncpy(name, temp_name, strlen(temp_name) + 1);
        if(check_username(name) != 1 || strlen(temp_misc) > 10)
        {
            printf("Usage: deposit <user-name> <amt>\n");
            return;
        }

        if(hash_table_find(bank->user_bal, name) == NULL)
        {
            printf("No such user\n");
            return;
        }

        strncpy(misc, temp_misc, strlen(temp_misc) + 1);
        if(check_bal(misc) == 0)
        {
            printf("Usage: deposit <user-name> <amt>\n");
            return;
        }
       	char *ptr;
        char* curr_bal = (char*) hash_table_find(bank->user_bal, name);
        
        unsigned int curr_bal_int = (unsigned int)strtoul(curr_bal, &ptr, 10);
    	unsigned int amt = (unsigned int)strtoul(misc, &ptr, 10);
   
        unsigned int new_bal = (unsigned int)amt + (unsigned int)curr_bal_int;  

        //checks if new_bal was capped
        if( new_bal > UINT_MAX || (new_bal - amt) != curr_bal_int || new_bal < curr_bal_int){
            printf("Too rich for this program\n");
            return;   
        }       

        char *new_bal_char = (char *)calloc(MAX_MISC_SIZE, sizeof(char));

        sprintf(new_bal_char, "%u", new_bal);

        hash_table_del(bank->user_bal, name);
        hash_table_add(bank->user_bal, name, new_bal_char);

        printf("$%s added to %s's account\n", misc, name);
        return;

    }
    else if(strcmp(comm, "balance") == 0)
    {
        if(strlen(temp_name) < 1)
        {
            printf("Usage: balance <user-name>\n");
            return;
        }

        if(strlen(temp_name) >= MAX_NAME_SIZE)
        {
            printf("Usage: balance <user-name>\n");
            return;
        }

        strncpy(name, temp_name, strlen(temp_name) + 1);
        if(check_username(name) != 1)
        {
            printf("Usage: balance <user-name>\n");
            return;
        }

        char *curr_bal = (char *) hash_table_find(bank->user_bal, name);
        if(curr_bal == NULL)
        {
            printf("No such user\n");
            return;
        }

        printf("$%s\n", curr_bal);
        return;

    }
    else
    {
        printf("Invalid command\n");
        return;
    }
}