int xtoi(char *s) { char d1, d2; int ret = 0; if(isxdigit(*s)) { d1 = *s++; if(isxdigit(*s)) { d2 = *s++; ret = (xdtoi(d1) * 16) + xdtoi(d2); } } return(ret); }
/* * Convert 's', which can have the one of the forms: * * "xx:xx:xx:xx:xx:xx" * "xx.xx.xx.xx.xx.xx" * "xx-xx-xx-xx-xx-xx" * "xxxx.xxxx.xxxx" * "xxxxxxxxxxxx" * * (or various mixes of ':', '.', and '-') into a new * ethernet address. Assumes 's' is well formed. */ u_char * pcap_ether_aton(const char *s) { register u_char *ep, *e; register u_char d; e = ep = (u_char *)malloc(6); if (e == NULL) return (NULL); while (*s) { if (*s == ':' || *s == '.' || *s == '-') s += 1; d = xdtoi(*s++); if (isxdigit((unsigned char)*s)) { d <<= 4; d |= xdtoi(*s++); } *ep++ = d; } return (e); }
struct pcap_etherent * pcap_next_etherent(FILE *fp) { register int c, i; u_char d; char *bp; size_t namesize; static struct pcap_etherent e; memset((char *)&e, 0, sizeof(e)); for (;;) { /* Find addr */ c = skip_space(fp); if (c == EOF) return (NULL); if (c == '\n') continue; /* If this is a comment, or first thing on line cannot be Ethernet address, skip the line. */ if (!isxdigit(c)) { c = skip_line(fp); if (c == EOF) return (NULL); continue; } /* must be the start of an address */ for (i = 0; i < 6; i += 1) { d = xdtoi((u_char)c); c = getc(fp); if (c == EOF) return (NULL); if (isxdigit(c)) { d <<= 4; d |= xdtoi((u_char)c); c = getc(fp); if (c == EOF) return (NULL); } e.addr[i] = d; if (c != ':') break; c = getc(fp); if (c == EOF) return (NULL); } /* Must be whitespace */ if (!isspace(c)) { c = skip_line(fp); if (c == EOF) return (NULL); continue; } c = skip_space(fp); if (c == EOF) return (NULL); /* hit end of line... */ if (c == '\n') continue; if (c == '#') { c = skip_line(fp); if (c == EOF) return (NULL); continue; } /* pick up name */ bp = e.name; /* Use 'namesize' to prevent buffer overflow. */ namesize = sizeof(e.name) - 1; do { *bp++ = (u_char)c; c = getc(fp); if (c == EOF) return (NULL); } while (!isspace(c) && --namesize != 0); *bp = '\0'; /* Eat trailing junk */ if (c != '\n') (void)skip_line(fp); return &e; } }