Changeset 5484:3ca4488d44e1 in roaraudio for roarclients


Ignore:
Timestamp:
04/25/12 09:48:43 (12 years ago)
Author:
phi
Branch:
default
Phase:
public
Message:

Added support for an application mode in roarpluginrunner

Location:
roarclients
Files:
1 added
2 edited

Legend:

Unmodified
Added
Removed
  • roarclients/Makefile

    r5413 r5484  
    77TARGETS_M=roardtmf 
    88TARGETS_VIO=roarvio 
    9 TARGETS_PLUGINS=roarpluginrunner 
     9TARGETS_PLUGINS=roarpluginrunner roarpluginapplication 
    1010 
    1111#TARGETS_TESTS=zcattest pgptest pipetest polytest 
  • roarclients/roarpluginrunner.c

    r5442 r5484  
    3131enum action { 
    3232 RUN, 
     33 RUN_AS_APPLICATION, 
    3334 EXPLAIN 
    3435}; 
     
    4142 fprintf(stderr, "\nOptions:\n\n"); 
    4243 
    43  fprintf(stderr, " -h --help            - This help.\n" 
    44                  " -v --verbose         - Be verbose. Can be used multiple times.\n" 
    45                  "    --server SERVER   - Set default server to SERVER.\n" 
    46                  "    --run             - Run plugin.\n" 
    47                  "    --explain         - Explain plugin.\n" 
    48                  "    --appname NAME    - Sets the appname.\n" 
    49                  "    --abiversion ABI  - Set the ABI version.\n" 
    50                  "    --args ARGS       - Set plugin arguments.\n" 
     44 fprintf(stderr, " -h --help               - This help.\n" 
     45                 " -v --verbose            - Be verbose. Can be used multiple times.\n" 
     46                 "    --server SERVER      - Set default server to SERVER.\n" 
     47                 "    --run                - Run plugin.\n" 
     48                 "    --run-as-application - Same as --run except all tailing arguments are\n" 
     49                 "                           passed to the plugin.\n" 
     50                 "    --explain            - Explain plugin.\n" 
     51                 "    --appname NAME       - Sets the appname.\n" 
     52                 "    --abiversion ABI     - Set the ABI version.\n" 
     53                 "    --args ARGS          - Set plugin arguments.\n" 
    5154        ); 
    5255} 
     
    285288   break; 
    286289  case RUN: 
     290  case RUN_AS_APPLICATION: 
    287291    return do_run(name); 
    288292   break; 
     
    300304 roar_dl_para_unref(g_para); 
    301305 g_para = NULL; 
     306} 
     307 
     308static inline int _add_para(struct roar_dl_librarypara * para, const char * pluginargs, size_t argc, char * argv[]) { 
     309 struct roar_keyval * kv; 
     310 ssize_t argslen, argvlen; 
     311 ssize_t arglen; 
     312 ssize_t pluginargc; 
     313 size_t argv_phys = argc; 
     314 size_t i; 
     315 int error; 
     316 char * sp, * c; 
     317 int after_parser_end; 
     318 
     319 if ( pluginargs == NULL ) 
     320  pluginargs = ""; 
     321 
     322 argslen = roar_mm_strlen(pluginargs) + 1 /* tailing '\0' */; 
     323 
     324 after_parser_end = 0; 
     325 argvlen = 0; 
     326 for (i = 0; i < argv_phys; i++) { 
     327  arglen   = roar_mm_strlen(argv[i]); 
     328  argvlen += arglen; 
     329  if ( !after_parser_end ) { 
     330   if ( !strcmp(argv[i], "--") ) { 
     331    after_parser_end = 1; 
     332    argc--; 
     333   } else if ( arglen > 1 && argv[i][0] == '-' && !(arglen > 2 && argv[i][1] == '-') ) { 
     334    argc += arglen - 2; 
     335   } 
     336  } 
     337 } 
     338 argvlen += argc; // the '\0's. 
     339 
     340 para->args_store = roar_mm_malloc(argslen+argvlen); 
     341 if ( para == NULL ) 
     342  return -1; 
     343 
     344 memcpy(para->args_store, pluginargs, argslen); 
     345 
     346 pluginargc = roar_keyval_split(&kv, para->args_store, NULL, NULL, 1); 
     347 if ( pluginargc == -1 ) { 
     348  error = roar_error; 
     349  roar_mm_free(para->args_store); 
     350  para->args_store = NULL; 
     351  roar_error = error; 
     352  return -1; 
     353 } 
     354 
     355 para->argv = roar_mm_malloc((pluginargc+argc)*sizeof(struct roar_keyval)); 
     356 if ( para->argv == NULL ) { 
     357  error = roar_error; 
     358  roar_mm_free(kv); 
     359  roar_mm_free(para->args_store); 
     360  para->args_store = NULL; 
     361  roar_error = error; 
     362  return -1; 
     363 } 
     364 
     365 para->argc = pluginargc + argc; 
     366 
     367 memcpy(para->argv, kv, pluginargc*sizeof(struct roar_keyval)); 
     368 roar_mm_free(kv); 
     369 
     370 sp = para->args_store + argslen; 
     371 kv = para->argv + pluginargc; 
     372 
     373 after_parser_end = 0; 
     374 for (i = 0; i < argv_phys; i++) { 
     375  arglen = roar_mm_strlen(argv[i]) + 1; 
     376  if ( after_parser_end || !(arglen > 2 && argv[i][0] == '-' && !(arglen > 3 && argv[i][1] == '-')) ) 
     377   memcpy(sp, argv[i], arglen); 
     378 
     379  if ( !after_parser_end && !strcmp(argv[i], "--") ) { 
     380   after_parser_end = 1; 
     381   continue; 
     382  } else if ( !after_parser_end && arglen > 3 && sp[0] == '-' && sp[1] == '-' ) { 
     383   kv->key = sp + 2; 
     384   kv->value = NULL; 
     385   for (c = sp + 2; *c; c++) { 
     386    if (*c == '=') { 
     387     *c = 0; 
     388     c++; 
     389     kv->value = c; 
     390     break; 
     391    } 
     392   } 
     393  } else if ( !after_parser_end && arglen > 2 && argv[i][0] == '-' ) { 
     394   for (c = argv[i] + 1; *c; c++) { 
     395    printf("*c=%c\n", *c); 
     396    sp[0] = *c; 
     397    sp[1] = 0; 
     398    kv->key = sp; 
     399    kv->value = NULL; 
     400    sp += 2; 
     401    kv++; 
     402   } 
     403   continue; 
     404  } else { 
     405   kv->key = NULL; 
     406   kv->value = sp; 
     407  } 
     408 
     409  sp += arglen; 
     410  kv++; 
     411 } 
     412 
     413 return 0; 
    302414} 
    303415 
     
    319431  } else if ( !strcmp(k, "--run") ) { 
    320432   action = RUN; 
     433  } else if ( !strcmp(k, "--run-as-application") ) { 
     434   action = RUN_AS_APPLICATION; 
    321435  } else if ( !strcmp(k, "--explain") ) { 
    322436   action = EXPLAIN; 
     
    336450  } else { 
    337451   if ( g_para == NULL ) 
    338     g_para = roar_dl_para_new(pluginargs, NULL, appname, abiversion); 
    339    roar_err_set(ROAR_ERROR_NONE); 
    340    if ( do_plugin(action, k) == -1 ) { 
    341     fprintf(stderr, "Error loading plugin: %s\n", 
    342                     roar_error != ROAR_ERROR_NONE ? roar_error2str(roar_error) : roar_dl_errstr(NULL)); 
    343     ret = 1; 
    344    } 
     452    g_para = roar_dl_para_new(action == RUN_AS_APPLICATION ? NULL : pluginargs, NULL, appname, abiversion); 
     453   if ( action == RUN_AS_APPLICATION && _add_para(g_para, pluginargs, argc - i - 1, &(argv[i+1])) == -1 ) { 
     454    fprintf(stderr, "Error parsing plugin arguments: %s\n", roar_error2str(roar_error)); 
     455   } else { 
     456    roar_err_set(ROAR_ERROR_NONE); 
     457    if ( do_plugin(action, k) == -1 ) { 
     458     fprintf(stderr, "Error loading plugin: %s\n", 
     459                     roar_error != ROAR_ERROR_NONE ? roar_error2str(roar_error) : roar_dl_errstr(NULL)); 
     460     ret = 1; 
     461    } 
     462   } 
     463   if ( action == RUN_AS_APPLICATION ) 
     464    break; // end looping over arguments 
    345465  } 
    346466 } 
Note: See TracChangeset for help on using the changeset viewer.