diff options
author | Werner Koch <[email protected]> | 2020-02-18 07:53:30 +0000 |
---|---|---|
committer | Werner Koch <[email protected]> | 2020-02-18 07:56:33 +0000 |
commit | 5742b8eaf3fa9cda3dfb6b3ad0fea7485fff1a12 (patch) | |
tree | 7bb1347295569e10184f65ccfb3aea8e44495275 /src/sysutils.c | |
parent | w32: Support static link with -lws2_32. (diff) | |
download | libgpg-error-5742b8eaf3fa9cda3dfb6b3ad0fea7485fff1a12.tar.gz libgpg-error-5742b8eaf3fa9cda3dfb6b3ad0fea7485fff1a12.zip |
core: Add gpgrt_fnameconcat and gpgrt_absfnameconcat.
* src/gpg-error.h.in (gpgrt_fnameconcat): New.
(gpgrt_absfnameconcat): New.
* src/visibility.c (gpgrt_fnameconcat, gpgrt_absfnameconcat): New.
* src/stringutils.c: New file.
(_gpgrt_vfnameconcat): New.
(_gpgrt_fnameconcat, _gpgrt_absfnameconcat): New.
* src/gpg-error.def.in: Add new functions.
* src/gpg-error.vers: Ditto.
* src/sysutils.c: Include pwd.h.
(_gpgrt_getpwdir): New.
* configure.ac: Test for pwd.h, getpwnam, getpwuid, and their _r
variants.
* src/Makefile.am (libgpg_error_la_SOURCES): Add new file.
* tests/t-stringutils.c: New.
* tests/t-common.h (xmalloc, xstrdup, xfree): New.
(die): Kludge to avoid compiler warnings.
--
The new functions are based on the code of make_filename from GnuPG.
They have been written by me ages ago with only minor modifications by
David Shaw. I re-license them from LGPL-3.0+ OR GPL-2.0+ to
LGPL-2.1-or-later.
Signed-off-by: Werner Koch <[email protected]>
Diffstat (limited to 'src/sysutils.c')
-rw-r--r-- | src/sysutils.c | 39 |
1 files changed, 39 insertions, 0 deletions
diff --git a/src/sysutils.c b/src/sysutils.c index bc31d92..6bdd76f 100644 --- a/src/sysutils.c +++ b/src/sysutils.c @@ -32,6 +32,9 @@ #endif #include <sys/types.h> #include <fcntl.h> +#ifdef HAVE_PWD_H +# include <pwd.h> +#endif #include "gpgrt-int.h" @@ -337,3 +340,39 @@ _gpgrt_getcwd (void) #endif } } + + +/* Get the standard home directory for user NAME. If NAME is NULL the + * directory for the current user is retruned. Caller must release + * the returned string. */ +char * +_gpgrt_getpwdir (const char *name) +{ + char *result = NULL; +#ifdef HAVE_PWD_H + struct passwd *pwd = NULL; + + if (name) + { +#ifdef HAVE_GETPWNAM + /* Fixme: We should use getpwnam_r if available. */ + pwd = getpwnam (name); +#endif + } + else + { +#ifdef HAVE_GETPWUID + /* Fixme: We should use getpwuid_r if available. */ + pwd = getpwuid (getuid()); +#endif + } + if (pwd) + { + result = _gpgrt_strdup (pwd->pw_dir); + } +#else /*!HAVE_PWD_H*/ + /* No support at all. */ + (void)name; +#endif /*HAVE_PWD_H*/ + return result; +} |