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.
4 
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.
9 
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.
14 
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/>.  */
18 
19 #ifndef _NSS_FILES_H
20 #define _NSS_FILES_H
21 
22 #include <nss.h>
23 #include <stdio.h>
24 #if IS_IN (libc)
25 #include <libc-lock.h>
26 #endif
27 
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)
31 
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)
39 
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;
46 
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)
53 
54 /* Per-file data.  Used by the *ent functions that need to preserve
55    state across calls.  */
56 struct nss_files_per_file_data
57 {
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
64 };
65 
66 /* File index for __nss_files_data_get.  */
67 enum nss_files_file
68   {
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,
80 
81     nss_file_count
82   };
83 
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)
95 
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)
100 
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)
106 
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)
110 
111 struct parser_data;
112 
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;
127 
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)
137 
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
143 
144 void _nss_files_init (void (*cb) (size_t, struct traced_file *));
145 libc_hidden_proto (_nss_files_init)
146 
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;
153 
154 #endif /* _NSS_FILES_H */
155