RELATION UnSet(KEY leftKey, RELATION id, KEY rightKey) { register struct relationDef *rd = FindRelation(id); if (rd && CompareKey) { register struct relation *r; register struct relation **h; h = &rd->rd_relationsTable; for (r = rd->rd_relationsTable; r; r = r->r_next) { if (CompareKey(r->r_leftKey, leftKey) && CompareKey(r->r_rightKey, rightKey)) { *h = r->r_next; TCFreeMem(r, sizeof(*r)); return id; } h = &r->r_next; } } return 0; }
RELATION SetP(KEY leftKey, RELATION id, KEY rightKey, PARAMETER parameter) { register struct relationDef *rd = FindRelation(id); if (rd && CompareKey) { register struct relation *r; for (r = rd->rd_relationsTable; r; r = r->r_next) { if (CompareKey(r->r_leftKey, leftKey) && CompareKey(r->r_rightKey, rightKey)) { if (parameter != NO_PARAMETER) r->r_parameter = parameter; return id; } } if ((r = (struct relation *) TCAllocMem(sizeof(*r), 0))) { r->r_next = rd->rd_relationsTable; rd->rd_relationsTable = r; r->r_leftKey = leftKey; r->r_rightKey = rightKey; r->r_parameter = parameter; return id; } } return 0; }
TEST(keyFile, ReadHexKeys) { const char* path; struct key* keys = NULL; struct key* result = NULL; char data[15]; path = CreatePath("key-test-hex", INPUT_DIR); TEST_ASSERT_EQUAL(3, auth_init(path, &keys)); free((void*) path); TEST_ASSERT_TRUE(keys != NULL); get_key(10, &result); TEST_ASSERT_TRUE(result != NULL); TEST_ASSERT_TRUE(CompareKey(10, 13, "MD5", "\x01\x23\x45\x67\x89\xab\xcd\xef\x01\x23\x45\x67\x89", result)); result = NULL; get_key(20, &result); TEST_ASSERT_TRUE(result != NULL); memset(data, 0x11, 15); TEST_ASSERT_TRUE(CompareKey(20, 15, "MD5", data, result)); result = NULL; get_key(30, &result); TEST_ASSERT_TRUE(result != NULL); memset(data, 0x01, 13); TEST_ASSERT_TRUE(CompareKey(30, 13, "MD5", data, result)); }
PARAMETER GetP(KEY leftKey, RELATION id, KEY rightKey) { register struct relationDef *rd = FindRelation(id); if (rd && CompareKey) { register struct relation *r; for (r = rd->rd_relationsTable; r; r = r->r_next) { if (CompareKey(r->r_leftKey, leftKey) && CompareKey(r->r_rightKey, rightKey)) return r->r_parameter; } } return NO_PARAMETER; }
TEST(keyFile, ReadASCIIKeys) { const char* path; struct key* keys = NULL; struct key* result = NULL; path = CreatePath("key-test-ascii", INPUT_DIR); TEST_ASSERT_EQUAL(2, auth_init(path, &keys)); free((void*) path); TEST_ASSERT_TRUE(keys != NULL); get_key(40, &result); TEST_ASSERT_TRUE(result != NULL); TEST_ASSERT_TRUE(CompareKey(40, 11, "MD5", "asciikeyTwo", result)); result = NULL; get_key(50, &result); TEST_ASSERT_TRUE(result != NULL); TEST_ASSERT_TRUE(CompareKey(50, 11, "MD5", "asciikeyOne", result)); }
TEST(keyFile, ReadKeyFileWithComments) { const char* path; struct key* keys = NULL; struct key* result = NULL; char data[15]; path = CreatePath("key-test-comments", INPUT_DIR); TEST_ASSERT_EQUAL(2, auth_init(path, &keys)); free((void*) path); TEST_ASSERT_TRUE(keys != NULL); get_key(10, &result); TEST_ASSERT_TRUE(result != NULL); memset(data, 0x01, 15); TEST_ASSERT_TRUE(CompareKey(10, 15, "MD5", data, result)); result = NULL; get_key(34, &result); TEST_ASSERT_TRUE(result != NULL); TEST_ASSERT_TRUE(CompareKey(34, 3, "MD5", "xyz", result)); }
void UnSetAll(KEY key, void (*UseKey) (KEY)) { register struct relationDef *rd; for (rd = relationsDefBase; rd; rd = rd->rd_next) { register struct relation *r; register struct relation **h; h = &rd->rd_relationsTable; for (r = rd->rd_relationsTable; r; r = r->r_next) { if (CompareKey(r->r_leftKey, key) || CompareKey(r->r_rightKey, key)) { if (UseKey) UseKey(key); *h = r->r_next; TCFreeMem(r, sizeof(*r)); } h = &r->r_next; } } }
void AskAll(KEY leftKey, RELATION id, void (*UseKey) (void *)) { register struct relationDef *rd = FindRelation(id); if (rd && CompareKey) { register struct relation *r; for (r = rd->rd_relationsTable; r; r = r->r_next) { if (CompareKey(r->r_leftKey, leftKey)) { if (UseKey) UseKey(r->r_rightKey); } } } }
RELATION AskP(KEY leftKey, RELATION id, KEY rightKey, PARAMETER parameter, COMPARSION comparsion) { register struct relationDef *rd = FindRelation(id); if (rd && CompareKey) { register struct relation *r; for (r = rd->rd_relationsTable; r; r = r->r_next) { if (CompareKey(r->r_leftKey, leftKey) && CompareKey(r->r_rightKey, rightKey)) { if (comparsion && (parameter != NO_PARAMETER)) { if (comparsion & CMP_EQUAL) { if (comparsion & CMP_HIGHER) return (r->r_parameter >= parameter ? id : 0); else if (comparsion & CMP_LOWER) return (r->r_parameter <= parameter ? id : 0); return (r->r_parameter == parameter ? id : 0); } else if (comparsion & CMP_HIGHER) return (r->r_parameter > parameter ? id : 0); else if (comparsion & CMP_LOWER) return (r->r_parameter < parameter ? id : 0); else if (comparsion & CMP_NOT_EQUAL) return (r->r_parameter != parameter ? id : 0); return 0; } return id; } } } return 0; }
TEST(keyFile, ReadKeyFileWithInvalidHex) { const char* path; struct key* keys = NULL; struct key* result = NULL; char data[15]; path = CreatePath("key-test-invalid-hex", INPUT_DIR); TEST_ASSERT_EQUAL(1, auth_init(path, &keys)); free((void*) path); TEST_ASSERT_TRUE(keys != NULL); get_key(10, &result); TEST_ASSERT_TRUE(result != NULL); memset(data, 0x01, 15); TEST_ASSERT_TRUE(CompareKey(10, 15, "MD5", data, result)); result = NULL; get_key(30, &result); /* Should not exist, and result should remain NULL. */ TEST_ASSERT_TRUE(result == NULL); }