/* returns whether to do nothing (0), close connection (1), broadcast (2), or send a private message (>2) */ int process_cmd( int chatuser_index, char * payload, int payload_length, char * response, int * response_length ) { if ( strncmp( payload, "ME IS ", 6 ) == 0 ) { trim_right( payload ); if ( find_chatuser( payload + 6 ) == -1 ) { chatusers[ chatuser_index ].username = (char *)calloc( payload_length - 4, sizeof( char ) ); strcpy( chatusers[ chatuser_index ].username, payload + 6 ); printf( "Identified user: [%s]\n", chatusers[ chatuser_index ].username ); response[1] = 0x03; /* MASK of 0 and LENGTH of 3 */ response[2] = 'O'; response[3] = 'K'; response[4] = newline; response[5] = '\0'; *response_length = 5; } else { printf( "Duplicate user: [%s]\n", payload + 6 ); response[1] = 0x06; /* MASK of 0 and LENGTH of 6 */ response[2] = 'E'; response[3] = 'R'; response[4] = 'R'; response[5] = 'O'; response[6] = 'R'; response[7] = newline; response[8] = '\0'; *response_length = 8; } } else if ( strncmp( payload, "WHO HERE", 8 ) == 0 ) { char allusers[8192]; int i, first; for ( i = 0 ; i < 8192 ; i++ ) { allusers[i] = '\0'; } for ( i = 0, first = 1 ; i < chatuser_next_index ; i++ ) { if ( chatusers[i].username != NULL ) { if ( first ) { first = 0; } else { strcat( allusers, "," ); } strcat( allusers, chatusers[i].username ); } } allusers[ strlen( allusers ) ] = newline; allusers[ strlen( allusers ) ] = '\0'; /* TO DO: add support in server for extended payload */ if ( strlen( allusers ) > 125 ) { printf( "Whoops! Long frame not supported. Skipping.\n" ); return 1; } response[1] = strlen( allusers ); strcpy( response + 2, allusers ); *response_length = strlen( allusers ) + 2; } else if ( strncmp( payload, "SEND ", 5 ) == 0 || strncmp( payload, "BROADCAST", 9 ) == 0 ) { int bc = strncmp( payload, "SEND ", 5 ); trim_right( payload ); char username[1024]; int i, j, k = (bc?9:5); for ( i = k ; i < payload_length && payload[i] != newline ; i++ ) { username[i-k] = payload[i]; username[i-(k-1)] = '\0'; } int orig_username_length = strlen( username ); /* this code will omit the optional <from-user>, if present */ for ( i = strlen( username ) - 1 ; i >= 0 ; i-- ) { if ( username[i] == ' ' ) { for ( i++, j = 0 ; i <= strlen( username ) ; i++, j++ ) { username[j] = username[i]; } break; } } if ( bc ) { strcpy( response + 2, "BROADCAST FROM " ); strcpy( response + 17, chatusers[ chatuser_index ].username ); strcat( response + 17, payload + 9 + orig_username_length ); *response_length = strlen( response + 2 ) + 2; response[1] = strlen( response + 2 ); return 2; } else { int index = find_chatuser( username ); if ( index == -1 ) { printf( "Unknown user: [%s]\n", username ); response[1] = 0x06; /* MASK of 0 and LENGTH of 6 */ response[2] = 'E'; response[3] = 'R'; response[4] = 'R'; response[5] = 'O'; response[6] = 'R'; response[7] = newline; response[8] = '\0'; *response_length = 8; } else { printf( "Found user on fd %d\n", chatusers[ index ].fd ); strcpy( response + 2, "PRIVATE FROM " ); strcpy( response + 15, chatusers[ chatuser_index ].username ); strcat( response + 15, payload + 5 + orig_username_length ); *response_length = strlen( response + 2 ) + 2; response[1] = strlen( response + 2 ); return chatusers[ index ].fd; } } } else if ( strncmp( payload, "LOGOUT", 6 ) == 0 ) { return 1; } return 0; }
/* returns whether to close connection (1) or not (0) */ int process_cmd( int chatuser_index, char * payload, int payload_length, char * response, int * response_length ) { if ( strncmp( payload, "I AM ", 5 ) == 0 ) { trim_right( payload ); if ( find_chatuser( payload + 5 ) == -1 ) { chatusers[ chatuser_index ].username = (char *)calloc( payload_length - 4, sizeof( char ) ); strcpy( chatusers[ chatuser_index ].username, payload + 5 ); printf( "Identified user: [%s]\n", chatusers[ chatuser_index ].username ); response[1] = 0x03; /* MASK of 0 and LENGTH of 3 */ response[2] = 'O'; response[3] = 'K'; response[4] = newline; response[5] = '\0'; *response_length = 5; } else { printf( "Duplicate user: [%s]\n", payload + 5 ); response[1] = 0x06; /* MASK of 0 and LENGTH of 6 */ response[2] = 'E'; response[3] = 'R'; response[4] = 'R'; response[5] = 'O'; response[6] = 'R'; response[7] = newline; response[8] = '\0'; *response_length = 8; } } else if ( strncmp( payload, "USERS", 5 ) == 0 ) { char allusers[8192]; int i, first; for ( i = 0 ; i < 8192 ; i++ ) { allusers[i] = '\0'; } for ( i = 0, first = 1 ; i < chatuser_next_index ; i++ ) { if ( chatusers[i].username != NULL ) { if ( first ) { first = 0; } else { strcat( allusers, "," ); } strcat( allusers, chatusers[i].username ); } } allusers[ strlen( allusers ) ] = newline; allusers[ strlen( allusers ) ] = '\0'; if ( strlen( allusers ) > 125 ) { printf( "Whoops! Long frame not supported. Skipping.\n" ); return 1; } response[1] = strlen( allusers ); strcpy( response + 2, allusers ); *response_length = strlen( allusers ) + 2; } else if ( strncmp( payload, "SEND ", 5 ) == 0 ) { char username[1024]; int i; for ( i = 5 ; i < payload_length && payload[i] != newline ; i++ ) { username[i-5] = payload[i]; username[i-4] = '\0'; } int index = find_chatuser( username ); if ( index == -1 ) { printf( "Unknown user: [%s]\n", username ); response[1] = 0x06; /* MASK of 0 and LENGTH of 6 */ response[2] = 'E'; response[3] = 'R'; response[4] = 'R'; response[5] = 'O'; response[6] = 'R'; response[7] = newline; response[8] = '\0'; *response_length = 8; } else { printf( "Found user on fd %d\n", chatusers[ index ].fd ); strcpy( response + 2, "PRIVATE FROM " ); strcpy( response + 15, chatusers[ chatuser_index ].username ); strcat( response + 15, payload + 5 + strlen( username ) ); *response_length = strlen( response + 2 ) + 2; response[1] = strlen( response + 2 ); return chatusers[ index ].fd; } } else if ( strncmp( payload, "BROADCAST", 9 ) == 0 ) { strcpy( response + 2, "BROADCAST FROM " ); strcpy( response + 17, chatusers[ chatuser_index ].username ); strcat( response + 17, payload + 9 ); *response_length = strlen( response + 2 ) + 2; response[1] = strlen( response + 2 ); return 2; } return 0; }