int main (int argc, char *argv[]) { GMainContext *ctx; GMainLoop *loop; /* * The mate-keyring startup is not as simple as I wish it could be. * * It's often started in the primordial stages of a session, where * there's no DBus, and no proper X display. This is the strange world * of PAM. * * When started with the --login option, we do as little initialization * as possible. We expect a login password on the stdin, and unlock * or create the login keyring. * * Then later we expect mate-keyring-dameon to be run again with the * --start option. This second mate-keyring-daemon will hook the * original daemon up with environment variables necessary to initialize * itself and bring it into the session. This second daemon usually exits. * * Without either of these options, we follow a more boring and * predictable startup. */ /* * Before we do ANYTHING, we drop privileges so we don't become * a security issue ourselves. */ gkd_capability_obtain_capability_and_drop_privileges (); #ifdef WITH_TESTS g_setenv ("DBUS_FATAL_WARNINGS", "1", FALSE); if (!g_getenv ("G_DEBUG")) g_log_set_always_fatal (G_LOG_LEVEL_CRITICAL | G_LOG_LEVEL_WARNING); #endif g_type_init (); g_thread_init (NULL); #ifdef HAVE_LOCALE_H /* internationalisation */ setlocale (LC_ALL, ""); #endif #ifdef HAVE_GETTEXT bindtextdomain (GETTEXT_PACKAGE, MATELOCALEDIR); textdomain (GETTEXT_PACKAGE); bind_textdomain_codeset (GETTEXT_PACKAGE, "UTF-8"); #endif egg_libgcrypt_initialize (); /* Send all warning or error messages to syslog */ prepare_logging (); parse_arguments (&argc, &argv); /* The --version option. This is machine parseable output */ if (run_version) { g_print ("mate-keyring-daemon: %s\n", VERSION); g_print ("testing: %s\n", #ifdef WITH_TESTS "enabled"); #else "disabled"); #endif exit (0); } /* The --start option */ if (run_for_start) { if (discover_other_daemon (initialize_daemon_at, TRUE)) { /* * Another daemon was initialized, print out environment * for any callers, and quit or go comatose. */ print_environment (0); if (run_foreground) while (sleep(0x08000000) == 0); cleanup_and_exit (0); } /* The --replace option */ } else if (run_for_replace) { discover_other_daemon (replace_daemon_at, FALSE); if (control_directory) g_message ("replacing daemon at: %s", control_directory); } /* Initialize the main directory */ gkd_util_init_master_directory (control_directory); /* Initialize our daemon main loop and threading */ loop = g_main_loop_new (NULL, FALSE); ctx = g_main_loop_get_context (loop); /* Initialize our control socket */ if (!gkd_control_listen ()) return FALSE; /* The --login option. Delayed initialization */ if (run_for_login) { login_password = read_login_password (STDIN); atexit (clear_login_password); timeout_id = g_timeout_add_seconds (LOGIN_TIMEOUT, (GSourceFunc) on_login_timeout, NULL); /* Not a login daemon. Startup stuff now.*/ } else { /* These are things that can run before forking */ if (!gkr_daemon_startup_steps (run_components)) cleanup_and_exit (1); } /* The whole forking and daemonizing dance starts here. */ fork_and_print_environment(); setup_signal_handling (loop); /* Prepare logging a second time, since we may be in a different process */ prepare_logging(); /* Remainder initialization after forking, if initialization not delayed */ if (!run_for_login) { gkr_daemon_initialize_steps (run_components); } g_main_loop_run (loop); /* This wraps everything up in order */ egg_cleanup_perform (); /* Wrap up signal handling here */ cleanup_signal_handling (); g_free (control_directory); return 0; }
int main(int argc, char **argv) { FILE *input; signed char op; void (*preprocess_fun)(void) = NULL; void (*postprocess_fun)(void) = print_summary; progname = "hmine"; inputfile = "stdin"; inputline = 0; /* set up internationalization */ if( !setlocale(LC_ALL, "") ) { errormsg(E_WARNING, "could not set locale, internationalization disabled\n"); } else { if( u_options & (1<<U_OPTION_VERBOSE) ) { errormsg(E_WARNING, "international locales not supported\n"); } } #if defined(HAVE_GETPAGESIZE) system_pagesize = getpagesize(); #endif if( system_pagesize == -1 ) { system_pagesize = BUFSIZ; } init_signal_handling(); /* parse the options */ while( (op = getopt(argc, argv, "aDvV")) > -1 ) { hset_option(op, optarg); } /* set up callbacks */ if( preprocess_fun ) { (*preprocess_fun)(); } init_header_handling(); /* now process only the first file on the command line, or if none provided read stdin */ if( (optind > -1) && *(argv + optind) ) { /* if it's a filename, process it */ input = fopen(argv[optind], "rb"); if( input ) { inputfile = argv[optind]; u_options |= (1<<U_OPTION_STDIN); if( (u_options & (1<<U_OPTION_VERBOSE)) && !(u_options & (1<<U_OPTION_CLASSIFY))) { fprintf(stdout, "processing file %s\n", argv[optind]); } /* set some initial options */ hprocess_file(input, &head); fclose(input); } else { /* unrecognized file name */ errormsg(E_ERROR, "couldn't open %s\n", argv[optind]); usage(argv); return 0; } } /* in case no files were specified, get input from stdin */ if( !(u_options & (1<<U_OPTION_STDIN)) && (input = fdopen(fileno(stdin), "rb")) ) { if( (u_options & (1<<U_OPTION_VERBOSE)) && !(u_options & (1<<U_OPTION_CLASSIFY)) ) { fprintf(stdout, "taking input from stdin\n"); } hprocess_file(input, &head); /* must close before freeing in_iobuf, in case setvbuf was called */ fclose(input); } if( postprocess_fun ) { (*postprocess_fun)(); } cleanup_header_handling(); cleanup_signal_handling(); return exit_code; }