| /* |
| * 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 <syslog.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[16]; |
| static int icache = -1; |
| struct protoent *pe; |
| |
| if (proto == icache) |
| return ncache; |
| |
| pe = getprotobynumber(proto); |
| if (pe) { |
| icache = proto; |
| strncpy(ncache, pe->p_name, 16); |
| strncpy(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[16]; |
| static int icache = -1; |
| struct protoent *pe; |
| |
| if (icache>=0 && strcmp(ncache, buf) == 0) |
| return icache; |
| |
| if (buf[0] >= '0' && buf[0] <= '9') { |
| __u8 ret; |
| if (get_u8(&ret, buf, 10)) |
| return -1; |
| return ret; |
| } |
| |
| pe = getprotobyname(buf); |
| if (pe) { |
| icache = pe->p_proto; |
| strncpy(ncache, pe->p_name, 16); |
| return pe->p_proto; |
| } |
| return -1; |
| } |