xref: /openbsd/usr.sbin/mopd/otherOS/loop.c (revision 043fbe51)
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