Mercurial > trustbridge
diff cinst/mozilla.c @ 180:344b8a79ad2e
Implemented detection profile paths for Windows Vista/7.
author | Sascha Wilde <wilde@intevation.de> |
---|---|
date | Tue, 25 Mar 2014 17:51:24 +0100 |
parents | c92297bcda8f |
children | bea93c8651b7 |
line wrap: on
line diff
--- a/cinst/mozilla.c Tue Mar 25 16:48:18 2014 +0100 +++ b/cinst/mozilla.c Tue Mar 25 17:51:24 2014 +0100 @@ -79,6 +79,47 @@ int return_code = 0; /** + * @brief Return users home path, on windows including drive letter + * @returns a pointer to a string containing the home path, it should + * be freed by the caller. + */ +static char * +get_home() +{ + char *home, *homevar, *fqhome; + char *homedrive = NULL; + + size_t len; + if (LINUX) + homevar = "HOME"; + else + homevar = "HOMEPATH"; + + if ((home = getenv(homevar)) == NULL) + { + DEBUGFPRINT("DEBUG: FATAL! No HOME in environment.\n"); + exit(ERR_MOZ_HOMELESS); + } + + len = strlen(home); + if (!LINUX) + homedrive = getenv("HOMEDRIVE"); + + if (homedrive != NULL) + len += strlen(homedrive); + + len++; /* Room for \0 */ + fqhome = xmalloc(len); + + if (homedrive == NULL) + snprintf(fqhome, len, "%s", home); + else + snprintf(fqhome, len, "%s%s", homedrive, home); + + return fqhome; +} + +/** * @brief Get a list of all mozilla profile directories * * Read the profiles.ini and extract all profile paths from that. @@ -132,13 +173,13 @@ strncpy(path, value, LINEBUFLEN); if ((fqpath = port_realpath(path)) != NULL) { - DEBUGFPRINT("DEBUG: Found profile path: '%s'\n", fqpath) + DEBUGFPRINT("DEBUG: Found profile path: '%s'\n", fqpath); strv_append(&dirs, fqpath, strlen(fqpath)); free (fqpath); } else { - DEBUGFPRINT("DEBUG: WARN! Non existent profile path: '%s'\n", path) + DEBUGFPRINT("DEBUG: WARN! Non existent profile path: '%s'\n", path); return_code |= WARN_MOZ_PROFILE_DOES_NOT_EXIST; } } @@ -150,7 +191,7 @@ } else { - DEBUGFPRINT("DEBUG: WARN! Could not open ini file: '%s'\n", inifile_name) + DEBUGFPRINT("DEBUG: WARN! Could not open ini file: '%s'\n", inifile_name); return_code |= WARN_MOZ_FAILED_TO_OPEN_INI; } return dirs; @@ -172,58 +213,51 @@ char **inis = NULL; char path[LINEBUFLEN]; char *fqpath; + char *mozdirname; DIR *mozdir; struct dirent *mozdirent; + char *home = get_home(); if (LINUX) { - /* Search in $HOME/.mozilla */ - char *home; - - if ((home = getenv("HOME")) == NULL) - { - DEBUGFPRINT("DEBUG: FATAL! No HOME in environment.\n") - exit(ERR_MOZ_HOMELESS); - } - - snprintf(path, LINEBUFLEN, "%s/%s", home, "/.mozilla"); - if ((mozdir = opendir(path)) != NULL) - { - while ((mozdirent = readdir(mozdir)) != NULL) - { - snprintf(path, LINEBUFLEN, "%s/%s/%s", - home, - "/.mozilla", - mozdirent->d_name); - if (port_isdir(path)) - { - snprintf(path, LINEBUFLEN, "%s/%s/%s/%s", - home, - "/.mozilla", - mozdirent->d_name, - "profiles.ini"); - DEBUGFPRINT("DEBUG: checking for %s...\n", path); - if ((fqpath = port_realpath(path)) != NULL) - { - strv_append(&inis, fqpath, strlen(fqpath)); - DEBUGFPRINT("DEBUG: Found mozilla ini file: '%s'\n", fqpath); - free(fqpath); - } - } - } - closedir(mozdir); - } - else - { - DEBUGFPRINT("DEBUG: Could not open %s/.mozilla\n", home) - exit(WARN_MOZ_NO_PROFILES); - } + mozdirname = ".mozilla"; } else { - /* Windows */ - fprintf(stderr, "Windows not yet supported"); - abort(); + mozdirname = "AppData/Roaming/Mozilla"; + } + + snprintf(path, LINEBUFLEN, "%s/%s", home, mozdirname); + if ((mozdir = opendir(path)) != NULL) + { + while ((mozdirent = readdir(mozdir)) != NULL) + { + snprintf(path, LINEBUFLEN, "%s/%s/%s", + home, + mozdirname, + mozdirent->d_name); + if (port_isdir(path)) + { + snprintf(path, LINEBUFLEN, "%s/%s/%s/%s", + home, + mozdirname, + mozdirent->d_name, + "profiles.ini"); + DEBUGFPRINT("DEBUG: checking for %s...\n", path); + if ((fqpath = port_realpath(path)) != NULL) + { + strv_append(&inis, fqpath, strlen(fqpath)); + DEBUGFPRINT("DEBUG: Found mozilla ini file: '%s'\n", fqpath); + free(fqpath); + } + } + } + closedir(mozdir); + } + else + { + DEBUGFPRINT("DEBUG: Could not open %s/%s\n", home, mozdirname); + exit(WARN_MOZ_NO_PROFILES); } return inis; }