source: rtems/cpukit/libnetworking/libc/linkaddr.c @ cb2f320

4.104.114.84.9
Last change on this file since cb2f320 was cb2f320, checked in by Joel Sherrill <joel.sherrill@…>, on Mar 5, 2004 at 6:02:41 PM

2004-03-05 Joel Sherrill <joel@…>

  • libblock/src/bdbuf.c, libblock/src/ramdisk.c, libcsupport/src/newlibc.c, libcsupport/src/sync.c, libmisc/cpuuse/cpuuse.c, libmisc/monitor/mon-symbols.c, libmisc/shell/cmds.c, libmisc/shell/shell.c, libnetworking/kern/kern_sysctl.c, libnetworking/lib/ftpfs.c, libnetworking/lib/tftpDriver.c, libnetworking/libc/gethostbydns.c, libnetworking/libc/gethostbyht.c, libnetworking/libc/gethostnamadr.c, libnetworking/libc/getnetbyht.c, libnetworking/libc/getnetnamadr.c, libnetworking/libc/inet_addr.c, libnetworking/libc/linkaddr.c, libnetworking/libc/map_v4v6.c, libnetworking/libc/ns_print.c, libnetworking/libc/ns_ttl.c, libnetworking/libc/nsap_addr.c, libnetworking/libc/rcmd.c, libnetworking/libc/res_debug.c, libnetworking/libc/res_mkupdate.c, libnetworking/libc/res_query.c, libnetworking/libc/res_send.c, libnetworking/libc/res_update.c, libnetworking/net/radix.c, libnetworking/rtems/mkrootfs.c, librpc/src/rpc/clnt_perror.c, librpc/src/rpc/svc.c, score/macros/rtems/score/chain.inl, score/src/objectidtoname.c: Too much was accidentally committed -- revert.
  • Property mode set to 100644
File size: 4.4 KB
Line 
1/*-
2 * Copyright (c) 1990, 1993
3 *      The Regents of the University of California.  All rights reserved.
4 *
5 * Redistribution and use in source and binary forms, with or without
6 * modification, are permitted provided that the following conditions
7 * are met:
8 * 1. Redistributions of source code must retain the above copyright
9 *    notice, this list of conditions and the following disclaimer.
10 * 2. Redistributions in binary form must reproduce the above copyright
11 *    notice, this list of conditions and the following disclaimer in the
12 *    documentation and/or other materials provided with the distribution.
13 * 3. All advertising materials mentioning features or use of this software
14 *    must display the following acknowledgement:
15 *      This product includes software developed by the University of
16 *      California, Berkeley and its contributors.
17 * 4. Neither the name of the University 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 REGENTS 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 REGENTS 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 *  $Id$
34 */
35
36#if defined(LIBC_SCCS) && !defined(lint)
37static char sccsid[] = "@(#)linkaddr.c  8.1 (Berkeley) 6/4/93";
38#endif /* LIBC_SCCS and not lint */
39
40#include <sys/types.h>
41#include <sys/socket.h>
42#include <net/if_dl.h>
43#include <string.h>
44
45/* States*/
46#define NAMING  0
47#define GOTONE  1
48#define GOTTWO  2
49#define RESET   3
50/* Inputs */
51#define DIGIT   (4*0)
52#define END     (4*1)
53#define DELIM   (4*2)
54#define LETTER  (4*3)
55
56void
57link_addr(addr, sdl)
58        register const char *addr;
59        register struct sockaddr_dl *sdl;
60{
61        register char *cp = sdl->sdl_data;
62        char *cplim = sdl->sdl_len + (char *)sdl;
63        register int byte = 0, state = NAMING,
64                new=0; /* new=0 to avoid warning */
65
66        bzero((char *)&sdl->sdl_family, sdl->sdl_len - 1);
67        sdl->sdl_family = AF_LINK;
68        do {
69                state &= ~LETTER;
70                if ((*addr >= '0') && (*addr <= '9')) {
71                        new = *addr - '0';
72                } else if ((*addr >= 'a') && (*addr <= 'f')) {
73                        new = *addr - 'a' + 10;
74                } else if ((*addr >= 'A') && (*addr <= 'F')) {
75                        new = *addr - 'A' + 10;
76                } else if (*addr == 0) {
77                        state |= END;
78                } else if (state == NAMING &&
79                           (((*addr >= 'A') && (*addr <= 'Z')) ||
80                           ((*addr >= 'a') && (*addr <= 'z'))))
81                        state |= LETTER;
82                else
83                        state |= DELIM;
84                addr++;
85                switch (state /* | INPUT */) {
86                case NAMING | DIGIT:
87                case NAMING | LETTER:
88                        *cp++ = addr[-1];
89                        continue;
90                case NAMING | DELIM:
91                        state = RESET;
92                        sdl->sdl_nlen = cp - sdl->sdl_data;
93                        continue;
94                case GOTTWO | DIGIT:
95                        *cp++ = byte;
96                        /* FALLTHROUGH */
97                case RESET | DIGIT:
98                        state = GOTONE;
99                        byte = new;
100                        continue;
101                case GOTONE | DIGIT:
102                        state = GOTTWO;
103                        byte = new + (byte << 4);
104                        continue;
105                default: /* | DELIM */
106                        state = RESET;
107                        *cp++ = byte;
108                        byte = 0;
109                        continue;
110                case GOTONE | END:
111                case GOTTWO | END:
112                        *cp++ = byte;
113                        /* FALLTHROUGH */
114                case RESET | END:
115                        break;
116                }
117                break;
118        } while (cp < cplim);
119        sdl->sdl_alen = cp - LLADDR(sdl);
120        new = cp - (char *)sdl;
121        if (new > sizeof(*sdl))
122                sdl->sdl_len = new;
123        return;
124}
125
126static char hexlist[] = "0123456789abcdef";
127
128char *
129link_ntoa(sdl)
130        register const struct sockaddr_dl *sdl;
131{
132        static char obuf[64];
133        register char *out = obuf;
134        register int i;
135        register u_char *in = (u_char *)LLADDR(sdl);
136        u_char *inlim = in + sdl->sdl_alen;
137        int firsttime = 1;
138
139        if (sdl->sdl_nlen) {
140                bcopy(sdl->sdl_data, obuf, sdl->sdl_nlen);
141                out += sdl->sdl_nlen;
142                if (sdl->sdl_alen)
143                        *out++ = ':';
144        }
145        while (in < inlim) {
146                if (firsttime)
147                        firsttime = 0;
148                else
149                        *out++ = '.';
150                i = *in++;
151                if (i > 0xf) {
152                        out[1] = hexlist[i & 0xf];
153                        i >>= 4;
154                        out[0] = hexlist[i];
155                        out += 2;
156                } else
157                        *out++ = hexlist[i];
158        }
159        *out = 0;
160        return (obuf);
161}
Note: See TracBrowser for help on using the repository browser.