Annotation of embedaddon/libnet/src/libnet_init.c, revision 1.1
1.1 ! misho 1: /*
! 2: * $Id: libnet_init.c,v 1.17 2004/03/16 18:40:59 mike Exp $
! 3: *
! 4: * libnet
! 5: * libnet_init.c - Initilization routines.
! 6: *
! 7: * Copyright (c) 1998 - 2004 Mike D. Schiffman <mike@infonexus.com>
! 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: * 1. Redistributions of source code must retain the above copyright
! 14: * notice, this list of conditions and the following disclaimer.
! 15: * 2. Redistributions in binary form must reproduce the above copyright
! 16: * notice, this list of conditions and the following disclaimer in the
! 17: * documentation and/or other materials provided with the distribution.
! 18: *
! 19: * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
! 20: * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
! 21: * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
! 22: * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
! 23: * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
! 24: * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
! 25: * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
! 26: * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
! 27: * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
! 28: * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
! 29: * SUCH DAMAGE.
! 30: *
! 31: */
! 32:
! 33: #if (HAVE_CONFIG_H)
! 34: #include "../include/config.h"
! 35: #endif
! 36: #if (!(_WIN32) || (__CYGWIN__))
! 37: #include "../include/libnet.h"
! 38: #else
! 39: #include "../include/win32/libnet.h"
! 40: #endif
! 41:
! 42: libnet_t *
! 43: libnet_init(int injection_type, char *device, char *err_buf)
! 44: {
! 45: libnet_t *l = NULL;
! 46:
! 47: #if !defined(__WIN32__)
! 48: if (getuid() && geteuid())
! 49: {
! 50: snprintf(err_buf, LIBNET_ERRBUF_SIZE,
! 51: "%s(): UID or EUID of 0 required\n", __func__);
! 52: goto bad;
! 53: }
! 54: #else
! 55: WSADATA wsaData;
! 56:
! 57: if ((WSAStartup(0x0202, &wsaData)) != 0)
! 58: {
! 59: snprintf(err_buf, LIBNET_ERRBUF_SIZE,
! 60: "%s(): unable to initialize winsock 2\n", __func__);
! 61: goto bad;
! 62: }
! 63: #endif
! 64:
! 65: l = (libnet_t *)malloc(sizeof (libnet_t));
! 66: if (l == NULL)
! 67: {
! 68: snprintf(err_buf, LIBNET_ERRBUF_SIZE, "%s(): malloc(): %s\n", __func__,
! 69: strerror(errno));
! 70: goto bad;
! 71: }
! 72:
! 73: memset(l, 0, sizeof (*l));
! 74:
! 75: l->injection_type = injection_type;
! 76: l->ptag_state = LIBNET_PTAG_INITIALIZER;
! 77: l->device = (device ? strdup(device) : NULL);
! 78:
! 79: strncpy(l->label, LIBNET_LABEL_DEFAULT, LIBNET_LABEL_SIZE);
! 80: l->label[sizeof(l->label)] = '\0';
! 81:
! 82: switch (l->injection_type)
! 83: {
! 84: case LIBNET_LINK:
! 85: case LIBNET_LINK_ADV:
! 86: if (libnet_select_device(l) == -1)
! 87: {
! 88: snprintf(err_buf, LIBNET_ERRBUF_SIZE, l->err_buf);
! 89: goto bad;
! 90: }
! 91: if (libnet_open_link(l) == -1)
! 92: {
! 93: snprintf(err_buf, LIBNET_ERRBUF_SIZE, l->err_buf);
! 94: goto bad;
! 95: }
! 96: break;
! 97: case LIBNET_RAW4:
! 98: case LIBNET_RAW4_ADV:
! 99: if (libnet_open_raw4(l) == -1)
! 100: {
! 101: snprintf(err_buf, LIBNET_ERRBUF_SIZE, l->err_buf);
! 102: goto bad;
! 103: }
! 104: break;
! 105: case LIBNET_RAW6:
! 106: case LIBNET_RAW6_ADV:
! 107: if (libnet_open_raw6(l) == -1)
! 108: {
! 109: snprintf(err_buf, LIBNET_ERRBUF_SIZE, l->err_buf);
! 110: goto bad;
! 111: }
! 112: break;
! 113: default:
! 114: snprintf(err_buf, LIBNET_ERRBUF_SIZE,
! 115: "%s(): unsupported injection type\n", __func__);
! 116: goto bad;
! 117: break;
! 118: }
! 119:
! 120: return (l);
! 121:
! 122: bad:
! 123: if (l)
! 124: {
! 125: libnet_destroy(l);
! 126: }
! 127: return (NULL);
! 128: }
! 129:
! 130: void
! 131: libnet_destroy(libnet_t *l)
! 132: {
! 133: if (l)
! 134: {
! 135: close(l->fd);
! 136: if (l->device)
! 137: {
! 138: free(l->device);
! 139: }
! 140: libnet_clear_packet(l);
! 141: free(l);
! 142: }
! 143: }
! 144:
! 145: void
! 146: libnet_clear_packet(libnet_t *l)
! 147: {
! 148: libnet_pblock_t *p;
! 149: libnet_pblock_t *next;
! 150:
! 151: if (l)
! 152: {
! 153: p = l->protocol_blocks;
! 154: if (p)
! 155: {
! 156: for (; p; p = next)
! 157: {
! 158: next = p->next;
! 159: if (p->buf)
! 160: {
! 161: free(p->buf);
! 162: }
! 163: free(p);
! 164: }
! 165: }
! 166: l->protocol_blocks = NULL;
! 167: l->total_size = 0;
! 168: }
! 169: }
! 170:
! 171: void
! 172: libnet_stats(libnet_t *l, struct libnet_stats *ls)
! 173: {
! 174: if (l == NULL)
! 175: {
! 176: return;
! 177: }
! 178:
! 179: ls->packets_sent = l->stats.packets_sent;
! 180: ls->packet_errors = l->stats.packet_errors;
! 181: ls->bytes_written = l->stats.bytes_written;
! 182: }
! 183:
! 184: int
! 185: libnet_getfd(libnet_t *l)
! 186: {
! 187: if (l == NULL)
! 188: {
! 189: return (-1);
! 190: }
! 191:
! 192: return (l->fd);
! 193: }
! 194:
! 195: int8_t *
! 196: libnet_getdevice(libnet_t *l)
! 197: {
! 198: if (l == NULL)
! 199: {
! 200: return (NULL);
! 201: }
! 202:
! 203: return (l->device);
! 204: }
! 205:
! 206: u_int8_t *
! 207: libnet_getpbuf(libnet_t *l, libnet_ptag_t ptag)
! 208: {
! 209: libnet_pblock_t *p;
! 210:
! 211: if (l == NULL)
! 212: {
! 213: return (NULL);
! 214: }
! 215:
! 216: p = libnet_pblock_find(l, ptag);
! 217: if (p == NULL)
! 218: {
! 219: /* err msg set in libnet_pblock_find() */
! 220: return (NULL);
! 221: }
! 222: else
! 223: {
! 224: return (p->buf);
! 225: }
! 226: }
! 227:
! 228: u_int32_t
! 229: libnet_getpbuf_size(libnet_t *l, libnet_ptag_t ptag)
! 230: {
! 231: libnet_pblock_t *p;
! 232:
! 233: if (l == NULL)
! 234: {
! 235: return (0);
! 236: }
! 237:
! 238: p = libnet_pblock_find(l, ptag);
! 239: if (p == NULL)
! 240: {
! 241: /* err msg set in libnet_pblock_find() */
! 242: return (0);
! 243: }
! 244: else
! 245: {
! 246: return (p->b_len);
! 247: }
! 248: }
! 249:
! 250: u_int32_t
! 251: libnet_getpacket_size(libnet_t *l)
! 252: {
! 253: libnet_pblock_t *p;
! 254: u_int32_t n;
! 255:
! 256: if (l == NULL)
! 257: {
! 258: return (0);
! 259: }
! 260:
! 261: n = 0;
! 262: p = l->protocol_blocks;
! 263: if (p)
! 264: {
! 265: for (; p; p = p->next)
! 266: {
! 267: n += p->b_len;
! 268: }
! 269: }
! 270: return (n);
! 271: }
! 272:
! 273: /* EOF */
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>