Initial import from FreeBSD RELENG_4:
[dragonfly.git] / contrib / isc-dhcp / omapip / convert.c
1 /* convert.c
2
3    Safe copying of option values into and out of the option buffer, which
4    can't be assumed to be aligned. */
5
6 /*
7  * Copyright (c) 1996-1999 Internet Software Consortium.
8  * All rights reserved.
9  *
10  * Redistribution and use in source and binary forms, with or without
11  * modification, are permitted provided that the following conditions
12  * are met:
13  *
14  * 1. Redistributions of source code must retain the above copyright
15  *    notice, this list of conditions and the following disclaimer.
16  * 2. Redistributions in binary form must reproduce the above copyright
17  *    notice, this list of conditions and the following disclaimer in the
18  *    documentation and/or other materials provided with the distribution.
19  * 3. Neither the name of The Internet Software Consortium nor the names
20  *    of its contributors may be used to endorse or promote products derived
21  *    from this software without specific prior written permission.
22  *
23  * THIS SOFTWARE IS PROVIDED BY THE INTERNET SOFTWARE CONSORTIUM AND
24  * CONTRIBUTORS ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES,
25  * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
26  * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
27  * DISCLAIMED.  IN NO EVENT SHALL THE INTERNET SOFTWARE CONSORTIUM OR
28  * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
29  * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
30  * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
31  * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
32  * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
33  * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
34  * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
35  * SUCH DAMAGE.
36  *
37  * This software has been written for the Internet Software Consortium
38  * by Ted Lemon in cooperation with Vixie Enterprises and Nominum, Inc.
39  * To learn more about the Internet Software Consortium, see
40  * ``http://www.isc.org/''.  To learn more about Vixie Enterprises,
41  * see ``http://www.vix.com''.   To learn more about Nominum, Inc., see
42  * ``http://www.nominum.com''.
43  */
44
45 #ifndef lint
46 static char copyright[] =
47 "$Id: convert.c,v 1.1.2.1 2002/04/27 05:35:20 murray Exp $ Copyright (c) 1996-1999 The Internet Software Consortium.  All rights reserved.\n";
48 #endif /* not lint */
49
50 #include <omapip/omapip_p.h>
51
52 u_int32_t getULong (buf)
53         const unsigned char *buf;
54 {
55         u_int32_t ibuf;
56
57         memcpy (&ibuf, buf, sizeof (u_int32_t));
58         return ntohl (ibuf);
59 }
60
61 int32_t getLong (buf)
62         const unsigned char *buf;
63 {
64         int32_t ibuf;
65
66         memcpy (&ibuf, buf, sizeof (int32_t));
67         return ntohl (ibuf);
68 }
69
70 u_int32_t getUShort (buf)
71         const unsigned char *buf;
72 {
73         unsigned short ibuf;
74
75         memcpy (&ibuf, buf, sizeof (u_int16_t));
76         return ntohs (ibuf);
77 }
78
79 int32_t getShort (buf)
80         const unsigned char *buf;
81 {
82         short ibuf;
83
84         memcpy (&ibuf, buf, sizeof (int16_t));
85         return ntohs (ibuf);
86 }
87
88 void putULong (obuf, val)
89         unsigned char *obuf;
90         u_int32_t val;
91 {
92         u_int32_t tmp = htonl (val);
93         memcpy (obuf, &tmp, sizeof tmp);
94 }
95
96 void putLong (obuf, val)
97         unsigned char *obuf;
98         int32_t val;
99 {
100         int32_t tmp = htonl (val);
101         memcpy (obuf, &tmp, sizeof tmp);
102 }
103
104 void putUShort (obuf, val)
105         unsigned char *obuf;
106         u_int32_t val;
107 {
108         u_int16_t tmp = htons (val);
109         memcpy (obuf, &tmp, sizeof tmp);
110 }
111
112 void putShort (obuf, val)
113         unsigned char *obuf;
114         int32_t val;
115 {
116         int16_t tmp = htons (val);
117         memcpy (obuf, &tmp, sizeof tmp);
118 }
119
120 void putUChar (obuf, val)
121         unsigned char *obuf;
122         u_int32_t val;
123 {
124         *obuf = val;
125 }
126
127 u_int32_t getUChar (obuf)
128         const unsigned char *obuf;
129 {
130         return obuf [0];
131 }
132
133 int converted_length (buf, base, width)
134         const unsigned char *buf;
135         unsigned int base;
136         unsigned int width;
137 {
138         u_int32_t number;
139         u_int32_t column;
140         int power = 1;
141         u_int32_t newcolumn = base;
142
143         if (base > 16)
144                 return 0;
145
146         if (width == 1)
147                 number = getUChar (buf);
148         else if (width == 2)
149                 number = getUShort (buf);
150         else if (width == 4)
151                 number = getULong (buf);
152
153         do {
154                 column = newcolumn;
155
156                 if (number < column)
157                         return power;
158                 power++;
159                 newcolumn = column * base;
160                 /* If we wrap around, it must be the next power of two up. */
161         } while (newcolumn > column);
162
163         return power;
164 }
165
166 int binary_to_ascii (outbuf, inbuf, base, width)
167         unsigned char *outbuf;
168         const unsigned char *inbuf;
169         unsigned int base;
170         unsigned int width;
171 {
172         u_int32_t number;
173         static char h2a [] = "0123456789abcdef";
174         int power = converted_length (inbuf, base, width);
175         int i, j;
176
177         if (base > 16)
178                 return 0;
179
180         if (width == 1)
181                 number = getUChar (inbuf);
182         else if (width == 2)
183                 number = getUShort (inbuf);
184         else if (width == 4)
185                 number = getULong (inbuf);
186
187         for (i = power - 1 ; i >= 0; i--) {
188                 outbuf [i] = h2a [number % base];
189                 number /= base;
190         }
191
192         return power;
193 }