loop-linux2.c revision 1.7
1/*
2 * Copyright (c) 1993-95 Mats O Jansson.  All rights reserved.
3 *
4 * Redistribution and use in source and binary forms, with or without
5 * modification, are permitted provided that the following conditions
6 * are met:
7 * 1. Redistributions of source code must retain the above copyright
8 *    notice, this list of conditions and the following disclaimer.
9 * 2. Redistributions in binary form must reproduce the above copyright
10 *    notice, this list of conditions and the following disclaimer in the
11 *    documentation and/or other materials provided with the distribution.
12 *
13 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
14 * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
15 * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
16 * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
17 * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
18 * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
19 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
20 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
21 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
22 * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
23 */
24
25#include <errno.h>
26#include <stdlib.h>
27#include <strings.h>
28#include <unistd.h>
29#if defined(__bsdi__) || defined(__FreeBSD__)
30#include <sys/time.h>
31#endif
32#include <sys/ioctl.h>
33
34#include "os.h"
35#include "common/common.h"
36#include "common/mopdef.h"
37
38int
39mopOpenRC(p, trans)
40	struct if_info *p;
41	int	trans;
42{
43#ifndef NORC
44	return (*(p->iopen))(p->if_name,
45			     O_RDWR,
46			     MOP_K_PROTO_RC,
47			     trans);
48#else
49	return -1;
50#endif
51}
52
53int
54mopOpenDL(p, trans)
55	struct if_info *p;
56	int	trans;
57{
58#ifndef NODL
59	return (*(p->iopen))(p->if_name,
60			     O_RDWR,
61			     MOP_K_PROTO_DL,
62			     trans);
63#else
64	return -1;
65#endif
66}
67
68void
69mopReadRC()
70{
71}
72
73void
74mopReadDL()
75{
76}
77
78/*
79 * The list of all interfaces that are being listened to.  loop()
80 * "selects" on the descriptors in this list.
81 */
82struct if_info *iflist;
83
84void   mopProcess(struct if_info *, u_char *);
85
86/*
87 * Loop indefinitely listening for MOP requests on the
88 * interfaces in 'iflist'.
89 */
90void
91Loop()
92{
93	u_char *buf, *bp, *ep;
94	int     cc;
95	fd_set  fds, listeners;
96	int     bufsize = 1100, maxfd =0;
97	struct if_info *ii;
98
99/* FIXME : this is a hack, for some reason specifying an interface would
100 * cause it to fail because bufsize is an impossible number, so I added a
101 * sanity check because I'm too lazy to figure out why. -- Karl
102 */
103	if (bufsize > 1100)
104	 	bufsize = 64;
105
106	if (iflist == 0) {
107		syslog(LOG_ERR, "no interfaces");
108		exit(0);
109	}
110
111	 buf = (u_char *) malloc((unsigned) bufsize);
112
113	if (buf == 0) {
114		syslog(LOG_ERR, "malloc: %m");
115		exit(0);
116	}
117	/*
118         * Find the highest numbered file descriptor for select().
119         * Initialize the set of descriptors to listen to.
120         */
121	FD_ZERO(&fds);
122	for (ii = iflist; ii; ii = ii->next) {
123		if (ii->fd != -1) {
124			FD_SET(ii->fd, &fds);
125			if (ii->fd > maxfd)
126				maxfd = ii->fd;
127	        }
128	}
129	while (1) {
130		listeners = fds;
131		if (select(maxfd + 1, &listeners, (fd_set *) 0,
132			(fd_set *) 0, (struct timeval *) 0) < 0) {
133			syslog(LOG_ERR, "select: %m");
134			exit(0);
135		}
136		for (ii = iflist; ii; ii = ii->next) {
137			if (ii->fd != -1) {
138				if (!FD_ISSET(ii->fd, &listeners))
139					continue;
140			}
141	again:
142			cc = read(ii->fd, (char *) buf, bufsize);
143			/* Don't choke when we get ptraced */
144			if (cc < 0 && errno == EINTR)
145				goto again;
146
147			bp = buf;
148			ep = bp + cc;
149
150if(bp < ep)
151	{
152	mopProcess(ii,buf);
153	}
154
155}
156
157}
158}
159
160