Well, support may be too concrete of a term. There is a lot that is missing in OS X, and not everything can be implemented with portability shims. The time APIs in OS X seem to have frozen with NeXTSTEP and never advanced with POSIX.OPENBSD_5_7
@ -0,0 +1,38 @@ | |||
/* | |||
* Copyright (c) 2004, 2005 Darren Tucker (dtucker at zip com au). | |||
* | |||
* Permission to use, copy, modify, and distribute this software for any | |||
* purpose with or without fee is hereby granted, provided that the above | |||
* copyright notice and this permission notice appear in all copies. | |||
* | |||
* THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES | |||
* WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF | |||
* MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR | |||
* ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES | |||
* WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN | |||
* ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF | |||
* OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. | |||
*/ | |||
#include <sys/types.h> | |||
#include <unistd.h> | |||
int | |||
setresgid(gid_t rgid, gid_t egid, gid_t sgid) | |||
{ | |||
/* this is the only configuration tested */ | |||
if (rgid != egid || egid != sgid) | |||
return -1; | |||
# if defined(HAVE_SETREGID) && !defined(BROKEN_SETREGID) | |||
if (setregid(rgid, egid) == -1) | |||
return -1; | |||
# else | |||
if (setegid(egid) == -1) | |||
return -1; | |||
if (setgid(rgid)) == -1) | |||
return -1; | |||
# endif | |||
return 0; | |||
} |
@ -0,0 +1,67 @@ | |||
/* | |||
* Copyright (c) 2004, 2005 Darren Tucker (dtucker at zip com au). | |||
* | |||
* Permission to use, copy, modify, and distribute this software for any | |||
* purpose with or without fee is hereby granted, provided that the above | |||
* copyright notice and this permission notice appear in all copies. | |||
* | |||
* THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES | |||
* WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF | |||
* MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR | |||
* ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES | |||
* WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN | |||
* ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF | |||
* OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. | |||
*/ | |||
#include <sys/types.h> | |||
#include <errno.h> | |||
#include <unistd.h> | |||
int | |||
setresuid(uid_t ruid, uid_t euid, uid_t suid) | |||
{ | |||
uid_t ouid; | |||
int ret = -1; | |||
/* Allow only the tested configuration. */ | |||
if (ruid != euid || euid != suid) { | |||
errno = ENOSYS; | |||
return -1; | |||
} | |||
ouid = getuid(); | |||
# if defined(HAVE_SETREUID) && !defined(BROKEN_SETREUID) | |||
if ((ret = setreuid(euid, euid)) == -1) | |||
return -1; | |||
# else | |||
# ifndef SETEUID_BREAKS_SETUID | |||
if (seteuid(euid) == -1) | |||
return -1; | |||
# endif | |||
if ((ret = setuid(ruid)) == -1) | |||
return -1; | |||
# endif | |||
/* | |||
* When real, effective and saved uids are the same and we have | |||
* changed uids, sanity check that we cannot restore the old uid. | |||
*/ | |||
if (ruid == euid && euid == suid && ouid != ruid && | |||
setuid(ouid) != -1 && seteuid(ouid) != -1) { | |||
errno = EINVAL; | |||
return -1; | |||
} | |||
/* | |||
* Finally, check that the real and effective uids are what we | |||
* expect. | |||
*/ | |||
if (getuid() != ruid || geteuid() != euid) { | |||
errno = EACCES; | |||
return -1; | |||
} | |||
return ret; | |||
} |
@ -0,0 +1,47 @@ | |||
/* | |||
* Copyright (c) 1999-2004 Damien Miller <djm@mindrot.org> | |||
* Copyright (c) 2004 Darren Tucker <dtucker at zip com au> | |||
* | |||
* Permission to use, copy, modify, and distribute this software for any | |||
* purpose with or without fee is hereby granted, provided that the above | |||
* copyright notice and this permission notice appear in all copies. | |||
* | |||
* THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES | |||
* WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF | |||
* MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR | |||
* ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES | |||
* WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN | |||
* ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF | |||
* OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. | |||
*/ | |||
#include <sys/time.h> | |||
#ifdef HAVE_ADJTIMEX | |||
#include <sys/timex.h> | |||
#endif | |||
int | |||
clock_getres(clockid_t clk_id, struct timespec *tp) | |||
{ | |||
# ifdef HAVE_ADJTIMEX | |||
struct timex tmx; | |||
# endif | |||
if (clk_id != CLOCK_REALTIME) | |||
return -1; /* not implemented */ | |||
tp->tv_sec = 0; | |||
# ifdef HAVE_ADJTIMEX | |||
tmx.modes = 0; | |||
if (adjtimex(&tmx) == -1) | |||
return -1; | |||
else | |||
tp->tv_nsec = tmx.precision * 1000; /* usec -> nsec */ | |||
# else | |||
/* assume default 10ms tick */ | |||
tp->tv_nsec = 10000000; | |||
# endif | |||
return 0; | |||
} |
@ -0,0 +1,44 @@ | |||
/* | |||
* Copyright (c) 1999-2004 Damien Miller <djm@mindrot.org> | |||
* Copyright (c) 2014 Brent Cook <bcook@openbsd.org> | |||
* | |||
* Permission to use, copy, modify, and distribute this software for any | |||
* purpose with or without fee is hereby granted, provided that the above | |||
* copyright notice and this permission notice appear in all copies. | |||
* | |||
* THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES | |||
* WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF | |||
* MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR | |||
* ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES | |||
* WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN | |||
* ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF | |||
* OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. | |||
*/ | |||
#include <mach/mach_time.h> | |||
#include <sys/time.h> | |||
#include <stdint.h> | |||
#include <time.h> | |||
int | |||
clock_gettime(clockid_t clk_id, struct timespec *ts) | |||
{ | |||
static uint64_t timebase_factor = 0; | |||
mach_timebase_info_data_t timebase_info; | |||
uint64_t nsec; | |||
if (clk_id != CLOCK_REALTIME) | |||
return -1; /* not implemented */ | |||
if (timebase_factor == 0) { | |||
mach_timebase_info(&timebase_info); | |||
timebase_factor = timebase_info.numer / timebase_info.denom; | |||
} | |||
nsec = mach_absolute_time() * timebase_factor; | |||
ts->tv_sec = nsec / 1000000000UL; | |||
ts->tv_nsec = nsec % 1000000000UL; | |||
return 0; | |||
} |
@ -0,0 +1,25 @@ | |||
/* | |||
* Public domain | |||
* time.h compatibility shim | |||
*/ | |||
#include_next <time.h> | |||
#ifndef LIBCOMPAT_TIME_H | |||
#define LIBCOMPAT_TIME_H | |||
#ifndef CLOCK_REALTIME | |||
typedef int clockid_t; | |||
#define CLOCK_REALTIME 1 | |||
#define CLOCK_MONOTONIC 2 | |||
#endif | |||
#ifndef HAVE_CLOCK_GETRES | |||
int clock_getres(clockid_t clk_id, struct timespec *res); | |||
#endif | |||
#ifndef HAVE_CLOCK_GETTIME | |||
int clock_gettime(clockid_t clk_id, struct timespec *ts); | |||
#endif | |||
#endif |