/* * 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 * * 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 #include #include #include #include #include #include #include #include #include #include #include #include #include #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 */