fix_options.c revision 1.2 1 /*
2 * Routine to disable IP-level socket options. This code was taken from 4.4BSD
3 * rlogind source, but all mistakes in it are my fault.
4 *
5 * Author: Wietse Venema, Eindhoven University of Technology, The Netherlands.
6 */
7
8 #ifndef lint
9 static char sccsid[] = "@(#) fix_options.c 1.3 94/12/28 17:42:22";
10 #endif
11
12 #include <sys/types.h>
13 #include <sys/param.h>
14 #include <netinet/in.h>
15 #include <netdb.h>
16 #include <stdio.h>
17 #include <syslog.h>
18
19 #include "tcpd.h"
20
21 /* fix_options - get rid of IP-level socket options */
22
23 fix_options(request)
24 struct request_info *request;
25 {
26 #ifdef IP_OPTIONS
27 unsigned char optbuf[BUFSIZ / 3], *cp;
28 char lbuf[BUFSIZ], *lp;
29 int optsize = sizeof(optbuf), ipproto;
30 struct protoent *ip;
31 int fd = request->fd;
32 int len = sizeof lbuf;
33
34 if ((ip = getprotobyname("ip")) != 0)
35 ipproto = ip->p_proto;
36 else
37 ipproto = IPPROTO_IP;
38
39 if (getsockopt(fd, ipproto, IP_OPTIONS, (char *) optbuf, &optsize) == 0
40 && optsize != 0) {
41 lp = lbuf;
42 for (cp = optbuf; optsize > 0; cp++, optsize--, lp += 3)
43 len -= snprintf(lp, len, " %2.2x", *cp);
44 syslog(LOG_NOTICE,
45 "connect from %s with IP options (ignored):%s",
46 eval_client(request), lbuf);
47 if (setsockopt(fd, ipproto, IP_OPTIONS, (char *) 0, optsize) != 0) {
48 syslog(LOG_ERR, "setsockopt IP_OPTIONS NULL: %m");
49 clean_exit(request);
50 }
51 }
52 #endif
53 }
54