/
githubmirror
/
net-tools
Обзор
Документация
Войти
/
githubmirror
/
net-tools
Код
Запросы
0
Пакеты
0
Релизы
0
Аналитика
Безопасность
master
lib/strip.c
117 строк
2 KB
Mike Frysinger
use sockaddr_storage everywhere
24 ноя 2015, 17:34
24 ноя 2015, 17:34
5c9e1e7
Код
Авторство
О чём код?
/* * lib/strip.c This file contains an implementation of the STRIP * support functions. * * Version: strip.c 1.20 1999/04/22 eswierk * * Author: Stuart Cheshire <cheshire@cs.stanford.edu> * * This program is free software; you can redistribute it * and/or modify it under the terms of the GNU General * Public License as published by the Free Software * Foundation; either version 2 of the License, or (at * your option) any later version. */ #include "config.h" #if HAVE_HWSTRIP #include <sys/types.h> #include <sys/ioctl.h> #include <sys/socket.h> #include <net/if_arp.h> #include <linux/types.h> #include <linux/if_strip.h> #include <stdlib.h> #include <stdio.h> #include <ctype.h> #include <errno.h> #include <fcntl.h> #include <string.h> #include <termios.h> #include <unistd.h> #include "net-support.h" #include "pathnames.h" #include "util.h" #include "intl.h" extern struct hwtype strip_hwtype; static const char * pr_strip(const char *ptr) { static char buff[64]; if(ptr[1]) sprintf(buff, "%02x-%02x%02x-%02x%02x", *(ptr+1), *(ptr+2), *(ptr+3), *(ptr+4), *(ptr+5)); else sprintf(buff, "%02x%02x-%02x%02x", *(ptr+2), *(ptr+3), *(ptr+4), *(ptr+5)); return buff; } static int in_strip(char *bufp, struct sockaddr_storage *sasp) { struct sockaddr *sap = (struct sockaddr *)sasp; int i,i0; MetricomAddress *haddr = (MetricomAddress *) (sap->sa_data); sap->sa_family = strip_hwtype.type; /* figure out what the device-address should be */ i0 = i = (bufp[0] == '*') ? 1 : 0; while (bufp[i] && (bufp[i] != '-')) i++; if (bufp[i] != '-') return -1; if(i-i0 == 2) { haddr->c[1] = strtol(&bufp[i0], 0, 16); i++; if(bufp[i] == 0) return -1; }else{ haddr->c[1] = 0; i=i0; } haddr->c[2] = strtol(&bufp[i], 0, 16) >> 8; haddr->c[3] = strtol(&bufp[i], 0, 16) & 0xFF; while (bufp[i] && (bufp[i] != '-')) i++; if (bufp[i] != '-') return -1; haddr->c[4] = strtol(&bufp[i+1], 0, 16) >> 8; haddr->c[5] = strtol(&bufp[i+1], 0, 16) & 0xFF; haddr->c[0] = 0; return 0; } /* Start the STRIP encapsulation on the file descriptor. */ static int do_strip(int fd) { int disc = N_STRIP; if (ioctl(fd, TIOCSETD, &disc) < 0) { fprintf(stderr, "STRIP_set_disc(%d): %s\n", disc, strerror(errno)); return(-errno); } return(0); } struct hwtype strip_hwtype = { "strip", "Metricom Starmode IP", ARPHRD_METRICOM, sizeof(MetricomAddress), pr_strip, in_strip, do_strip, 0 }; #endif /* HAVE_HWSTRIP */