QemuOpts: add qemu_opts_append to replace append_option_parameters
For later merge .create_opts of drv and proto_drv in qemu-img commands. Reviewed-by: Stefan Hajnoczi <stefanha@redhat.com> Reviewed-by: Eric Blake <eblake@redhat.com> Reviewed-by: Leandro Dorileo <l@dorileo.org> Signed-off-by: Chunyan Liu <cyliu@suse.com> Signed-off-by: Stefan Hajnoczi <stefanha@redhat.com>
This commit is contained in:
		
							parent
							
								
									8559e45e51
								
							
						
					
					
						commit
						a1097a2614
					
				| 
						 | 
				
			
			@ -176,5 +176,10 @@ void qemu_opts_print_help(QemuOptsList *list);
 | 
			
		|||
void qemu_opts_free(QemuOptsList *list);
 | 
			
		||||
QEMUOptionParameter *opts_to_params(QemuOpts *opts);
 | 
			
		||||
QemuOptsList *params_to_opts(QEMUOptionParameter *list);
 | 
			
		||||
/* FIXME: will remove QEMUOptionParameter after all drivers switch to QemuOpts.
 | 
			
		||||
 */
 | 
			
		||||
QemuOptsList *qemu_opts_append(QemuOptsList *dst,
 | 
			
		||||
                               QemuOptsList *list,
 | 
			
		||||
                               QEMUOptionParameter *param);
 | 
			
		||||
 | 
			
		||||
#endif
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -1499,3 +1499,70 @@ void qemu_opts_free(QemuOptsList *list)
 | 
			
		|||
 | 
			
		||||
    g_free(list);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/* Realloc dst option list and append options either from an option list (list)
 | 
			
		||||
 * or a QEMUOptionParameter (param) to it. dst could be NULL or a malloced list.
 | 
			
		||||
 * FIXME: will remove QEMUOptionParameter after all drivers switch to QemuOpts.
 | 
			
		||||
 */
 | 
			
		||||
QemuOptsList *qemu_opts_append(QemuOptsList *dst,
 | 
			
		||||
                               QemuOptsList *list,
 | 
			
		||||
                               QEMUOptionParameter *param)
 | 
			
		||||
{
 | 
			
		||||
    size_t num_opts, num_dst_opts;
 | 
			
		||||
    QemuOptDesc *desc;
 | 
			
		||||
    bool need_init = false;
 | 
			
		||||
 | 
			
		||||
    assert(!(list && param));
 | 
			
		||||
    if (!param && !list) {
 | 
			
		||||
        return dst;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    if (param) {
 | 
			
		||||
        list = params_to_opts(param);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /* If dst is NULL, after realloc, some area of dst should be initialized
 | 
			
		||||
     * before adding options to it.
 | 
			
		||||
     */
 | 
			
		||||
    if (!dst) {
 | 
			
		||||
        need_init = true;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    num_opts = count_opts_list(dst);
 | 
			
		||||
    num_dst_opts = num_opts;
 | 
			
		||||
    num_opts += count_opts_list(list);
 | 
			
		||||
    dst = g_realloc(dst, sizeof(QemuOptsList) +
 | 
			
		||||
                    (num_opts + 1) * sizeof(QemuOptDesc));
 | 
			
		||||
    if (need_init) {
 | 
			
		||||
        dst->name = NULL;
 | 
			
		||||
        dst->implied_opt_name = NULL;
 | 
			
		||||
        QTAILQ_INIT(&dst->head);
 | 
			
		||||
        dst->allocated = true;
 | 
			
		||||
        dst->merge_lists = false;
 | 
			
		||||
    }
 | 
			
		||||
    dst->desc[num_dst_opts].name = NULL;
 | 
			
		||||
 | 
			
		||||
    /* (const char *) members of result dst are malloced, need free. */
 | 
			
		||||
    assert(dst->allocated);
 | 
			
		||||
    /* append list->desc to dst->desc */
 | 
			
		||||
    if (list) {
 | 
			
		||||
        desc = list->desc;
 | 
			
		||||
        while (desc && desc->name) {
 | 
			
		||||
            if (find_desc_by_name(dst->desc, desc->name) == NULL) {
 | 
			
		||||
                dst->desc[num_dst_opts].name = g_strdup(desc->name);
 | 
			
		||||
                dst->desc[num_dst_opts].type = desc->type;
 | 
			
		||||
                dst->desc[num_dst_opts].help = g_strdup(desc->help);
 | 
			
		||||
                dst->desc[num_dst_opts].def_value_str =
 | 
			
		||||
                                         g_strdup(desc->def_value_str);
 | 
			
		||||
                num_dst_opts++;
 | 
			
		||||
                dst->desc[num_dst_opts].name = NULL;
 | 
			
		||||
            }
 | 
			
		||||
            desc++;
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    if (param) {
 | 
			
		||||
        qemu_opts_free(list);
 | 
			
		||||
    }
 | 
			
		||||
    return dst;
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
		Reference in New Issue