VGAuthError VGAuth_Init(const char *applicationName, int numExtraParams, const VGAuthExtraParams *extraParams, VGAuthContext **ctx) { VGAuthContext *newCtx = NULL; VGAuthError err = VGAUTH_E_OK; static gboolean firstTime = TRUE; int i; /* * The application name cannot be an empty string. */ if ((NULL == applicationName) || ('\0' == *applicationName) || (NULL == ctx)) { return VGAUTH_E_INVALID_ARGUMENT; } *ctx = NULL; /* XXX process any options */ if (!g_utf8_validate(applicationName, -1, NULL)) { Warning("%s: invalid applicationName\n", __FUNCTION__); return VGAUTH_E_INVALID_ARGUMENT; } err = VGAuthValidateExtraParams(numExtraParams, extraParams); if (VGAUTH_E_OK != err) { return err; } newCtx = g_malloc0(sizeof(VGAuthContext)); if (NULL == newCtx) { return VGAUTH_E_OUT_OF_MEMORY; } newCtx->applicationName = g_strdup(applicationName); newCtx->isImpersonating = FALSE; newCtx->impersonatedUser = NULL; /* * Only init prefs, i18n and auditing once. */ if (firstTime) { gboolean logSuccessAudits; gchar *msgCatalog; gPrefs = Pref_Init(VGAUTH_PREF_CONFIG_FILENAME); logSuccessAudits = Pref_GetBool(gPrefs, VGAUTH_PREF_AUDIT_SUCCESS, VGAUTH_PREF_GROUP_NAME_AUDIT, TRUE); msgCatalog = Pref_GetString(gPrefs, VGAUTH_PREF_LOCALIZATION_DIR, VGAUTH_PREF_GROUP_NAME_LOCALIZATION, VGAUTH_PREF_DEFAULT_LOCALIZATION_CATALOG); I18n_BindTextDomain(VMW_TEXT_DOMAIN, NULL, msgCatalog); g_free(msgCatalog); Audit_Init("VGAuth", logSuccessAudits); firstTime = FALSE; } newCtx->numExtraParams = numExtraParams; newCtx->extraParams = g_malloc0(sizeof(*newCtx->extraParams) * numExtraParams); for (i = 0; i < numExtraParams; i++) { newCtx->extraParams[i].name = g_strdup(extraParams[i].name); newCtx->extraParams[i].value = g_strdup(extraParams[i].value); } err = VGAuth_InitConnection(newCtx); if (VGAUTH_E_OK != err) { return err; } err = VGAuthInitAuthentication(newCtx); if (VGAUTH_E_OK != err) { return err; } *ctx = newCtx; Log("VGAuth '%s' initialized for application '%s'. Context created at %p\n", BUILD_NUMBER, newCtx->applicationName, newCtx); return err; }
int main(int argc, char *argv[]) { gPrefs = Pref_Init(VGAUTH_PREF_CONFIG_FILENAME); /* * Determine where the service is running from, so resources can * be found relative to it. */ if (!g_path_is_absolute(argv[0])) { gchar *abs = g_find_program_in_path(argv[0]); if (abs == NULL || g_strcmp0(abs, argv[0]) == 0) { gchar *cwd = g_get_current_dir(); g_free(abs); abs = g_build_filename(cwd, argv[0], NULL); g_free(cwd); } gInstallDir = g_path_get_dirname(abs); g_free(abs); } else { gInstallDir = g_path_get_dirname(argv[0]); } #ifdef _WIN32 #if SUPPORT_WIN_SERVICE /* * This is the path for the service control manager. */ if (argc == 1) { ServiceRunAsService(); return 0; } else if (argc == 2) { // register if (g_strcmp0(argv[1], "-r") == 0) { ServiceDoRegisterService(argv[0], TRUE); return 0; // unregister } else if (g_strcmp0(argv[1], "-u") == 0) { ServiceDoRegisterService(argv[0], FALSE); return 0; // run as a cmdline app for debugging } else if (g_strcmp0(argv[1], "-d") == 0) { Service_SetLogOnStdout(TRUE); Service_InitLogging(FALSE, FALSE); ServiceStartAndRun(); return 0; // run on cmdline, using log file } else if (g_strcmp0(argv[1], "-s") == 0) { Service_InitLogging(FALSE, FALSE); ServiceStartAndRun(); return 0; } else if (g_strcmp0(argv[1], "-h") == 0) { ServiceHelp(argv[0]); return 0; } } #else Service_SetLogOnStdout(TRUE); Service_InitLogging(FALSE, FALSE); ServiceStartAndRun(); #endif #else // !_WIN32 #if USE_POSIX_SERVICE /* * Parse arguments. * * "-b" tells it to run as a daemon. * "-s" tells it to run in service mode (logging to a file). * "-k" tells it to kill itself. * * When running as a daemon, we restart, except with -b changed * to -s so we properly log to a file. * * This code assumes the only arguments supported are "-b" and "-k". * The replacement of "-b" before calling ServiceDamonize() * will need work if that changes. */ if (argc > 1) { if (g_strcmp0(argv[1], "-k") == 0) { // kill mode if (!ServiceSuicide(pidFileName)) { exit(-1); } else { exit(0); } } else if (g_strcmp0(argv[1], "-s") == 0) { // service mode isRunningAsService = TRUE; Service_InitLogging(FALSE, FALSE); } else if (g_strcmp0(argv[1], "-b") == 0) { // background mode Service_InitLogging(FALSE, FALSE); /* * We have to remove this flag to prevent an infinite loop. */ argv[1] = g_strdup("-s"); if (!ServiceDaemonize(argv[0], argv, SERVICE_DAEMONIZE_LOCKPID, pidFileName)) { Warning("%s: failed to daemonize\n", __FUNCTION__); return -1; } // NOTREACHED return 0; } else if (g_strcmp0(argv[1], "-h") == 0) { // help ServiceHelp(argv[0]); return 0; } else { Warning("%s: unrecognized args\n", __FUNCTION__); } } else { /* The foreground mode */ Service_SetLogOnStdout(TRUE); Service_InitLogging(FALSE, FALSE); } #endif // USE_POSIX_SERVICE ServiceSetSignalHandlers(); ServiceStartAndRun(); #endif // !_WIN32 return 0; }