mirror_iproute2/lib/inet_proto.c
Luca Boccassi 6d2fd4a53f Include bsd/string.h only in include/utils.h
This is simpler and cleaner, and avoids having to include the header
from every file where the functions are used. The prototypes of the
internal implementation are in this header, so utils.h will have to be
included anyway for those.

Fixes: 508f3c231e ("Use libbsd for strlcpy if available")

Signed-off-by: Luca Boccassi <bluca@debian.org>
Signed-off-by: Stephen Hemminger <stephen@networkplumber.org>
2018-11-05 08:38:32 -08:00

70 lines
1.3 KiB
C

/*
* inet_proto.c
*
* 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.
*
* Authors: Alexey Kuznetsov, <kuznet@ms2.inr.ac.ru>
*
*/
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <fcntl.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <netdb.h>
#include <string.h>
#include "rt_names.h"
#include "utils.h"
const char *inet_proto_n2a(int proto, char *buf, int len)
{
static char *ncache;
static int icache = -1;
struct protoent *pe;
if (proto == icache)
return ncache;
pe = getprotobynumber(proto);
if (pe) {
if (icache != -1)
free(ncache);
icache = proto;
ncache = strdup(pe->p_name);
strlcpy(buf, pe->p_name, len);
return buf;
}
snprintf(buf, len, "ipproto-%d", proto);
return buf;
}
int inet_proto_a2n(const char *buf)
{
static char *ncache;
static int icache = -1;
struct protoent *pe;
__u8 ret;
if (icache != -1 && strcmp(ncache, buf) == 0)
return icache;
if (!get_u8(&ret, buf, 10))
return ret;
pe = getprotobyname(buf);
if (pe) {
if (icache != -1)
free(ncache);
icache = pe->p_proto;
ncache = strdup(pe->p_name);
return pe->p_proto;
}
return -1;
}