~zulcss/samba/server-dailies-3.4

« back to all changes in this revision

Viewing changes to source3/lib/util_pw.c

  • Committer: Chuck Short
  • Date: 2010-09-28 20:38:39 UTC
  • Revision ID: zulcss@ubuntu.com-20100928203839-pgjulytsi9ue63x1
Initial version

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
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
 
 
24
struct passwd *tcopy_passwd(TALLOC_CTX *mem_ctx, const struct passwd *from) 
 
25
{
 
26
        struct passwd *ret = TALLOC_P(mem_ctx, struct passwd);
 
27
        if (!ret) {
 
28
                return NULL;
 
29
        }
 
30
        ret->pw_name = talloc_strdup(ret, from->pw_name);
 
31
        ret->pw_passwd = talloc_strdup(ret, from->pw_passwd);
 
32
        ret->pw_uid = from->pw_uid;
 
33
        ret->pw_gid = from->pw_gid;
 
34
        ret->pw_gecos = talloc_strdup(ret, from->pw_gecos);
 
35
        ret->pw_dir = talloc_strdup(ret, from->pw_dir);
 
36
        ret->pw_shell = talloc_strdup(ret, from->pw_shell);
 
37
        return ret;
 
38
}
 
39
 
 
40
void flush_pwnam_cache(void)
 
41
{
 
42
        memcache_flush(NULL, GETPWNAM_CACHE);
 
43
}
 
44
 
 
45
struct passwd *getpwnam_alloc(TALLOC_CTX *mem_ctx, const char *name)
 
46
{
 
47
        struct passwd *pw, *for_cache;
 
48
 
 
49
        pw = (struct passwd *)memcache_lookup_talloc(
 
50
                NULL, GETPWNAM_CACHE, data_blob_string_const_null(name));
 
51
        if (pw != NULL) {
 
52
                return tcopy_passwd(mem_ctx, pw);
 
53
        }
 
54
 
 
55
        pw = sys_getpwnam(name);
 
56
        if (pw == NULL) {
 
57
                return NULL;
 
58
        }
 
59
 
 
60
        for_cache = tcopy_passwd(talloc_autofree_context(), pw);
 
61
        if (for_cache == NULL) {
 
62
                return NULL;
 
63
        }
 
64
 
 
65
        memcache_add_talloc(NULL, GETPWNAM_CACHE,
 
66
                            data_blob_string_const_null(name), &for_cache);
 
67
 
 
68
        return tcopy_passwd(mem_ctx, pw);
 
69
}
 
70
 
 
71
struct passwd *getpwuid_alloc(TALLOC_CTX *mem_ctx, uid_t uid) 
 
72
{
 
73
        struct passwd *temp;
 
74
 
 
75
        temp = sys_getpwuid(uid);
 
76
        
 
77
        if (!temp) {
 
78
#if 0
 
79
                if (errno == ENOMEM) {
 
80
                        /* what now? */
 
81
                }
 
82
#endif
 
83
                return NULL;
 
84
        }
 
85
 
 
86
        return tcopy_passwd(mem_ctx, temp);
 
87
}