21 bump_verbosity(
const gchar *option_name,
const gchar *optarg, gpointer
data, GError **error) {
37 args->
summary = strdup(summary);
48 free_common_args(gpointer
data) {
64 GOptionGroup **output_group,
const char *param_string) {
66 GOptionContext *context;
67 GOptionGroup *main_group;
69 GOptionEntry main_entries[3] = {
70 {
"version",
'$', 0, G_OPTION_ARG_NONE, &(common_args->
version),
71 "Display software version and exit",
73 {
"verbose",
'V', G_OPTION_FLAG_NO_ARG, G_OPTION_ARG_CALLBACK, bump_verbosity,
74 "Increase debug output (may be specified multiple times)",
80 main_group = g_option_group_new(NULL,
"Application Options:", NULL, common_args, free_common_args);
81 g_option_group_add_entries(main_group, main_entries);
83 context = g_option_context_new(param_string);
84 g_option_context_set_summary(context, common_args->
summary);
85 g_option_context_set_description(context, desc);
86 g_option_context_set_main_group(context, main_group);
89 GOptionEntry output_entries[3] = {
90 {
"output-as", 0, 0, G_OPTION_ARG_STRING, &(common_args->
output_ty),
93 {
"output-to", 0, 0, G_OPTION_ARG_STRING, &(common_args->
output_dest),
94 "Specify file name for output (or \"-\" for stdout)",
"DEST" },
99 if (*output_group == NULL) {
100 *output_group = g_option_group_new(
"output",
"Output Options:",
"Show output help", NULL, NULL);
105 g_option_group_add_entries(*output_group, output_entries);
106 g_option_context_add_group(context, *output_group);
118 if (context == NULL) {
122 g_option_context_free(context);
128 GOptionGroup *main_group = g_option_context_get_main_group(context);
130 g_option_group_add_entries(main_group, entries);
135 const char *header,
const char *desc,
136 const GOptionEntry entries[])
138 GOptionGroup *group = NULL;
140 group = g_option_group_new(
name, header, desc, NULL, NULL);
141 g_option_group_add_entries(group, entries);
142 g_option_context_add_group(context, group);
148 string_replace(gchar *str,
const gchar *sub,
const gchar *repl)
157 gchar **split = g_strsplit(str, sub, 0);
158 gchar *retval = g_strjoinv(repl, split);
169 if (argv == NULL || argv[0] == NULL) {
173 gs = g_string_sized_new(100);
175 for (
int i = 0; argv[i] != NULL; i++) {
177 g_string_append_c(gs,
' ');
180 if (strchr(argv[i],
' ') == NULL) {
182 g_string_append(gs, argv[i]);
183 }
else if (strchr(argv[i],
'\'') == NULL) {
205 gchar *repl = string_replace(argv[i],
"'",
"\\\'");
211 return g_string_free(gs, FALSE);
216 GPtrArray *arr = NULL;
217 bool saw_dash_dash =
false;
218 bool copy_option =
false;
224 if (g_get_prgname() == NULL && argv && *argv) {
225 gchar *basename = g_path_get_basename(*argv);
227 g_set_prgname(basename);
231 arr = g_ptr_array_new();
233 for (
int i = 0; argv[i] != NULL; i++) {
239 if (saw_dash_dash ==
false && strcmp(argv[i],
"--") == 0) {
240 saw_dash_dash =
true;
243 if (saw_dash_dash ==
true) {
244 g_ptr_array_add(arr, g_strdup(argv[i]));
248 if (copy_option ==
true) {
249 g_ptr_array_add(arr, g_strdup(argv[i]));
258 g_ptr_array_add(arr, g_strdup(argv[i]));
265 if (g_str_has_prefix(argv[i],
"-") && !g_str_has_prefix(argv[i],
"--")) {
267 const char *ch = argv[i]+1;
274 if (*ch !=
'\0' && *ch >=
'1' && *ch <=
'9') {
275 bool is_numeric =
true;
277 while (*ch !=
'\0') {
287 g_ptr_array_add(arr, g_strdup_printf(
"%s", argv[i]));
297 while (*ch !=
'\0') {
303 if (special != NULL && strchr(special, *ch) != NULL) {
307 if (*(ch+1) !=
'\0') {
308 g_ptr_array_add(arr, g_strdup_printf(
"-%c", *ch));
309 g_ptr_array_add(arr, g_strdup(ch+1));
317 g_ptr_array_add(arr, g_strdup_printf(
"-%c", *ch));
324 g_ptr_array_add(arr, g_strdup_printf(
"-%c", *ch));
334 g_ptr_array_add(arr, g_strdup(argv[i]));
338 g_ptr_array_add(arr, NULL);
340 return (
char **) g_ptr_array_free(arr, FALSE);
348 gchar **extra_args = NULL;
350 gboolean retval = TRUE;
352 va_start(ap, format);
353 len = vasprintf(&buf, format, ap);
357 if (!g_shell_parse_argv(buf, NULL, &extra_args, error)) {
358 g_strfreev(extra_args);
363 retval = g_option_context_parse_strv(context, &extra_args, error);
365 g_strfreev(extra_args);
_Noreturn crm_exit_t crm_exit(crm_exit_t rc)
gchar ** pcmk__cmdline_preproc(char *const *argv, const char *special)
gchar * pcmk__quote_cmdline(gchar **argv)
GOptionContext * pcmk__build_arg_context(pcmk__common_args_t *common_args, const char *fmts, GOptionGroup **output_group, const char *param_string)
External (OS/environmental) problem.
void pcmk__g_strcat(GString *buffer,...) G_GNUC_NULL_TERMINATED
pcmk__common_args_t * pcmk__new_common_args(const char *summary)
char * crm_strdup_printf(char const *format,...) G_GNUC_PRINTF(1
void pcmk__add_arg_group(GOptionContext *context, const char *name, const char *header, const char *desc, const GOptionEntry entries[])
void pcmk__free_arg_context(GOptionContext *context)
gboolean pcmk__force_args(GOptionContext *context, GError **error, const char *format,...)
void pcmk__add_main_args(GOptionContext *context, const GOptionEntry entries[])
#define PACKAGE_BUGREPORT