The io marshall code in rpki-client is a bit strange. It mixes
non-blocking and blocking sematics and some of the code could be more
async. This is the first mini step. Always use the buffer io API and
remove the functions that call io_simple_write() internally.
Next step would be to build a proper write queue and kill
io_simple_write().
Change is fairly mechanical and works for me :)
--
:wq Claudio
Index: extern.h
===================================================================
RCS file: /cvs/src/usr.sbin/rpki-client/extern.h,v
retrieving revision 1.34
diff -u -p -r1.34 extern.h
--- extern.h 12 Sep 2020 15:46:48 -0000 1.34
+++ extern.h 19 Nov 2020 11:17:42 -0000
@@ -378,10 +378,8 @@ void io_simple_write(int, const void *
void io_buf_buffer(char **, size_t *, size_t *, const void *,
size_t);
void io_buf_read_alloc(int, void **, size_t *);
-void io_buf_write(int, const void *, size_t);
void io_str_buffer(char **, size_t *, size_t *, const char *);
void io_str_read(int, char **);
-void io_str_write(int, const char *);
/* X509 helpers. */
Index: io.c
===================================================================
RCS file: /cvs/src/usr.sbin/rpki-client/io.c,v
retrieving revision 1.9
diff -u -p -r1.9 io.c
--- io.c 12 Sep 2020 15:46:48 -0000 1.9
+++ io.c 19 Nov 2020 11:17:05 -0000
@@ -98,17 +98,6 @@ io_buf_buffer(char **b, size_t *bsz,
}
/*
- * Write a binary buffer of the given size, which may be zero.
- */
-void
-io_buf_write(int fd, const void *p, size_t sz)
-{
-
- io_simple_write(fd, &sz, sizeof(size_t));
- io_simple_write(fd, p, sz);
-}
-
-/*
* Like io_str_write() but into a buffer.
*/
void
@@ -117,17 +106,6 @@ io_str_buffer(char **b, size_t *bsz, siz
size_t sz = (p == NULL) ? 0 : strlen(p);
io_buf_buffer(b, bsz, bmax, p, sz);
-}
-
-/*
- * Write a NUL-terminated string, which may be zero-length.
- */
-void
-io_str_write(int fd, const char *p)
-{
- size_t sz = (p == NULL) ? 0 : strlen(p);
-
- io_buf_write(fd, p, sz);
}
/*
Index: main.c
===================================================================
RCS file: /cvs/src/usr.sbin/rpki-client/main.c,v
retrieving revision 1.84
diff -u -p -r1.84 main.c
--- main.c 24 Oct 2020 08:12:00 -0000 1.84
+++ main.c 19 Nov 2020 11:20:01 -0000
@@ -301,6 +301,8 @@ repo_lookup(int fd, const char *uri)
const char *host, *mod;
size_t hostsz, modsz, i;
struct repo *rp;
+ char *b = NULL;
+ size_t bsz = 0, bmax = 0;
if (!rsync_uri_parse(&host, &hostsz,
&mod, &modsz, NULL, NULL, NULL, uri))
@@ -337,9 +339,12 @@ repo_lookup(int fd, const char *uri)
if (!noop) {
logx("%s/%s: pulling from network", rp->host, rp->module);
- io_simple_write(fd, &i, sizeof(size_t));
- io_str_write(fd, rp->host);
- io_str_write(fd, rp->module);
+ io_simple_buffer(&b, &bsz, &bmax, &i, sizeof(size_t));
+ io_str_buffer(&b, &bsz, &bmax, rp->host);
+ io_str_buffer(&b, &bsz, &bmax, rp->module);
+
+ io_simple_write(fd, b, bsz);
+ free(b);
} else {
rp->loaded = 1;
logx("%s/%s: using cache", rp->host, rp->module);
Index: rsync.c
===================================================================
RCS file: /cvs/src/usr.sbin/rpki-client/rsync.c,v
retrieving revision 1.9
diff -u -p -r1.9 rsync.c
--- rsync.c 12 Sep 2020 15:46:48 -0000 1.9
+++ rsync.c 19 Nov 2020 11:16:17 -0000
@@ -171,10 +171,10 @@ proc_child(int signal)
void
proc_rsync(char *prog, char *bind_addr, int fd)
{
- size_t id, i, idsz = 0;
+ size_t id, i, idsz = 0, bsz = 0, bmax = 0;
ssize_t ssz;
char *host = NULL, *mod = NULL, *uri = NULL,
- *dst = NULL, *path, *save, *cmd;
+ *dst = NULL, *path, *save, *cmd, *b = NULL;
const char *pp;
pid_t pid;
char *args[32];
@@ -265,8 +265,13 @@ proc_rsync(char *prog, char *bind_addr,
ok = 0;
}
- io_simple_write(fd, &ids[i].id, sizeof(size_t));
- io_simple_write(fd, &ok, sizeof(ok));
+ io_simple_buffer(&b, &bsz, &bmax,
+ &ids[i].id, sizeof(size_t));
+ io_simple_buffer(&b, &bsz, &bmax,
+ &ok, sizeof(ok));
+ io_simple_write(fd, b, bsz);
+ bsz = 0;
+
free(ids[i].uri);
ids[i].uri = NULL;
ids[i].pid = 0;
@@ -361,6 +366,7 @@ proc_rsync(char *prog, char *bind_addr,
free(ids[i].uri);
}
+ free(b);
free(ids);
exit(rc);
/* NOTREACHED */