int fswc_getopts(fswebcam_config_t *config, int argc, char *argv[]) { int c; fswc_getopt_t s; static struct option long_opts[] = { {"help", no_argument, 0, '?'}, {"config", required_argument, 0, 'c'}, {"quiet", no_argument, 0, 'q'}, {"verbose", no_argument, 0, 'v'}, {"version", no_argument, 0, OPT_VERSION}, {"loop", required_argument, 0, 'l'}, {"offset", required_argument, 0, OPT_OFFSET}, {"background", no_argument, 0, 'b'}, {"pid", required_argument, 0, OPT_PID}, {"log", required_argument, 0, 'L'}, {"device", required_argument, 0, 'd'}, {"input", required_argument, 0, 'i'}, {"list-inputs", no_argument, 0, OPT_LIST_INPUTS}, {"tuner", required_argument, 0, 't'}, {"list-tuners", no_argument, 0, OPT_LIST_TUNERS}, {"frequency", required_argument, 0, 'f'}, {"delay", required_argument, 0, 'D'}, {"resolution", required_argument, 0, 'r'}, {"fps", required_argument, 0, OPT_FPS}, {"list-framesizes", no_argument, 0, OPT_LIST_FRAMESIZES}, {"list-framerates", no_argument, 0, OPT_LIST_FRAMERATES}, {"frames", required_argument, 0, 'F'}, {"skip", required_argument, 0, 'S'}, {"palette", required_argument, 0, 'p'}, {"dumpframe", required_argument, 0, OPT_DUMPFRAME}, {"read", no_argument, 0, 'R'}, {"list-formats", no_argument, 0, OPT_LIST_FORMATS}, {"set", required_argument, 0, 's'}, {"list-controls", no_argument, 0, OPT_LIST_CONTROLS}, {"revert", no_argument, 0, OPT_REVERT}, {"flip", required_argument, 0, OPT_FLIP}, {"crop", required_argument, 0, OPT_CROP}, {"scale", required_argument, 0, OPT_SCALE}, {"rotate", required_argument, 0, OPT_ROTATE}, {"deinterlace", no_argument, 0, OPT_DEINTERLACE}, {"invert", no_argument, 0, OPT_INVERT}, {"greyscale", no_argument, 0, OPT_GREYSCALE}, {"swapchannels", required_argument, 0, OPT_SWAPCHANNELS}, {"no-banner", no_argument, 0, OPT_NO_BANNER}, {"top-banner", no_argument, 0, OPT_TOP_BANNER}, {"bottom-banner", no_argument, 0, OPT_BOTTOM_BANNER}, {"banner-colour", required_argument, 0, OPT_BG_COLOUR}, {"line-colour", required_argument, 0, OPT_BL_COLOUR}, {"text-colour", required_argument, 0, OPT_FG_COLOUR}, {"font", required_argument, 0, OPT_FONT}, {"no-shadow", no_argument, 0, OPT_NO_SHADOW}, {"shadow", no_argument, 0, OPT_SHADOW}, {"title", required_argument, 0, OPT_TITLE}, {"no-title", no_argument, 0, OPT_NO_TITLE}, {"subtitle", required_argument, 0, OPT_SUBTITLE}, {"no-subtitle", no_argument, 0, OPT_NO_SUBTITLE}, {"timestamp", required_argument, 0, OPT_TIMESTAMP}, {"no-timestamp", no_argument, 0, OPT_NO_TIMESTAMP}, {"gmt", no_argument, 0, OPT_GMT}, {"info", required_argument, 0, OPT_INFO}, {"no-info", no_argument, 0, OPT_NO_INFO}, {"underlay", required_argument, 0, OPT_UNDERLAY}, {"no-underlay", no_argument, 0, OPT_NO_UNDERLAY}, {"overlay", required_argument, 0, OPT_OVERLAY}, {"no-overlay", no_argument, 0, OPT_NO_OVERLAY}, {"jpeg", required_argument, 0, OPT_JPEG}, {"png", required_argument, 0, OPT_PNG}, {"save", required_argument, 0, OPT_SAVE}, {"exec", required_argument, 0, OPT_EXEC}, {0, 0, 0, 0} }; char *opts = "-qc:vl:bL:d:i:t:f:D:r:F:s:S:p:R"; s.opts = opts; s.long_opts = long_opts; s.opt_index = 0; s.filename = NULL; s.f = NULL; s.line = 0; /* Set the defaults. */ config->loop = 0; config->offset = 0; config->background = 0; config->pidfile = NULL; config->logfile = NULL; config->gmt = 0; config->start = 0; config->device = strdup("/dev/video0"); config->input = NULL; config->tuner = 0; config->frequency = 0; config->delay = 0; config->use_read = 0; config->list = 0; config->width = 384; config->height = 288; config->fps = 0; config->frames = 1; config->skipframes = 0; config->palette = SRC_PAL_ANY; config->option = NULL; config->dumpframe = NULL; config->jobs = 0; config->job = NULL; /* Don't report errors. */ opterr = 0; /* Reset getopt to ensure parsing begins at the first argument. */ optind = 0; /* Parse the command line and any config files. */ while((c = fswc_getopt(&s, argc, argv)) != -1) { switch(c) { case '?': fswc_usage(); /* Command line error. */ case '!': return(-1); /* Conf file error. */ case 'c': INFO("Reading configuration from '%s'...", optarg); s.f = fopen(optarg, "rt"); if(!s.f) { ERROR("fopen: %s", strerror(errno)); return(-1); } s.line = 0; free(s.filename); s.filename = strdup(optarg); break; case OPT_VERSION: fprintf(stderr, "fswebcam %s\n", PACKAGE_VERSION); return(-1); case 'q': log_quiet(-1); log_verbose(0); break; case 'v': log_quiet(0); log_verbose(-1); break; case 'l': config->loop = atol(optarg); break; case OPT_OFFSET: config->offset = atol(optarg); break; case 'b': config->background = -1; break; case OPT_PID: if(config->pidfile) free(config->pidfile); config->pidfile = strdup(optarg); break; case 'L': if(config->logfile) free(config->logfile); config->logfile = strdup(optarg); break; case 'd': if(config->device) free(config->device); config->device = strdup(optarg); break; case 'i': if(config->input) free(config->input); config->input = strdup(optarg); break; case OPT_LIST_INPUTS: config->list |= SRC_LIST_INPUTS; break; case 't': config->tuner = atoi(optarg); break; case OPT_LIST_TUNERS: config->list |= SRC_LIST_TUNERS; break; case 'f': config->frequency = atof(optarg) * 1000; break; case 'D': config->delay = atoi(optarg); break; case 'r': config->width = argtol(optarg, "x ", 0, 0, 10); config->height = argtol(optarg, "x ", 1, 0, 10); break; case OPT_FPS: config->fps = atoi(optarg); break; case 'F': config->frames = atoi(optarg); break; case 'S': config->skipframes = atoi(optarg); break; case 's': fswc_set_option(config, optarg); break; case OPT_LIST_CONTROLS: config->list |= SRC_LIST_CONTROLS; break; case 'p': config->palette = fswc_find_palette(optarg); if(config->palette == -1) return(-1); break; case 'R': config->use_read = -1; break; case OPT_LIST_FORMATS: config->list |= SRC_LIST_FORMATS; break; case OPT_GMT: config->gmt = -1; break; case OPT_DUMPFRAME: free(config->dumpframe); config->dumpframe = strdup(optarg); break; default: /* All other options are added to the job queue. */ fswc_add_job(config, c, optarg); break; } } /* Do a sanity check on the options. */ if(config->frequency < 0) config->frequency = 0; if(config->width < 1) config->width = 1; if(config->height < 1) config->height = 1; if(config->frames < 1) config->frames = 1; if(config->frames > MAX_FRAMES) { WARN("Requested %u frames, maximum is %u. Using that.", config->frames, MAX_FRAMES); config->frames = MAX_FRAMES; } /* Correct offset if negative or out of range. */ if(config->offset && (config->offset %= (signed long) config->loop) < 0) config->offset += config->loop; /* Free the config filename if set. */ free(s.filename); return(0); }
int main(int argc, char **argv) { static struct option options[] = { { "with-disputed", no_argument, NULL, 'D' }, { "hostname", required_argument, NULL, 'h' }, { "quiet", no_argument, NULL, 'q' }, { "log-format", required_argument, NULL, 'l' }, { "log-file", required_argument, NULL, 'f' }, { NULL } }; const char *opt_hostname = NULL; const char *opt_log_format = NULL; const char *opt_log_file = NULL; int c; while ((c = getopt_long(argc, argv, "Dh:ql:f:", options, NULL)) != EOF) { switch (c) { case 'D': opt_flags |= RPF_DISPUTED; break; case 'h': opt_hostname = optarg; break; case 'q': opt_flags |= RPF_QUIET; break; case 'l': opt_log_format = optarg; break; case 'f': opt_log_file = optarg; break; default: usage: fprintf(stderr, "Usage:\n" "rpctest [-h hostname]\n"); return 1; } } if (optind != argc) goto usage; if (opt_flags & RPF_QUIET) log_quiet(); log_init(opt_log_format, "rpcunit", opt_log_file); if (!rpctest_init_nettypes()) return 1; rpctest_verify_netpath_all(); rpctest_verify_netconfig_all(); rpctest_verify_sockets_all(); rpctest_verify_pmap_all(opt_flags); rpctest_verify_rpcb_all(opt_flags); rpctest_verify_svc_register(); rpctest_verify_clnt_funcs(); log_finish(); return num_fails != 0; }