1 /*        $NetBSD: optprint.c,v 1.2 2012/07/22 14:27:36 darrenr Exp $ */
2 
3 /*
4  * Copyright (C) 2012 by Darren Reed.
5  *
6  * See the IPFILTER.LICENCE file for details on licencing.
7  *
8  * Id: optprint.c,v 1.1.1.2 2012/07/22 13:44:39 darrenr Exp $
9  */
10 #include "ipf.h"
11 
12 
optprint(sec,optmsk,optbits)13 void optprint(sec, optmsk, optbits)
14           u_short *sec;
15           u_long optmsk, optbits;
16 {
17           u_short secmsk = sec[0], secbits = sec[1];
18           struct ipopt_names *io, *so;
19           char *s;
20 
21           s = " opt ";
22           for (io = ionames; io->on_name; io++)
23                     if ((io->on_bit & optmsk) &&
24                         ((io->on_bit & optmsk) == (io->on_bit & optbits))) {
25                               if ((io->on_value != IPOPT_SECURITY) ||
26                                   (!secmsk && !secbits)) {
27                                         printf("%s%s", s, io->on_name);
28                                         /*
29                                          * Because the ionames table has this entry
30                                          * twice.
31                                          */
32                                         if (io->on_value == IPOPT_SECURITY)
33                                                   io++;
34                                         s = ",";
35                               }
36                     }
37 
38 
39           if (secmsk & secbits) {
40                     printf("%ssec-class", s);
41                     s = " ";
42                     for (so = secclass; so->on_name; so++)
43                               if ((secmsk & so->on_bit) &&
44                                   ((so->on_bit & secmsk) == (so->on_bit & secbits))) {
45                                         printf("%s%s", s, so->on_name);
46                                         s = ",";
47                               }
48           }
49 
50           if ((optmsk && (optmsk != optbits)) ||
51               (secmsk && (secmsk != secbits))) {
52                     s = " ";
53                     printf(" not opt");
54                     if (optmsk != optbits) {
55                               for (io = ionames; io->on_name; io++)
56                                         if ((io->on_bit & optmsk) &&
57                                             ((io->on_bit & optmsk) !=
58                                              (io->on_bit & optbits))) {
59                                                   if ((io->on_value != IPOPT_SECURITY) ||
60                                                       (!secmsk && !secbits)) {
61                                                             printf("%s%s", s, io->on_name);
62                                                             s = ",";
63                                                             if (io->on_value ==
64                                                                 IPOPT_SECURITY)
65                                                                       io++;
66                                                   } else
67                                                             io++;
68                                         }
69                     }
70 
71                     if (secmsk != secbits) {
72                               printf("%ssec-class", s);
73                               s = " ";
74                               for (so = secclass; so->on_name; so++)
75                                         if ((so->on_bit & secmsk) &&
76                                             ((so->on_bit & secmsk) !=
77                                              (so->on_bit & secbits))) {
78                                                   printf("%s%s", s, so->on_name);
79                                                   s = ",";
80                                         }
81                     }
82           }
83 }
84