void multi_client(int sock) { int quit; int cs; t_sockaddr_in csin; unsigned int cslen; pid_t pid; cs = accept(sock, (t_sockaddr *)&csin, &cslen); write(1, "A CLIENT HAS JOINED.\n", sizeof("A CLIENT HAS JOINED.\n")); pid = fork(); if (pid == -1) { write(2, "FORK FAILED.\n", sizeof("FORK FAILED.\n")); exit(-1); } if (pid > 0) multi_client(sock); else { quit = 0; while (!quit) quit = loop_command(cs); close(cs); write(1, "A CLIENT HAS LEFT.\n", sizeof("A CLIENT HAS LEFT.\n")); exit(1); } }
cmd_err_t console_parse_cmd( char* line ) { const command_t* cmd_ptr = NULL; char* params[MAX_PARAMS]; uint32_t param_cnt = 0; char copy[strlen(line) + 1]; /* Copy original buffer into local buffer, as tokenize will change the original string */ strcpy( copy, line ); cmd_err_t err = ERR_CMD_OK; /* First call to strtok. */ params[param_cnt++] = strtok( copy, console_delimit_string ); if ( params[0] == NULL ) /* no command entered */ { err = ERR_NO_CMD; } else { /* find the command */ for ( cmd_ptr = console_command_table; cmd_ptr->name != NULL; cmd_ptr++ ) { if ( strcmp( params[0], cmd_ptr->name ) == 0 ) { break; } } if ( cmd_ptr->name == NULL ) { err = ERR_UNKNOWN_CMD; } else if ( strcmp(cmd_ptr->name, "loop") == 0 ) { loop_command( line ); } else { /* determine argument delimit string */ char* delimit; if ( cmd_ptr->delimit != NULL ) { delimit = cmd_ptr->delimit; } else { delimit = console_delimit_string; } /* parse arguments */ while ( ( ( params[param_cnt] = strtok( NULL, delimit ) ) != NULL ) ) { param_cnt++; if ( param_cnt > ( MAX_PARAMS - 1 ) ) { err = ERR_TOO_MANY_ARGS; break; } } /* check arguments */ if ( ( param_cnt - 1 ) < cmd_ptr->arg_count ) { err = ERR_INSUFFICENT_ARGS; } /* run command */ if ( ( err == ERR_CMD_OK ) && ( cmd_ptr->command != NULL ) ) { platform_enable_mcu_powersave(); err = (cmd_err_t) cmd_ptr->command( param_cnt, params ); platform_disable_mcu_powersave(); } } /* process errors */ if ( err != ERR_CMD_OK ) { if ((err <=0) && (err > ERR_LAST_ERROR)) { printf( "ERROR: %s\r\n", console_error_strings[-err] ); } if ( err != ERR_UNKNOWN_CMD ) { printf("Usage: %s %s\r\n",cmd_ptr->name, cmd_ptr->format); } } } return err; }
cmd_err_t console_parse_cmd( const char* line ) { const command_t* cmd_ptr = NULL; char* params[MAX_PARAMS]; uint32_t param_cnt = 0; char* saveptr = NULL; char copy[strlen(line) + 1]; /* Copy original buffer into local buffer, as tokenize will change the original string */ strcpy( copy, line ); cmd_err_t err = ERR_CMD_OK; /* First call to strtok. */ params[param_cnt++] = strtok_r( copy, cons.console_delimit_string, &saveptr ); if ( params[0] == NULL ) /* no command entered */ { err = ERR_NO_CMD; } else { /* find the command */ if ( (cmd_ptr = console_lookup_command(params[0])) == NULL ) { err = ERR_UNKNOWN_CMD; } else if ( strcmp(cmd_ptr->name, "loop") == 0 ) { loop_command( line ); } else { uint32_t i = 0; /* determine argument delimit string */ const char* delimit; if ( cmd_ptr->delimit != NULL ) { delimit = cmd_ptr->delimit; } else { delimit = cons.console_delimit_string; } /* parse arguments */ while ( saveptr != NULL && saveptr[ 0 ] != '\0' ) { wiced_bool_t encap_flag = WICED_FALSE; /* Check for delimiters first */ while ( saveptr[ 0 ] != '\0' ) { wiced_bool_t delimiter_flag = WICED_FALSE; for ( i = 0; i < strlen( delimit ); i++ ) { if ( saveptr[ 0 ] == delimit[ i ] ) { saveptr++; delimiter_flag = WICED_TRUE; break; } } if ( delimiter_flag == WICED_FALSE ) { break; } } /* Then check for encapsulation */ for ( i = 0; i < ( sizeof( console_encapsulate_string ) / sizeof( console_encapsulate_string[ 0 ] ) ); i++ ) { /* If encapsulated, get encapsulated token */ if ( saveptr[ 0 ] == console_encapsulate_string[ i ][ 0 ] ) { encap_flag = WICED_TRUE; params[ param_cnt ] = strtok_r( NULL, (char *) console_encapsulate_string[ i ], &saveptr ); break; } } /* Else not encapsulated, check for token */ if ( encap_flag == WICED_FALSE ) { params[ param_cnt ] = strtok_r( NULL, (char *) delimit, &saveptr ); } if ( params[ param_cnt ] != NULL ) { param_cnt++; if ( param_cnt > ( MAX_PARAMS - 1 ) ) { err = ERR_TOO_MANY_ARGS; break; } } } if ( err == ERR_CMD_OK ) { params[ param_cnt ] = NULL; } /* check arguments */ if ( ( param_cnt - 1 ) < cmd_ptr->arg_count ) { err = ERR_INSUFFICENT_ARGS; } /* run command */ if ( ( err == ERR_CMD_OK ) && ( cmd_ptr->command != NULL ) ) { err = (cmd_err_t) cmd_ptr->command( param_cnt, params ); } } /* process errors */ if ( err != ERR_CMD_OK ) { if ((err <=0) && (err > ERR_LAST_ERROR)) { printf( "ERROR: %s\r\n", console_error_strings[-err] ); } if ( err != ERR_UNKNOWN_CMD ) { printf("Usage: %s %s\r\n",cmd_ptr->name, cmd_ptr->format); } } } return err; }