Unix Technical Forum

Re: A question about read(2) in ntpd/bgpd

This is a discussion on Re: A question about read(2) in ntpd/bgpd within the mailing.openbsd.tech forums, part of the OpenBSD category; --> On Sun, 18 Mar 2007 at 20:05, Henning Brauer wrote: > * Valentin Kozamernik <tin@komna.com> [2007-03-18 16:25]: > > ...


Go Back   Unix Technical Forum > Unix Operating Systems > OpenBSD > mailing.openbsd.tech

Register FAQ Members List Calendar Search Today's Posts Mark Forums Read
  #1 (permalink)  
Old 02-18-2008, 09:15 AM
Valentin Kozamernik
 
Posts: n/a
Default Re: A question about read(2) in ntpd/bgpd

On Sun, 18 Mar 2007 at 20:05, Henning Brauer wrote:

> * Valentin Kozamernik <tin@komna.com> [2007-03-18 16:25]:
> > The imsg_read() function uses read(2) and returns 0 on EOF, EINTR or
> > EAGAIN. But whereever imsg_read() is used it is assumed that the
> > return value of 0 means that the socket has been closed.

>
> imsg_read actually uses recvmsg(2), but that doesn't really make a
> difference.


Well, I've checked it again; ntpd users read(2), bgpd uses recvmsg(2)
and ospfd uses recv(2).


> you are correct insofar that the return(0) there is incorrect.
> after looking at things a bit I believe we get away with returning -2


Yes, that is what I was thinking too. Here is a possible patch (which
I currently can not test properly!):


Index: usr.sbin/bgpd/control.c
================================================== =================
RCS file: /cvs/src/usr.sbin/bgpd/control.c,v
retrieving revision 1.53
diff -u -r1.53 control.c
--- usr.sbin/bgpd/control.c 2006/08/23 08:13:04 1.53
+++ usr.sbin/bgpd/control.c 2007/03/18 22:21:01
@@ -209,7 +209,7 @@
if (!(pfd->revents & POLLIN))
return (0);

- if (imsg_read(&c->ibuf) <= 0) {
+ if ((n = imsg_read(&c->ibuf)) == -1 || n == 0) {
*ctl_cnt -= control_close(pfd->fd);
return (1);
}
Index: usr.sbin/bgpd/imsg.c
================================================== =================
RCS file: /cvs/src/usr.sbin/bgpd/imsg.c,v
retrieving revision 1.38
diff -u -r1.38 imsg.c
--- usr.sbin/bgpd/imsg.c 2006/05/27 19:59:44 1.38
+++ usr.sbin/bgpd/imsg.c 2007/03/18 22:21:01
@@ -61,7 +61,7 @@
log_warn("imsg_read: pipe read error");
return (-1);
}
- return (0);
+ return (-2);
}

ibuf->r.wpos += n;
Index: usr.sbin/ntpd/imsg.c
================================================== =================
RCS file: /cvs/src/usr.sbin/ntpd/imsg.c,v
retrieving revision 1.11
diff -u -r1.11 imsg.c
--- usr.sbin/ntpd/imsg.c 2005/04/26 15:18:22 1.11
+++ usr.sbin/ntpd/imsg.c 2007/03/18 22:21:02
@@ -46,7 +46,7 @@
log_warn("imsg_read: pipe read error");
return (-1);
}
- return (0);
+ return (-2);
}

ibuf->r.wpos += n;
Index: usr.sbin/ospfd/control.c
================================================== =================
RCS file: /cvs/src/usr.sbin/ospfd/control.c,v
retrieving revision 1.16
diff -u -r1.16 control.c
--- usr.sbin/ospfd/control.c 2007/01/23 17:39:33 1.16
+++ usr.sbin/ospfd/control.c 2007/03/18 22:21:02
@@ -197,7 +197,7 @@

switch (event) {
case EV_READ:
- if ((n = imsg_read(&c->ibuf)) <= 0) {
+ if ((n = imsg_read(&c->ibuf)) == -1 || n == 0) {
control_close(fd);
return;
}
Index: usr.sbin/ospfd/imsg.c
================================================== =================
RCS file: /cvs/src/usr.sbin/ospfd/imsg.c,v
retrieving revision 1.7
diff -u -r1.7 imsg.c
--- usr.sbin/ospfd/imsg.c 2006/05/27 20:07:42 1.7
+++ usr.sbin/ospfd/imsg.c 2007/03/18 22:21:02
@@ -50,7 +50,7 @@
log_warn("imsg_read: pipe read error");
return (-1);
}
- return (0);
+ return (-2);
}

ibuf->r.wpos += n;



--
Tin

Digg this Post!Add Post to del.icio.usBookmark Post in TechnoratiFurl this Post!
Reply With Quote
Reply


Thread Tools
Display Modes

Posting Rules
You may not post new threads
You may not post replies
You may not post attachments
You may not edit your posts

vB code is On
Smilies are On
[IMG] code is On
HTML code is Off
Trackbacks are On
Pingbacks are On
Refbacks are On
Forum Jump


All times are GMT. The time now is 02:37 AM.


Powered by vBulletin® Version 3.6.5
Copyright ©2000 - 2008, Jelsoft Enterprises Ltd.
SEO by vBSEO 3.2.0
www.UnixAdminTalk.com