Ejemplo n.º 1
0
/* 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;
}
Ejemplo n.º 2
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;
}