Re: rpki-client io cleanup

2020-11-19 Thread Theo Buehler
On Thu, Nov 19, 2020 at 12:31:27PM +0100, Claudio Jeker wrote:
> 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

ok tb

> 
> 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 -  1.34
> +++ extern.h  19 Nov 2020 11:17:42 -
> @@ -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 -  1.9
> +++ io.c  19 Nov 2020 11:17:05 -
> @@ -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.c24 Oct 2020 08:12:00 -  1.84
> +++ main.c19 Nov 2020 11:20:01 -
> @@ -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 -  1.9
> +++ rsync.c   19 Nov 2020 11:16:17 -
> @@ -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_tpid;
>   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));
> +  

rpki-client io cleanup

2020-11-19 Thread Claudio Jeker
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.h12 Sep 2020 15:46:48 -  1.34
+++ extern.h19 Nov 2020 11:17:42 -
@@ -378,10 +378,8 @@ voidio_simple_write(int, const void *
 voidio_buf_buffer(char **, size_t *, size_t *, const void *,
size_t);
 voidio_buf_read_alloc(int, void **, size_t *);
-voidio_buf_write(int, const void *, size_t);
 voidio_str_buffer(char **, size_t *, size_t *, const char *);
 voidio_str_read(int, char **);
-voidio_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.c12 Sep 2020 15:46:48 -  1.9
+++ io.c19 Nov 2020 11:17:05 -
@@ -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 -  1.84
+++ main.c  19 Nov 2020 11:20:01 -
@@ -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 -  1.9
+++ rsync.c 19 Nov 2020 11:16:17 -
@@ -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_tpid;
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;
+