1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
|
/* Copyright (c) 2003-2018 Dovecot authors, see the included COPYING file */
#include "lib.h"
#include "ipwd.h"
#include "home-expand.h"
int home_try_expand(const char **_path)
{
const char *path = *_path;
const char *name, *home, *p;
struct passwd pw;
if (path == NULL || *path != '~')
return 0;
path++;
if (*path == '/' || *path == '\0') {
home = getenv("HOME");
if (*path != '\0') path++;
} else {
p = strchr(path, '/');
if (p == NULL) {
name = path;
path = "";
} else {
name = t_strdup_until(path, p);
path = p+1;
}
switch (i_getpwnam(name, &pw)) {
case -1:
i_error("getpwnam(%s) failed: %m", name);
home = NULL;
break;
case 0:
home = NULL;
break;
default:
home = pw.pw_dir;
break;
}
}
if (home == NULL)
return -1;
if (*path == '\0')
*_path = t_strdup(home);
else
*_path = t_strconcat(home, "/", path, NULL);
return 0;
}
const char *home_expand(const char *path)
{
(void)home_try_expand(&path);
return path;
}
const char *home_expand_tilde(const char *path, const char *home)
{
if (path == NULL || *path != '~')
return path;
if (path[1] == '\0')
return home;
if (path[1] != '/')
return path;
/* ~/ used */
return t_strconcat(home, path + 1, NULL);
}
|