On 2014/05/20 16:41, viq wrote:
> I encountered a strange problem when trying to communicate with net/ipcad:
> 
> rsh localhost stats
> rsh: poll: Undefined error: 0
> 
> Same thing on 5.1:
> rsh localhost stats
> connect to address ::1: Connection refused
> Trying 127.0.0.1...
> Interface vlan123: received 585816944, 5 m average 313 bytes/sec, 4
> pkts/sec, dropped 6078
> Flow entries made: 583
> Memory usage: 6% (65296 from 1048576)
> Free slots for rsh clients: 9
> IPCAD uptime is 159 days  7:04
> fw.example.com uptime is 159 days  7:04
> 
> According to sthen@ this also works fine on 5.4 and he suspects
> breakage due to time_t changes. He also provided simple sample config
> http://pbot.rmdir.de/iFGRSOehzxnZ1flTJqum5Q because he's awesome like
> that ;)
> 
> kern.version=OpenBSD 5.5 (GENERIC.MP) #0: Fri Apr 25 13:03:34 CEST 2014
>     
> r...@stable-55-amd64.mtier.org:/binpatchng/work-binpatch55-amd64/src/sys/arch/amd64/compile/GENERIC.MP
> ipcad-3.7.3p1
> -- 
> viq
> 

Note that ipcad listens on port 514 and provides *its own* cisco-ish
rshell interface that you connect to, this isn't about openbsd rshd.

Sample config inline at the bottom of this mail. (the pastebin above
was just meant for when I was talking about this on irc - it will expire).

The error is coming from /usr/src/usr.bin/rsh/rsh.c:243 and since
nothing changed here in many years, I'm wondering if there's anything
up with poll(2). (If it's a direct bug with rsh, well, that's "fixed"
a different way in -current)..

230         sigprocmask(SIG_SETMASK, omask, NULL);
231         pfd[1].fd = rfd2;
232         pfd[1].events = POLLIN;
233         pfd[0].fd = rem;
234         pfd[0].events = POLLIN;
235         do {
236                 if (poll(pfd, 2, INFTIM) < 0) {
237                         if (errno != EINTR)
238                                 err(1, "poll");
239                         continue;
240                 }
241                 if ((pfd[0].revents & (POLLERR|POLLHUP|POLLNVAL)) ||
242                     (pfd[1].revents & (POLLERR|POLLHUP|POLLNVAL)))
>> 243                      err(1, "poll");
244                 if (pfd[1].revents & POLLIN) {
245                         errno = 0;
246                         cc = read(rfd2, buf, sizeof buf);
247                         if (cc <= 0) {
248                                 if (errno != EWOULDBLOCK)
249                                         pfd[1].revents = 0;
250                         } else
251                                 (void)write(STDERR_FILENO, buf, cc);
252                 }
253                 if (pfd[0].revents & POLLIN) {
254                         errno = 0;
255                         cc = read(rem, buf, sizeof buf);
256                         if (cc <= 0) {
257                                 if (errno != EWOULDBLOCK)
258                                         pfd[0].revents = 0;
259                         } else
260                                 (void)write(STDOUT_FILENO, buf, cc);
261                 }
262         } while ((pfd[0].revents & POLLIN) || (pfd[1].revents & POLLIN));

===
capture-ports disable;
interface em0;
rsh enable at 127.0.0.1;
rsh root@127.0.0.1 admin;
rsh 127.0.0.1;
rsh ttl = 3;
rsh timeout = 30;
dumpfile = ipcad.dump;
chroot = /var/ipcad;
pidfile = ipcad.pid;
memory_limit = 1m;

Reply via email to