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/] [stdlib/] [system.c] - Diff between revs 207 and 520

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

Rev 207 Rev 520
/*
/*
FUNCTION
FUNCTION
<<system>>---execute command string
<<system>>---execute command string
 
 
INDEX
INDEX
        system
        system
INDEX
INDEX
        _system_r
        _system_r
 
 
ANSI_SYNOPSIS
ANSI_SYNOPSIS
        #include <stdlib.h>
        #include <stdlib.h>
        int system(char *<[s]>);
        int system(char *<[s]>);
 
 
        int _system_r(void *<[reent]>, char *<[s]>);
        int _system_r(void *<[reent]>, char *<[s]>);
 
 
TRAD_SYNOPSIS
TRAD_SYNOPSIS
        #include <stdlib.h>
        #include <stdlib.h>
        int system(<[s]>)
        int system(<[s]>)
        char *<[s]>;
        char *<[s]>;
 
 
        int _system_r(<[reent]>, <[s]>)
        int _system_r(<[reent]>, <[s]>)
        char *<[reent]>;
        char *<[reent]>;
        char *<[s]>;
        char *<[s]>;
 
 
DESCRIPTION
DESCRIPTION
 
 
Use <<system>> to pass a command string <<*<[s]>>> to <</bin/sh>> on
Use <<system>> to pass a command string <<*<[s]>>> to <</bin/sh>> on
your system, and wait for it to finish executing.
your system, and wait for it to finish executing.
 
 
Use ``<<system(NULL)>>'' to test whether your system has <</bin/sh>>
Use ``<<system(NULL)>>'' to test whether your system has <</bin/sh>>
available.
available.
 
 
The alternate function <<_system_r>> is a reentrant version.  The
The alternate function <<_system_r>> is a reentrant version.  The
extra argument <[reent]> is a pointer to a reentrancy structure.
extra argument <[reent]> is a pointer to a reentrancy structure.
 
 
RETURNS
RETURNS
<<system(NULL)>> returns a non-zero value if <</bin/sh>> is available, and
<<system(NULL)>> returns a non-zero value if <</bin/sh>> is available, and
<<0>> if it is not.
<<0>> if it is not.
 
 
With a command argument, the result of <<system>> is the exit status
With a command argument, the result of <<system>> is the exit status
returned by <</bin/sh>>.
returned by <</bin/sh>>.
 
 
PORTABILITY
PORTABILITY
ANSI C requires <<system>>, but leaves the nature and effects of a
ANSI C requires <<system>>, but leaves the nature and effects of a
command processor undefined.  ANSI C does, however, specify that
command processor undefined.  ANSI C does, however, specify that
<<system(NULL)>> return zero or nonzero to report on the existence of
<<system(NULL)>> return zero or nonzero to report on the existence of
a command processor.
a command processor.
 
 
POSIX.2 requires <<system>>, and requires that it invoke a <<sh>>.
POSIX.2 requires <<system>>, and requires that it invoke a <<sh>>.
Where <<sh>> is found is left unspecified.
Where <<sh>> is found is left unspecified.
 
 
Supporting OS subroutines required: <<_exit>>, <<_execve>>, <<_fork_r>>,
Supporting OS subroutines required: <<_exit>>, <<_execve>>, <<_fork_r>>,
<<_wait_r>>.
<<_wait_r>>.
*/
*/
 
 
#include <_ansi.h>
#include <_ansi.h>
#include <errno.h>
#include <errno.h>
#include <stddef.h>
#include <stddef.h>
#include <stdlib.h>
#include <stdlib.h>
#include <unistd.h>
#include <unistd.h>
#include <_syslist.h>
#include <_syslist.h>
#include <reent.h>
#include <reent.h>
 
 
#if defined (unix) || defined (__CYGWIN__)
#if defined (unix) || defined (__CYGWIN__)
static int _EXFUN(do_system, (struct _reent *ptr _AND _CONST char *s));
static int _EXFUN(do_system, (struct _reent *ptr _AND _CONST char *s));
#endif
#endif
 
 
int
int
_DEFUN(_system_r, (ptr, s),
_DEFUN(_system_r, (ptr, s),
     struct _reent *ptr _AND
     struct _reent *ptr _AND
     _CONST char *s)
     _CONST char *s)
{
{
#if defined(HAVE_SYSTEM)
#if defined(HAVE_SYSTEM)
  return _system (s);
  return _system (s);
  ptr = ptr;
  ptr = ptr;
#elif defined(NO_EXEC)
#elif defined(NO_EXEC)
  if (s == NULL)
  if (s == NULL)
    return 0;
    return 0;
  errno = ENOSYS;
  errno = ENOSYS;
  return -1;
  return -1;
#else
#else
 
 
  /* ??? How to handle (s == NULL) here is not exactly clear.
  /* ??? How to handle (s == NULL) here is not exactly clear.
     If _fork_r fails, that's not really a justification for returning 0.
     If _fork_r fails, that's not really a justification for returning 0.
     For now we always return 0 and leave it to each target to explicitly
     For now we always return 0 and leave it to each target to explicitly
     handle otherwise (this can always be relaxed in the future).  */
     handle otherwise (this can always be relaxed in the future).  */
 
 
#if defined (unix) || defined (__CYGWIN__)
#if defined (unix) || defined (__CYGWIN__)
  if (s == NULL)
  if (s == NULL)
    return 1;
    return 1;
  return do_system (ptr, s);
  return do_system (ptr, s);
#else
#else
  if (s == NULL)
  if (s == NULL)
    return 0;
    return 0;
  errno = ENOSYS;
  errno = ENOSYS;
  return -1;
  return -1;
#endif
#endif
 
 
#endif
#endif
}
}
 
 
#ifndef _REENT_ONLY
#ifndef _REENT_ONLY
 
 
int
int
_DEFUN(system, (s),
_DEFUN(system, (s),
     _CONST char *s)
     _CONST char *s)
{
{
  return _system_r (_REENT, s);
  return _system_r (_REENT, s);
}
}
 
 
#endif
#endif


#if defined (unix) && !defined (__CYGWIN__) && !defined(__rtems__)
#if defined (unix) && !defined (__CYGWIN__) && !defined(__rtems__)
extern char **environ;
extern char **environ;
 
 
/* Only deal with a pointer to environ, to work around subtle bugs with shared
/* Only deal with a pointer to environ, to work around subtle bugs with shared
   libraries and/or small data systems where the user declares his own
   libraries and/or small data systems where the user declares his own
   'environ'.  */
   'environ'.  */
static char ***p_environ = &environ;
static char ***p_environ = &environ;
 
 
static int
static int
_DEFUN(do_system, (ptr, s),
_DEFUN(do_system, (ptr, s),
     struct _reent *ptr _AND
     struct _reent *ptr _AND
     _CONST char *s)
     _CONST char *s)
{
{
  char *argv[4];
  char *argv[4];
  int pid, status;
  int pid, status;
 
 
  argv[0] = "sh";
  argv[0] = "sh";
  argv[1] = "-c";
  argv[1] = "-c";
  argv[2] = (char *) s;
  argv[2] = (char *) s;
  argv[3] = NULL;
  argv[3] = NULL;
 
 
  if ((pid = _fork_r (ptr)) == 0)
  if ((pid = _fork_r (ptr)) == 0)
    {
    {
      _execve ("/bin/sh", argv, *p_environ);
      _execve ("/bin/sh", argv, *p_environ);
      exit (100);
      exit (100);
    }
    }
  else if (pid == -1)
  else if (pid == -1)
    return -1;
    return -1;
  else
  else
    {
    {
      int rc = _wait_r (ptr, &status);
      int rc = _wait_r (ptr, &status);
      if (rc == -1)
      if (rc == -1)
        return -1;
        return -1;
      status = (status >> 8) & 0xff;
      status = (status >> 8) & 0xff;
      return status;
      return status;
    }
    }
}
}
#endif
#endif
 
 
#if defined (__CYGWIN__)
#if defined (__CYGWIN__)
static int
static int
_DEFUN(do_system, (ptr, s),
_DEFUN(do_system, (ptr, s),
     struct _reent *ptr _AND
     struct _reent *ptr _AND
     _CONST char *s)
     _CONST char *s)
{
{
  char *argv[4];
  char *argv[4];
  int pid, status;
  int pid, status;
 
 
  argv[0] = "sh";
  argv[0] = "sh";
  argv[1] = "-c";
  argv[1] = "-c";
  argv[2] = (char *) s;
  argv[2] = (char *) s;
  argv[3] = NULL;
  argv[3] = NULL;
 
 
  if ((pid = vfork ()) == 0)
  if ((pid = vfork ()) == 0)
    {
    {
      /* ??? It's not clear what's the right path to take (pun intended :-).
      /* ??? It's not clear what's the right path to take (pun intended :-).
         There won't be an "sh" in any fixed location so we need each user
         There won't be an "sh" in any fixed location so we need each user
         to be able to say where to find "sh".  That suggests using an
         to be able to say where to find "sh".  That suggests using an
         environment variable, but after a few more such situations we may
         environment variable, but after a few more such situations we may
         have too many of them.  */
         have too many of them.  */
      char *sh = getenv ("SH_PATH");
      char *sh = getenv ("SH_PATH");
      if (sh == NULL)
      if (sh == NULL)
        sh = "/bin/sh";
        sh = "/bin/sh";
      _execve (sh, argv, environ);
      _execve (sh, argv, environ);
      exit (100);
      exit (100);
    }
    }
  else if (pid == -1)
  else if (pid == -1)
    return -1;
    return -1;
  else
  else
    {
    {
      extern int _wait (int *);
      extern int _wait (int *);
      int rc = _wait (&status);
      int rc = _wait (&status);
      if (rc == -1)
      if (rc == -1)
        return -1;
        return -1;
      status = (status >> 8) & 0xff;
      status = (status >> 8) & 0xff;
      return status;
      return status;
    }
    }
}
}
#endif
#endif
 
 

powered by: WebSVN 2.1.0

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