1 /* Internal routines for nss_files.
2 Copyright (C) 2020-2021 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/>. */
25 #include <libc-lock.h>
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
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
);
66 /* File index for __nss_files_data_get. */
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
90 enum nss_status
__nss_files_data_open (struct nss_files_per_file_data
**pdata
,
91 enum nss_files_file file
,
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
103 enum nss_status
__nss_files_data_setent (enum nss_files_file file
,
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
)
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 */