Imported Upstream version 1.8.7
[debian/sudo] / plugins / sudoers / pwutil.h
1 /*
2  * Copyright (c) 2010-2013 Todd C. Miller <Todd.Miller@courtesan.com>
3  *
4  * Permission to use, copy, modify, and distribute this software for any
5  * purpose with or without fee is hereby granted, provided that the above
6  * copyright notice and this permission notice appear in all copies.
7  *
8  * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
9  * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
10  * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
11  * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
12  * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
13  * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
14  * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
15  */
16
17 #ifndef _SUDOERS_PWUTIL_H
18 #define _SUDOERS_PWUTIL_H
19
20 #define ptr_to_item(p) ((struct cache_item *)((char *)p - offsetof(struct cache_item_##p, p)))
21
22 /*
23  * Generic cache element.
24  */
25 struct cache_item {
26     unsigned int refcnt;
27     /* key */
28     union {
29         uid_t uid;
30         gid_t gid;
31         char *name;
32     } k;
33     /* datum */
34     union {
35         struct passwd *pw;
36         struct group *gr;
37         struct group_list *grlist;
38     } d;
39 };
40
41 /*
42  * Container structs to simpify size and offset calculations and guarantee
43  * proper aligment of struct passwd, group and group_list.
44  */
45 struct cache_item_pw {
46     struct cache_item cache;
47     struct passwd pw;
48 };
49
50 struct cache_item_gr {
51     struct cache_item cache;
52     struct group gr;
53 };
54
55 struct cache_item_grlist {
56     struct cache_item cache;
57     struct group_list grlist;
58     /* actually bigger */
59 };
60
61 struct cache_item *sudo_make_gritem(gid_t gid, const char *group);
62 struct cache_item *sudo_make_grlist_item(struct passwd *pw, char * const *groups, char * const *gids);
63 struct cache_item *sudo_make_pwitem(uid_t uid, const char *user);
64
65 #endif /* _SUDOERS_PWUTIL_H */