1 /* Utilities for reading/writing fstab, mtab, etc.
2    Copyright (C) 1995, 1996, 1997, 2000 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, write to the Free
17    Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
18    02111-1307 USA.  */
19 
20 #include <features.h>
21 #include <mntent.h>
22 #include <stdlib.h>
23 #include <libc-symbols.h>
24 #define  _LIBC 1
25 #define  NOT_IN_libc 1
26 #include <bits/libc-lock.h>
27 
28 /* We don't want to allocate the static buffer all the time since it
29    is not always used (in fact, rather infrequently).  Accept the
30    extra cost of a `malloc'.  */
31 static char *getmntent_buffer;
32 
33 /* This is the size of the buffer.  This is really big.  */
34 #define BUFFER_SIZE	4096
35 
36 
37 static void
allocate(void)38 allocate (void)
39 {
40   getmntent_buffer = (char *) malloc (BUFFER_SIZE);
41 }
42 
43 
44 struct mntent *
getmntent(FILE * stream)45 getmntent (FILE *stream)
46 {
47   static struct mntent m;
48   static int once;
49 
50   do {
51     if (__pthread_once != NULL)
52       __pthread_once (&once, allocate);
53     else if (once == 0) {
54       allocate ();
55       once = !(0);
56     }
57   } while (0);
58 
59 
60   if (getmntent_buffer == NULL)
61     /* If no core is available we don't have a chance to run the
62        program successfully and so returning NULL is an acceptable
63        result.  */
64     return NULL;
65 
66   return __getmntent_r (stream, &m, getmntent_buffer, BUFFER_SIZE);
67 }
68 
69 
70 /* Make sure the memory is freed if the programs ends while in
71    memory-debugging mode and something actually was allocated.  */
72 static void
73 __attribute__ ((unused))
free_mem(void)74 free_mem (void)
75 {
76   free (getmntent_buffer);
77 }
78 
79 text_set_element (__libc_subfreeres, free_mem);
80