this repo has no description
1
fork

Configure Feed

Select the types of activity you want to include in your feed.

getpwent family impl

+131
+92
src/libSystem/libc/getpwent.cpp
··· 1 + #include "config.h" 2 + #include "getpwent.h" 3 + #include "darwin_errno_codes.h" 4 + #include <pwd.h> 5 + #include <cstring> 6 + #include <errno.h> 7 + #include <cstdlib> 8 + #include <iostream> 9 + #include "errno.h" 10 + 11 + static void passwdLinuxToDarwin(const struct passwd* in, __darwin_passwd* out) 12 + { 13 + memset(out, 0, sizeof(*out)); 14 + out->pw_name = in->pw_name; 15 + out->pw_passwd = in->pw_passwd; 16 + out->pw_uid = in->pw_uid; 17 + out->pw_gid = in->pw_gid; 18 + out->pw_gecos = in->pw_gecos; 19 + out->pw_dir = in->pw_dir; 20 + out->pw_shell = in->pw_shell; 21 + } 22 + 23 + static __darwin_passwd* passwdLinuxToDarwin(const struct passwd* in) 24 + { 25 + static __thread __darwin_passwd pwd; 26 + passwdLinuxToDarwin(in, &pwd); 27 + return &pwd; 28 + } 29 + 30 + __darwin_passwd* __darwin_getpwent() 31 + { 32 + return passwdLinuxToDarwin(getpwent()); 33 + } 34 + 35 + __darwin_passwd* __darwin_getpwnam(const char* login) 36 + { 37 + return passwdLinuxToDarwin(getpwnam(login)); 38 + } 39 + 40 + template<typename Func, typename Param> int GenericGet_R(Func f, Param p, struct __darwin_passwd *pwd, 41 + char *buffer, size_t bufsize, struct __darwin_passwd **result) 42 + { 43 + static_assert(sizeof(struct __darwin_passwd) >= sizeof(struct passwd), "struct passwd is too small on this platform!"); 44 + 45 + int rv = f(p, reinterpret_cast<struct passwd*>(pwd), buffer, bufsize, reinterpret_cast<struct passwd**>(result)); 46 + if (rv != 0) 47 + { 48 + return errnoLinuxToDarwin(rv); 49 + } 50 + else 51 + { 52 + if (*result) 53 + { 54 + struct passwd l; 55 + memcpy(&l, *result, sizeof(l)); 56 + passwdLinuxToDarwin(&l, *result); 57 + } 58 + 59 + return 0; 60 + } 61 + } 62 + 63 + int __darwin_getpwnam_r(const char *name, struct __darwin_passwd *pwd, char *buffer, size_t bufsize, struct __darwin_passwd **result) 64 + { 65 + return GenericGet_R(getpwnam_r, name, pwd, buffer, bufsize, result); 66 + } 67 + 68 + __darwin_passwd* __darwin_getpwuid(uid_t uid) 69 + { 70 + return passwdLinuxToDarwin(getpwuid(uid)); 71 + } 72 + 73 + int __darwin_getpwuid_r(uid_t uid, struct __darwin_passwd *pwd, char *buffer, size_t bufsize, struct __darwin_passwd **result) 74 + { 75 + return GenericGet_R(getpwuid_r, uid, pwd, buffer, bufsize, result); 76 + } 77 + 78 + int __darwin_getpwuuid(/* ... */) 79 + { 80 + errno = DARWIN_ENOSYS; 81 + return -1; 82 + } 83 + 84 + int __darwin_getpwuuid_r(/* ... */) 85 + { 86 + errno = DARWIN_ENOSYS; 87 + return -1; 88 + } 89 + 90 + int __darwin_setpassent(int stayopen); 91 + 92 +
+39
src/libSystem/libc/getpwent.h
··· 1 + #ifndef LIBC_GETPWENT_H 2 + #define LIBC_GETPWENT_H 3 + #include <sys/types.h> 4 + 5 + extern "C" 6 + { 7 + 8 + struct __darwin_passwd 9 + { 10 + const char* pw_name; 11 + const char* pw_passwd; 12 + uid_t pw_uid; 13 + gid_t pw_gid; 14 + time_t pw_change; 15 + const char* pw_class; 16 + const char* pw_gecos; 17 + const char* pw_dir; 18 + const char* pw_shell; 19 + time_t pw_expire; 20 + }; 21 + 22 + __darwin_passwd* __darwin_getpwent(); 23 + __darwin_passwd* __darwin_getpwnam(const char* login); 24 + int __darwin_getpwnam_r(const char *name, struct __darwin_passwd *pwd, char *buffer, size_t bufsize, struct __darwin_passwd **result); 25 + __darwin_passwd* __darwin_getpwuid(uid_t uid); 26 + int __darwin_getpwuid_r(uid_t uid, struct __darwin_passwd *pwd, char *buffer, size_t bufsize, struct __darwin_passwd **result); 27 + int __darwin_getpwuuid(/* ... */); 28 + int __darwin_getpwuuid_r(/* ... */); 29 + int __darwin_setpassent(int stayopen); 30 + 31 + // not needed, compatible 32 + // void __darwin_setpwent(); 33 + // void __darwin_endpwent(); 34 + 35 + } 36 + 37 + 38 + #endif 39 +