int qemu_config_parse(FILE *fp, QemuOptsList **lists, const char *fname) { char line[1024], group[64], id[64], arg[64], value[1024]; Location loc; QemuOptsList *list = NULL; QemuOpts *opts = NULL; int res = -1, lno = 0; loc_push_none(&loc); while (fgets(line, sizeof(line), fp) != NULL) { loc_set_file(fname, ++lno); if (line[0] == '\n') { /* skip empty lines */ continue; } if (line[0] == '#') { /* comment */ continue; } if (sscanf(line, "[%63s \"%63[^\"]\"]", group, id) == 2) { /* group with id */ list = find_list(lists, group); if (list == NULL) goto out; opts = qemu_opts_create(list, id, 1); continue; } if (sscanf(line, "[%63[^]]]", group) == 1) { /* group without id */ list = find_list(lists, group); if (list == NULL) goto out; opts = qemu_opts_create(list, NULL, 0); continue; } if (sscanf(line, " %63s = \"%1023[^\"]\"", arg, value) == 2) { /* arg = value */ if (opts == NULL) { error_report("no group defined"); goto out; } if (qemu_opt_set(opts, arg, value) != 0) { goto out; } continue; } error_report("parse error"); goto out; } if (ferror(fp)) { error_report("error reading file"); goto out; } res = 0; out: loc_pop(&loc); return res; }
static void trace_init_events(const char *fname) { Location loc; FILE *fp; char line_buf[1024]; size_t line_idx = 0; if (fname == NULL) { return; } loc_push_none(&loc); loc_set_file(fname, 0); fp = fopen(fname, "r"); if (!fp) { error_report("%s", strerror(errno)); exit(1); } while (fgets(line_buf, sizeof(line_buf), fp)) { loc_set_file(fname, ++line_idx); size_t len = strlen(line_buf); if (len > 1) { /* skip empty lines */ line_buf[len - 1] = '\0'; if ('#' == line_buf[0]) { /* skip commented lines */ continue; } const bool enable = ('-' != line_buf[0]); char *line_ptr = enable ? line_buf : line_buf + 1; if (trace_event_is_pattern(line_ptr)) { TraceEvent *ev = NULL; while ((ev = trace_event_pattern(line_ptr, ev)) != NULL) { if (trace_event_get_state_static(ev)) { trace_event_set_state_dynamic(ev, enable); } } } else { TraceEvent *ev = trace_event_name(line_ptr); if (ev == NULL) { error_report("WARNING: trace event '%s' does not exist", line_ptr); } else if (!trace_event_get_state_static(ev)) { error_report("WARNING: trace event '%s' is not traceable\n", line_ptr); } else { trace_event_set_state_dynamic(ev, enable); } } } } if (fclose(fp) != 0) { loc_set_file(fname, 0); error_report("%s", strerror(errno)); exit(1); } loc_pop(&loc); }
int scsi_bus_legacy_handle_cmdline(SCSIBus *bus) { Location loc; DriveInfo *dinfo; int res = 0, unit; loc_push_none(&loc); for (unit = 0; unit < bus->ndev; unit++) { dinfo = drive_get(IF_SCSI, bus->busnr, unit); if (dinfo == NULL) { continue; } qemu_opts_loc_restore(dinfo->opts); if (!scsi_bus_legacy_add_drive(bus, dinfo->bdrv, unit, false)) { res = -1; break; } } loc_pop(&loc); return res; }
void replay_configure(QemuOpts *opts) { const char *fname; const char *rr; ReplayMode mode = REPLAY_MODE_NONE; Location loc; if (!opts) { return; } loc_push_none(&loc); qemu_opts_loc_restore(opts); rr = qemu_opt_get(opts, "rr"); if (!rr) { /* Just enabling icount */ goto out; } else if (!strcmp(rr, "record")) { mode = REPLAY_MODE_RECORD; } else if (!strcmp(rr, "replay")) { mode = REPLAY_MODE_PLAY; } else { error_report("Invalid icount rr option: %s", rr); exit(1); } fname = qemu_opt_get(opts, "rrfile"); if (!fname) { error_report("File name not specified for replay"); exit(1); } replay_snapshot = g_strdup(qemu_opt_get(opts, "rrsnapshot")); replay_vmstate_register(); replay_enable(fname, mode); out: loc_pop(&loc); }
static void trace_init_events(const char *fname) { Location loc; FILE *fp; char line_buf[1024]; size_t line_idx = 0; if (fname == NULL) { return; } loc_push_none(&loc); loc_set_file(fname, 0); fp = fopen(fname, "r"); if (!fp) { error_report("%s", strerror(errno)); exit(1); } while (fgets(line_buf, sizeof(line_buf), fp)) { loc_set_file(fname, ++line_idx); size_t len = strlen(line_buf); if (len > 1) { /* skip empty lines */ line_buf[len - 1] = '\0'; if ('#' == line_buf[0]) { /* skip commented lines */ continue; } trace_enable_events(line_buf); } } if (fclose(fp) != 0) { loc_set_file(fname, 0); error_report("%s", strerror(errno)); exit(1); } loc_pop(&loc); }