Annotation of embedaddon/libnet/src/libnet_link_nit.c, revision 1.1
1.1 ! misho 1: /*
! 2: * $Id: libnet_link_nit.c,v 1.6 2004/01/03 20:31:02 mike Exp $
! 3: *
! 4: * libnet
! 5: * libnet_nit.c - network interface tap 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:
! 30: #if (HAVE_CONFIG_H)
! 31: #include "../include/config.h"
! 32: #endif
! 33: #if (!(_WIN32) || (__CYGWIN__))
! 34: #include "../include/libnet.h"
! 35: #else
! 36: #include "../include/win32/libnet.h"
! 37: #endif
! 38:
! 39: #include "../include/gnuc.h"
! 40: #ifdef HAVE_OS_PROTO_H
! 41: #include "../include/os-proto.h"
! 42: #endif
! 43:
! 44: struct libnet_link_int *
! 45: libnet_open_link_interface(int8_t *device, int8_t *ebuf)
! 46: {
! 47: struct sockaddr_nit snit;
! 48: register struct libnet_link_int *l;
! 49:
! 50: l = (struct libnet_link_int *)malloc(sizeof(*p));
! 51: if (l == NULL)
! 52: {
! 53: strcpy(ebuf, strerror(errno));
! 54: return (NULL);
! 55: }
! 56:
! 57: memset(l, 0, sizeof(*l));
! 58:
! 59: l->fd = socket(AF_NIT, SOCK_RAW, NITPROTO_RAW);
! 60: if (l->fd < 0)
! 61: {
! 62: sprintf(ebuf, "socket: %s", strerror(errno));
! 63: goto bad;
! 64: }
! 65: snit.snit_family = AF_NIT;
! 66: strncpy(snit.snit_ifname, device, NITIFSIZ -1);
! 67: snit.snit_ifname[NITIFSIZ] = '\0';
! 68:
! 69: if (bind(l->fd, (struct sockaddr *)&snit, sizeof(snit)))
! 70: {
! 71: sprintf(ebuf, "bind: %s: %s", snit.snit_ifname, strerror(errno));
! 72: goto bad;
! 73: }
! 74:
! 75: /*
! 76: * NIT supports only ethernets.
! 77: */
! 78: l->linktype = DLT_EN10MB;
! 79:
! 80: return (l);
! 81:
! 82: bad:
! 83: if (l->fd >= 0)
! 84: {
! 85: close(l->fd);
! 86: }
! 87: free(l);
! 88: return (NULL);
! 89: }
! 90:
! 91:
! 92: int
! 93: libnet_close_link_interface(struct libnet_link_int *l)
! 94: {
! 95: if (close(l->fd) == 0)
! 96: {
! 97: free(l);
! 98: return (1);
! 99: }
! 100: else
! 101: {
! 102: free(l);
! 103: return (-1);
! 104: }
! 105: }
! 106:
! 107:
! 108: int
! 109: write_link_layer(struct libnet_link_int *l, const int8_t *device,
! 110: u_int8_t *buf, int len)
! 111: {
! 112: int c;
! 113: struct sockaddr sa;
! 114:
! 115: memset(&sa, 0, sizeof(sa));
! 116: strncpy(sa.sa_data, device, sizeof(sa.sa_data));
! 117:
! 118: c = sendto(l->fd, buf, len, 0, &sa, sizeof(sa));
! 119: if (c != len)
! 120: {
! 121: /* error */
! 122: }
! 123: return (c);
! 124: }
! 125:
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>