Rewrite to allow omitting initialization of global variables.
[kopensolaris-gnu/glibc.git] / misc / mntent_r.c
index 70da258..f6ee1ca 100644 (file)
@@ -1,27 +1,32 @@
 /* Utilities for reading/writing fstab, mtab, etc.
-Copyright (C) 1995, 1996 Free Software Foundation, Inc.
-This file is part of the GNU C Library.
+   Copyright (C) 1995, 1996, 1997, 1998 Free Software Foundation, Inc.
+   This file is part of the GNU C Library.
 
-The GNU C Library is free software; you can redistribute it and/or
-modify it under the terms of the GNU Library General Public License as
-published by the Free Software Foundation; either version 2 of the
-License, or (at your option) any later version.
+   The GNU C Library is free software; you can redistribute it and/or
+   modify it under the terms of the GNU Library General Public License as
+   published by the Free Software Foundation; either version 2 of the
+   License, or (at your option) any later version.
 
-The GNU C Library is distributed in the hope that it will be useful,
-but WITHOUT ANY WARRANTY; without even the implied warranty of
-MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
-Library General Public License for more details.
+   The GNU C Library is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+   Library General Public License for more details.
 
-You should have received a copy of the GNU Library General Public
-License along with the GNU C Library; see the file COPYING.LIB.  If
-not, write to the Free Software Foundation, Inc., 675 Mass Ave,
-Cambridge, MA 02139, USA.  */
+   You should have received a copy of the GNU Library General Public
+   License along with the GNU C Library; see the file COPYING.LIB.  If not,
+   write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+   Boston, MA 02111-1307, USA.  */
 
 #include <mntent.h>
 #include <stdio.h>
 #include <string.h>
 #include <sys/types.h>
 
+#ifdef USE_IN_LIBIO
+# define flockfile(s) _IO_flockfile (s)
+# define funlockfile(s) _IO_funlockfile (s)
+#endif
+
 /* Prepare to begin reading and/or writing mount table entries from the
    beginning of FILE.  MODE is as for `fopen'.  */
 FILE *
@@ -51,12 +56,16 @@ __getmntent_r (FILE *stream, struct mntent *mp, char *buffer, int bufsiz)
 {
   char *head;
 
+  flockfile (stream);
   do
     {
       char *end_ptr;
 
-      if (fgets (buffer, bufsiz, stream) == NULL)
-       return NULL;
+      if (fgets_unlocked (buffer, bufsiz, stream) == NULL)
+       {
+         funlockfile (stream);
+         return NULL;
+       }
 
       end_ptr = strchr (buffer, '\n');
       if (end_ptr != NULL)     /* chop newline */
@@ -65,7 +74,7 @@ __getmntent_r (FILE *stream, struct mntent *mp, char *buffer, int bufsiz)
        {
          /* Not the whole line was read.  Do it now but forget it.  */
          char tmp[1024];
-         while (fgets (tmp, sizeof tmp, stream) != NULL)
+         while (fgets_unlocked (tmp, sizeof tmp, stream) != NULL)
            if (strchr (tmp, '\n') != NULL)
              break;
        }
@@ -92,6 +101,7 @@ __getmntent_r (FILE *stream, struct mntent *mp, char *buffer, int bufsiz)
       mp->mnt_passno = 0;
     case 2:
     }
+  funlockfile (stream);
 
   return mp;
 }
@@ -127,13 +137,17 @@ __hasmntopt (const struct mntent *mnt, const char *opt)
 
   while ((p = strstr (rest, opt)) != NULL)
     {
-      if (p == rest || p[-1] == ',' &&
-         (p[optlen] == '\0' ||
-          p[optlen] == '=' ||
-          p[optlen] == ','))
+      if (p == rest
+         || (p[-1] == ','
+             && (p[optlen] == '\0' ||
+                 p[optlen] == '='  ||
+                 p[optlen] == ',')))
        return p;
 
       rest = strchr (rest, ',');
+      if (rest == NULL)
+       break;
+      ++rest;
     }
 
   return NULL;