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