1 /* 2 * setreuid() for uClibc 3 * 4 * Copyright (C) 2000-2006 Erik Andersen <andersen@uclibc.org> 5 * 6 * Licensed under the LGPL v2.1, see the file COPYING.LIB in this tarball. 7 */ 8 9 #include <sys/syscall.h> 10 #include <unistd.h> 11 #include <bits/wordsize.h> 12 13 14 #if (__WORDSIZE == 32 && defined(__NR_setreuid32)) || __WORDSIZE == 64 15 # ifdef __NR_setreuid32 16 # undef __NR_setreuid 17 # define __NR_setreuid __NR_setreuid32 18 # endif 19 20 _syscall2(int, setreuid, uid_t, ruid, uid_t, euid) 21 22 #else 23 24 # define __NR___syscall_setreuid __NR_setreuid 25 static __inline__ _syscall2(int, __syscall_setreuid, 26 __kernel_uid_t, ruid, __kernel_uid_t, euid) 27 28 int setreuid(uid_t ruid, uid_t euid) 29 { 30 if (((ruid + 1) > (uid_t) ((__kernel_uid_t) - 1U)) 31 || ((euid + 1) > (uid_t) ((__kernel_uid_t) - 1U))) { 32 __set_errno(EINVAL); 33 return -1; 34 } 35 return (__syscall_setreuid(ruid, euid)); 36 } 37 #endif 38 39 libc_hidden_weak(setreuid) 40