Back to index

glibc  2.9
waitid.c
Go to the documentation of this file.
00001 /* Pseudo implementation of waitid.
00002    Copyright (C) 1997, 1998, 2000, 2002 Free Software Foundation, Inc.
00003    This file is part of the GNU C Library.
00004    Contributed by Zack Weinberg <zack@rabi.phys.columbia.edu>, 1997.
00005 
00006    The GNU C Library is free software; you can redistribute it and/or
00007    modify it under the terms of the GNU Lesser General Public
00008    License as published by the Free Software Foundation; either
00009    version 2.1 of the License, or (at your option) any later version.
00010 
00011    The GNU C Library is distributed in the hope that it will be useful,
00012    but WITHOUT ANY WARRANTY; without even the implied warranty of
00013    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
00014    Lesser General Public License for more details.
00015 
00016    You should have received a copy of the GNU Lesser General Public
00017    License along with the GNU C Library; if not, write to the Free
00018    Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
00019    02111-1307 USA.  */
00020 
00021 #include <errno.h>
00022 #include <signal.h>
00023 #define __need_NULL
00024 #include <stddef.h>
00025 #include <sys/wait.h>
00026 #include <sys/types.h>
00027 
00028 #include <assert.h>
00029 
00030 extern pid_t kwaitpid (int *stat_loc, pid_t pid, int options,
00031                      struct rusage *ru_loc, siginfo_t *infop);
00032 
00033 int
00034 __waitid (idtype, id, infop, options)
00035      idtype_t idtype;
00036      id_t id;
00037      siginfo_t *infop;
00038      int options;
00039 {
00040   pid_t pid, child;
00041   int status;
00042 
00043   switch (idtype)
00044     {
00045     case P_PID:
00046       if(id <= 0)
00047        goto invalid;
00048       pid = (pid_t) id;
00049       break;
00050     case P_PGID:
00051       if (id < 0 || id == 1)
00052        goto invalid;
00053       pid = (pid_t) -id;
00054       break;
00055     case P_ALL:
00056       pid = -1;
00057       break;
00058     default:
00059     invalid:
00060       __set_errno (EINVAL);
00061       return -1;
00062     }
00063 
00064   /* Technically we're supposed to return EFAULT if infop is bogus,
00065      but that would involve mucking with signals, which is
00066      too much hassle.  User will have to deal with SIGSEGV/SIGBUS.
00067      We just check for a null pointer. */
00068 
00069   if (infop == NULL)
00070     {
00071       __set_errno (EFAULT);
00072       return -1;
00073     }
00074 
00075   child = kwaitpid (&status, pid, options, NULL, infop);
00076 
00077   if (child == -1)
00078     /* `waitpid' set `errno' for us.  */
00079     return -1;
00080 
00081   return 0;
00082 }
00083 weak_alias (__waitid, waitid)