void setoption(const char *sect_name, const char *key, union val val, int tp) { struct sect *s = addsect(sect_name); struct option *o; if (tp==0 || tp==1 && !val.str[3]) { o = s->opts; while (o) { if (!strcmp(key, opt_key(o))) { o->val = val; o->tp_key[0] = tp; rmopt(key, o); return; } o = o->next; } } addopt(key, val, tp, s); rmopt(key, s->opts); }
cmdopts_t *cmdopts_parse(int argc, char **argv) { typedef enum { CMDOPT_HELP = 0, CMDOPT_VERBOSE, CMDOPT_INFILE, CMDOPT_INFMT, CMDOPT_INOPT, CMDOPT_OUTFILE, CMDOPT_OUTFMT, CMDOPT_OUTOPT, CMDOPT_VERSION, CMDOPT_DEBUG, CMDOPT_CMPTNO, CMDOPT_SRGB } cmdoptid_t; static jas_opt_t cmdoptions[] = { {CMDOPT_HELP, "help", 0}, {CMDOPT_VERBOSE, "verbose", 0}, {CMDOPT_INFILE, "input", JAS_OPT_HASARG}, {CMDOPT_INFILE, "f", JAS_OPT_HASARG}, {CMDOPT_INFMT, "input-format", JAS_OPT_HASARG}, {CMDOPT_INFMT, "t", JAS_OPT_HASARG}, {CMDOPT_INOPT, "input-option", JAS_OPT_HASARG}, {CMDOPT_INOPT, "o", JAS_OPT_HASARG}, {CMDOPT_OUTFILE, "output", JAS_OPT_HASARG}, {CMDOPT_OUTFILE, "F", JAS_OPT_HASARG}, {CMDOPT_OUTFMT, "output-format", JAS_OPT_HASARG}, {CMDOPT_OUTFMT, "T", JAS_OPT_HASARG}, {CMDOPT_OUTOPT, "output-option", JAS_OPT_HASARG}, {CMDOPT_OUTOPT, "O", JAS_OPT_HASARG}, {CMDOPT_VERSION, "version", 0}, {CMDOPT_DEBUG, "debug-level", JAS_OPT_HASARG}, {CMDOPT_CMPTNO, "cmptno", JAS_OPT_HASARG}, {CMDOPT_SRGB, "force-srgb", 0}, {CMDOPT_SRGB, "S", 0}, {-1, 0, 0} }; cmdopts_t *cmdopts; int c; if (!(cmdopts = malloc(sizeof(cmdopts_t)))) { jas_eprintf("error: insufficient memory\n"); exit(EXIT_FAILURE); } cmdopts->infile = 0; cmdopts->infmt = -1; cmdopts->inopts = 0; cmdopts->inoptsbuf[0] = '\0'; cmdopts->outfile = 0; cmdopts->outfmt = -1; cmdopts->outopts = 0; cmdopts->outoptsbuf[0] = '\0'; cmdopts->verbose = 0; cmdopts->version = 0; cmdopts->cmptno = -1; cmdopts->debug = 0; cmdopts->srgb = 0; while ((c = jas_getopt(argc, argv, cmdoptions)) != EOF) { switch (c) { case CMDOPT_HELP: cmdusage(); break; case CMDOPT_VERBOSE: cmdopts->verbose = 1; break; case CMDOPT_VERSION: cmdopts->version = 1; break; case CMDOPT_DEBUG: cmdopts->debug = atoi(jas_optarg); break; case CMDOPT_INFILE: cmdopts->infile = jas_optarg; break; case CMDOPT_INFMT: if ((cmdopts->infmt = jas_image_strtofmt(jas_optarg)) < 0) { jas_eprintf("warning: ignoring invalid input format %s\n", jas_optarg); cmdopts->infmt = -1; } break; case CMDOPT_INOPT: addopt(cmdopts->inoptsbuf, OPTSMAX, jas_optarg); cmdopts->inopts = cmdopts->inoptsbuf; break; case CMDOPT_OUTFILE: cmdopts->outfile = jas_optarg; break; case CMDOPT_OUTFMT: if ((cmdopts->outfmt = jas_image_strtofmt(jas_optarg)) < 0) { jas_eprintf("error: invalid output format %s\n", jas_optarg); badusage(); } break; case CMDOPT_OUTOPT: addopt(cmdopts->outoptsbuf, OPTSMAX, jas_optarg); cmdopts->outopts = cmdopts->outoptsbuf; break; case CMDOPT_CMPTNO: cmdopts->cmptno = atoi(jas_optarg); break; case CMDOPT_SRGB: cmdopts->srgb = 1; break; default: badusage(); break; } } while (jas_optind < argc) { jas_eprintf( "warning: ignoring bogus command line argument %s\n", argv[jas_optind]); ++jas_optind; } if (cmdopts->version) { goto done; } if (cmdopts->outfmt < 0 && cmdopts->outfile) { if ((cmdopts->outfmt = jas_image_fmtfromname(cmdopts->outfile)) < 0) { jas_eprintf( "error: cannot guess image format from output file name\n"); } } if (cmdopts->outfmt < 0) { jas_eprintf("error: no output format specified\n"); badusage(); } done: return cmdopts; }
/** * Starts the program * * \param argc The number of args * \param argv The arg array * \returns 0 for success, -1 on error */ int main(int argc, char *argv[]) { FILE_UID = getuid(); FILE_GID = getgid(); int newargc = 0; char **newargv = NULL; addopt(&newargc, &newargv, argv[0]); // Always add -s (single threaded) addopt(&newargc, &newargv, "-s"); addopt(&newargc, &newargv, "-oallow_other"); int opt; char *ptr = NULL; while ((opt = getopt(argc, argv, "o:df")) != -1) { switch (opt) { case 'o': ptr = strtok(optarg, ","); while (ptr != NULL) { if (strncasecmp(ptr, INPUT_FILE_OPTION_NAME "=", strlen(INPUT_FILE_OPTION_NAME "=")) == 0) { if (mappedFile != NULL) { printf("Can't specify more than one '%s=' option\n", INPUT_FILE_OPTION_NAME); printUsage(argv[0]); return -1; } ptr += strlen(INPUT_FILE_OPTION_NAME "="); mappedFile = fopen(ptr, "rb"); if (mappedFile == NULL) { perror(ptr); return -1; } fseeko(mappedFile, 0, SEEK_END); mappedFile_size = ftello(mappedFile); } else if (strncasecmp(ptr, LOG_FILE_OPTION_NAME "=", strlen(LOG_FILE_OPTION_NAME "=")) == 0) { if (flog != NULL) { printf("Can't specify more than one '%s=' option\n", LOG_FILE_OPTION_NAME); printUsage(argv[0]); return -1; } ptr += strlen(LOG_FILE_OPTION_NAME "="); flog = fopen(ptr, "ab"); if (flog == NULL) { perror(ptr); return -1; } struct timeval tv; gettimeofday(&tv, NULL); fprintf(flog, "===== Log started at %ld.%06ld =====\n", tv.tv_sec, tv.tv_usec); } else { addopt(&newargc, &newargv, "-o"); addopt(&newargc, &newargv, ptr); } ptr = strtok(NULL, ","); } break; case 'd': addopt(&newargc, &newargv, "-d"); addopt(&newargc, &newargv, "-o"); addopt(&newargc, &newargv, "debug"); break; case 'f': addopt(&newargc, &newargv, "-f"); break; default: printUsage(argv[0]); return -1; } } if (optind >= argc) { printf("Missing mountpoint\n"); printUsage(argv[0]); return -1; } if (mappedFile == NULL) { printf("Input file not provided\n"); printUsage(argv[0]); return -1; } addopt(&newargc, &newargv, argv[optind]); // -s single threaded // -d -o debug (enable debug mode) // -f foreground int ret = fuse_main(newargc, newargv, &fop, NULL); int i; for (i = 0; i < newargc; i++) { g_free(newargv[i]); } g_free(newargv); return ret; }