mirror of
https://github.com/sheumann/hush.git
synced 2024-08-20 19:29:02 +00:00
libbb: factor out hex2bin() for infiniband address parser
function old new delta hex2bin - 149 +149 in_ib 172 27 -145 Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
This commit is contained in:
parent
c03602baa4
commit
4836331924
@ -734,6 +734,8 @@ const char *make_human_readable_str(unsigned long long size,
|
|||||||
unsigned long block_size, unsigned long display_unit) FAST_FUNC;
|
unsigned long block_size, unsigned long display_unit) FAST_FUNC;
|
||||||
/* Put a string of hex bytes ("1b2e66fe"...), return advanced pointer */
|
/* Put a string of hex bytes ("1b2e66fe"...), return advanced pointer */
|
||||||
char *bin2hex(char *buf, const char *cp, int count) FAST_FUNC;
|
char *bin2hex(char *buf, const char *cp, int count) FAST_FUNC;
|
||||||
|
/* Reverse */
|
||||||
|
char* hex2bin(char *dst, const char *str, int count) FAST_FUNC;
|
||||||
|
|
||||||
/* Generate a UUID */
|
/* Generate a UUID */
|
||||||
void generate_uuid(uint8_t *buf) FAST_FUNC;
|
void generate_uuid(uint8_t *buf) FAST_FUNC;
|
||||||
|
@ -122,6 +122,41 @@ char* FAST_FUNC bin2hex(char *p, const char *cp, int count)
|
|||||||
return p;
|
return p;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* Convert "[x]x[:][x]x[:][x]x[:][x]x" hex string to binary, no more than COUNT bytes */
|
||||||
|
char* FAST_FUNC hex2bin(char *dst, const char *str, int count)
|
||||||
|
{
|
||||||
|
errno = EINVAL;
|
||||||
|
while (*str && count) {
|
||||||
|
uint8_t val;
|
||||||
|
uint8_t c = *str++;
|
||||||
|
if (isdigit(c))
|
||||||
|
val = c - '0';
|
||||||
|
else if ((c|0x20) >= 'a' && (c|0x20) <= 'f')
|
||||||
|
val = (c|0x20) - ('a' - 10);
|
||||||
|
else
|
||||||
|
return NULL;
|
||||||
|
val <<= 4;
|
||||||
|
c = *str;
|
||||||
|
if (isdigit(c))
|
||||||
|
val |= c - '0';
|
||||||
|
else if ((c|0x20) >= 'a' && (c|0x20) <= 'f')
|
||||||
|
val |= (c|0x20) - ('a' - 10);
|
||||||
|
else if (c == ':' || c == '\0')
|
||||||
|
val >>= 4;
|
||||||
|
else
|
||||||
|
return NULL;
|
||||||
|
|
||||||
|
*dst++ = val;
|
||||||
|
if (c != '\0')
|
||||||
|
str++;
|
||||||
|
if (*str == ':')
|
||||||
|
str++;
|
||||||
|
count--;
|
||||||
|
}
|
||||||
|
errno = (*str ? ERANGE : 0);
|
||||||
|
return dst;
|
||||||
|
}
|
||||||
|
|
||||||
/* Return how long the file at fd is, if there's any way to determine it. */
|
/* Return how long the file at fd is, if there's any way to determine it. */
|
||||||
#ifdef UNUSED
|
#ifdef UNUSED
|
||||||
off_t FAST_FUNC fdlength(int fd)
|
off_t FAST_FUNC fdlength(int fd)
|
||||||
|
@ -30,7 +30,6 @@
|
|||||||
* 20001008 - Bernd Eckenfels, Patch from RH for setting mtu
|
* 20001008 - Bernd Eckenfels, Patch from RH for setting mtu
|
||||||
* (default AF was wrong)
|
* (default AF was wrong)
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include <net/if.h>
|
#include <net/if.h>
|
||||||
#include <net/if_arp.h>
|
#include <net/if_arp.h>
|
||||||
#if (defined(__GLIBC__) && __GLIBC__ >= 2 && __GLIBC_MINOR__ >= 1) || defined(_NEWLIB_VERSION)
|
#if (defined(__GLIBC__) && __GLIBC__ >= 2 && __GLIBC_MINOR__ >= 1) || defined(_NEWLIB_VERSION)
|
||||||
@ -1215,53 +1214,12 @@ static int if_print(char *ifname)
|
|||||||
/* Input an Infiniband address and convert to binary. */
|
/* Input an Infiniband address and convert to binary. */
|
||||||
int FAST_FUNC in_ib(const char *bufp, struct sockaddr *sap)
|
int FAST_FUNC in_ib(const char *bufp, struct sockaddr *sap)
|
||||||
{
|
{
|
||||||
unsigned char *ptr;
|
|
||||||
char c;
|
|
||||||
const char *orig;
|
|
||||||
int i;
|
|
||||||
unsigned val;
|
|
||||||
|
|
||||||
sap->sa_family = ib_hwtype.type;
|
sap->sa_family = ib_hwtype.type;
|
||||||
ptr = (unsigned char *) sap->sa_data;
|
//TODO: error check?
|
||||||
|
hex2bin((char*)sap->sa_data, bufp, INFINIBAND_ALEN);
|
||||||
i = 0;
|
# ifdef HWIB_DEBUG
|
||||||
orig = bufp;
|
fprintf(stderr, "in_ib(%s): %s\n", bufp, UNSPEC_print(sap->sa_data));
|
||||||
while ((*bufp != '\0') && (i < INFINIBAND_ALEN)) {
|
# endif
|
||||||
val = 0;
|
|
||||||
c = *bufp++;
|
|
||||||
if (isdigit(c))
|
|
||||||
val = c - '0';
|
|
||||||
else if ((c|0x20) >= 'a' && (c|0x20) <= 'f')
|
|
||||||
val = (c|0x20) - ('a' - 10);
|
|
||||||
else {
|
|
||||||
errno = EINVAL;
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
val <<= 4;
|
|
||||||
c = *bufp;
|
|
||||||
if (isdigit(c))
|
|
||||||
val |= c - '0';
|
|
||||||
else if ((c|0x20) >= 'a' && (c|0x20) <= 'f')
|
|
||||||
val |= (c|0x20) - ('a' - 10);
|
|
||||||
else if (c == ':' || c == '\0')
|
|
||||||
val >>= 4;
|
|
||||||
else {
|
|
||||||
errno = EINVAL;
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
if (c != '\0')
|
|
||||||
bufp++;
|
|
||||||
*ptr++ = (unsigned char) (val & 0377);
|
|
||||||
i++;
|
|
||||||
|
|
||||||
/* We might get a semicolon here - not required. */
|
|
||||||
if (*bufp == ':') {
|
|
||||||
bufp++;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
#ifdef DEBUG
|
|
||||||
fprintf(stderr, "in_ib(%s): %s\n", orig, UNSPEC_print(sap->sa_data));
|
|
||||||
#endif
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
@ -282,8 +282,10 @@ static char *gethdr(char *buf, size_t bufsiz, FILE *fp /*, int *istrunc*/)
|
|||||||
return NULL;
|
return NULL;
|
||||||
|
|
||||||
/* convert the header name to lower case */
|
/* convert the header name to lower case */
|
||||||
for (s = buf; isalnum(*s) || *s == '-' || *s == '.'; ++s)
|
for (s = buf; isalnum(*s) || *s == '-' || *s == '.'; ++s) {
|
||||||
*s = tolower(*s);
|
/* tolower for "A-Z", no-op for "0-9a-z-." */
|
||||||
|
*s = (*s | 0x20);
|
||||||
|
}
|
||||||
|
|
||||||
/* verify we are at the end of the header name */
|
/* verify we are at the end of the header name */
|
||||||
if (*s != ':')
|
if (*s != ':')
|
||||||
|
Loading…
Reference in New Issue
Block a user