Files
WHCandCursor 5ee82f126d feat: same-Realm peer discovery via UDP and local registry (0.9.10)
Advertise instances with a multicast beacon and a config-dir registry so
same-machine and LAN peers that share a Realm fingerprint can find each
other without TOFU pairing.

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-10-28 22:48:04 +08:00

70 lines
2.0 KiB
C

#define _POSIX_C_SOURCE 200809L
#include "cst_discover.h"
#include "cst_realm.h"
#include "cst_test_util.h"
#include "os_compat.h"
#include <assert.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <time.h>
static int wait_peer(cst_discover_t *d, const char *want_iid, int ms) {
cst_peer_info_t peers[8];
for (int t = 0; t < ms; t += 50) {
int n = cst_discover_peers(d, peers, 8);
for (int i = 0; i < n; i++) {
if (!strcmp(peers[i].instance_id, want_iid) && peers[i].port > 0)
return 1;
}
struct timespec ts = {0, 50 * 1000 * 1000};
nanosleep(&ts, NULL);
}
return 0;
}
int main(void) {
char dir[2048];
assert(!test_tmpdir(dir, sizeof(dir), "discover"));
/* Point config at tmp so local-instances.json is isolated. */
char cfg[512];
assert(snprintf(cfg, sizeof(cfg), "%s/cfg", dir) < (int)sizeof(cfg));
assert(!os_mkdir_p(cfg, 0700));
setenv("XDG_CONFIG_HOME", cfg, 1);
cst_realm_keys_t realm;
assert(cst_realm_generate(&realm) == 0);
char rid[33];
assert(cst_realm_fingerprint(realm.pk, rid) == 0);
assert(cst_discover_local_put(rid, "a", "alpha", 9101) == 0);
assert(cst_discover_local_put(rid, "b", "beta", 9102) == 0);
cst_peer_info_t list[8];
int n = cst_discover_local_list(rid, list, 8);
assert(n == 2);
cst_discover_t *da = cst_discover_start(rid, "a", "alpha", 9101);
cst_discover_t *db = cst_discover_start(rid, "b", "beta", 9102);
assert(da && db);
assert(wait_peer(da, "b", 3000));
assert(wait_peer(db, "a", 3000));
cst_realm_keys_t other;
assert(cst_realm_generate(&other) == 0);
char other_rid[33];
assert(cst_realm_fingerprint(other.pk, other_rid) == 0);
cst_discover_t *dc = cst_discover_start(other_rid, "c", "gamma", 9103);
assert(dc);
/* Foreign realm must not appear in same-realm peer lists. */
assert(!wait_peer(da, "c", 800));
assert(wait_peer(dc, "c", 200) == 0); /* self excluded */
cst_discover_stop(dc);
cst_discover_stop(db);
cst_discover_stop(da);
test_rmrf(dir);
puts("test_discover: OK");
return 0;
}