Annotation of embedaddon/libnet/src/libnet_link_snit.c, revision 1.1

1.1     ! misho       1: /*
        !             2:  *  $Id: libnet_link_snit.c,v 1.6 2004/01/03 20:31:02 mike Exp $
        !             3:  *
        !             4:  *  libnet
        !             5:  *  libnet_snit.c - snit routines
        !             6:  *
        !             7:  *  Copyright (c) 1998 - 2004 Mike D. Schiffman <mike@infonexus.com>
        !             8:  *  All rights reserved.
        !             9:  *
        !            10:  * Copyright (c) 1990, 1991, 1992, 1993, 1994, 1995, 1996
        !            11:  *     The Regents of the University of California.  All rights reserved.
        !            12:  *
        !            13:  * Redistribution and use in source and binary forms, with or without
        !            14:  * modification, are permitted provided that: (1) source code distributions
        !            15:  * retain the above copyright notice and this paragraph in its entirety, (2)
        !            16:  * distributions including binary code include the above copyright notice and
        !            17:  * this paragraph in its entirety in the documentation or other materials
        !            18:  * provided with the distribution, and (3) all advertising materials mentioning
        !            19:  * features or use of this software display the following acknowledgement:
        !            20:  * ``This product includes software developed by the University of California,
        !            21:  * Lawrence Berkeley Laboratory and its contributors.'' Neither the name of
        !            22:  * the University nor the names of its contributors may be used to endorse
        !            23:  * or promote products derived from this software without specific prior
        !            24:  * written permission.
        !            25:  * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR IMPLIED
        !            26:  * WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED WARRANTIES OF
        !            27:  * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
        !            28:  *
        !            29:  * Modifications made to accommodate the new SunOS4.0 NIT facility by
        !            30:  * Micky Liu, micky@cunixc.cc.columbia.edu, Columbia University in May, 1989.
        !            31:  * This module now handles the STREAMS based NIT.
        !            32:  */
        !            33: 
        !            34: #if (HAVE_CONFIG_H)
        !            35: #include "../include/config.h"
        !            36: #endif
        !            37: #if (!(_WIN32) || (__CYGWIN__)) 
        !            38: #include "../include/libnet.h"
        !            39: #else
        !            40: #include "../include/win32/libnet.h"
        !            41: #endif
        !            42: #include "../include/gnuc.h"
        !            43: #ifdef HAVE_OS_PROTO_H
        !            44: #include "../include/os-proto.h"
        !            45: #endif
        !            46: 
        !            47: 
        !            48: struct libnet_link_int *
        !            49: libnet_open_link_interface(int8_t *device, int8_t *ebuf)
        !            50: {
        !            51:     struct strioctl si;            /* struct for ioctl() */
        !            52:     struct ifreq ifr;       /* interface request struct */
        !            53:     static int8_t dev[] = "/dev/nit";
        !            54:     register struct libnet_link_int *l;
        !            55: 
        !            56:     l = (struct libnet_link_int *)malloc(sizeof(*l));
        !            57:     if (l == NULL)
        !            58:     {
        !            59:         strcpy(ebuf, strerror(errno));
        !            60:         return (NULL);
        !            61:     }
        !            62: 
        !            63:     memset(l, 0, sizeof(*l));
        !            64: 
        !            65:     l->fd  = open(dev, O_RDWR);
        !            66:     if (l->fd < 0)
        !            67:     {
        !            68:         sprintf(ebuf, "%s: %s", dev, strerror(errno));
        !            69:         goto bad;
        !            70:     }
        !            71: 
        !            72:     /*
        !            73:      *  arrange to get discrete messages from the STREAM and use NIT_BUF
        !            74:      */
        !            75:     if (ioctl(l->fd, I_SRDOPT, (int8_t *)RMSGD) < 0)
        !            76:     {
        !            77:         sprintf(ebuf, "I_SRDOPT: %s", strerror(errno));
        !            78:         goto bad;
        !            79:     }
        !            80:     if (ioctl(l->fd, I_PUSH, "nbuf") < 0)
        !            81:     {
        !            82:         sprintf(ebuf, "push nbuf: %s", strerror(errno));
        !            83:         goto bad;
        !            84:     }
        !            85:     /*
        !            86:      *  request the interface
        !            87:      */
        !            88:     strncpy(ifr.ifr_name, device, sizeof(ifr.ifr_name) -1);
        !            89:     ifr.ifr_name[sizeof(ifr.ifr_name) - 1] = '\0';
        !            90:     si.ic_cmd = NIOCBIND;
        !            91:     si.ic_len = sizeof(ifr);
        !            92:     si.ic_dp = (int8_t *)&ifr;
        !            93:     if (ioctl(l->fd, I_STR, (int8_t *)&si) < 0)
        !            94:     {
        !            95:         sprintf(ebuf, "NIOCBIND: %s: %s", ifr.ifr_name, strerror(errno));
        !            96:         goto bad;
        !            97:     }
        !            98: 
        !            99:     ioctl(l->fd, I_FLUSH, (int8_t *)FLUSHR);
        !           100:     /*
        !           101:      * NIT supports only ethernets.
        !           102:      */
        !           103:     l->linktype = DLT_EN10MB;
        !           104: 
        !           105:     return (l);
        !           106: bad:
        !           107:     if (l->fd >= 0)
        !           108:     {
        !           109:         close(l->fd);
        !           110:     }
        !           111:     free(l);
        !           112:     return (NULL);
        !           113: }
        !           114: 
        !           115: 
        !           116: int
        !           117: libnet_close_link_interface(struct libnet_link_int *l)
        !           118: {
        !           119:     if (close(l->fd) == 0)
        !           120:     {
        !           121:         free(l);
        !           122:         return (1);
        !           123:     }
        !           124:     else
        !           125:     {
        !           126:         free(l);
        !           127:         return (-1);
        !           128:     }
        !           129: }
        !           130: 
        !           131: 
        !           132: int
        !           133: libnet_write_link_layer(struct libnet_link_int *l, const int8_t *device,
        !           134:             const u_int8_t *buf, int len)
        !           135: {
        !           136:     int c;
        !           137:     struct sockaddr sa;
        !           138: 
        !           139:     memset(&sa, 0, sizeof(sa));
        !           140:     strncpy(sa.sa_data, device, sizeof(sa.sa_data));
        !           141: 
        !           142:     c = sendto(l->fd, buf, len, 0, &sa, sizeof(sa));
        !           143:     if (c != len)
        !           144:     {
        !           145:         /* err */
        !           146:         return (-1);
        !           147:     }
        !           148:     return (c);
        !           149: }

FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>