diff options
| author | winter Sparkles | 2026-07-02 17:01:12 +0100 |
|---|---|---|
| committer | winter Sparkles | 2026-07-02 17:01:12 +0100 |
| commit | 3bf8591a0aa782445bc4495cfc0f1feb4470f57b (patch) | |
| tree | b36dfbbfcf0d2d3a85c2515c4b875e42bb33745e | |
| parent | 726ba494e5f5c78bde1fc67278ad557541e6004e (diff) | |
| -rw-r--r-- | docs/examples.md | 3 | ||||
| -rw-r--r-- | docs/fetch-default.example.c | 52 | ||||
| -rw-r--r-- | libsparklepaw/request.c | 6 | ||||
| -rw-r--r-- | libsparklepaw/transport.c | 2 |
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; |
