/* note, the g_debugs are commented out because this function may be * called before the log handler is installed. */ char* mu_util_dir_expand (const char *path) { char *dir; char resolved[PATH_MAX + 1]; g_return_val_if_fail (path, NULL); dir = do_wordexp (path); if (!dir) return NULL; /* error */ /* don't try realpath if the dir does not exist */ if (access (dir, F_OK) != 0) return dir; /* now resolve any symlinks, .. etc. */ if (realpath (dir, resolved) == NULL) { /* g_debug ("%s: could not get realpath for '%s': %s", */ /* __FUNCTION__, dir, strerror(errno)); */ g_free (dir); return NULL; } else g_free (dir); return g_strdup (resolved); }
int wordexp(const char *s, wordexp_t *we, int flags) { int r, cs; pthread_setcancelstate(PTHREAD_CANCEL_DISABLE, &cs); r = do_wordexp(s, we, flags); pthread_setcancelstate(cs, 0); return r; }
we->we_wordc -= we->we_offs; } return err; nospace: if (!(flags & WRDE_APPEND)) { we->we_wordc = 0; we->we_wordv = 0; } return WRDE_NOSPACE; } int wordexp(const char *restrict s, wordexp_t *restrict we, int flags) { int r, cs; pthread_setcancelstate(PTHREAD_CANCEL_DISABLE, &cs); r = do_wordexp(s, we, flags); pthread_setcancelstate(cs, 0); return r; } void wordfree(wordexp_t *we) { size_t i; if (!we->we_wordv) return; for (i=0; i<we->we_wordc; i++) free(we->we_wordv[we->we_offs+i]); free(we->we_wordv); we->we_wordv = 0; we->we_wordc = 0; }