1*043fbe51Sderaadt /* $OpenBSD: loop.c,v 1.8 2009/10/27 23:59:52 deraadt Exp $ */
2e08c8b61Smaja
3bff609efSmaja /*
4bff609efSmaja * Copyright (c) 1993-95 Mats O Jansson. All rights reserved.
5bff609efSmaja *
6bff609efSmaja * Redistribution and use in source and binary forms, with or without
7bff609efSmaja * modification, are permitted provided that the following conditions
8bff609efSmaja * are met:
9bff609efSmaja * 1. Redistributions of source code must retain the above copyright
10bff609efSmaja * notice, this list of conditions and the following disclaimer.
11bff609efSmaja * 2. Redistributions in binary form must reproduce the above copyright
12bff609efSmaja * notice, this list of conditions and the following disclaimer in the
13bff609efSmaja * documentation and/or other materials provided with the distribution.
14bff609efSmaja *
15bff609efSmaja * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
16bff609efSmaja * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
17bff609efSmaja * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
18bff609efSmaja * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
19bff609efSmaja * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
20bff609efSmaja * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
21bff609efSmaja * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
22bff609efSmaja * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
23bff609efSmaja * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
24bff609efSmaja * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
25bff609efSmaja */
26bff609efSmaja
27bff609efSmaja #include "os.h"
28bff609efSmaja #include "common/common.h"
29bff609efSmaja #include "common/mopdef.h"
30bff609efSmaja
31bff609efSmaja /*
32bff609efSmaja * The list of all interfaces that are being listened to. loop()
33bff609efSmaja * "selects" on the descriptors in this list.
34bff609efSmaja */
35bff609efSmaja struct if_info *iflist;
36bff609efSmaja u_char buf[BUFSIZE];
37bff609efSmaja
38bff609efSmaja void mopProcess (/* struct if_info *, u_char * */);
39bff609efSmaja
40bff609efSmaja int
mopOpenRC(p,trans)41bff609efSmaja mopOpenRC(p, trans)
42bff609efSmaja struct if_info *p;
43bff609efSmaja int trans;
44bff609efSmaja {
45bff609efSmaja #ifndef NORC
46bff609efSmaja int fd;
47bff609efSmaja
48bff609efSmaja fd = (*(p->iopen))(p->if_name,
49bff609efSmaja O_RDWR,
50bff609efSmaja MOP_K_PROTO_RC,
51bff609efSmaja trans);
52bff609efSmaja if (fd >= 0) {
53bff609efSmaja pfAddMulti(fd, p->if_name, rc_mcst);
54bff609efSmaja pfEthAddr(fd, p->eaddr);
55bff609efSmaja }
56bff609efSmaja
57bff609efSmaja return fd;
58bff609efSmaja #else
59bff609efSmaja return -1;
60bff609efSmaja #endif
61bff609efSmaja }
62bff609efSmaja
63bff609efSmaja int
mopOpenDL(p,trans)64bff609efSmaja mopOpenDL(p, trans)
65bff609efSmaja struct if_info *p;
66bff609efSmaja int trans;
67bff609efSmaja {
68bff609efSmaja #ifndef NODL
69bff609efSmaja int fd;
70bff609efSmaja
71bff609efSmaja fd = (*(p->iopen))(p->if_name,
72bff609efSmaja O_RDWR,
73bff609efSmaja MOP_K_PROTO_DL,
74bff609efSmaja trans);
75bff609efSmaja if (fd >= 0) {
76bff609efSmaja pfAddMulti(fd, p->if_name, dl_mcst);
77bff609efSmaja pfEthAddr(fd, p->eaddr);
78bff609efSmaja }
79bff609efSmaja
80bff609efSmaja return fd;
81bff609efSmaja #else
82bff609efSmaja return -1;
83bff609efSmaja #endif
84bff609efSmaja }
85bff609efSmaja
86bff609efSmaja void
mopReadRC(p,fd)87bff609efSmaja mopReadRC(p, fd)
88bff609efSmaja struct if_info *p;
89bff609efSmaja int fd;
90bff609efSmaja {
91bff609efSmaja int cc;
92bff609efSmaja
93bff609efSmaja if ((cc = pfRead(fd, buf+HDRSIZ, BUFSIZE-HDRSIZ)) < 0) {
94bff609efSmaja return;
95bff609efSmaja }
96bff609efSmaja
97bff609efSmaja if (cc == 0)
98bff609efSmaja return;
99bff609efSmaja
100bff609efSmaja mopProcess(p, buf+HDRSIZ);
101bff609efSmaja
102bff609efSmaja return;
103bff609efSmaja }
104bff609efSmaja
105bff609efSmaja void
mopReadDL(p,fd)106bff609efSmaja mopReadDL(p, fd)
107bff609efSmaja struct if_info *p;
108bff609efSmaja int fd;
109bff609efSmaja {
110bff609efSmaja int cc;
111bff609efSmaja
112bff609efSmaja if ((cc = pfRead(fd, buf+HDRSIZ, BUFSIZE-HDRSIZ)) < 0) {
113bff609efSmaja return;
114bff609efSmaja }
115bff609efSmaja
116bff609efSmaja if (cc == 0)
117bff609efSmaja return;
118bff609efSmaja
119bff609efSmaja mopProcess(p, buf+HDRSIZ);
120bff609efSmaja
121bff609efSmaja return;
122bff609efSmaja }
123bff609efSmaja
124bff609efSmaja /*
125bff609efSmaja * Loop indefinitely listening for MOP requests on the
126bff609efSmaja * interfaces in 'iflist'.
127bff609efSmaja */
128bff609efSmaja void
Loop()129bff609efSmaja Loop()
130bff609efSmaja {
131bff609efSmaja fd_set fds, listeners;
132bff609efSmaja int maxfd = 0;
133bff609efSmaja struct if_info *ii;
134bff609efSmaja
135bff609efSmaja if (iflist == 0) {
136bff609efSmaja fprintf(stderr,"no interfaces");
137bff609efSmaja exit(0);
138bff609efSmaja }
139bff609efSmaja
140bff609efSmaja /*
141bff609efSmaja * Find the highest numbered file descriptor for select().
142bff609efSmaja * Initialize the set of descriptors to listen to.
143bff609efSmaja */
144bff609efSmaja FD_ZERO(&fds);
145bff609efSmaja for (ii = iflist; ii; ii = ii->next) {
146bff609efSmaja if (ii->fd != -1) {
147bff609efSmaja FD_SET(ii->fd, &fds);
148bff609efSmaja if (ii->fd > maxfd)
149bff609efSmaja maxfd = ii->fd;
150bff609efSmaja }
151bff609efSmaja }
152bff609efSmaja while (1) {
153bff609efSmaja listeners = fds;
1542a3385b9Sart if (select(maxfd + 1, &listeners, (fd_set *) 0,
1552a3385b9Sart (fd_set *) 0, (struct timeval *) 0) < 0) {
15699901d2cSderaadt fprintf(stderr, "select: %s", strerror(errno));
157bff609efSmaja exit(0);
158bff609efSmaja }
159bff609efSmaja for (ii = iflist; ii; ii = ii->next) {
160bff609efSmaja if (ii->fd != -1) {
161bff609efSmaja if (FD_ISSET(ii->fd, &listeners))
162bff609efSmaja (*(ii->read))(ii,ii->fd);
163bff609efSmaja }
164bff609efSmaja }
165bff609efSmaja }
166bff609efSmaja }
167bff609efSmaja
168bff609efSmaja
169bff609efSmaja
170bff609efSmaja
171bff609efSmaja
172