+static void gopt_set_option(struct gopt_job_view *gjv, struct fio_option *o,
+ struct gopt *gopt, struct thread_options *to)
+{
+ switch (o->type) {
+ case FIO_OPT_STR_VAL: {
+ unsigned long long *ullp = NULL;
+ struct gopt_str_val *g;
+
+ if (o->off1)
+ ullp = td_var(to, o, o->off1);
+
+ g = container_of(gopt, struct gopt_str_val, gopt);
+ if (ullp)
+ gopt_str_val_set_val(g, *ullp);
+ break;
+ }
+ case FIO_OPT_STR_VAL_TIME: {
+ unsigned long long *ullp = NULL;
+ struct gopt_int *i;
+
+ if (o->off1)
+ ullp = td_var(to, o, o->off1);
+
+ i = container_of(gopt, struct gopt_int, gopt);
+ if (ullp)
+ gopt_int_set_val(i, *ullp);
+ break;
+ }
+ case FIO_OPT_INT:
+ if (o->posval[0].ival) {
+ unsigned int *ip = NULL;
+ struct gopt_combo *c;
+
+ if (o->off1)
+ ip = td_var(to, o, o->off1);
+
+ c = container_of(gopt, struct gopt_combo, gopt);
+ if (ip)
+ gopt_combo_int_set_val(c, *ip);
+ } else {
+ unsigned int *ip = NULL;
+ struct gopt_int *i;
+
+ if (o->off1)
+ ip = td_var(to, o, o->off1);
+
+ i = container_of(gopt, struct gopt_int, gopt);
+ if (ip)
+ gopt_int_set_val(i, *ip);
+ }
+ break;
+ case FIO_OPT_STR_SET:
+ case FIO_OPT_BOOL: {
+ unsigned int *ip = NULL;
+ struct gopt_bool *b;
+
+ if (o->off1)
+ ip = td_var(to, o, o->off1);
+
+ b = container_of(gopt, struct gopt_bool, gopt);
+ if (ip)
+ gopt_bool_set_val(b, *ip);
+ break;
+ }
+ case FIO_OPT_STR: {
+ if (o->posval[0].ival) {
+ unsigned int *ip = NULL;
+ struct gopt_combo *c;
+
+ if (o->off1)
+ ip = td_var(to, o, o->off1);
+
+ c = container_of(gopt, struct gopt_combo, gopt);
+ if (ip)
+ gopt_combo_int_set_val(c, *ip);
+ } else {
+ struct gopt_str *s;
+ char *text = NULL;
+
+ if (o->off1) {
+ char **p = td_var(to, o, o->off1);
+
+ text = *p;
+ }
+
+ s = container_of(gopt, struct gopt_str, gopt);
+ gopt_str_store_set_val(s, text);
+ }
+
+ break;
+ }
+ case FIO_OPT_STR_STORE: {
+ struct gopt_combo *c;
+ char *text = NULL;
+
+ if (o->off1) {
+ char **p = td_var(to, o, o->off1);
+ text = *p;
+ }
+
+ if (!o->posval[0].ival) {
+ struct gopt_str *s;
+
+ s = container_of(gopt, struct gopt_str, gopt);
+ gopt_str_store_set_val(s, text);
+ break;
+ }
+
+ c = container_of(gopt, struct gopt_combo, gopt);
+ if (text)
+ gopt_combo_str_set_val(c, text);
+ break;
+ }
+ case FIO_OPT_STR_MULTI:
+ /* HANDLE ME */
+ break;
+ case FIO_OPT_RANGE: {
+ struct gopt_range *r;
+ unsigned int *ip[4] = { td_var(to, o, o->off1),
+ td_var(to, o, o->off2),
+ td_var(to, o, o->off3),
+ td_var(to, o, o->off4) };
+
+ r = container_of(gopt, struct gopt_range, gopt);
+ gopt_int_range_set_val(r, *ip);
+ break;
+ }
+ /* still need to handle this one */
+ case FIO_OPT_FLOAT_LIST:
+ break;
+ case FIO_OPT_DEPRECATED:
+ break;
+ default:
+ printf("ignore type %u\n", o->type);
+ break;
+ }
+}
+