X-Git-Url: http://git.tuebingen.mpg.de/?a=blobdiff_plain;f=string.c;h=9fffad13f3586796c2f66d66b884375f71c6570e;hb=refs%2Fheads%2Fpu;hp=46b346235f17ffb696f43d22d3dcfde4c75ba4ca;hpb=a0707daa23f8706326aa837f969c20d3e4ee02aa;p=paraslash.git diff --git a/string.c b/string.c index 46b34623..56f1443f 100644 --- a/string.c +++ b/string.c @@ -308,15 +308,33 @@ __must_check __malloc char *para_logname(void) } /** - * Get the home directory of the current user. + * Return the expansion of $HOME/.paraslash. * - * \return A dynamically allocated string that must be freed by the caller. If - * the home directory could not be found, this function returns "/tmp". + * If the environment variable HOME is unset or empty, the function prints an + * error message and aborts. Otherwise, on the first call the memory for the + * string is allocated and a pointer to this memory location is returned. + * Subsequent calls return a pointer to the memory that was allocated during + * the first call. + * + * \return A pointer to a C string, allocated on the heap. Callers should make + * sure that free() is only called once. + * + * \sa getenv(3), getuid(2). */ -__must_check __malloc char *para_homedir(void) +__malloc char *get_confdir(void) { - struct passwd *pw = getpwuid(getuid()); - return para_strdup(pw? pw->pw_dir : "/tmp"); + static 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; } /** @@ -739,13 +757,11 @@ void free_argv(char **argv) static int create_argv_offset(int offset, const char *buf, const char *delim, char ***result) { - char *word, **argv = arr_alloc(offset + 1, sizeof(char *)); + char *word, **argv = arr_zalloc(offset + 1, sizeof(char *)); const char *p; int i, ret; - for (i = 0; i < offset; i++) - argv[i] = NULL; - for (p = buf; p && *p; p += ret, i++) { + for (p = buf, i = offset; p && *p; p += ret, i++) { ret = get_next_word(p, delim, &word); if (ret < 0) goto err;