예제 #1
0
int _kill_r(struct _reent *r, int pid, int signal) {
   if (pid == _getpid_r(r)) {
       switch (signal) {
       case SIGHUP:
       case SIGINT:
       case SIGQUIT:
       case SIGILL:
       case SIGTRAP:
       case SIGEMT:
       case SIGFPE:
       case SIGKILL:
       case SIGBUS:
       case SIGSEGV:
       case SIGSYS:
       case SIGPIPE:
       case SIGALRM:
       case SIGTERM:
       default:
           _exit(0);
       }
   } else {
       SET_ERR(ECHILD);
   }
   return -1;
}
예제 #2
0
파일: signal.c 프로젝트: mlyle/newlib
int 
_raise_r (struct _reent *ptr,
     int sig)
{
  _sig_func_ptr func;

  if (sig < 0 || sig >= NSIG)
    {
      __errno_r(ptr) = EINVAL;
      return -1;
    }

  if (ptr->_sig_func == NULL)
    func = SIG_DFL;
  else
    func = ptr->_sig_func[sig];

  if (func == SIG_DFL)
    return _kill_r (ptr, _getpid_r (ptr), sig);
  else if (func == SIG_IGN)
    return 0;
  else if (func == SIG_ERR)
    {
      __errno_r(ptr) = EINVAL;
      return 1;
    }
  else
    {
      ptr->_sig_func[sig] = SIG_DFL;
      func (sig);
      return 0;
    }
}
예제 #3
0
파일: sysgetpid.c 프로젝트: Alexpux/Cygwin
int
getpid (void)
{
  return _getpid_r (_REENT);
}
예제 #4
0
int
_DEFUN_VOID (getpid)
{
  return _getpid_r (_REENT);
}
예제 #5
0
       char *path         _AND
       register int *doopen _AND
       int domkdir        _AND
       size_t suffixlen   _AND
       int flags)
{
  register char *start, *trv;
  char *end;
#ifdef __USE_INTERNAL_STAT64
  struct stat64 sbuf;
#else
  struct stat sbuf;
#endif
  unsigned int pid;

  pid = _getpid_r (ptr);
  for (trv = path; *trv; ++trv)		/* extra X's get set to 0's */
    continue;
  if (trv - path < suffixlen)
    {
      ptr->_errno = EINVAL;
      return 0;
    }
  trv -= suffixlen;
  end = trv;
  while (path < trv && *--trv == 'X')
    {
      *trv = (pid % 10) + '0';
      pid /= 10;
    }
  if (end - trv < 6)
예제 #6
0
파일: mktemp.c 프로젝트: Alexpux/Cygwin
static int
_gettemp (struct _reent *ptr,
       char *path,
       register int *doopen,
       int domkdir,
       size_t suffixlen,
       int flags)
{
  register char *start, *trv;
  char *end;
#ifdef __USE_INTERNAL_STAT64
  struct stat64 sbuf;
#else
  struct stat sbuf;
#endif
  unsigned int pid;

  pid = _getpid_r (ptr);
  for (trv = path; *trv; ++trv)		/* extra X's get set to 0's */
    continue;
  if (trv - path < suffixlen)
    {
      ptr->_errno = EINVAL;
      return 0;
    }
  trv -= suffixlen;
  end = trv;
  while (path < trv && *--trv == 'X')
    {
      *trv = (pid % 10) + '0';
      pid /= 10;
    }
  if (end - trv < 6)
    {
      ptr->_errno = EINVAL;
      return 0;
    }

  /*
   * Check the target directory; if you have six X's and it
   * doesn't exist this runs for a *very* long time.
   */

  for (start = trv + 1;; --trv)
    {
      if (trv <= path)
	break;
      if (*trv == '/')
	{
	  *trv = '\0';
#ifdef __USE_INTERNAL_STAT64
	  if (_stat64_r (ptr, path, &sbuf))
#else
	  if (_stat_r (ptr, path, &sbuf))
#endif
	    return (0);
	  if (!(sbuf.st_mode & S_IFDIR))
	    {
	      ptr->_errno = ENOTDIR;
	      return (0);
	    }
	  *trv = '/';
	  break;
	}
    }

  for (;;)
    {
#if !defined _ELIX_LEVEL || _ELIX_LEVEL >= 4
      if (domkdir)
	{
#ifdef HAVE_MKDIR
	  if (_mkdir_r (ptr, path, 0700) == 0)
	    return 1;
	  if (ptr->_errno != EEXIST)
	    return 0;
#else /* !HAVE_MKDIR */
	  ptr->_errno = ENOSYS;
	  return 0;
#endif /* !HAVE_MKDIR */
	}
      else
#endif /* _ELIX_LEVEL */
      if (doopen)
	{
	  if ((*doopen = _open_r (ptr, path, O_CREAT | O_EXCL | O_RDWR | flags,
				  0600)) >= 0)
	    return 1;
	  if (ptr->_errno != EEXIST)
	    return 0;
	}
#ifdef __USE_INTERNAL_STAT64
      else if (_stat64_r (ptr, path, &sbuf))
#else
      else if (_stat_r (ptr, path, &sbuf))
#endif
	return (ptr->_errno == ENOENT ? 1 : 0);

      /* tricky little algorithm for backward compatibility */
      for (trv = start;;)
	{
	  if (trv == end)
	    return 0;
	  if (*trv == 'z')
	    *trv++ = 'a';
	  else
	    {
	      /* Safe, since it only encounters 7-bit characters.  */
	      if (isdigit ((unsigned char) *trv))
		*trv = 'a';
	      else
		++ * trv;
	      break;
	    }
	}
    }
  /*NOTREACHED*/
}