From: Claudio Jeker Subject: Re: file: use better imsg API To: tech@openbsd.org Date: Wed, 21 Aug 2024 21:12:20 +0200 On Wed, Aug 21, 2024 at 07:17:27PM +0200, Florian Obser wrote: > Hang on, there is an imsg_get_data?! Why do I only learn about this now? > I see a flurry of commits in my future... You should read imsg_init.3 and ibuf_add.3 I added a lot of good stuff over the last year. bgpd(8) is using most of this already. > Anyway, this reads OK florian > On 2024-08-21 17:44 +02, Claudio Jeker wrote: > > Tired of old crufty imsg fiddling. Lets use the real deal. > > > > -- > > :wq Claudio > > > > Index: file.c > > =================================================================== > > RCS file: /cvs/src/usr.bin/file/file.c,v > > diff -u -p -r1.70 file.c > > --- file.c 16 Jan 2024 13:07:29 -0000 1.70 > > +++ file.c 21 Aug 2024 15:41:10 -0000 > > @@ -125,7 +125,7 @@ main(int argc, char **argv) > > struct imsgbuf ibuf; > > struct imsg imsg; > > struct input_msg msg; > > - struct input_ack *ack; > > + struct input_ack ack; > > pid_t pid, parent; > > > > tzset(); > > @@ -223,10 +223,9 @@ main(int argc, char **argv) > > > > if (read_message(&ibuf, &imsg, pid) == 0) > > break; > > - if (imsg.hdr.len != IMSG_HEADER_SIZE + sizeof *ack) > > - errx(1, "message too small"); > > - ack = imsg.data; > > - if (ack->idx != idx) > > + if (imsg_get_data(&imsg, &ack, sizeof ack) == -1) > > + err(1, "bad message"); > > + if (ack.idx != idx) > > errx(1, "index not expected"); > > imsg_free(&imsg); > > } > > @@ -365,7 +364,7 @@ child(int fd, pid_t parent, int argc, ch > > struct magic *m; > > struct imsgbuf ibuf; > > struct imsg imsg; > > - struct input_msg *msg; > > + struct input_msg msg; > > struct input_ack ack; > > struct input_file inf; > > int i, idx; > > @@ -405,17 +404,16 @@ child(int fd, pid_t parent, int argc, ch > > for (;;) { > > if (read_message(&ibuf, &imsg, parent) == 0) > > break; > > - if (imsg.hdr.len != IMSG_HEADER_SIZE + sizeof *msg) > > - errx(1, "message too small"); > > - msg = imsg.data; > > + if (imsg_get_data(&imsg, &msg, sizeof msg) == -1) > > + err(1, "bad message"); > > > > - idx = msg->idx; > > + idx = msg.idx; > > if (idx < 0 || idx >= argc) > > errx(1, "index out of range"); > > > > memset(&inf, 0, sizeof inf); > > inf.m = m; > > - inf.msg = msg; > > + inf.msg = &msg; > > > > inf.path = argv[idx]; > > inf.fd = imsg_get_fd(&imsg); > > > > -- > In my defence, I have been left unsupervised. > -- :wq Claudio