⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 addrtoname.c

📁 mgcp协议源代码。支持多种编码:g711
💻 C
字号:
/* * Copyright (c) 1990, 1991, 1992, 1993, 1994, 1995, 1996, 1997 *      The Regents of the University of California.  All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that: (1) source code distributions * retain the above copyright notice and this paragraph in its entirety, (2) * distributions including binary code include the above copyright notice and * this paragraph in its entirety in the documentation or other materials * provided with the distribution, and (3) all advertising materials mentioning * features or use of this software display the following acknowledgement: * ``This product includes software developed by the University of California, * Lawrence Berkeley Laboratory and its contributors.'' Neither the name of * the University nor the names of its contributors may be used to endorse * or promote products derived from this software without specific prior * written permission. * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR IMPLIED * WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED WARRANTIES OF * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. * *  Internet, ethernet, port, and protocol string to address *  and address to string conversion routines *  *----------------------------------------------------------------------------- * * Modifed from tcpdump's addrtoname.c by Mike Borella for ipgrab * */#include <stdio.h>#include <string.h>#include <stdlib.h>#include <netdb.h>#include <sys/types.h>#include <netinet/in.h>#include <unistd.h>#include "config.h"#include "addrtoname.h"#include "error.h"#define HASHNAMESIZE 4096struct hnamemem {  u_int addr;  char *name;  struct hnamemem *nxt;};struct enamemem {  u_short e_addr0;  u_short e_addr1;  u_short e_addr2;  char *e_name;  u_char *e_nsap;                 /* used only for nsaptable[] */  struct enamemem *e_nxt;};/* * From libpcap */extern struct eproto {  char *s;  u_short p;} eproto_db[];struct hnamemem tporttable[HASHNAMESIZE];struct hnamemem uporttable[HASHNAMESIZE];struct hnamemem eprototable[HASHNAMESIZE];struct enamemem enametable[HASHNAMESIZE];static char hex[] = "0123456789abcdef";/*----------------------------------------------------------------------------**** newhnamemem()**** Return a zero'ed hnamemem struct and cuts down on calloc() overhead ****----------------------------------------------------------------------------*/struct hnamemem *newhnamemem(void){  struct hnamemem *p;  static struct hnamemem *ptr = NULL;  static u_int num = 0;  if (num  <= 0)     {      num = 64;      ptr = (struct hnamemem *)calloc(num, sizeof (*ptr));      if (ptr == NULL) 	GWF_error_fatal("newhnamemem: calloc");    }       --num;  p = ptr++;  return (p);}/*----------------------------------------------------------------------------**** init_servarray()**** Set up array with service to port mappings for both TCP and UDP****----------------------------------------------------------------------------*/void init_servarray(void){  struct servent *sv;  struct hnamemem *table;  int i;    while ((sv = getservent()) != NULL)     {      int port = ntohs(sv->s_port);      i = port & (HASHNAMESIZE-1);      if (strcmp(sv->s_proto, "tcp") == 0)	table = &tporttable[i];      else 	if (strcmp(sv->s_proto, "udp") == 0)	  table = &uporttable[i];	else	  continue;            while (table->name)	table = table->nxt;      table->name = strdup(sv->s_name);            table->addr = port;      table->nxt = newhnamemem();    }  endservent();}/*----------------------------------------------------------------------------**** udpport_string()**** Translate a well-known UDP port number to its service name. ****----------------------------------------------------------------------------*/char *udpport_string(u_short port){  struct hnamemem *tp;  u_int i = port;  char buf[sizeof("00000")];  for (tp = &uporttable[i & (HASHNAMESIZE-1)]; tp->nxt; tp = tp->nxt)    if (tp->addr == i) return (tp->name);  tp->addr = i;  tp->nxt = newhnamemem();  sprintf(buf, "%u", i);  tp->name = strdup(buf);  return (tp->name);}/*----------------------------------------------------------------------------**** tcpport_string()**** Translate a well-known TCP port number to its service name. ****----------------------------------------------------------------------------*/char *tcpport_string(u_short port){  struct hnamemem *tp;  u_int i = port;  char buf[sizeof("00000")];  for (tp = &tporttable[i & (HASHNAMESIZE-1)]; tp->nxt; tp = tp->nxt)    if (tp->addr == i) return (tp->name);  tp->addr = i;  tp->nxt = newhnamemem();    sprintf(buf, "%u", i);  tp->name = strdup(buf);  return (tp->name);}/*----------------------------------------------------------------------------**** lookup_emem()**** Find the hash node that corresponds the ether address 'ep'****----------------------------------------------------------------------------*/struct enamemem *lookup_emem(const u_char *ep){  u_int i, j, k;  struct enamemem *tp;  k = (ep[0] << 8) | ep[1];  j = (ep[2] << 8) | ep[3];  i = (ep[4] << 8) | ep[5];    tp = &enametable[(i ^ j) & (HASHNAMESIZE-1)];  while (tp->e_nxt)    {      if (tp->e_addr0 == i && tp->e_addr1 == j && tp->e_addr2 == k)	return tp;      else	tp = tp->e_nxt;    }  tp->e_addr0 = i;  tp->e_addr1 = j;  tp->e_addr2 = k;  tp->e_nxt = (struct enamemem *) calloc (1, sizeof(*tp));  if (tp->e_nxt == NULL)     GWF_error_fatal("lookup_emem: calloc");  return tp;}/*----------------------------------------------------------------------------**** init_eprotoarray()**** Initialize the Ethernet protocol table****----------------------------------------------------------------------------*/static void init_eprotoarray(void){  int i;  struct hnamemem *table;  for (i = 0; eproto_db[i].s; i++)     {      int j = ntohs(eproto_db[i].p) & (HASHNAMESIZE-1);      table = &eprototable[j];      while (table->name) table = table->nxt;      table->name = eproto_db[i].s;      table->addr = ntohs(eproto_db[i].p);      table->nxt = newhnamemem();    }}/*----------------------------------------------------------------------------**** etheraddr_string()**** Translate an ethernet address to a colon-delimited string****----------------------------------------------------------------------------*/char *etheraddr_string(u_char *ep){  u_int i, j;  char *cp;  struct enamemem *tp;  char buf[sizeof("00:00:00:00:00:00")];  tp = lookup_emem(ep);  if (tp->e_name) return (tp->e_name);  cp = buf;  if ((j = *ep >> 4) != 0) *cp++ = hex[j];  *cp++ = hex[*ep++ & 0xf];  for (i = 5; (int)--i >= 0;)     {      *cp++ = ':';      if ((j = *ep >> 4) != 0) *cp++ = hex[j];      *cp++ = hex[*ep++ & 0xf];    }  *cp = '\0';  tp->e_name = strdup(buf);  return (tp->e_name);}/*----------------------------------------------------------------------------**** etherproto_string()**** Translate an ethernet protocol id to a network-layer protocol string****----------------------------------------------------------------------------*/char *etherproto_string(u_short port){  char *cp;  struct hnamemem *tp;  u_int i = port;  char buf[sizeof("0000")];  for (tp = &eprototable[i & (HASHNAMESIZE-1)]; tp->nxt; tp = tp->nxt)    if (tp->addr == i) return (tp->name);  tp->addr = i;  tp->nxt = newhnamemem();    cp = buf;  port = ntohs(port);  *cp++ = hex[port >> 12 & 0xf];  *cp++ = hex[port >> 8 & 0xf];  *cp++ = hex[port >> 4 & 0xf];  *cp++ = hex[port & 0xf];  *cp++ = '\0';  tp->name = strdup(buf);  return (tp->name);}/*----------------------------------------------------------------------------**** init_addrtoname()**** Initialize all of the tables****----------------------------------------------------------------------------*/void init_addrtoname(void){  init_servarray();  init_eprotoarray();}/*----------------------------------------------------------------------------**** print_char2hex()**** Convert a series of chars to hex representation****----------------------------------------------------------------------------*/  void print_char2hex(u_char *bp, int length){  u_char *p;  int cnt = 0;  p = bp;  while(p < bp+length)    {      printf("%.2X ", *p);      p++;      /*       * Don't run off the end of the line       */      cnt++;      if (cnt >= 14)	{	  printf("\n                        ");	  cnt = 0;	}    } /* while */  printf("\n");}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -