annotate src/lib/home-expand.c @ 9191:b340ecb24469 HEAD

Fix VPATH build of RQUOTA support. Some rpcgen derive #include "..." paths from the infile argument. This will be off for VPATH builds, as the generated rquota_xdr.c code will look in $(srcdir), but we'll generate the rquota.h file in $(builddir). Play safe and copy rquota.x to $(builddir) first. This fixes the build on openSUSE 11.1.
author Matthias Andree <matthias.andree@gmx.de>
date Tue, 07 Jul 2009 21:01:36 +0200
parents b9faf4db2a9f
children 00cd9aacd03c
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
8590
b9faf4db2a9f Updated copyright notices to include year 2009.
Timo Sirainen <tss@iki.fi>
parents: 7086
diff changeset
1 /* Copyright (c) 2003-2009 Dovecot authors, see the included COPYING file */
1151
058f6c26f405 Added mail_full_filesystem_access setting. Some of the setting variable
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
2
058f6c26f405 Added mail_full_filesystem_access setting. Some of the setting variable
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
3 #include "lib.h"
058f6c26f405 Added mail_full_filesystem_access setting. Some of the setting variable
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
4 #include "home-expand.h"
058f6c26f405 Added mail_full_filesystem_access setting. Some of the setting variable
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
5
058f6c26f405 Added mail_full_filesystem_access setting. Some of the setting variable
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
6 #include <stdlib.h>
058f6c26f405 Added mail_full_filesystem_access setting. Some of the setting variable
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
7 #include <pwd.h>
058f6c26f405 Added mail_full_filesystem_access setting. Some of the setting variable
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
8
4984
0caa09cc3edb Added home_try_expand()
Timo Sirainen <tss@iki.fi>
parents: 1588
diff changeset
9 int home_try_expand(const char **_path)
1151
058f6c26f405 Added mail_full_filesystem_access setting. Some of the setting variable
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
10 {
4984
0caa09cc3edb Added home_try_expand()
Timo Sirainen <tss@iki.fi>
parents: 1588
diff changeset
11 const char *path = *_path;
1151
058f6c26f405 Added mail_full_filesystem_access setting. Some of the setting variable
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
12 const char *home, *p, *orig_path;
058f6c26f405 Added mail_full_filesystem_access setting. Some of the setting variable
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
13 struct passwd *pw;
058f6c26f405 Added mail_full_filesystem_access setting. Some of the setting variable
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
14
1588
e0006f30b496 home_expand(NULL) -> NULL
Timo Sirainen <tss@iki.fi>
parents: 1151
diff changeset
15 if (path == NULL || *path != '~')
4984
0caa09cc3edb Added home_try_expand()
Timo Sirainen <tss@iki.fi>
parents: 1588
diff changeset
16 return 0;
1151
058f6c26f405 Added mail_full_filesystem_access setting. Some of the setting variable
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
17
058f6c26f405 Added mail_full_filesystem_access setting. Some of the setting variable
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
18 orig_path = path++;
058f6c26f405 Added mail_full_filesystem_access setting. Some of the setting variable
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
19 if (*path == '/' || *path == '\0') {
058f6c26f405 Added mail_full_filesystem_access setting. Some of the setting variable
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
20 home = getenv("HOME");
058f6c26f405 Added mail_full_filesystem_access setting. Some of the setting variable
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
21 if (*path != '\0') path++;
058f6c26f405 Added mail_full_filesystem_access setting. Some of the setting variable
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
22 } else {
058f6c26f405 Added mail_full_filesystem_access setting. Some of the setting variable
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
23 p = strchr(path, '/');
058f6c26f405 Added mail_full_filesystem_access setting. Some of the setting variable
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
24 if (p == NULL) {
058f6c26f405 Added mail_full_filesystem_access setting. Some of the setting variable
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
25 pw = getpwnam(path);
058f6c26f405 Added mail_full_filesystem_access setting. Some of the setting variable
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
26 path = "";
058f6c26f405 Added mail_full_filesystem_access setting. Some of the setting variable
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
27 } else {
058f6c26f405 Added mail_full_filesystem_access setting. Some of the setting variable
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
28 pw = getpwnam(t_strdup_until(path, p));
058f6c26f405 Added mail_full_filesystem_access setting. Some of the setting variable
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
29 path = p+1;
058f6c26f405 Added mail_full_filesystem_access setting. Some of the setting variable
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
30 }
058f6c26f405 Added mail_full_filesystem_access setting. Some of the setting variable
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
31
058f6c26f405 Added mail_full_filesystem_access setting. Some of the setting variable
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
32 home = pw == NULL ? NULL : pw->pw_dir;
058f6c26f405 Added mail_full_filesystem_access setting. Some of the setting variable
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
33 }
058f6c26f405 Added mail_full_filesystem_access setting. Some of the setting variable
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
34
058f6c26f405 Added mail_full_filesystem_access setting. Some of the setting variable
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
35 if (home == NULL)
4984
0caa09cc3edb Added home_try_expand()
Timo Sirainen <tss@iki.fi>
parents: 1588
diff changeset
36 return -1;
0caa09cc3edb Added home_try_expand()
Timo Sirainen <tss@iki.fi>
parents: 1588
diff changeset
37
0caa09cc3edb Added home_try_expand()
Timo Sirainen <tss@iki.fi>
parents: 1588
diff changeset
38 if (*path == '\0')
0caa09cc3edb Added home_try_expand()
Timo Sirainen <tss@iki.fi>
parents: 1588
diff changeset
39 *_path = t_strdup(home);
1151
058f6c26f405 Added mail_full_filesystem_access setting. Some of the setting variable
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
40 else
4984
0caa09cc3edb Added home_try_expand()
Timo Sirainen <tss@iki.fi>
parents: 1588
diff changeset
41 *_path = t_strconcat(home, "/", path, NULL);
0caa09cc3edb Added home_try_expand()
Timo Sirainen <tss@iki.fi>
parents: 1588
diff changeset
42 return 0;
1151
058f6c26f405 Added mail_full_filesystem_access setting. Some of the setting variable
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
43 }
4984
0caa09cc3edb Added home_try_expand()
Timo Sirainen <tss@iki.fi>
parents: 1588
diff changeset
44
0caa09cc3edb Added home_try_expand()
Timo Sirainen <tss@iki.fi>
parents: 1588
diff changeset
45 const char *home_expand(const char *path)
0caa09cc3edb Added home_try_expand()
Timo Sirainen <tss@iki.fi>
parents: 1588
diff changeset
46 {
0caa09cc3edb Added home_try_expand()
Timo Sirainen <tss@iki.fi>
parents: 1588
diff changeset
47 (void)home_try_expand(&path);
0caa09cc3edb Added home_try_expand()
Timo Sirainen <tss@iki.fi>
parents: 1588
diff changeset
48 return path;
0caa09cc3edb Added home_try_expand()
Timo Sirainen <tss@iki.fi>
parents: 1588
diff changeset
49 }
5385
284f2994ea5f Added home_expand_tilde()
Timo Sirainen <tss@iki.fi>
parents: 4984
diff changeset
50
284f2994ea5f Added home_expand_tilde()
Timo Sirainen <tss@iki.fi>
parents: 4984
diff changeset
51 const char *home_expand_tilde(const char *path, const char *home)
284f2994ea5f Added home_expand_tilde()
Timo Sirainen <tss@iki.fi>
parents: 4984
diff changeset
52 {
284f2994ea5f Added home_expand_tilde()
Timo Sirainen <tss@iki.fi>
parents: 4984
diff changeset
53 if (path == NULL || *path != '~')
284f2994ea5f Added home_expand_tilde()
Timo Sirainen <tss@iki.fi>
parents: 4984
diff changeset
54 return path;
284f2994ea5f Added home_expand_tilde()
Timo Sirainen <tss@iki.fi>
parents: 4984
diff changeset
55
284f2994ea5f Added home_expand_tilde()
Timo Sirainen <tss@iki.fi>
parents: 4984
diff changeset
56 if (path[1] == '\0')
284f2994ea5f Added home_expand_tilde()
Timo Sirainen <tss@iki.fi>
parents: 4984
diff changeset
57 return home;
284f2994ea5f Added home_expand_tilde()
Timo Sirainen <tss@iki.fi>
parents: 4984
diff changeset
58 if (path[1] != '/')
284f2994ea5f Added home_expand_tilde()
Timo Sirainen <tss@iki.fi>
parents: 4984
diff changeset
59 return path;
284f2994ea5f Added home_expand_tilde()
Timo Sirainen <tss@iki.fi>
parents: 4984
diff changeset
60
284f2994ea5f Added home_expand_tilde()
Timo Sirainen <tss@iki.fi>
parents: 4984
diff changeset
61 /* ~/ used */
284f2994ea5f Added home_expand_tilde()
Timo Sirainen <tss@iki.fi>
parents: 4984
diff changeset
62 return t_strconcat(home, path + 1, NULL);
284f2994ea5f Added home_expand_tilde()
Timo Sirainen <tss@iki.fi>
parents: 4984
diff changeset
63 }