]> git.tuebingen.mpg.de Git - paraslash.git/blobdiff - string.c
Merge topic branch t/sf_float into pu
[paraslash.git] / string.c
index 46b346235f17ffb696f43d22d3dcfde4c75ba4ca..56f1443fe72f5a016fc685cc652b2796477f6359 100644 (file)
--- 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)
 {
 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;
 
        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;
                ret = get_next_word(p, delim, &word);
                if (ret < 0)
                        goto err;