18 #define ROUNDUP(a, b) (((a) & ~((b)-1)) + (b)) 20 int add_config_file(
char **list,
size_t *list_len,
size_t *list_size,
unsigned char id,
char *file,
size_t file_len,
unsigned int check_path)
22 static char *home_dir = NULL;
23 static size_t home_dir_len = 0;
28 struct passwd *pw = NULL;
36 if(getenv(
"HOME") != NULL)
37 home_dir = strdup(getenv(
"HOME"));
38 else if((pw = getpwuid(getuid())) == NULL)
40 if(pw->pw_dir != NULL)
41 home_dir = strdup(pw->pw_dir);
43 home_dir = strdup(
"/root");
52 home_dir_len =
str_len(home_dir);
55 if(*list == NULL || *list_size < *list_len + home_dir_len + 1 + file_len + 3)
57 if(*list == NULL) *list_len = 0;
58 *list_size =
ROUNDUP(*list_len + home_dir_len + 1 + file_len + 3, 32);
59 ptr = (
char *)realloc(*list, *list_size);
68 (*list)[(*list_len)++] = id;
69 (*list)[(*list_len)++] =
'=';
70 ptr = *list + *list_len;
71 strncpy(*list + *list_len, home_dir, home_dir_len);
72 *list_len += home_dir_len;
73 if(file[0] ==
'/' && home_dir[home_dir_len - 1] ==
'/')
78 else if(file[0] !=
'/' && home_dir[home_dir_len - 1] !=
'/')
79 (*list)[(*list_len)++] =
'/';
81 strncpy(*list + *list_len, file, file_len);
82 *list_len += file_len;
83 (*list)[(*list_len)++] =
'\0';
85 if((check_path & S_IFMT) > 0)
91 if(S_ISDIR(check_path & S_IFMT))
92 return mkdir(ptr, S_IRUSR | S_IWUSR | S_IXUSR | S_IRGRP | S_IXGRP);
93 else if(S_ISREG(check_path & S_IFMT))
95 int fd = open(ptr, O_CREAT, S_IRUSR | S_IWUSR | S_IRGRP);
118 return envz_get(list, list_size, s);
#define PATH_R
request read permission
#define PATH_W
request write permission
char * get_config_file(char *list, size_t list_size, unsigned char id)
#define str_len(s)
Shorthand for counting '\0' terminating strings. See _len for more info.
#define check_dir_exists(dir, mode)
int add_config_file(char **list, size_t *list_len, size_t *list_size, unsigned char id, char *file, size_t file_len, unsigned int check_path)
#define PATH_X
request execute permission
int check_path_exists(const char *path, mode_t type, mode_t mode)