/********************************************* Update an entry from a network frame return RET_NOK on error *********************************************/ ret_code_t entry_update(char * data) { char * elements[5] = {NULL,NULL,NULL,NULL,NULL}; config_setting_t * setting; const config_t * config= NULL; int value; char * token; int index = 0; ret_code_t ret = RET_NOK; token = _strsep(&data,NETWORK_DELIMITER); while( token != NULL ) { elements[index] = strdup(token); index++; if(index>5) { werr(LOGDEV,"Split string error"); goto entry_update_cleanup; } token = _strsep(&data,NETWORK_DELIMITER); } SDL_LockMutex(entry_mutex); config = get_config(elements[1],elements[2]); if(config==NULL) { goto entry_update_cleanup; } setting = config_lookup (config, elements[3]); if(setting==NULL) { goto entry_update_cleanup; } if( strcmp(elements[0],ENTRY_TYPE_INT) == 0 ) { value = atoll(elements[4]); if(config_setting_set_int (setting, value) == CONFIG_FALSE) { werr(LOGUSER,"Errror setting %s/%s/%s to %d",elements[1],elements[2],elements[3],value); } else { write_config(config,elements[1],elements[2]); } } else if( strcmp(elements[0],ENTRY_TYPE_STRING) == 0 ) { if(config_setting_set_string (setting,elements[4]) == CONFIG_FALSE) { werr(LOGUSER,"Errror setting %s/%s/%s to %s",elements[1],elements[2],elements[3],elements[4]); } else { write_config(config,elements[1],elements[2]); } } ret = RET_OK; entry_update_cleanup: SDL_UnlockMutex(entry_mutex); for(index=0; index<5; index++) { if(elements[index]) { free(elements[index]); } } return ret; }
/************************************** Return RET_NOK on error **************************************/ ret_code_t parse_incoming_data(context_t * context, Uint32 command, Uint32 command_size, char * data) { char * value = NULL; char * fullname; char * elements[512]; char * cksum; int i; char * user_name; char * password; if( !context_get_connected(context) && ( command != CMD_REQ_LOGIN && command != CMD_REQ_FILE) ) { werr(LOGUSER,"Request from not authenticated client, close connection"); return RET_NOK; } switch(command) { case CMD_REQ_LOGIN: wlog(LOGDEBUG,"Received CMD_REQ_LOGIN"); user_name = _strsep(&data,NETWORK_DELIMITER); password = _strsep(&data,NETWORK_DELIMITER); if(entry_read_string(PASSWD_TABLE, user_name, &value, PASSWD_KEY_PASSWORD,NULL) == RET_NOK) { return RET_NOK; } if( strcmp(value, password) != 0) { free(value); werr(LOGUSER,"Wrong login for %s",user_name); // send answer network_send_command(context, CMD_SEND_LOGIN_NOK, 0, NULL, false); // force client disconnection return RET_NOK; } else { free(value); if( context_set_username(context, user_name) == RET_NOK ) { return RET_NOK; } context_set_connected(context, true); // send answer network_send_command(context, CMD_SEND_LOGIN_OK, 0, NULL, false); wlog(LOGUSER,"Login successful for user %s",context->user_name); } break; case CMD_REQ_CHARACTER_LIST : wlog(LOGDEBUG,"Received CMD_REQ_CHARACTER_LIST"); character_send_list(context); wlog(LOGDEBUG,"character list sent"); break; case CMD_REQ_FILE : i = 0; elements[i] = _strsep(&data,NETWORK_DELIMITER); while(elements[i]) { i++; elements[i] = _strsep(&data,NETWORK_DELIMITER); } if(elements[0]==NULL || elements[1]==NULL) { werr(LOGDEV,"Received erroneous CMD_REQ_FILE"); break; } wlog(LOGDEBUG,"Received CMD_REQ_FILE for %s",elements[0]); /* compare checksum */ fullname = strconcat(base_directory,"/",elements[0],NULL); cksum = checksum_file(fullname); free(fullname); if( cksum == NULL) { werr(LOGUSER,"Required file %s doesn't exists",elements[0]); break; } if( strcmp(elements[1],cksum) == 0 ) { wlog(LOGDEBUG,"Client has already newest %s file",elements[0]); free(cksum); break; } free(cksum); network_send_file(context,elements[0]); wlog(LOGDEBUG,"File %s sent",elements[0]); break; case CMD_REQ_USER_CHARACTER_LIST : wlog(LOGDEBUG,"Received CMD_REQ_USER_CHARACTER_LIST"); character_user_send_list(context); wlog(LOGDEBUG,"user %s's character list sent",context->user_name); break; case CMD_REQ_START : if( context->in_game == false ) { context->id = strdup(data); context->in_game = true; context_update_from_file(context); context_spread(context); context_request_other_context(context); } wlog(LOGDEBUG,"Received CMD_REQ_START for %s /%s",context->user_name,context->id); break; case CMD_REQ_STOP : wlog(LOGDEBUG,"Received CMD_REQ_STOP for %s /%s",context->user_name,context->id); if( context->in_game == true ) { context->in_game = false; if( context->map ) { free(context->map); } context->map = NULL; if( context->prev_map ) { free(context->prev_map); } context->prev_map = NULL; if( context->id ) { free(context->id); } context->id = NULL; context_spread(context); } break; case CMD_REQ_ACTION : i = 0; elements[i] = NULL; elements[i] = _strsep(&data,NETWORK_DELIMITER); while(elements[i]) { i++; elements[i] = _strsep(&data,NETWORK_DELIMITER); } elements[i+1] = NULL; wlog(LOGDEBUG,"Received CMD_REQ_ACTION %s from %s /%s",elements[0],context->user_name,context->character_name); action_execute(context,elements[0],&elements[1]); break; default: werr(LOGDEV,"Unknown request %d from client",command); return RET_NOK; } return RET_OK; }
// this function reads a file for "," separated values and creates a matrix object from it int CFmDataFrame::Load(const char* filename, bool bRowName, bool bColName) { _log_debug(_HI_, "CFmDataFrame::Load:%s, bRowName=%d, bColName=%d", filename, bRowName, bColName); FILE* fp = fopen( filename, "rt"); if (fp==NULL) { _log_error(_HI_, "The file can not be opened(%s)", filename); return(ERR_OPEN_FILE); } char aLine[MAX_LINE_WIDTH+1]={0}; if( fgets( aLine, MAX_LINE_WIDTH, fp ) == NULL) { _log_error( _HI_, "Failed to read a line (%s)", filename); fclose(fp); return(ERR_READ_FILE); } CFmVectorStr vctRowNames(0); CFmVectorStr vctColNames(0); int col_size = 0; // count how many elements in the first lines const char seps1[] = ",\t\n\r"; char* running = Strdup (aLine); char* runnptr = running; char* token = _strsep((char**)&running, seps1 ); while(token) { if(strlen(token)!=0) { vctColNames.Put( token); col_size++; } token = _strsep( (char**)&running, seps1 ); } Free(runnptr); _log_debug(_HI_, "CFmDataFrame::Load: col_size: %d", col_size); CFmVector tmpRow(col_size, 0.0); if (bRowName && !bColName) tmpRow.Resize(col_size-1); int nMaxRows = 20; int nMaxCols = tmpRow.GetLength(); m_nNumCols = tmpRow.GetLength(); m_nNumRows = 0; AllocMemory( nMaxRows, nMaxCols ); if (!bColName) { if (!bRowName) { m_nNumCols = col_size; for (int i=0; i<col_size; i++) Set(0, i, vctColNames[i]); } else { m_nNumCols = col_size-1; for (int i=1; i<col_size+1; i++) Set(0, i-1, vctColNames[i]); vctRowNames.Put( vctColNames[0] ); } m_nNumRows++; } CFmVectorStr vctTmpRow(0); while(!feof(fp)) { if( fgets( aLine, MAX_LINE_WIDTH, fp ) == NULL) break; char* running = Strdup (aLine); vctTmpRow.Reset(0); char* token = _strsep( &running, seps1 ); int nNonEmty = 0; while(token) { if (strlen(token)!=0 && strncmp(token, "\n", 1)!=0 && strncmp(token, "\r", 1)!=0 && strncmp(token, "\t", 1)!=0) nNonEmty ++; vctTmpRow.Put(token); token = _strsep( &running, seps1 ); } Free(running); if (nNonEmty==0) break; m_nNumRows++; if (m_nNumRows >= m_nMaxRows ) AllocMemory( m_nNumRows+20, m_nMaxCols ); if (!bRowName) { for (int i=0; i<col_size && i<vctTmpRow.GetLength(); i++) Set( m_nNumRows-1, i, vctTmpRow[i] ); } else { for (int i=1; i<col_size+1 && i<vctTmpRow.GetLength(); i++) { Set( m_nNumRows-1, i-1, vctTmpRow[i] ); } vctRowNames.Put( vctTmpRow[0]); } } fclose(fp); CFmNewTemp refNew; if (bRowName) m_pRowNames = new (refNew) CFmVectorStr( &vctRowNames ); if (bColName) m_pColNames = new (refNew) CFmVectorStr( &vctColNames ); _log_debug(_HI_, "CFmDataFrame::Load:%d,%d", m_nNumRows, m_nNumCols); return(0); }