Change __signed to signed.
[dragonfly.git] / crypto / kerberosIV / lib / krb / lsb_addr_comp.c
1 /*
2  * Copyright (c) 1995, 1996, 1997 Kungliga Tekniska Högskolan
3  * (Royal Institute of Technology, Stockholm, Sweden).
4  * 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  * 
10  * 1. Redistributions of source code must retain the above copyright
11  *    notice, this list of conditions and the following disclaimer.
12  * 
13  * 2. Redistributions in binary form must reproduce the above copyright
14  *    notice, this list of conditions and the following disclaimer in the
15  *    documentation and/or other materials provided with the distribution.
16  * 
17  * 3. Neither the name of the Institute nor the names of its contributors
18  *    may be used to endorse or promote products derived from this software
19  *    without specific prior written permission.
20  * 
21  * THIS SOFTWARE IS PROVIDED BY THE INSTITUTE AND CONTRIBUTORS ``AS IS'' AND
22  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
23  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
24  * ARE DISCLAIMED.  IN NO EVENT SHALL THE INSTITUTE OR CONTRIBUTORS BE LIABLE
25  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
26  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
27  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
28  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
29  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
30  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
31  * SUCH DAMAGE.
32  */
33
34 #include "krb_locl.h"
35
36 RCSID("$Id: lsb_addr_comp.c,v 1.16 1999/12/02 16:58:42 joda Exp $");
37
38 #include "krb-archaeology.h"
39
40 int
41 krb_lsb_antinet_ulong_cmp(u_int32_t x, u_int32_t y)
42 {
43     int i;
44     u_int32_t a = 0, b = 0;
45     u_int8_t *p = (u_int8_t*) &x;
46     u_int8_t *q = (u_int8_t*) &y;
47
48     for(i = sizeof(u_int32_t) - 1; i >= 0; i--){
49         a = (a << 8) | p[i];
50         b = (b << 8) | q[i];
51     }
52     if(a > b)
53         return 1;
54     if(a < b)
55         return -1;
56     return 0;
57 }
58
59 int
60 krb_lsb_antinet_ushort_cmp(u_int16_t x, u_int16_t y)
61 {
62     int i;
63     u_int16_t a = 0, b = 0;
64     u_int8_t *p = (u_int8_t*) &x;
65     u_int8_t *q = (u_int8_t*) &y;
66
67     for(i = sizeof(u_int16_t) - 1; i >= 0; i--){
68         a = (a << 8) | p[i];
69         b = (b << 8) | q[i];
70     }
71     if(a > b)
72         return 1;
73     if(a < b)
74         return -1;
75     return 0;
76 }
77
78 u_int32_t
79 lsb_time(time_t t, struct sockaddr_in *src, struct sockaddr_in *dst)
80 {
81     int dir = 1;
82     const char *fw;
83
84     /*
85      * direction bit is the sign bit of the timestamp.  Ok until
86      * 2038??
87      */
88     if(krb_debug) {
89         krb_warning("lsb_time: src = %s:%u\n", 
90                     inet_ntoa(src->sin_addr), ntohs(src->sin_port));
91         krb_warning("lsb_time: dst = %s:%u\n", 
92                     inet_ntoa(dst->sin_addr), ntohs(dst->sin_port));
93     }
94
95     /* For compatibility with broken old code, compares are done in VAX 
96        byte order (LSBFIRST) */ 
97     if (krb_lsb_antinet_ulong_less(src->sin_addr.s_addr, /* src < recv */ 
98                                    dst->sin_addr.s_addr) < 0) 
99         dir = -1;
100     else if (krb_lsb_antinet_ulong_less(src->sin_addr.s_addr, 
101                                         dst->sin_addr.s_addr)==0) 
102         if (krb_lsb_antinet_ushort_less(src->sin_port, dst->sin_port) < 0)
103             dir = -1;
104     /*
105      * all that for one tiny bit!  Heaven help those that talk to
106      * themselves.
107      */
108     if(krb_get_config_bool("reverse_lsb_test")) {
109         if(krb_debug) 
110             krb_warning("lsb_time: reversing direction: %d -> %d\n", dir, -dir);
111         dir = -dir;
112     }else if((fw = krb_get_config_string("firewall_address"))) {
113         struct in_addr fw_addr;
114         fw_addr.s_addr = inet_addr(fw);
115         if(fw_addr.s_addr != INADDR_NONE) {
116             int s_lt_d, d_lt_f;
117             krb_warning("lsb_time: fw = %s\n", inet_ntoa(fw_addr));
118             /* negate if src < dst < fw || fw < dst < src */
119             s_lt_d = (krb_lsb_antinet_ulong_less(src->sin_addr.s_addr,
120                                                  dst->sin_addr.s_addr) == -1);
121             d_lt_f = (krb_lsb_antinet_ulong_less(fw_addr.s_addr,
122                                                  dst->sin_addr.s_addr) == 1);
123             if((s_lt_d ^ d_lt_f) == 0) {
124                 if(krb_debug) 
125                     krb_warning("lsb_time: reversing direction: %d -> %d\n", 
126                                 dir, -dir);
127                 dir = -dir;
128             }
129         }
130     }
131     t = t * dir;
132     t = t & 0xffffffff;
133     return t;
134 }