void process_server_info(struct sockaddr_in *sockaddr, struct buffer_t *buffer) { struct queried_server_t *cserver = queried_servers; struct found_server_t new_server_info; uint16_t servers; struct sockaddr_in s; time_t t; int proto_ver; while(cserver) { if(cserver->ip == sockaddr->sin_addr.s_addr && cserver->port == sockaddr->sin_port) { proto_ver = buffer_read_uint8(buffer); if(proto_ver != EM_PROTO_VER) { if(proto_ver > EM_PROTO_VER) num_servers_new_proto++; break; } new_server_info.ip = sockaddr->sin_addr.s_addr; new_server_info.port = sockaddr->sin_port; new_server_info.ping = get_wall_time() - cserver->stamp; new_server_info.host_name = buffer_read_string(buffer); new_server_info.map_name = buffer_read_string(buffer); new_server_info.num_players = buffer_read_uint8(buffer); new_server_info.max_players = buffer_read_uint8(buffer); new_server_info.authenticating = buffer_read_uint8(buffer); add_new_found_server(&new_server_info); add_new_server(&rumoured_servers, sockaddr, time(NULL)); servers = buffer_read_uint16(buffer); while(servers--) { s.sin_addr.s_addr = buffer_read_uint32(buffer); s.sin_port = buffer_read_uint16(buffer); t = buffer_read_uint32(buffer); if(!find_queried_server(s.sin_addr.s_addr, s.sin_port)) { if(add_new_server(&unqueried_servers, &s, t)) num_servers_unqueried++; } } break; } LL_NEXT(cserver); } }
bool unabto_buffer_test(void) { char * raw_test_string = "asjdhc#21?(!?(92814skzjbcasa"; uint8_t data[7 + 2 + strlen(raw_test_string)]; unabto_buffer buf, raw_string_buf; buffer_write_t w_buf; buffer_read_t r_buf; uint32_t t32; uint16_t t16; uint8_t t8; uint8_t raw_string_data[strlen(raw_test_string) + 1]; buffer_init(&raw_string_buf, (uint8_t*)raw_test_string, strlen(raw_test_string)); buffer_init(&buf, data, sizeof(data)); buffer_write_init(&w_buf, &buf); if (! (buffer_write_uint32(&w_buf, 0x12345678) && buffer_write_uint16(&w_buf, 0x1234) && buffer_write_uint8(&w_buf, 0x12) && buffer_write_raw(&w_buf, &raw_string_buf) ) ) { NABTO_LOG_ERROR(("Buffer write test failed")); return false; } buffer_read_init(&r_buf, &buf); memset(raw_string_data, 0, sizeof(raw_string_data) + 1); buffer_init(&raw_string_buf, raw_string_data, sizeof(raw_string_data)); bool t = false; if (! ( buffer_read_uint32(&r_buf, &t32) && t32 == 0x12345678 && buffer_read_uint16(&r_buf, &t16) && t16 == 0x1234 && buffer_read_uint8(&r_buf, &t8) && t8 == 0x12 && (t = buffer_read_raw(&r_buf, &raw_string_buf)) && buffer_get_size(&raw_string_buf) == strlen(raw_test_string) && 0 == strncmp((char*)buffer_get_data(&raw_string_buf), raw_test_string, strlen(raw_test_string)) )) { NABTO_LOG_ERROR(("Failed read test failed")); return false; } if (buffer_read_uint32(&r_buf, &t32) || buffer_read_uint16(&r_buf, &t16) || buffer_read_uint8(&r_buf, &t8) || buffer_read_raw(&w_buf, &raw_string_buf) || buffer_write_uint32(&w_buf, 0x12345678) || buffer_write_uint16(&w_buf, 0x1234) || buffer_write_uint8(&w_buf, 0x12) || buffer_write_raw(&w_buf, &raw_string_buf) ) { NABTO_LOG_ERROR(("Some function should have returned false but returned true")); return false; } return true; }
application_event_result weather_station_application(application_request* request, buffer_read_t* read_buffer, buffer_write_t* write_buffer) { switch (request->queryId) { case 1: /* * <query name="house_temperature" id="1" * template="house_temperature_template_overrule.tpt"> * <request> * <parameter name="sensor_id" type="uint32"/> * </request> * <response> * <parameter name="temperature" type="int32"/> * </response> * </query> */ { int32_t temp; uint32_t ix; // read 4 bytes from the input buffer if (!buffer_read_uint32(read_buffer, &ix)) return AER_REQ_TOO_SMALL; // write 4 bytes to the output buffer temp = getTemperature(ix); if (!buffer_write_uint32(write_buffer, temp)) return AER_REQ_RSP_TOO_LARGE; return AER_REQ_RESPONSE_READY; } case 2: /* * <query name="wind_speed" id="2"> * <request> * </request> * <response> * <parameter name="speed_m_s" type="uint32"/> * </response> * </query> */ if (!buffer_write_uint32(write_buffer, getWindSpeed())) return AER_REQ_RSP_TOO_LARGE; return AER_REQ_RESPONSE_READY; case 3: /** * <query name="weather_station" description="Weather station" id="3"> * <request> * </request> * <response> * <parameter name="temperature"/> * <parameter name="windspeed"/> * <parameter name="humidity"/> * </response> * </query> */ if (buffer_write_uint32(write_buffer, getTemperatureSimulated()) && buffer_write_uint32(write_buffer, getWindSpeedSimulated()) && buffer_write_uint32(write_buffer, getHumiditySimulated())) { return AER_REQ_RESPONSE_READY; } else { return AER_REQ_RSP_TOO_LARGE; } case 4: return AER_REQ_RESPONSE_READY; } /** * if no opcode matched return it as an error */ return AER_REQ_INV_QUERY_ID; }