gaih_inet: make gethosts into a function
[glibc.git] / include / nss_files.h
blob0855edc333653779e71544c903863891886ad2de
1 /* Internal routines for nss_files.
2 Copyright (C) 2020-2022 Free Software Foundation, Inc.
3 This file is part of the GNU C Library.
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, see
17 <https://www.gnu.org/licenses/>. */
19 #ifndef _NSS_FILES_H
20 #define _NSS_FILES_H
22 #include <nss.h>
23 #include <stdio.h>
24 #if IS_IN (libc)
25 #include <libc-lock.h>
26 #endif
28 /* Open PATH for reading, as a data source for nss_files. */
29 FILE *__nss_files_fopen (const char *path);
30 libc_hidden_proto (__nss_files_fopen)
32 /* Read a line from FP, storing it BUF. Strip leading blanks and skip
33 comments. Sets errno and returns error code on failure. Special
34 failure: ERANGE means the buffer is too small. The function writes
35 the original offset to *POFFSET (which can be negative in the case
36 of non-seekable input). */
37 int __nss_readline (FILE *fp, char *buf, size_t len, off64_t *poffset);
38 libc_hidden_proto (__nss_readline)
40 /* Seek FP to OFFSET. Sets errno and returns error code on failure.
41 On success, sets errno to ERANGE and returns ERANGE (to indicate
42 re-reading of the same input line to the caller). If OFFSET is
43 negative, fail with ESPIPE without seeking. Intended to be used
44 after parsing data read by __nss_readline failed with ERANGE. */
45 int __nss_readline_seek (FILE *fp, off64_t offset) attribute_hidden;
47 /* Handles the result of a parse_line call (as defined by
48 nss/nss_files/files-parse.c). Adjusts the file offset of FP as
49 necessary. Returns 0 on success, and updates errno on failure (and
50 returns that error code). */
51 int __nss_parse_line_result (FILE *fp, off64_t offset, int parse_line_result);
52 libc_hidden_proto (__nss_parse_line_result)
54 /* Per-file data. Used by the *ent functions that need to preserve
55 state across calls. */
56 struct nss_files_per_file_data
58 FILE *stream;
59 #if IS_IN (libc)
60 /* The size of locks changes between libc and nss_files, so this
61 member must be last and is only available in libc. */
62 __libc_lock_define (, lock);
63 #endif
66 /* File index for __nss_files_data_get. */
67 enum nss_files_file
69 nss_file_aliasent,
70 nss_file_etherent,
71 nss_file_grent,
72 nss_file_hostent,
73 nss_file_netent,
74 nss_file_protoent,
75 nss_file_pwent,
76 nss_file_rpcent,
77 nss_file_servent,
78 nss_file_sgent,
79 nss_file_spent,
81 nss_file_count
84 /* Obtains a pointer to the per-file data for FILE, which is written
85 to *PDATA, and tries to open the file at PATH for it. On success,
86 returns NSS_STATUS_SUCCESS, and the caller must later call
87 __nss_files_data_put. On failure, NSS_STATUS_TRYAGAIN is returned,
88 and *ERRNOP and *HERRNOP are updated if these pointers are not
89 null. */
90 enum nss_status __nss_files_data_open (struct nss_files_per_file_data **pdata,
91 enum nss_files_file file,
92 const char *path,
93 int *errnop, int *herrnop);
94 libc_hidden_proto (__nss_files_data_open)
96 /* Unlock the per-file data, previously obtained by
97 __nss_files_data_open. */
98 void __nss_files_data_put (struct nss_files_per_file_data *data);
99 libc_hidden_proto (__nss_files_data_put)
101 /* Performs the set*ent operation for FILE. PATH is the file to
102 open. */
103 enum nss_status __nss_files_data_setent (enum nss_files_file file,
104 const char *path);
105 libc_hidden_proto (__nss_files_data_setent)
107 /* Performs the end*ent operation for FILE. */
108 enum nss_status __nss_files_data_endent (enum nss_files_file file);
109 libc_hidden_proto (__nss_files_data_endent)
111 struct parser_data;
113 /* Instances of the parse_line function from
114 nss/nss_files/files-parse.c. */
115 typedef int nss_files_parse_line (char *line, void *result,
116 struct parser_data *data,
117 size_t datalen, int *errnop);
118 extern nss_files_parse_line _nss_files_parse_etherent;
119 extern nss_files_parse_line _nss_files_parse_grent;
120 extern nss_files_parse_line _nss_files_parse_netent;
121 extern nss_files_parse_line _nss_files_parse_protoent;
122 extern nss_files_parse_line _nss_files_parse_pwent;
123 extern nss_files_parse_line _nss_files_parse_rpcent;
124 extern nss_files_parse_line _nss_files_parse_servent;
125 extern nss_files_parse_line _nss_files_parse_sgent;
126 extern nss_files_parse_line _nss_files_parse_spent;
128 libc_hidden_proto (_nss_files_parse_etherent)
129 libc_hidden_proto (_nss_files_parse_grent)
130 libc_hidden_proto (_nss_files_parse_netent)
131 libc_hidden_proto (_nss_files_parse_protoent)
132 libc_hidden_proto (_nss_files_parse_pwent)
133 libc_hidden_proto (_nss_files_parse_rpcent)
134 libc_hidden_proto (_nss_files_parse_servent)
135 libc_hidden_proto (_nss_files_parse_sgent)
136 libc_hidden_proto (_nss_files_parse_spent)
138 NSS_DECLARE_MODULE_FUNCTIONS (files)
139 #undef DEFINE_NSS_FUNCTION
140 #define DEFINE_NSS_FUNCTION(x) libc_hidden_proto (_nss_files_##x)
141 #include <nss/function.def>
142 #undef DEFINE_NSS_FUNCTION
144 void _nss_files_init (void (*cb) (size_t, struct traced_file *));
145 libc_hidden_proto (_nss_files_init)
147 /* Generic implementation of fget*ent_r. Reads lines from FP until
148 EOF or a successful parse into *RESULT using PARSER. Returns 0 on
149 success, ENOENT on EOF, ERANGE on too-small buffer. */
150 int __nss_fgetent_r (FILE *fp, void *result,
151 char *buffer, size_t buffer_length,
152 nss_files_parse_line parser) attribute_hidden;
154 #endif /* _NSS_FILES_H */