1 /* $NetBSD: getservent_r.c,v 1.8 2006/09/14 19:58:48 christos Exp $ */
4 * Copyright (c) 1983, 1993
5 * The Regents of the University of California. All rights reserved.
7 * Redistribution and use in source and binary forms, with or without
8 * modification, are permitted provided that the following conditions
10 * 1. Redistributions of source code must retain the above copyright
11 * notice, this list of conditions and the following disclaimer.
12 * 2. Redistributions in binary form must reproduce the above copyright
13 * notice, this list of conditions and the following disclaimer in the
14 * documentation and/or other materials provided with the distribution.
15 * 3. Neither the name of the University nor the names of its contributors
16 * may be used to endorse or promote products derived from this software
17 * without specific prior written permission.
19 * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
20 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
21 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
22 * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
23 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
24 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
25 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
26 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
27 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
28 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
32 #include <sys/cdefs.h>
33 #if defined(LIBC_SCCS) && !defined(lint)
35 static char sccsid
[] = "@(#)getservent.c 8.1 (Berkeley) 6/4/93";
37 __RCSID("$NetBSD: getservent_r.c,v 1.8 2006/09/14 19:58:48 christos Exp $");
39 #endif /* LIBC_SCCS and not lint */
41 #include "namespace.h"
53 __weak_alias(endservent_r
,_endservent_r
)
54 __weak_alias(getservent_r
,_getservent_r
)
55 __weak_alias(setservent_r
,_setservent_r
)
59 _servent_open(struct servent_data
*sd
)
61 sd
->flags
|= _SV_FIRST
;
63 if ((sd
->db
= dbopen(_PATH_SERVICES_DB
, O_RDONLY
, 0,
64 DB_HASH
, NULL
)) != NULL
)
67 sd
->db
= fopen(_PATH_SERVICES
, "r");
69 return sd
->db
? 0 : -1;
73 _servent_close(struct servent_data
*sd
)
76 if (sd
->flags
& _SV_DB
) {
80 (void)fclose((FILE *)sd
->db
);
83 sd
->flags
&= ~_SV_STAYOPEN
;
88 _servent_getline(struct servent_data
*sd
)
98 if (sd
->flags
& _SV_DB
) {
101 u_int flags
= (sd
->flags
& _SV_FIRST
) ? R_FIRST
: R_NEXT
;
103 while ((*db
->seq
)(db
, &key
, &data
, flags
) == 0) {
105 switch (((u_char
*)key
.data
)[0]) {
112 sd
->line
= strdup(data
.data
);
116 if (sd
->flags
& _SV_FIRST
)
117 (void)rewind((FILE *)sd
->db
);
118 sd
->line
= fparseln((FILE *)sd
->db
, NULL
, NULL
, NULL
,
121 sd
->flags
&= ~_SV_FIRST
;
122 return sd
->line
== NULL
? -1 : 0;
127 _servent_parseline(struct servent_data
*sd
, struct servent
*sp
)
133 if (sd
->line
== NULL
)
136 sp
->s_name
= p
= sd
->line
;
137 p
= strpbrk(p
, " \t");
141 while (*p
== ' ' || *p
== '\t')
143 cp
= strpbrk(p
, ",/");
147 sp
->s_port
= htons((u_short
)atoi(p
));
149 if (sd
->aliases
== NULL
) {
151 sd
->aliases
= malloc(sd
->maxaliases
* sizeof(char *));
152 if (sd
->aliases
== NULL
) {
159 q
= sp
->s_aliases
= sd
->aliases
;
160 cp
= strpbrk(cp
, " \t");
164 if (*cp
== ' ' || *cp
== '\t') {
168 if (i
== sd
->maxaliases
- 2) {
171 sd
->maxaliases
* sizeof(char *));
178 sp
->s_aliases
= sd
->aliases
= q
;
181 cp
= strpbrk(cp
, " \t");
190 setservent_r(int f
, struct servent_data
*sd
)
192 (void)_servent_open(sd
);
193 sd
->flags
|= f
? _SV_STAYOPEN
: 0;
197 endservent_r(struct servent_data
*sd
)
212 getservent_r(struct servent
*sp
, struct servent_data
*sd
)
214 if (sd
->db
== NULL
&& _servent_open(sd
) == -1)
218 if (_servent_getline(sd
) == -1)
220 if (_servent_parseline(sd
, sp
) == NULL
)