1/* 2 Unix SMB/CIFS implementation. 3 4 Safe versions of getpw* calls 5 6 Copyright (C) Andrew Bartlett 2002 7 8 This program is free software; you can redistribute it and/or modify 9 it under the terms of the GNU General Public License as published by 10 the Free Software Foundation; either version 3 of the License, or 11 (at your option) any later version. 12 13 This program is distributed in the hope that it will be useful, 14 but WITHOUT ANY WARRANTY; without even the implied warranty of 15 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 16 GNU General Public License for more details. 17 18 You should have received a copy of the GNU General Public License 19 along with this program. If not, see <http://www.gnu.org/licenses/>. 20*/ 21 22#include "includes.h" 23 24static struct passwd *alloc_copy_passwd(TALLOC_CTX *mem_ctx, 25 const struct passwd *from) 26{ 27 struct passwd *ret = talloc_zero(mem_ctx, struct passwd); 28 29 if (ret == NULL) 30 return NULL; 31 32 ret->pw_name = talloc_strdup(ret, from->pw_name); 33 ret->pw_passwd = talloc_strdup(ret, from->pw_passwd); 34 ret->pw_uid = from->pw_uid; 35 ret->pw_gid = from->pw_gid; 36 ret->pw_gecos = talloc_strdup(ret, from->pw_gecos); 37 ret->pw_dir = talloc_strdup(ret, from->pw_dir); 38 ret->pw_shell = talloc_strdup(ret, from->pw_shell); 39 40 return ret; 41} 42 43struct passwd *getpwnam_alloc(TALLOC_CTX *mem_ctx, const char *name) 44{ 45 struct passwd *temp; 46 47 temp = sys_getpwnam(name); 48 49 if (!temp) { 50#if 0 51 if (errno == ENOMEM) { 52 /* what now? */ 53 } 54#endif 55 return NULL; 56 } 57 58 return alloc_copy_passwd(mem_ctx, temp); 59} 60 61struct passwd *getpwuid_alloc(TALLOC_CTX *mem_ctx, uid_t uid) 62{ 63 struct passwd *temp; 64 65 temp = sys_getpwuid(uid); 66 67 if (!temp) { 68#if 0 69 if (errno == ENOMEM) { 70 /* what now? */ 71 } 72#endif 73 return NULL; 74 } 75 76 return alloc_copy_passwd(mem_ctx, temp); 77} 78