static ssize_t struct_machine_unpack(machine_t *machine, request_t *request){ ssize_t ret; data_t *buffer; request_t *values; struct_userdata *userdata = (struct_userdata *)machine->userdata; buffer = hash_data_find(request, userdata->buffer); if(buffer != NULL){ switch(userdata->values){ case STRUCT_VALUES_WHOLE: values = request; break; case STRUCT_VALUES_ONE: hash_data_get(ret, TYPE_HASHT, values, request, userdata->key_values); if(ret != 0) return error("hash with keys not supplied"); break; }; if(struct_unpack(userdata->structure, values, buffer) == 0) return error("struct_unpack failed"); } return machine_pass(machine, request); }
fail_unless(memcmp(test, orig, sizeof(orig)) == 0, "struct_pack data failed"); uint32_t test1; off_t test2; char *test3 = malloc(100); memset(test3, 0x41, 99); test3[99] = 0; request_t query[] = { { HK(key4), DATA_STRING(test3) }, { HK(key1), DATA_UINT32T(0) }, { HK(key2), DATA_OFFT(0) }, hash_end }; ret = struct_unpack(structure, query, &test_data); fail_unless(ret > 0, "struct_unpack failed"); hash_data_get(ret, TYPE_UINT32T, test1, query, HK(key1)); fail_unless(ret == 0 && test1 == 100, "struct_unpack data 1 failed\n"); hash_data_get(ret, TYPE_OFFT, test2, query, HK(key2)); fail_unless(ret == 0 && test2 == 10, "struct_unpack data 2 failed\n"); hash_data_get(ret, TYPE_STRINGT, test3, query, HK(key4)); fail_unless(ret == 0 && strcmp(test3,"hello") == 0, "struct_unpack data 3 failed\n"); free(test3); } END_TEST REGISTER_TEST(core, test_structs)