aboutsummaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
authorwinter Sparkles2026-07-02 17:01:12 +0100
committerwinter Sparkles2026-07-02 17:01:12 +0100
commit3bf8591a0aa782445bc4495cfc0f1feb4470f57b (patch)
treeb36dfbbfcf0d2d3a85c2515c4b875e42bb33745e
parent726ba494e5f5c78bde1fc67278ad557541e6004e (diff)
fix the default transport & add example for itHEADmain
-rw-r--r--docs/examples.md3
-rw-r--r--docs/fetch-default.example.c52
-rw-r--r--libsparklepaw/request.c6
-rw-r--r--libsparklepaw/transport.c2
4 files changed, 61 insertions, 2 deletions
diff --git a/docs/examples.md b/docs/examples.md
index e10e646..6abec99 100644
--- a/docs/examples.md
+++ b/docs/examples.md
@@ -10,3 +10,6 @@ Example of reading a service in and printing it for debugging:
Example of making a request to a daemon via TCP transport:
\include fetch-tcp.example.c
+
+As above, but using the system configured default transport:
+\include fetch-default.example.c
diff --git a/docs/fetch-default.example.c b/docs/fetch-default.example.c
new file mode 100644
index 0000000..89619a0
--- /dev/null
+++ b/docs/fetch-default.example.c
@@ -0,0 +1,52 @@
+#include <libsparklepaw/transport.h>
+#include <stdio.h>
+
+int main(int argc, char** argv) {
+ // key for my example zone, replace it with one you can test against
+ uint8_t key[0x20] = {
+ 0xc5, 0x82, 0x1e, 0x05, 0x34, 0x80, 0x17, 0x25,
+ 0x3c, 0xfc, 0x80, 0x87, 0x0b, 0xca, 0x03, 0xed,
+ 0x0a, 0x8b, 0x93, 0xbc, 0x33, 0x58, 0x33, 0x9e,
+ 0x7e, 0xee, 0x44, 0x08, 0xff, 0xfd, 0x2c, 0x2d
+ };
+
+ struct sprkl_request* req = sprkl_request_make_fetchservice(
+ SPRKL_SIGALGO_ED25519, key, 0
+ );
+
+ struct sprkl_transport t;
+ int err = sprkl_transport_make_default(&t);
+ if (err == -1) {
+ fprintf(stderr, "error: no default transport is available\n");
+ return err;
+ } else if (err) {
+ fprintf(stderr, "make transport error: %s\n", sprkl_transport_strerror(&t, err));
+ return err;
+ }
+
+ err = sprkl_transport_sendrequest(&t, req);
+ if (err) {
+ fprintf(stderr, "req error: %s\n", sprkl_transport_strerror(&t, err));
+ return err;
+ }
+
+ struct sprkl_response resp;
+ resp.verb = req->verb;
+ err = sprkl_transport_recvresponse(&t, &resp);
+ if (err) {
+ fprintf(stderr, "resp error: %s\n", sprkl_transport_strerror(&t, err));
+ return err;
+ }
+
+ sprkl_transport_fini_default(&t);
+
+ fprintf(stderr, "response status code is %x\n", resp.status);
+ if (resp.status != SPRKL_STATUS_OK) {
+ fprintf(stderr, "server said: %*s\n", resp.errmsgsz, resp.errmsg);
+ } else {
+ sprkl_service_printdebug(resp.fetchsvc.svc, stdout);
+ }
+
+ sprkl_response_freeparts(&resp, true);
+ sprkl_request_freeall(req);
+}
diff --git a/libsparklepaw/request.c b/libsparklepaw/request.c
index f8b3f88..a408f2a 100644
--- a/libsparklepaw/request.c
+++ b/libsparklepaw/request.c
@@ -8,6 +8,7 @@
#include <string.h>
int sprkl_request_write(struct sprkl_request* request, FILE* stream) {
+ struct sprkl_request_fetchservice* inner;
int n = 0;
n += fwrite(SPRKL_REQUEST_MAGIC, 1, SPRKL_REQUEST_MAGIC_SZ, stream);
n += sprkl_writeuint16be(SPRKL_PROTO_VERSION, stream);
@@ -20,7 +21,7 @@ int sprkl_request_write(struct sprkl_request* request, FILE* stream) {
);
break;
case SPRKL_VERB_FETCHSERVICE:
- struct sprkl_request_fetchservice* inner = &request->fetchsvc;
+ inner = &request->fetchsvc;
n += sprkl_writeuint16be(inner->keyalgo, stream);
n += sprkl_writeuint16be(inner->keysz, stream);
n += fwrite(inner->key, 1, inner->keysz, stream);
@@ -31,6 +32,7 @@ int sprkl_request_write(struct sprkl_request* request, FILE* stream) {
}
int sprkl_request_read(struct sprkl_request* request, FILE* stream) {
+ struct sprkl_request_fetchservice* inner;
int n = 0;
uint8_t buf[SPRKL_REQUEST_MAGIC_SZ];
n += fread(buf, 1, sizeof buf, stream);
@@ -60,7 +62,7 @@ int sprkl_request_read(struct sprkl_request* request, FILE* stream) {
);
break;
case SPRKL_VERB_FETCHSERVICE:
- struct sprkl_request_fetchservice* inner = &request->fetchsvc;
+ inner = &request->fetchsvc;
n += sprkl_readuint16be((uint16_t*) &inner->keyalgo, stream);
n += sprkl_readuint16be(&inner->keysz, stream);
inner->key = malloc(inner->keysz);
diff --git a/libsparklepaw/transport.c b/libsparklepaw/transport.c
index 28fcac5..1a6e79a 100644
--- a/libsparklepaw/transport.c
+++ b/libsparklepaw/transport.c
@@ -88,6 +88,8 @@ int sprkl_transport_make_default(struct sprkl_transport* transport) {
sa.sin_family = AF_INET;
sa.sin_addr.s_addr = inet_addr(host);
sa.sin_port = htons(atoi(port));
+ // so that strerror works for connect errors:
+ transport->strerror = _transport_stream_strerror;
int sock = socket(AF_INET, SOCK_STREAM, 6);
if (connect(sock, (struct sockaddr*) &sa, sizeof sa)) return errno;