void log_error(int flags, const char *fmt, ...) { int serrno = errno; char *message; char *logline; va_list ap; /* Expand printf-style format + args. */ va_start(ap, fmt); evasprintf(&message, fmt, ap); va_end(ap); /* Become root if we are not already to avoid user interference */ set_perms(PERM_ROOT|PERM_NOEXIT); if (ISSET(flags, MSG_ONLY)) logline = message; else logline = new_logline(message, ISSET(flags, USE_ERRNO) ? serrno : 0); /* * Tell the user. */ if (!ISSET(flags, NO_STDERR)) { if (ISSET(flags, USE_ERRNO)) warning("%s", message); else warningx("%s", message); } if (logline != message) efree(message); /* * Send a copy of the error via mail. */ if (!ISSET(flags, NO_MAIL)) send_mail("%s", logline); /* * Log to syslog and/or a file. */ if (def_syslog) do_syslog(def_syslog_badpri, logline); if (def_logfile) do_logfile(logline); efree(logline); restore_perms(); if (!ISSET(flags, NO_EXIT)) { plugin_cleanup(0); siglongjmp(error_jmp, 1); } }
void errorx2(int eval, const char *fmt, ...) { va_list ap; va_start(ap, fmt); _warning(0, fmt, ap); va_end(ap); plugin_cleanup(0); siglongjmp(error_jmp, eval); }
int main(int argc, char *argv[]) { GOptionContext *context; GError *err = NULL; guint signal; #ifdef NEED_THREADS if (g_thread_supported() == FALSE) g_thread_init(NULL); #endif context = g_option_context_new(NULL); g_option_context_add_main_entries(context, options, NULL); if (g_option_context_parse(context, &argc, &argv, &err) == FALSE) { if (err != NULL) { g_printerr("%s\n", err->message); g_error_free(err); } else g_printerr("An unknown error occurred\n"); exit(EXIT_FAILURE); } g_option_context_free(context); if (option_detach == TRUE) { if (daemon(0, 0)) { perror("Can't start daemon"); exit(1); } } __obex_log_init("obexd", option_debug, option_detach); DBG("Entering main loop"); main_loop = g_main_loop_new(NULL, FALSE); signal = setup_signalfd(); #ifdef NEED_THREADS if (dbus_threads_init_default() == FALSE) { fprintf(stderr, "Can't init usage of threads\n"); exit(EXIT_FAILURE); } #endif if (manager_init() == FALSE) { error("manager_init failed"); exit(EXIT_FAILURE); } if (option_root == NULL) option_root = g_strdup(DEFAULT_ROOT_PATH); if (option_root[0] != '/') { char *old_root = option_root, *home = getenv("HOME"); if (home) { option_root = g_strdup_printf("%s/%s", home, old_root); g_free(old_root); } } if (option_capability == NULL) option_capability = g_strdup(DEFAULT_CAP_FILE); plugin_init(option_plugin, option_noplugin); if (obex_server_init() < 0) { error("obex_server_init failed"); exit(EXIT_FAILURE); } if (!root_folder_setup(option_root, option_root_setup)) { error("Unable to setup root folder %s", option_root); exit(EXIT_FAILURE); } g_main_loop_run(main_loop); g_source_remove(signal); obex_server_exit(); plugin_cleanup(); manager_cleanup(); g_main_loop_unref(main_loop); g_free(option_capability); g_free(option_root); __obex_log_cleanup(); return 0; }
int main (int argc, char *argv[]) { int c; int option_index; int help = 0, version = 0; tls_init (); for (;;) { c = getopt_long (argc, argv, short_options, long_options, &option_index); if (c == -1) break; switch (c) { case 0: /* options which are long only */ if (strcmp (long_options[option_index].name, "dump-config") == 0) { dump_config (); exit (EXIT_SUCCESS); } else if (strcmp (long_options[option_index].name, "run") == 0) { run = optarg; foreground = 1; } else { fprintf (stderr, "%s: unknown long option: %s (%d)\n", program_name, long_options[option_index].name, option_index); exit (EXIT_FAILURE); } break; case 'f': foreground = 1; break; case 'g': group = optarg; break; case 'i': ipaddr = optarg; break; case 'n': newstyle = 1; break; case 'o': /* XXX When we add support for exportnames, we will need to * ensure that the user does not use -o + --export. */ newstyle = 0; break; case 'P': pidfile = nbdkit_absolute_path (optarg); if (pidfile == NULL) exit (EXIT_FAILURE); break; case 'p': port = optarg; break; case 'r': readonly = 1; break; case 's': listen_stdin = 1; break; case 'U': if (strcmp (optarg, "-") == 0) unixsocket = make_random_fifo (); else unixsocket = nbdkit_absolute_path (optarg); if (unixsocket == NULL) exit (EXIT_FAILURE); break; case 'u': user = optarg; break; case 'v': verbose = 1; break; case 'V': version = 1; break; case HELP_OPTION: help = 1; break; default: usage (); exit (EXIT_FAILURE); } } /* No extra parameters. */ if (optind >= argc) { if (help) { usage (); exit (EXIT_SUCCESS); } if (version) { display_version (); exit (EXIT_SUCCESS); } /* Otherwise this is an error. */ fprintf (stderr, "%s: no plugins given on the command line.\nRead nbdkit(1) for documentation.\n", program_name); exit (EXIT_FAILURE); } /* Remaining command line arguments define the plugins and plugin * configuration. If --help or --version was specified, we still * partially parse these in order that we can display the per-plugin * help/version information. In future (when the new protocol and * export names are permitted) we will allow multiple plugins to be * given, but at the moment only one plugin is allowed. */ while (optind < argc) { const char *filename = argv[optind]; char *p; open_plugin_so (filename); /* Find key=value configuration parameters for this plugin. */ ++optind; while (optind < argc && (p = strchr (argv[optind], '=')) != NULL) { if (help || version) continue; *p = '\0'; plugin_config (argv[optind], p+1); ++optind; } if (help) { usage (); printf ("\n%s:\n\n", filename); plugin_usage (); exit (EXIT_SUCCESS); } if (version) { display_version (); plugin_version (); exit (EXIT_SUCCESS); } plugin_config_complete (); /* If we supported export names, then we'd continue in the loop * here, but at the moment only one plugin may be used per server * so exit if there are any more. */ ++optind; if (optind < argc) { fprintf (stderr, "%s: this server only supports a single plugin\n", program_name); exit (EXIT_FAILURE); } } start_serving (); plugin_cleanup (); free (unixsocket); free (pidfile); if (random_fifo) { unlink (random_fifo); free (random_fifo); } if (random_fifo_dir) { rmdir (random_fifo_dir); free (random_fifo_dir); } exit (EXIT_SUCCESS); }