aboutsummaryrefslogtreecommitdiffstats
path: root/src/sysutils.c
diff options
context:
space:
mode:
authorWerner Koch <[email protected]>2020-02-18 07:53:30 +0000
committerWerner Koch <[email protected]>2020-02-18 07:56:33 +0000
commit5742b8eaf3fa9cda3dfb6b3ad0fea7485fff1a12 (patch)
tree7bb1347295569e10184f65ccfb3aea8e44495275 /src/sysutils.c
parentw32: Support static link with -lws2_32. (diff)
downloadlibgpg-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.c39
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;
+}