libcfe  0.12.1
some useful C-functions
uname_gname.c
Go to the documentation of this file.
1 #include "config.h"
2 #include "uname_gname.h"
3 
4 #include <string.h>
5 #include <stdlib.h>
6 #include <grp.h>
7 
8 #include "len.h"
9 
10 static char *cached_uname;
11 static char *cached_gname;
12 
13 static uid_t cached_uid; /* valid only if cached_uname is not NULL */
14 static gid_t cached_gid; /* valid only if cached_gname is not NULL */
15 
16 char *get_uname(uid_t uid)
17 {
18  char *ret = NULL;
19  if(cached_uname == NULL || uid != cached_uid)
20  {
21  struct passwd *passwd = getpwuid(uid);
22  if(passwd)
23  {
24  cached_uid = uid;
25  free(cached_uname);
26  cached_uname = malloc(str_len(passwd->pw_name) + 1);
27  strcpy(cached_uname, passwd->pw_name);
28  }
29  else
30  return NULL;
31  }
32  ret = malloc(str_len(cached_uname) + 1);
33  strcpy(ret, cached_uname);
34  return ret;
35 }
36 
37 char *get_gname(gid_t gid)
38 {
39  char *ret = NULL;
40  if(cached_gname == NULL || gid != cached_gid)
41  {
42  struct group *group = getgrgid(gid);
43  if(group)
44  {
45  cached_gid = gid;
46  free(cached_gname);
47  cached_gname = malloc(str_len(group->gr_name) + 1);
48  strcpy(cached_gname, group->gr_name);
49  }
50  else
51  return NULL;
52  }
53  ret = malloc(str_len(cached_gname) + 1);
54  strcpy(ret, cached_gname);
55  return ret;
56 }
#define str_len(s)
Shorthand for counting &#39;\0&#39; terminating strings. See _len for more info.
Definition: len.h:17
char * get_uname(uid_t uid)
Definition: uname_gname.c:16
char * get_gname(gid_t gid)
Definition: uname_gname.c:37