int av_opt_show(void *obj, void *av_log_obj){ if(!obj) return -1; av_log(av_log_obj, AV_LOG_INFO, "%s AVOptions:\n", (*(AVClass**)obj)->class_name); opt_list(obj, av_log_obj, NULL); return 0; }
int main(int argc, char *argv[]) { opt_t opt; int retval = 0; const char *m; /* * Initialize. */ err_init(xbasename(argv[0])); /* init err package */ /* * If running setuid, fork a child to handle * all privileged operations and drop privs in this process. */ privsep_init(); /* * Seed options with default values: */ opt_default(&opt, argv[0]); /* * Override defaults with environment */ opt_env(&opt); /* * Process any options that need to be handled early: */ opt_args_early(&opt, argc, argv); /* * Load static or dynamic pdsh modules */ mod_init(); /* * Allow module directory to be overridden, but not when * running as root or setuid. (This is mainly for testing...) */ if (!(m = getenv ("PDSH_MODULE_DIR")) || getuid() == 0 || getuid() != geteuid()) m = pdsh_module_dir; if (mod_load_modules(m, &opt) < 0) errx("%p: Couldn't load any pdsh modules\n"); /* * Handle options. */ opt_args(&opt, argc, argv); /* override with command line */ if (opt_verify(&opt)) { /* verify options, print errors */ /* * Do the work. */ if (opt.info_only) /* display info only */ opt_list(&opt); else if (pdsh_personality() == PCP && opt.pcp_server) retval = (_pcp_remote_server (&opt) < 0); else if (pdsh_personality() == PCP && opt.pcp_client) retval = (_pcp_remote_client (&opt) < 0); else if (pdsh_personality() == PCP || opt.cmd != NULL) retval = dsh(&opt); /* single dsh/pcp command */ else /* prompt loop */ _interactive_dsh(&opt); } else { retval = 1; } mod_exit(); /* * Clean up. */ privsep_fini(); opt_free(&opt); /* free heap storage in opt struct */ err_cleanup(); return retval; }
static void opt_list(void *obj, void *av_log_obj, const char *unit) { const AVOption *opt=NULL; while((opt= av_next_option(obj, opt))){ if(!(opt->flags & (AV_OPT_FLAG_ENCODING_PARAM|AV_OPT_FLAG_DECODING_PARAM))) continue; /* Don't print CONST's on level one. * Don't print anything but CONST's on level two. * Only print items from the requested unit. */ if (!unit && opt->type==FF_OPT_TYPE_CONST) continue; else if (unit && opt->type!=FF_OPT_TYPE_CONST) continue; else if (unit && opt->type==FF_OPT_TYPE_CONST && strcmp(unit, opt->unit)) continue; else if (unit && opt->type == FF_OPT_TYPE_CONST) av_log(av_log_obj, AV_LOG_INFO, " %-15s ", opt->name); else av_log(av_log_obj, AV_LOG_INFO, "-%-17s ", opt->name); switch( opt->type ) { case FF_OPT_TYPE_FLAGS: av_log( av_log_obj, AV_LOG_INFO, "%-7s ", "<flags>" ); break; case FF_OPT_TYPE_INT: av_log( av_log_obj, AV_LOG_INFO, "%-7s ", "<int>" ); break; case FF_OPT_TYPE_INT64: av_log( av_log_obj, AV_LOG_INFO, "%-7s ", "<int64>" ); break; case FF_OPT_TYPE_DOUBLE: av_log( av_log_obj, AV_LOG_INFO, "%-7s ", "<double>" ); break; case FF_OPT_TYPE_FLOAT: av_log( av_log_obj, AV_LOG_INFO, "%-7s ", "<float>" ); break; case FF_OPT_TYPE_STRING: av_log( av_log_obj, AV_LOG_INFO, "%-7s ", "<string>" ); break; case FF_OPT_TYPE_RATIONAL: av_log( av_log_obj, AV_LOG_INFO, "%-7s ", "<rational>" ); break; case FF_OPT_TYPE_BINARY: av_log( av_log_obj, AV_LOG_INFO, "%-7s ", "<binary>" ); break; case FF_OPT_TYPE_CONST: default: av_log( av_log_obj, AV_LOG_INFO, "%-7s ", "" ); break; } av_log(av_log_obj, AV_LOG_INFO, "%c", (opt->flags & AV_OPT_FLAG_ENCODING_PARAM) ? 'E' : '.'); av_log(av_log_obj, AV_LOG_INFO, "%c", (opt->flags & AV_OPT_FLAG_DECODING_PARAM) ? 'D' : '.'); av_log(av_log_obj, AV_LOG_INFO, "%c", (opt->flags & AV_OPT_FLAG_VIDEO_PARAM ) ? 'V' : '.'); av_log(av_log_obj, AV_LOG_INFO, "%c", (opt->flags & AV_OPT_FLAG_AUDIO_PARAM ) ? 'A' : '.'); av_log(av_log_obj, AV_LOG_INFO, "%c", (opt->flags & AV_OPT_FLAG_SUBTITLE_PARAM) ? 'S' : '.'); if(opt->help) av_log(av_log_obj, AV_LOG_INFO, " %s", opt->help); av_log(av_log_obj, AV_LOG_INFO, "\n"); if (opt->unit && opt->type != FF_OPT_TYPE_CONST) { opt_list(obj, av_log_obj, opt->unit); } } }