146 lines
3.9 KiB
C
146 lines
3.9 KiB
C
/****************************************************************************
|
|
* libs/libc/netdb/lib_protor.c
|
|
*
|
|
* Copyright © 2005-2020 Rich Felker, et al.
|
|
*
|
|
* Permission is hereby granted, free of charge, to any person obtaining
|
|
* a copy of this software and associated documentation files (the
|
|
* "Software"), to deal in the Software without restriction, including
|
|
* without limitation the rights to use, copy, modify, merge, publish,
|
|
* distribute, sublicense, and/or sell copies of the Software, and to
|
|
* permit persons to whom the Software is furnished to do so, subject to
|
|
* the following conditions:
|
|
*
|
|
* The above copyright notice and this permission notice shall be
|
|
* included in all copies or substantial portions of the Software.
|
|
*
|
|
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
|
* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
|
* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
|
|
* IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
|
|
* CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
|
|
* TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
|
|
* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
|
*
|
|
****************************************************************************/
|
|
|
|
/****************************************************************************
|
|
* Included Files
|
|
****************************************************************************/
|
|
|
|
#include <nuttx/config.h>
|
|
|
|
#include <errno.h>
|
|
#include <netdb.h>
|
|
#include <string.h>
|
|
|
|
/****************************************************************************
|
|
* Private Data
|
|
****************************************************************************/
|
|
|
|
static const unsigned char g_protos[] =
|
|
{
|
|
"\000ip\0"
|
|
"\001icmp\0"
|
|
"\002igmp\0"
|
|
"\003ggp\0"
|
|
"\004ipencap\0"
|
|
"\005st\0"
|
|
"\006tcp\0"
|
|
"\010egp\0"
|
|
"\014pup\0"
|
|
"\021udp\0"
|
|
"\024hmp\0"
|
|
"\026xns-idp\0"
|
|
"\033rdp\0"
|
|
"\035iso-tp4\0"
|
|
"\044xtp\0"
|
|
"\045ddp\0"
|
|
"\046idpr-cmtp\0"
|
|
"\051ipv6\0"
|
|
"\053ipv6-route\0"
|
|
"\054ipv6-frag\0"
|
|
"\055idrp\0"
|
|
"\056rsvp\0"
|
|
"\057gre\0"
|
|
"\062esp\0"
|
|
"\063ah\0"
|
|
"\071skip\0"
|
|
"\072ipv6-icmp\0"
|
|
"\073ipv6-nonxt\0"
|
|
"\074ipv6-opts\0"
|
|
"\111rspf\0"
|
|
"\121vmtp\0"
|
|
"\131ospf\0"
|
|
"\136ipip\0"
|
|
"\142encap\0"
|
|
"\147pim\0"
|
|
"\377raw"
|
|
};
|
|
|
|
static FAR const char *g_aliases;
|
|
|
|
/****************************************************************************
|
|
* Public Functions
|
|
****************************************************************************/
|
|
|
|
void setprotoent_r(int stayopen, FAR struct protoent *result_buf)
|
|
{
|
|
result_buf->idx = 0;
|
|
}
|
|
|
|
void endprotoent_r(FAR struct protoent *result_buf)
|
|
{
|
|
result_buf->idx = 0;
|
|
}
|
|
|
|
int getprotoent_r(FAR struct protoent *result_buf, FAR char *buf,
|
|
size_t buflen, FAR struct protoent **result)
|
|
{
|
|
int idx = result_buf->idx;
|
|
if (idx >= sizeof(g_protos))
|
|
{
|
|
*result = NULL;
|
|
return ENOENT;
|
|
}
|
|
|
|
result_buf->p_proto = g_protos[idx];
|
|
result_buf->p_name = (FAR char *)&g_protos[idx + 1];
|
|
result_buf->p_aliases = (FAR char **)&g_aliases;
|
|
idx += strlen(result_buf->p_name) + 2;
|
|
result_buf->idx = idx;
|
|
*result = result_buf;
|
|
|
|
return OK;
|
|
}
|
|
|
|
int getprotobyname_r(FAR const char *name,
|
|
FAR struct protoent *result_buf, FAR char *buf,
|
|
size_t buflen, FAR struct protoent **result)
|
|
{
|
|
int ret;
|
|
endprotoent_r(result_buf);
|
|
do
|
|
{
|
|
ret = getprotoent_r(result_buf, buf, buflen, result);
|
|
}
|
|
while (ret == OK && strcmp(name, result_buf->p_name));
|
|
|
|
return ret;
|
|
}
|
|
|
|
int getprotobynumber_r(int proto,
|
|
FAR struct protoent *result_buf, FAR char *buf,
|
|
size_t buflen, FAR struct protoent **result)
|
|
{
|
|
int ret;
|
|
endprotoent_r(result_buf);
|
|
do
|
|
{
|
|
ret = getprotoent_r(result_buf, buf, buflen, result);
|
|
}
|
|
while (ret == OK && result_buf->p_proto != proto);
|
|
|
|
return ret;
|
|
}
|