Mercurial > trustbridge
view cinst/mozilla.c @ 157:a46a4b443410
Use strtok instead of strsep for portability.
author | Sascha Wilde <wilde@intevation.de> |
---|---|
date | Tue, 25 Mar 2014 09:30:42 +0100 |
parents | fc9af77b06b9 |
children | a9e4454dee97 |
line wrap: on
line source
/** * @file * @brief Mozilla installation process * * Reads from stdin a list of instructions in the form: * * I:<base64 DER econded certificate>\r\n * R:<base64 DER econded certificate>\r\n * ... * * The maximum size of an input line is 9999 characters * (including the \r\n) at the end of the line. * * Certificates marked with I: will be installed and the ones * marked with R: will be searched and if available removed from * the databases. * * This tool tries to find all NSS databases the user has * access to and to execute the instructions on all of them. * * If there are other processes accessing the databases the caller * has to ensure that those are terminated before this process is * executed. * * Returns 0 on success (Even when no stores where found) an error value * as defined in errorcodes.h otherwise. * * Success messages are written to stdout. Errors to stderr. For logging * purposes each installation / removal of a certificate will be reported * with the profile name that it modified. * */ /* @brief IniParser for mozilla profiles.ini * * Parse data to find values formed in * * [Profile99] * IsRelative=1 * Path=Profiles/fooo.bar * * or * [Profile0] * IsRelative=0 * Path=c:\foo\bar\baz * * Mozilla also accepts the ini file on Windows even if it is UTF-16 * encoded. * */ #include <stdbool.h> #include <stdio.h> #include <stdlib.h> #include <string.h> #include <errorcodes.h> #include <portpath.h> #include <strhelp.h> #ifndef _WIN32 #define UNIX 1 #else #define UNIX 0 #endif #define LINEBUFLEN 1000 /** * @brief Global Return Code * * This will be retuned by the programm and might be set to an * error code on fatal errors and to and warning code on non-fatal * errors. In case of mor than one warning the warning codes will be * ORed together. */ int return_code = 0; /** * @brief Get a list of all mozilla profile directories * * Read the profiles.ini and extract all profile paths from that. * * @param[in] inifile_name path of the profile.ini to read. * @return NULL terminated array of strings containing containing the * absolute path of the profile directories. The array needs to * be freed by the caller. */ static char ** get_profile_dirs (char *inifile_name) { char **dirs = NULL; char *inifile_dirname; FILE *inifile; char line[LINEBUFLEN]; char *key; char *value; char path[LINEBUFLEN]; char *fqpath; bool inprofile = false; bool relative_path = false; if ((inifile = fopen(inifile_name, "r")) != NULL) { inifile_dirname = port_dirname(inifile_name); while (fgets(line, LINEBUFLEN, inifile) != NULL) { /* Determine if we are in an profile section */ if (str_starts_with(line, "[Profile")) { relative_path = false; inprofile = true; } else if (line[0] == '[') inprofile = false; /* If we are in a profile parse path related stuff */ if (inprofile) { key = strtok(line, "="); value = strtok(NULL, "="); str_trim(&value); if (str_equal(key, "Path")) { if (relative_path) snprintf(path, LINEBUFLEN, "%s/%s", inifile_dirname, value); else strncpy(path, value, LINEBUFLEN); if ((fqpath = port_realpath(path)) != NULL) { strv_append(&dirs, fqpath, strlen(fqpath)); free (fqpath); } else return_code |= WARN_MOZ_PROFILE_DOES_NOT_EXIST; } else if (str_equal(key, "IsRelative") && str_starts_with(value, "1")) relative_path = true; } } } else { return_code |= WARN_MOZ_FAILED_TO_OPEN_INI; } return dirs; } int main (int argc, char *argv[]) { int x = 0; if (argc == 2) { char **pdirs = get_profile_dirs(argv[1]); if (pdirs != NULL) { while (pdirs[x] != NULL) puts(pdirs[x++]); strv_free(pdirs); } } exit(return_code); }