}
/**
- * Get the home directory of the calling user.
+ * Return the expansion of $HOME/.paraslash.
*
- * \return A dynamically allocated string that must be freed by the caller. If
- * no entry is found which matches the UID of the calling process, or any other
- * error occurs, the function prints an error message and aborts.
+ * \return A pointer to memory that must not be freed by the caller. If the
+ * environment variable HOME is unset or empty, the function prints an error
+ * message and aborts.
*
- * \sa getpwuid(3), getuid(2).
+ * \sa getenv(3), getuid(2).
*/
-__must_check __malloc char *para_homedir(void)
+const char *get_confdir(void)
{
- struct passwd *pw;
-
- /*
- * To distinguish between the error case and the "not found" case we
- * have to check errno after getpwuid(3). The manual page recommends to
- * set it to zero before the call.
- */
- errno = 0;
- pw = getpwuid(getuid());
- if (pw)
- return para_strdup(pw->pw_dir);
- if (errno != 0)
- PARA_EMERG_LOG("getpwuid error: %s\n", strerror(errno));
- else
- PARA_EMERG_LOG("no pw entry for uid %u\n", (unsigned)getuid());
- exit(EXIT_FAILURE);
+ static const char *dot_para;
+ const char *home;
+
+ if (dot_para)
+ return dot_para;
+ home = getenv("HOME");
+ if (!home || !*home) {
+ PARA_EMERG_LOG("fatal: HOME is unset or empty");
+ exit(EXIT_FAILURE);
+ }
+ dot_para = make_message("%s/.paraslash", home);
+ return dot_para;
}
/**