]> git.saurik.com Git - apple/network_cmds.git/blob - route.tproj/ccitt_addr.c
network_cmds-85.tar.gz
[apple/network_cmds.git] / route.tproj / ccitt_addr.c
1 /*
2 * Copyright (c) 1999 Apple Computer, Inc. All rights reserved.
3 *
4 * @APPLE_LICENSE_HEADER_START@
5 *
6 * "Portions Copyright (c) 1999 Apple Computer, Inc. All Rights
7 * Reserved. This file contains Original Code and/or Modifications of
8 * Original Code as defined in and that are subject to the Apple Public
9 * Source License Version 1.0 (the 'License'). You may not use this file
10 * except in compliance with the License. Please obtain a copy of the
11 * License at http://www.apple.com/publicsource and read it before using
12 * this file.
13 *
14 * The Original Code and all software distributed under the License are
15 * distributed on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER
16 * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
17 * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
18 * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT. Please see the
19 * License for the specific language governing rights and limitations
20 * under the License."
21 *
22 * @APPLE_LICENSE_HEADER_END@
23 */
24 /*
25 * Copyright (c) 1990, 1993
26 * The Regents of the University of California. All rights reserved.
27 *
28 * Redistribution and use in source and binary forms, with or without
29 * modification, are permitted provided that the following conditions
30 * are met:
31 * 1. Redistributions of source code must retain the above copyright
32 * notice, this list of conditions and the following disclaimer.
33 * 2. Redistributions in binary form must reproduce the above copyright
34 * notice, this list of conditions and the following disclaimer in the
35 * documentation and/or other materials provided with the distribution.
36 * 3. All advertising materials mentioning features or use of this software
37 * must display the following acknowledgement:
38 * This product includes software developed by the University of
39 * California, Berkeley and its contributors.
40 * 4. Neither the name of the University nor the names of its contributors
41 * may be used to endorse or promote products derived from this software
42 * without specific prior written permission.
43 *
44 * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
45 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
46 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
47 * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
48 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
49 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
50 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
51 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
52 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
53 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
54 * SUCH DAMAGE.
55 *
56 * @(#)ccitt_addr.c 8.2 (Berkeley) 4/28/95
57 */
58
59 /*
60 * parse CCITT addresses
61 *
62 * Addresses must have the format: [hpr],x121address[,userdata][,protocol]
63 * items enclosed with square brackets are optional
64 * 'h' or 'p' means hi priority (packet size = 128; specific to Datapac
65 * and necessary only for X.25(76) and non-negotiating X.25(80) DTE's)
66 * 'r' means reverse charge (remote DTE pays for call).
67 * The x121address consists of an optional netid and dot, followed
68 * by a dte address.
69 *
70 * Frank Pronk
71 * The University of British Columbia
72 * Laboratory for Computational Vision
73 * Copyright (c) 1984
74 */
75
76 #include <sys/types.h>
77 #include <sys/socket.h>
78 #include <bsd/netccitt/x25.h>
79
80 static char *copychar ();
81
82 ccitt_addr (addr, xp)
83 char *addr;
84 register struct sockaddr_x25 *xp;
85 {
86 register char *p, *ap, *limit;
87 int havenet = 0;
88
89 memset(xp, 0, sizeof (*xp));
90 xp->x25_family = AF_CCITT;
91 xp->x25_len = sizeof(*xp);
92 p = addr;
93
94 /*
95 * process optional priority and reverse charging flags
96 */
97
98 if (*p == 'p' || *p == 'r' || *p == 'h') {
99 while (*p == 'p' || *p == 'r' || *p == 'h') {
100 if (*p == 'p' || *p == 'h')
101 xp->x25_opts.op_psize = X25_PS128;
102 else if (*p == 'r')
103 xp->x25_opts.op_flags |= X25_REVERSE_CHARGE;
104 p++;
105 }
106 if (*p != ',')
107 return (0);
108 p++;
109 }
110 if (*p == '\0')
111 return (0);
112
113 /*
114 * [network id:]X.121 address
115 */
116
117 ap = xp->x25_addr;
118 limit = ap + sizeof (xp->x25_addr) - 1;
119 while (*p) {
120 if (*p == ',')
121 break;
122 if (*p == '.' || *p == ':') {
123 if (havenet)
124 return (0);
125 havenet++;
126 xp->x25_net = atoi (xp->x25_addr);
127 p++;
128 ap = xp->x25_addr;
129 *ap = '\0';
130 }
131 if (*p < '0' || *p > '9')
132 return (0);
133 if (ap >= limit)
134 return (0);
135 *ap++ = *p++;
136 }
137 if (*p == '\0')
138 return (1);
139
140 /*
141 * optional user data, bytes 4 to 16
142 */
143
144 p++;
145 ap = xp->x25_udata + 4; /* first four bytes are protocol id */
146 limit = ap + sizeof (xp->x25_udata) - 4;
147 xp->x25_udlen = 4;
148 while (*p) {
149 if (*p == ',')
150 break;
151 if (ap >= limit)
152 return (0);
153 p = copychar (p, ap++);
154 xp->x25_udlen++;
155 }
156 if (xp->x25_udlen == 4)
157 xp->x25_udlen = 0;
158 if (*p == '\0')
159 return (1);
160
161 p++;
162 ap = xp->x25_udata; /* protocol id */
163 limit = ap + (xp->x25_udlen ? 4 : sizeof(xp->x25_udata));
164 while (*p) {
165 if (*p == ',')
166 return (0);
167 if (ap >= limit)
168 return (0);
169 p = copychar (p, ap++);
170 }
171 if (xp->x25_udlen == 0)
172 xp->x25_udlen = ap - xp->x25_udata;
173 return (1);
174 }
175
176 static char *
177 copychar (from, to)
178 register char *from, *to;
179 {
180 register int n;
181
182 if (*from != '\\' || from[1] < '0' || from[1] > '7') {
183 *to = *from++;
184 return (from);
185 }
186 n = *++from - '0';
187 from++;
188 if (*from >= '0' && *from <= '7') {
189 register int n1;
190
191 n = n*8 + *from++ - '0';
192 if (*from >= '0' && *from <= '7' && (n1 = n*8 + *from-'0') < 256) {
193 n = n1;
194 from++;
195 }
196 }
197 *to = n;
198 return (from);
199 }