OpenCores
URL https://opencores.org/ocsvn/openrisc/openrisc/trunk

Subversion Repositories openrisc

[/] [openrisc/] [tags/] [gnu-src/] [newlib-1.18.0/] [newlib-1.18.0-or32-1.0rc2/] [newlib/] [libc/] [sys/] [linux/] [mntent_r.c] - Diff between revs 207 and 520

Only display areas with differences | Details | Blame | View Log

Rev 207 Rev 520
/* Utilities for reading/writing fstab, mtab, etc.
/* Utilities for reading/writing fstab, mtab, etc.
   Copyright (C) 1995-2000, 2001 Free Software Foundation, Inc.
   Copyright (C) 1995-2000, 2001 Free Software Foundation, Inc.
   This file is part of the GNU C Library.
   This file is part of the GNU C Library.
 
 
   The GNU C Library is free software; you can redistribute it and/or
   The GNU C Library is free software; you can redistribute it and/or
   modify it under the terms of the GNU Lesser General Public
   modify it under the terms of the GNU Lesser General Public
   License as published by the Free Software Foundation; either
   License as published by the Free Software Foundation; either
   version 2.1 of the License, or (at your option) any later version.
   version 2.1 of the License, or (at your option) any later version.
 
 
   The GNU C Library is distributed in the hope that it will be useful,
   The GNU C Library is distributed in the hope that it will be useful,
   but WITHOUT ANY WARRANTY; without even the implied warranty of
   but WITHOUT ANY WARRANTY; without even the implied warranty of
   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
   Lesser General Public License for more details.
   Lesser General Public License for more details.
 
 
   You should have received a copy of the GNU Lesser General Public
   You should have received a copy of the GNU Lesser General Public
   License along with the GNU C Library; if not, write to the Free
   License along with the GNU C Library; if not, write to the Free
   Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
   Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
   02111-1307 USA.  */
   02111-1307 USA.  */
 
 
#include <alloca.h>
#include <alloca.h>
#include <mntent.h>
#include <mntent.h>
#include <stdio.h>
#include <stdio.h>
#include <string.h>
#include <string.h>
#include <sys/types.h>
#include <sys/types.h>
#include <machine/weakalias.h>
#include <machine/weakalias.h>
 
 
/* Prepare to begin reading and/or writing mount table entries from the
/* Prepare to begin reading and/or writing mount table entries from the
   beginning of FILE.  MODE is as for `fopen'.  */
   beginning of FILE.  MODE is as for `fopen'.  */
FILE *
FILE *
__setmntent (const char *file, const char *mode)
__setmntent (const char *file, const char *mode)
{
{
  FILE *result = fopen (file, mode);
  FILE *result = fopen (file, mode);
 
 
  return result;
  return result;
}
}
weak_alias (__setmntent, setmntent)
weak_alias (__setmntent, setmntent)
 
 
 
 
/* Close a stream opened with `setmntent'.  */
/* Close a stream opened with `setmntent'.  */
int
int
__endmntent (FILE *stream)
__endmntent (FILE *stream)
{
{
  if (stream)           /* SunOS 4.x allows for NULL stream */
  if (stream)           /* SunOS 4.x allows for NULL stream */
    fclose (stream);
    fclose (stream);
  return 1;             /* SunOS 4.x says to always return 1 */
  return 1;             /* SunOS 4.x says to always return 1 */
}
}
weak_alias (__endmntent, endmntent)
weak_alias (__endmntent, endmntent)
 
 
 
 
/* Since the values in a line are separated by spaces, a name cannot
/* Since the values in a line are separated by spaces, a name cannot
   contain a space.  Therefore some programs encode spaces in names
   contain a space.  Therefore some programs encode spaces in names
   by the strings "\040".  We undo the encoding when reading an entry.
   by the strings "\040".  We undo the encoding when reading an entry.
   The decoding happens in place.  */
   The decoding happens in place.  */
static char *
static char *
decode_name (char *buf)
decode_name (char *buf)
{
{
  char *rp = buf;
  char *rp = buf;
  char *wp = buf;
  char *wp = buf;
 
 
  do
  do
    if (rp[0] == '\\' && rp[1] == '0' && rp[2] == '4' && rp[3] == '0')
    if (rp[0] == '\\' && rp[1] == '0' && rp[2] == '4' && rp[3] == '0')
      {
      {
        /* \040 is a SPACE.  */
        /* \040 is a SPACE.  */
        *wp++ = ' ';
        *wp++ = ' ';
        rp += 3;
        rp += 3;
      }
      }
    else if (rp[0] == '\\' && rp[1] == '0' && rp[2] == '1' && rp[3] == '2')
    else if (rp[0] == '\\' && rp[1] == '0' && rp[2] == '1' && rp[3] == '2')
      {
      {
        /* \012 is a TAB.  */
        /* \012 is a TAB.  */
        *wp++ = '\t';
        *wp++ = '\t';
        rp += 3;
        rp += 3;
      }
      }
    else if (rp[0] == '\\' && rp[1] == '\\')
    else if (rp[0] == '\\' && rp[1] == '\\')
      {
      {
        /* We have to escape \\ to be able to represent all characters.  */
        /* We have to escape \\ to be able to represent all characters.  */
        *wp++ = '\\';
        *wp++ = '\\';
        rp += 1;
        rp += 1;
      }
      }
    else
    else
      *wp++ = *rp;
      *wp++ = *rp;
  while (*rp++ != '\0');
  while (*rp++ != '\0');
 
 
  return buf;
  return buf;
}
}
 
 
 
 
/* Read one mount table entry from STREAM.  Returns a pointer to storage
/* Read one mount table entry from STREAM.  Returns a pointer to storage
   reused on the next call, or null for EOF or error (use feof/ferror to
   reused on the next call, or null for EOF or error (use feof/ferror to
   check).  */
   check).  */
struct mntent *
struct mntent *
__getmntent_r (FILE *stream, struct mntent *mp, char *buffer, int bufsiz)
__getmntent_r (FILE *stream, struct mntent *mp, char *buffer, int bufsiz)
{
{
  char *cp;
  char *cp;
  char *head;
  char *head;
 
 
  flockfile (stream);
  flockfile (stream);
  do
  do
    {
    {
      char *end_ptr;
      char *end_ptr;
 
 
      if (fgets (buffer, bufsiz, stream) == NULL)
      if (fgets (buffer, bufsiz, stream) == NULL)
        {
        {
          funlockfile (stream);
          funlockfile (stream);
          return NULL;
          return NULL;
        }
        }
 
 
      end_ptr = strchr (buffer, '\n');
      end_ptr = strchr (buffer, '\n');
      if (end_ptr != NULL)      /* chop newline */
      if (end_ptr != NULL)      /* chop newline */
        *end_ptr = '\0';
        *end_ptr = '\0';
      else
      else
        {
        {
          /* Not the whole line was read.  Do it now but forget it.  */
          /* Not the whole line was read.  Do it now but forget it.  */
          char tmp[1024];
          char tmp[1024];
          while (fgets (tmp, sizeof tmp, stream) != NULL)
          while (fgets (tmp, sizeof tmp, stream) != NULL)
            if (strchr (tmp, '\n') != NULL)
            if (strchr (tmp, '\n') != NULL)
              break;
              break;
        }
        }
 
 
      head = buffer + strspn (buffer, " \t");
      head = buffer + strspn (buffer, " \t");
      /* skip empty lines and comment lines:  */
      /* skip empty lines and comment lines:  */
    }
    }
  while (head[0] == '\0' || head[0] == '#');
  while (head[0] == '\0' || head[0] == '#');
 
 
  cp = strsep (&head, " \t");
  cp = strsep (&head, " \t");
  mp->mnt_fsname = cp != NULL ? decode_name (cp) : (char *) "";
  mp->mnt_fsname = cp != NULL ? decode_name (cp) : (char *) "";
  if (head)
  if (head)
    head += strspn (head, " \t");
    head += strspn (head, " \t");
  cp = strsep (&head, " \t");
  cp = strsep (&head, " \t");
  mp->mnt_dir = cp != NULL ? decode_name (cp) : (char *) "";
  mp->mnt_dir = cp != NULL ? decode_name (cp) : (char *) "";
  if (head)
  if (head)
    head += strspn (head, " \t");
    head += strspn (head, " \t");
  cp = strsep (&head, " \t");
  cp = strsep (&head, " \t");
  mp->mnt_type = cp != NULL ? decode_name (cp) : (char *) "";
  mp->mnt_type = cp != NULL ? decode_name (cp) : (char *) "";
  if (head)
  if (head)
    head += strspn (head, " \t");
    head += strspn (head, " \t");
  cp = strsep (&head, " \t");
  cp = strsep (&head, " \t");
  mp->mnt_opts = cp != NULL ? decode_name (cp) : (char *) "";
  mp->mnt_opts = cp != NULL ? decode_name (cp) : (char *) "";
  switch (head ? sscanf (head, " %d %d ", &mp->mnt_freq, &mp->mnt_passno) : 0)
  switch (head ? sscanf (head, " %d %d ", &mp->mnt_freq, &mp->mnt_passno) : 0)
    {
    {
    case 0:
    case 0:
      mp->mnt_freq = 0;
      mp->mnt_freq = 0;
    case 1:
    case 1:
      mp->mnt_passno = 0;
      mp->mnt_passno = 0;
    case 2:
    case 2:
      break;
      break;
    }
    }
  funlockfile (stream);
  funlockfile (stream);
 
 
  return mp;
  return mp;
}
}
weak_alias (__getmntent_r, getmntent_r)
weak_alias (__getmntent_r, getmntent_r)
 
 
 
 
/* We have to use an encoding for names if they contain spaces or tabs.
/* We have to use an encoding for names if they contain spaces or tabs.
   To be able to represent all characters we also have to escape the
   To be able to represent all characters we also have to escape the
   backslash itself.  This "function" must be a macro since we use
   backslash itself.  This "function" must be a macro since we use
   `alloca'.  */
   `alloca'.  */
#define encode_name(name) \
#define encode_name(name) \
  do {                                                                        \
  do {                                                                        \
    const char *rp = name;                                                    \
    const char *rp = name;                                                    \
                                                                              \
                                                                              \
    while (*rp != '\0')                                                       \
    while (*rp != '\0')                                                       \
      if (*rp == ' ' || *rp == '\t' || *rp == '\\')                           \
      if (*rp == ' ' || *rp == '\t' || *rp == '\\')                           \
        break;                                                                \
        break;                                                                \
      else                                                                    \
      else                                                                    \
        ++rp;                                                                 \
        ++rp;                                                                 \
                                                                              \
                                                                              \
    if (*rp != '\0')                                                          \
    if (*rp != '\0')                                                          \
      {                                                                       \
      {                                                                       \
        /* In the worst case the length of the string can increase to         \
        /* In the worst case the length of the string can increase to         \
           founr times the current length.  */                                \
           founr times the current length.  */                                \
        char *wp;                                                             \
        char *wp;                                                             \
                                                                              \
                                                                              \
        rp = name;                                                            \
        rp = name;                                                            \
        name = wp = (char *) alloca (strlen (name) * 4 + 1);                  \
        name = wp = (char *) alloca (strlen (name) * 4 + 1);                  \
                                                                              \
                                                                              \
        do                                                                    \
        do                                                                    \
          if (*rp == ' ')                                                     \
          if (*rp == ' ')                                                     \
            {                                                                 \
            {                                                                 \
              *wp++ = '\\';                                                   \
              *wp++ = '\\';                                                   \
              *wp++ = '0';                                                    \
              *wp++ = '0';                                                    \
              *wp++ = '4';                                                    \
              *wp++ = '4';                                                    \
              *wp++ = '0';                                                    \
              *wp++ = '0';                                                    \
            }                                                                 \
            }                                                                 \
          else if (*rp == '\t')                                               \
          else if (*rp == '\t')                                               \
            {                                                                 \
            {                                                                 \
              *wp++ = '\\';                                                   \
              *wp++ = '\\';                                                   \
              *wp++ = '0';                                                    \
              *wp++ = '0';                                                    \
              *wp++ = '1';                                                    \
              *wp++ = '1';                                                    \
              *wp++ = '2';                                                    \
              *wp++ = '2';                                                    \
            }                                                                 \
            }                                                                 \
          else if (*rp == '\\')                                               \
          else if (*rp == '\\')                                               \
            {                                                                 \
            {                                                                 \
              *wp++ = '\\';                                                   \
              *wp++ = '\\';                                                   \
              *wp++ = '\\';                                                   \
              *wp++ = '\\';                                                   \
            }                                                                 \
            }                                                                 \
          else                                                                \
          else                                                                \
            *wp++ = *rp;                                                      \
            *wp++ = *rp;                                                      \
        while (*rp++ != '\0');                                                \
        while (*rp++ != '\0');                                                \
      }                                                                       \
      }                                                                       \
  } while (0)
  } while (0)
 
 
 
 
/* Write the mount table entry described by MNT to STREAM.
/* Write the mount table entry described by MNT to STREAM.
   Return zero on success, nonzero on failure.  */
   Return zero on success, nonzero on failure.  */
int
int
__addmntent (FILE *stream, const struct mntent *mnt)
__addmntent (FILE *stream, const struct mntent *mnt)
{
{
  struct mntent mntcopy = *mnt;
  struct mntent mntcopy = *mnt;
  if (fseek (stream, 0, SEEK_END))
  if (fseek (stream, 0, SEEK_END))
    return 1;
    return 1;
 
 
  /* Encode spaces and tabs in the names.  */
  /* Encode spaces and tabs in the names.  */
  encode_name (mntcopy.mnt_fsname);
  encode_name (mntcopy.mnt_fsname);
  encode_name (mntcopy.mnt_dir);
  encode_name (mntcopy.mnt_dir);
  encode_name (mntcopy.mnt_type);
  encode_name (mntcopy.mnt_type);
  encode_name (mntcopy.mnt_opts);
  encode_name (mntcopy.mnt_opts);
 
 
  return (fprintf (stream, "%s %s %s %s %d %d\n",
  return (fprintf (stream, "%s %s %s %s %d %d\n",
                   mntcopy.mnt_fsname,
                   mntcopy.mnt_fsname,
                   mntcopy.mnt_dir,
                   mntcopy.mnt_dir,
                   mntcopy.mnt_type,
                   mntcopy.mnt_type,
                   mntcopy.mnt_opts,
                   mntcopy.mnt_opts,
                   mntcopy.mnt_freq,
                   mntcopy.mnt_freq,
                   mntcopy.mnt_passno)
                   mntcopy.mnt_passno)
          < 0 ? 1 : 0);
          < 0 ? 1 : 0);
}
}
weak_alias (__addmntent, addmntent)
weak_alias (__addmntent, addmntent)
 
 
 
 
/* Search MNT->mnt_opts for an option matching OPT.
/* Search MNT->mnt_opts for an option matching OPT.
   Returns the address of the substring, or null if none found.  */
   Returns the address of the substring, or null if none found.  */
char *
char *
__hasmntopt (const struct mntent *mnt, const char *opt)
__hasmntopt (const struct mntent *mnt, const char *opt)
{
{
  const size_t optlen = strlen (opt);
  const size_t optlen = strlen (opt);
  char *rest = mnt->mnt_opts, *p;
  char *rest = mnt->mnt_opts, *p;
 
 
  while ((p = strstr (rest, opt)) != NULL)
  while ((p = strstr (rest, opt)) != NULL)
    {
    {
      if (p == rest
      if (p == rest
          || (p[-1] == ','
          || (p[-1] == ','
              && (p[optlen] == '\0' ||
              && (p[optlen] == '\0' ||
                  p[optlen] == '='  ||
                  p[optlen] == '='  ||
                  p[optlen] == ',')))
                  p[optlen] == ',')))
        return p;
        return p;
 
 
      rest = strchr (rest, ',');
      rest = strchr (rest, ',');
      if (rest == NULL)
      if (rest == NULL)
        break;
        break;
      ++rest;
      ++rest;
    }
    }
 
 
  return NULL;
  return NULL;
}
}
weak_alias (__hasmntopt, hasmntopt)
weak_alias (__hasmntopt, hasmntopt)
 
 

powered by: WebSVN 2.1.0

© copyright 1999-2024 OpenCores.org, equivalent to Oliscience, all rights reserved. OpenCores®, registered trademark.