1
/* Copyright (C) 1997, 2000, 2002 Free Software Foundation, Inc.
2
This file is part of the GNU C Library.
3
Contributed by Mark Kettenis <kettenis@phys.uva.nl>, 1997.
5
The GNU C Library is free software; you can redistribute it and/or
6
modify it under the terms of the GNU Lesser General Public
7
License as published by the Free Software Foundation; either
8
version 2.1 of the License, or (at your option) any later version.
10
The GNU C Library is distributed in the hope that it will be useful,
11
but WITHOUT ANY WARRANTY; without even the implied warranty of
12
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
13
Lesser General Public License for more details.
15
You should have received a copy of the GNU Lesser General Public
16
License along with the GNU C Library; if not, write to the Free
17
Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
23
#include <netinet/in.h>
29
#include "nss_hesiod.h"
31
/* Declare a parser for Hesiod protocol entries. Although the format
32
of the entries is identical to those in /etc/protocols, here is no
33
predefined parser for us to use. */
35
#define ENTNAME protoent
37
struct protoent_data {};
39
#define TRAILING_LIST_MEMBER p_aliases
40
#define TRAILING_LIST_SEPARATOR_P isspace
41
#include <nss/nss_files/files-parse.c>
44
STRING_FIELD (result->p_name, isspace, 1);
45
INT_FIELD (result->p_proto, isspace, 1, 10,);
49
_nss_hesiod_setprotoent (int stayopen)
51
return NSS_STATUS_SUCCESS;
55
_nss_hesiod_endprotoent (void)
57
return NSS_STATUS_SUCCESS;
60
static enum nss_status
61
lookup (const char *name, const char *type, struct protoent *proto,
62
char *buffer, size_t buflen, int *errnop)
64
struct parser_data *data = (void *) buffer;
72
context = _nss_hesiod_init ();
74
return NSS_STATUS_UNAVAIL;
76
list = hesiod_resolve (context, name, type);
82
return err == ENOENT ? NSS_STATUS_NOTFOUND : NSS_STATUS_UNAVAIL;
85
linebuflen = buffer + buflen - data->linebuffer;
91
size_t len = strlen (*item) + 1;
95
hesiod_free_list (context, list);
98
return NSS_STATUS_TRYAGAIN;
101
memcpy (data->linebuffer, *item, len);
103
parse_res = parse_line (buffer, proto, data, buflen, errnop);
106
hesiod_free_list (context, list);
107
hesiod_end (context);
108
return NSS_STATUS_TRYAGAIN;
116
while (*item != NULL && !found);
118
hesiod_free_list (context, list);
119
hesiod_end (context);
123
__set_errno (olderr);
124
return NSS_STATUS_NOTFOUND;
127
return NSS_STATUS_SUCCESS;
131
_nss_hesiod_getprotobyname_r (const char *name, struct protoent *proto,
132
char *buffer, size_t buflen, int *errnop)
134
return lookup (name, "protocol", proto, buffer, buflen, errnop);
138
_nss_hesiod_getprotobynumber_r (const int protocol, struct protoent *proto,
139
char *buffer, size_t buflen, int *errnop)
143
snprintf (protostr, sizeof protostr, "%d", protocol);
145
return lookup (protostr, "protonum", proto, buffer, buflen, errnop);