1*0bcc8e5bSMarkus Armbruster /* 2*0bcc8e5bSMarkus Armbruster * Special QDict functions used by the block layer 3*0bcc8e5bSMarkus Armbruster * 4*0bcc8e5bSMarkus Armbruster * Copyright (c) 2013-2018 Red Hat, Inc. 5*0bcc8e5bSMarkus Armbruster * 6*0bcc8e5bSMarkus Armbruster * This work is licensed under the terms of the GNU LGPL, version 2.1 or later. 7*0bcc8e5bSMarkus Armbruster * See the COPYING.LIB file in the top-level directory. 8*0bcc8e5bSMarkus Armbruster */ 9*0bcc8e5bSMarkus Armbruster 10*0bcc8e5bSMarkus Armbruster #include "qemu/osdep.h" 11*0bcc8e5bSMarkus Armbruster #include "block/qdict.h" 12*0bcc8e5bSMarkus Armbruster #include "qapi/qmp/qlist.h" 13*0bcc8e5bSMarkus Armbruster #include "qemu/cutils.h" 14*0bcc8e5bSMarkus Armbruster #include "qapi/error.h" 15*0bcc8e5bSMarkus Armbruster 16*0bcc8e5bSMarkus Armbruster /** 17*0bcc8e5bSMarkus Armbruster * qdict_copy_default(): If no entry mapped by 'key' exists in 'dst' yet, the 18*0bcc8e5bSMarkus Armbruster * value of 'key' in 'src' is copied there (and the refcount increased 19*0bcc8e5bSMarkus Armbruster * accordingly). 20*0bcc8e5bSMarkus Armbruster */ 21*0bcc8e5bSMarkus Armbruster void qdict_copy_default(QDict *dst, QDict *src, const char *key) 22*0bcc8e5bSMarkus Armbruster { 23*0bcc8e5bSMarkus Armbruster QObject *val; 24*0bcc8e5bSMarkus Armbruster 25*0bcc8e5bSMarkus Armbruster if (qdict_haskey(dst, key)) { 26*0bcc8e5bSMarkus Armbruster return; 27*0bcc8e5bSMarkus Armbruster } 28*0bcc8e5bSMarkus Armbruster 29*0bcc8e5bSMarkus Armbruster val = qdict_get(src, key); 30*0bcc8e5bSMarkus Armbruster if (val) { 31*0bcc8e5bSMarkus Armbruster qdict_put_obj(dst, key, qobject_ref(val)); 32*0bcc8e5bSMarkus Armbruster } 33*0bcc8e5bSMarkus Armbruster } 34*0bcc8e5bSMarkus Armbruster 35*0bcc8e5bSMarkus Armbruster /** 36*0bcc8e5bSMarkus Armbruster * qdict_set_default_str(): If no entry mapped by 'key' exists in 'dst' yet, a 37*0bcc8e5bSMarkus Armbruster * new QString initialised by 'val' is put there. 38*0bcc8e5bSMarkus Armbruster */ 39*0bcc8e5bSMarkus Armbruster void qdict_set_default_str(QDict *dst, const char *key, const char *val) 40*0bcc8e5bSMarkus Armbruster { 41*0bcc8e5bSMarkus Armbruster if (qdict_haskey(dst, key)) { 42*0bcc8e5bSMarkus Armbruster return; 43*0bcc8e5bSMarkus Armbruster } 44*0bcc8e5bSMarkus Armbruster 45*0bcc8e5bSMarkus Armbruster qdict_put_str(dst, key, val); 46*0bcc8e5bSMarkus Armbruster } 47*0bcc8e5bSMarkus Armbruster 48*0bcc8e5bSMarkus Armbruster static void qdict_flatten_qdict(QDict *qdict, QDict *target, 49*0bcc8e5bSMarkus Armbruster const char *prefix); 50*0bcc8e5bSMarkus Armbruster 51*0bcc8e5bSMarkus Armbruster static void qdict_flatten_qlist(QList *qlist, QDict *target, const char *prefix) 52*0bcc8e5bSMarkus Armbruster { 53*0bcc8e5bSMarkus Armbruster QObject *value; 54*0bcc8e5bSMarkus Armbruster const QListEntry *entry; 55*0bcc8e5bSMarkus Armbruster char *new_key; 56*0bcc8e5bSMarkus Armbruster int i; 57*0bcc8e5bSMarkus Armbruster 58*0bcc8e5bSMarkus Armbruster /* This function is never called with prefix == NULL, i.e., it is always 59*0bcc8e5bSMarkus Armbruster * called from within qdict_flatten_q(list|dict)(). Therefore, it does not 60*0bcc8e5bSMarkus Armbruster * need to remove list entries during the iteration (the whole list will be 61*0bcc8e5bSMarkus Armbruster * deleted eventually anyway from qdict_flatten_qdict()). */ 62*0bcc8e5bSMarkus Armbruster assert(prefix); 63*0bcc8e5bSMarkus Armbruster 64*0bcc8e5bSMarkus Armbruster entry = qlist_first(qlist); 65*0bcc8e5bSMarkus Armbruster 66*0bcc8e5bSMarkus Armbruster for (i = 0; entry; entry = qlist_next(entry), i++) { 67*0bcc8e5bSMarkus Armbruster value = qlist_entry_obj(entry); 68*0bcc8e5bSMarkus Armbruster new_key = g_strdup_printf("%s.%i", prefix, i); 69*0bcc8e5bSMarkus Armbruster 70*0bcc8e5bSMarkus Armbruster if (qobject_type(value) == QTYPE_QDICT) { 71*0bcc8e5bSMarkus Armbruster qdict_flatten_qdict(qobject_to(QDict, value), target, new_key); 72*0bcc8e5bSMarkus Armbruster } else if (qobject_type(value) == QTYPE_QLIST) { 73*0bcc8e5bSMarkus Armbruster qdict_flatten_qlist(qobject_to(QList, value), target, new_key); 74*0bcc8e5bSMarkus Armbruster } else { 75*0bcc8e5bSMarkus Armbruster /* All other types are moved to the target unchanged. */ 76*0bcc8e5bSMarkus Armbruster qdict_put_obj(target, new_key, qobject_ref(value)); 77*0bcc8e5bSMarkus Armbruster } 78*0bcc8e5bSMarkus Armbruster 79*0bcc8e5bSMarkus Armbruster g_free(new_key); 80*0bcc8e5bSMarkus Armbruster } 81*0bcc8e5bSMarkus Armbruster } 82*0bcc8e5bSMarkus Armbruster 83*0bcc8e5bSMarkus Armbruster static void qdict_flatten_qdict(QDict *qdict, QDict *target, const char *prefix) 84*0bcc8e5bSMarkus Armbruster { 85*0bcc8e5bSMarkus Armbruster QObject *value; 86*0bcc8e5bSMarkus Armbruster const QDictEntry *entry, *next; 87*0bcc8e5bSMarkus Armbruster char *new_key; 88*0bcc8e5bSMarkus Armbruster bool delete; 89*0bcc8e5bSMarkus Armbruster 90*0bcc8e5bSMarkus Armbruster entry = qdict_first(qdict); 91*0bcc8e5bSMarkus Armbruster 92*0bcc8e5bSMarkus Armbruster while (entry != NULL) { 93*0bcc8e5bSMarkus Armbruster 94*0bcc8e5bSMarkus Armbruster next = qdict_next(qdict, entry); 95*0bcc8e5bSMarkus Armbruster value = qdict_entry_value(entry); 96*0bcc8e5bSMarkus Armbruster new_key = NULL; 97*0bcc8e5bSMarkus Armbruster delete = false; 98*0bcc8e5bSMarkus Armbruster 99*0bcc8e5bSMarkus Armbruster if (prefix) { 100*0bcc8e5bSMarkus Armbruster new_key = g_strdup_printf("%s.%s", prefix, entry->key); 101*0bcc8e5bSMarkus Armbruster } 102*0bcc8e5bSMarkus Armbruster 103*0bcc8e5bSMarkus Armbruster if (qobject_type(value) == QTYPE_QDICT) { 104*0bcc8e5bSMarkus Armbruster /* Entries of QDicts are processed recursively, the QDict object 105*0bcc8e5bSMarkus Armbruster * itself disappears. */ 106*0bcc8e5bSMarkus Armbruster qdict_flatten_qdict(qobject_to(QDict, value), target, 107*0bcc8e5bSMarkus Armbruster new_key ? new_key : entry->key); 108*0bcc8e5bSMarkus Armbruster delete = true; 109*0bcc8e5bSMarkus Armbruster } else if (qobject_type(value) == QTYPE_QLIST) { 110*0bcc8e5bSMarkus Armbruster qdict_flatten_qlist(qobject_to(QList, value), target, 111*0bcc8e5bSMarkus Armbruster new_key ? new_key : entry->key); 112*0bcc8e5bSMarkus Armbruster delete = true; 113*0bcc8e5bSMarkus Armbruster } else if (prefix) { 114*0bcc8e5bSMarkus Armbruster /* All other objects are moved to the target unchanged. */ 115*0bcc8e5bSMarkus Armbruster qdict_put_obj(target, new_key, qobject_ref(value)); 116*0bcc8e5bSMarkus Armbruster delete = true; 117*0bcc8e5bSMarkus Armbruster } 118*0bcc8e5bSMarkus Armbruster 119*0bcc8e5bSMarkus Armbruster g_free(new_key); 120*0bcc8e5bSMarkus Armbruster 121*0bcc8e5bSMarkus Armbruster if (delete) { 122*0bcc8e5bSMarkus Armbruster qdict_del(qdict, entry->key); 123*0bcc8e5bSMarkus Armbruster 124*0bcc8e5bSMarkus Armbruster /* Restart loop after modifying the iterated QDict */ 125*0bcc8e5bSMarkus Armbruster entry = qdict_first(qdict); 126*0bcc8e5bSMarkus Armbruster continue; 127*0bcc8e5bSMarkus Armbruster } 128*0bcc8e5bSMarkus Armbruster 129*0bcc8e5bSMarkus Armbruster entry = next; 130*0bcc8e5bSMarkus Armbruster } 131*0bcc8e5bSMarkus Armbruster } 132*0bcc8e5bSMarkus Armbruster 133*0bcc8e5bSMarkus Armbruster /** 134*0bcc8e5bSMarkus Armbruster * qdict_flatten(): For each nested QDict with key x, all fields with key y 135*0bcc8e5bSMarkus Armbruster * are moved to this QDict and their key is renamed to "x.y". For each nested 136*0bcc8e5bSMarkus Armbruster * QList with key x, the field at index y is moved to this QDict with the key 137*0bcc8e5bSMarkus Armbruster * "x.y" (i.e., the reverse of what qdict_array_split() does). 138*0bcc8e5bSMarkus Armbruster * This operation is applied recursively for nested QDicts and QLists. 139*0bcc8e5bSMarkus Armbruster */ 140*0bcc8e5bSMarkus Armbruster void qdict_flatten(QDict *qdict) 141*0bcc8e5bSMarkus Armbruster { 142*0bcc8e5bSMarkus Armbruster qdict_flatten_qdict(qdict, qdict, NULL); 143*0bcc8e5bSMarkus Armbruster } 144*0bcc8e5bSMarkus Armbruster 145*0bcc8e5bSMarkus Armbruster /* extract all the src QDict entries starting by start into dst */ 146*0bcc8e5bSMarkus Armbruster void qdict_extract_subqdict(QDict *src, QDict **dst, const char *start) 147*0bcc8e5bSMarkus Armbruster 148*0bcc8e5bSMarkus Armbruster { 149*0bcc8e5bSMarkus Armbruster const QDictEntry *entry, *next; 150*0bcc8e5bSMarkus Armbruster const char *p; 151*0bcc8e5bSMarkus Armbruster 152*0bcc8e5bSMarkus Armbruster *dst = qdict_new(); 153*0bcc8e5bSMarkus Armbruster entry = qdict_first(src); 154*0bcc8e5bSMarkus Armbruster 155*0bcc8e5bSMarkus Armbruster while (entry != NULL) { 156*0bcc8e5bSMarkus Armbruster next = qdict_next(src, entry); 157*0bcc8e5bSMarkus Armbruster if (strstart(entry->key, start, &p)) { 158*0bcc8e5bSMarkus Armbruster qdict_put_obj(*dst, p, qobject_ref(entry->value)); 159*0bcc8e5bSMarkus Armbruster qdict_del(src, entry->key); 160*0bcc8e5bSMarkus Armbruster } 161*0bcc8e5bSMarkus Armbruster entry = next; 162*0bcc8e5bSMarkus Armbruster } 163*0bcc8e5bSMarkus Armbruster } 164*0bcc8e5bSMarkus Armbruster 165*0bcc8e5bSMarkus Armbruster static int qdict_count_prefixed_entries(const QDict *src, const char *start) 166*0bcc8e5bSMarkus Armbruster { 167*0bcc8e5bSMarkus Armbruster const QDictEntry *entry; 168*0bcc8e5bSMarkus Armbruster int count = 0; 169*0bcc8e5bSMarkus Armbruster 170*0bcc8e5bSMarkus Armbruster for (entry = qdict_first(src); entry; entry = qdict_next(src, entry)) { 171*0bcc8e5bSMarkus Armbruster if (strstart(entry->key, start, NULL)) { 172*0bcc8e5bSMarkus Armbruster if (count == INT_MAX) { 173*0bcc8e5bSMarkus Armbruster return -ERANGE; 174*0bcc8e5bSMarkus Armbruster } 175*0bcc8e5bSMarkus Armbruster count++; 176*0bcc8e5bSMarkus Armbruster } 177*0bcc8e5bSMarkus Armbruster } 178*0bcc8e5bSMarkus Armbruster 179*0bcc8e5bSMarkus Armbruster return count; 180*0bcc8e5bSMarkus Armbruster } 181*0bcc8e5bSMarkus Armbruster 182*0bcc8e5bSMarkus Armbruster /** 183*0bcc8e5bSMarkus Armbruster * qdict_array_split(): This function moves array-like elements of a QDict into 184*0bcc8e5bSMarkus Armbruster * a new QList. Every entry in the original QDict with a key "%u" or one 185*0bcc8e5bSMarkus Armbruster * prefixed "%u.", where %u designates an unsigned integer starting at 0 and 186*0bcc8e5bSMarkus Armbruster * incrementally counting up, will be moved to a new QDict at index %u in the 187*0bcc8e5bSMarkus Armbruster * output QList with the key prefix removed, if that prefix is "%u.". If the 188*0bcc8e5bSMarkus Armbruster * whole key is just "%u", the whole QObject will be moved unchanged without 189*0bcc8e5bSMarkus Armbruster * creating a new QDict. The function terminates when there is no entry in the 190*0bcc8e5bSMarkus Armbruster * QDict with a prefix directly (incrementally) following the last one; it also 191*0bcc8e5bSMarkus Armbruster * returns if there are both entries with "%u" and "%u." for the same index %u. 192*0bcc8e5bSMarkus Armbruster * Example: {"0.a": 42, "0.b": 23, "1.x": 0, "4.y": 1, "o.o": 7, "2": 66} 193*0bcc8e5bSMarkus Armbruster * (or {"1.x": 0, "4.y": 1, "0.a": 42, "o.o": 7, "0.b": 23, "2": 66}) 194*0bcc8e5bSMarkus Armbruster * => [{"a": 42, "b": 23}, {"x": 0}, 66] 195*0bcc8e5bSMarkus Armbruster * and {"4.y": 1, "o.o": 7} (remainder of the old QDict) 196*0bcc8e5bSMarkus Armbruster */ 197*0bcc8e5bSMarkus Armbruster void qdict_array_split(QDict *src, QList **dst) 198*0bcc8e5bSMarkus Armbruster { 199*0bcc8e5bSMarkus Armbruster unsigned i; 200*0bcc8e5bSMarkus Armbruster 201*0bcc8e5bSMarkus Armbruster *dst = qlist_new(); 202*0bcc8e5bSMarkus Armbruster 203*0bcc8e5bSMarkus Armbruster for (i = 0; i < UINT_MAX; i++) { 204*0bcc8e5bSMarkus Armbruster QObject *subqobj; 205*0bcc8e5bSMarkus Armbruster bool is_subqdict; 206*0bcc8e5bSMarkus Armbruster QDict *subqdict; 207*0bcc8e5bSMarkus Armbruster char indexstr[32], prefix[32]; 208*0bcc8e5bSMarkus Armbruster size_t snprintf_ret; 209*0bcc8e5bSMarkus Armbruster 210*0bcc8e5bSMarkus Armbruster snprintf_ret = snprintf(indexstr, 32, "%u", i); 211*0bcc8e5bSMarkus Armbruster assert(snprintf_ret < 32); 212*0bcc8e5bSMarkus Armbruster 213*0bcc8e5bSMarkus Armbruster subqobj = qdict_get(src, indexstr); 214*0bcc8e5bSMarkus Armbruster 215*0bcc8e5bSMarkus Armbruster snprintf_ret = snprintf(prefix, 32, "%u.", i); 216*0bcc8e5bSMarkus Armbruster assert(snprintf_ret < 32); 217*0bcc8e5bSMarkus Armbruster 218*0bcc8e5bSMarkus Armbruster /* Overflow is the same as positive non-zero results */ 219*0bcc8e5bSMarkus Armbruster is_subqdict = qdict_count_prefixed_entries(src, prefix); 220*0bcc8e5bSMarkus Armbruster 221*0bcc8e5bSMarkus Armbruster /* 222*0bcc8e5bSMarkus Armbruster * There may be either a single subordinate object (named 223*0bcc8e5bSMarkus Armbruster * "%u") or multiple objects (each with a key prefixed "%u."), 224*0bcc8e5bSMarkus Armbruster * but not both. 225*0bcc8e5bSMarkus Armbruster */ 226*0bcc8e5bSMarkus Armbruster if (!subqobj == !is_subqdict) { 227*0bcc8e5bSMarkus Armbruster break; 228*0bcc8e5bSMarkus Armbruster } 229*0bcc8e5bSMarkus Armbruster 230*0bcc8e5bSMarkus Armbruster if (is_subqdict) { 231*0bcc8e5bSMarkus Armbruster qdict_extract_subqdict(src, &subqdict, prefix); 232*0bcc8e5bSMarkus Armbruster assert(qdict_size(subqdict) > 0); 233*0bcc8e5bSMarkus Armbruster } else { 234*0bcc8e5bSMarkus Armbruster qobject_ref(subqobj); 235*0bcc8e5bSMarkus Armbruster qdict_del(src, indexstr); 236*0bcc8e5bSMarkus Armbruster } 237*0bcc8e5bSMarkus Armbruster 238*0bcc8e5bSMarkus Armbruster qlist_append_obj(*dst, subqobj ?: QOBJECT(subqdict)); 239*0bcc8e5bSMarkus Armbruster } 240*0bcc8e5bSMarkus Armbruster } 241*0bcc8e5bSMarkus Armbruster 242*0bcc8e5bSMarkus Armbruster /** 243*0bcc8e5bSMarkus Armbruster * qdict_split_flat_key: 244*0bcc8e5bSMarkus Armbruster * @key: the key string to split 245*0bcc8e5bSMarkus Armbruster * @prefix: non-NULL pointer to hold extracted prefix 246*0bcc8e5bSMarkus Armbruster * @suffix: non-NULL pointer to remaining suffix 247*0bcc8e5bSMarkus Armbruster * 248*0bcc8e5bSMarkus Armbruster * Given a flattened key such as 'foo.0.bar', split it into two parts 249*0bcc8e5bSMarkus Armbruster * at the first '.' separator. Allows double dot ('..') to escape the 250*0bcc8e5bSMarkus Armbruster * normal separator. 251*0bcc8e5bSMarkus Armbruster * 252*0bcc8e5bSMarkus Armbruster * e.g. 253*0bcc8e5bSMarkus Armbruster * 'foo.0.bar' -> prefix='foo' and suffix='0.bar' 254*0bcc8e5bSMarkus Armbruster * 'foo..0.bar' -> prefix='foo.0' and suffix='bar' 255*0bcc8e5bSMarkus Armbruster * 256*0bcc8e5bSMarkus Armbruster * The '..' sequence will be unescaped in the returned 'prefix' 257*0bcc8e5bSMarkus Armbruster * string. The 'suffix' string will be left in escaped format, so it 258*0bcc8e5bSMarkus Armbruster * can be fed back into the qdict_split_flat_key() key as the input 259*0bcc8e5bSMarkus Armbruster * later. 260*0bcc8e5bSMarkus Armbruster * 261*0bcc8e5bSMarkus Armbruster * The caller is responsible for freeing the string returned in @prefix 262*0bcc8e5bSMarkus Armbruster * using g_free(). 263*0bcc8e5bSMarkus Armbruster */ 264*0bcc8e5bSMarkus Armbruster static void qdict_split_flat_key(const char *key, char **prefix, 265*0bcc8e5bSMarkus Armbruster const char **suffix) 266*0bcc8e5bSMarkus Armbruster { 267*0bcc8e5bSMarkus Armbruster const char *separator; 268*0bcc8e5bSMarkus Armbruster size_t i, j; 269*0bcc8e5bSMarkus Armbruster 270*0bcc8e5bSMarkus Armbruster /* Find first '.' separator, but if there is a pair '..' 271*0bcc8e5bSMarkus Armbruster * that acts as an escape, so skip over '..' */ 272*0bcc8e5bSMarkus Armbruster separator = NULL; 273*0bcc8e5bSMarkus Armbruster do { 274*0bcc8e5bSMarkus Armbruster if (separator) { 275*0bcc8e5bSMarkus Armbruster separator += 2; 276*0bcc8e5bSMarkus Armbruster } else { 277*0bcc8e5bSMarkus Armbruster separator = key; 278*0bcc8e5bSMarkus Armbruster } 279*0bcc8e5bSMarkus Armbruster separator = strchr(separator, '.'); 280*0bcc8e5bSMarkus Armbruster } while (separator && separator[1] == '.'); 281*0bcc8e5bSMarkus Armbruster 282*0bcc8e5bSMarkus Armbruster if (separator) { 283*0bcc8e5bSMarkus Armbruster *prefix = g_strndup(key, separator - key); 284*0bcc8e5bSMarkus Armbruster *suffix = separator + 1; 285*0bcc8e5bSMarkus Armbruster } else { 286*0bcc8e5bSMarkus Armbruster *prefix = g_strdup(key); 287*0bcc8e5bSMarkus Armbruster *suffix = NULL; 288*0bcc8e5bSMarkus Armbruster } 289*0bcc8e5bSMarkus Armbruster 290*0bcc8e5bSMarkus Armbruster /* Unescape the '..' sequence into '.' */ 291*0bcc8e5bSMarkus Armbruster for (i = 0, j = 0; (*prefix)[i] != '\0'; i++, j++) { 292*0bcc8e5bSMarkus Armbruster if ((*prefix)[i] == '.') { 293*0bcc8e5bSMarkus Armbruster assert((*prefix)[i + 1] == '.'); 294*0bcc8e5bSMarkus Armbruster i++; 295*0bcc8e5bSMarkus Armbruster } 296*0bcc8e5bSMarkus Armbruster (*prefix)[j] = (*prefix)[i]; 297*0bcc8e5bSMarkus Armbruster } 298*0bcc8e5bSMarkus Armbruster (*prefix)[j] = '\0'; 299*0bcc8e5bSMarkus Armbruster } 300*0bcc8e5bSMarkus Armbruster 301*0bcc8e5bSMarkus Armbruster /** 302*0bcc8e5bSMarkus Armbruster * qdict_is_list: 303*0bcc8e5bSMarkus Armbruster * @maybe_list: dict to check if keys represent list elements. 304*0bcc8e5bSMarkus Armbruster * 305*0bcc8e5bSMarkus Armbruster * Determine whether all keys in @maybe_list are valid list elements. 306*0bcc8e5bSMarkus Armbruster * If @maybe_list is non-zero in length and all the keys look like 307*0bcc8e5bSMarkus Armbruster * valid list indexes, this will return 1. If @maybe_list is zero 308*0bcc8e5bSMarkus Armbruster * length or all keys are non-numeric then it will return 0 to indicate 309*0bcc8e5bSMarkus Armbruster * it is a normal qdict. If there is a mix of numeric and non-numeric 310*0bcc8e5bSMarkus Armbruster * keys, or the list indexes are non-contiguous, an error is reported. 311*0bcc8e5bSMarkus Armbruster * 312*0bcc8e5bSMarkus Armbruster * Returns: 1 if a valid list, 0 if a dict, -1 on error 313*0bcc8e5bSMarkus Armbruster */ 314*0bcc8e5bSMarkus Armbruster static int qdict_is_list(QDict *maybe_list, Error **errp) 315*0bcc8e5bSMarkus Armbruster { 316*0bcc8e5bSMarkus Armbruster const QDictEntry *ent; 317*0bcc8e5bSMarkus Armbruster ssize_t len = 0; 318*0bcc8e5bSMarkus Armbruster ssize_t max = -1; 319*0bcc8e5bSMarkus Armbruster int is_list = -1; 320*0bcc8e5bSMarkus Armbruster int64_t val; 321*0bcc8e5bSMarkus Armbruster 322*0bcc8e5bSMarkus Armbruster for (ent = qdict_first(maybe_list); ent != NULL; 323*0bcc8e5bSMarkus Armbruster ent = qdict_next(maybe_list, ent)) { 324*0bcc8e5bSMarkus Armbruster 325*0bcc8e5bSMarkus Armbruster if (qemu_strtoi64(ent->key, NULL, 10, &val) == 0) { 326*0bcc8e5bSMarkus Armbruster if (is_list == -1) { 327*0bcc8e5bSMarkus Armbruster is_list = 1; 328*0bcc8e5bSMarkus Armbruster } else if (!is_list) { 329*0bcc8e5bSMarkus Armbruster error_setg(errp, 330*0bcc8e5bSMarkus Armbruster "Cannot mix list and non-list keys"); 331*0bcc8e5bSMarkus Armbruster return -1; 332*0bcc8e5bSMarkus Armbruster } 333*0bcc8e5bSMarkus Armbruster len++; 334*0bcc8e5bSMarkus Armbruster if (val > max) { 335*0bcc8e5bSMarkus Armbruster max = val; 336*0bcc8e5bSMarkus Armbruster } 337*0bcc8e5bSMarkus Armbruster } else { 338*0bcc8e5bSMarkus Armbruster if (is_list == -1) { 339*0bcc8e5bSMarkus Armbruster is_list = 0; 340*0bcc8e5bSMarkus Armbruster } else if (is_list) { 341*0bcc8e5bSMarkus Armbruster error_setg(errp, 342*0bcc8e5bSMarkus Armbruster "Cannot mix list and non-list keys"); 343*0bcc8e5bSMarkus Armbruster return -1; 344*0bcc8e5bSMarkus Armbruster } 345*0bcc8e5bSMarkus Armbruster } 346*0bcc8e5bSMarkus Armbruster } 347*0bcc8e5bSMarkus Armbruster 348*0bcc8e5bSMarkus Armbruster if (is_list == -1) { 349*0bcc8e5bSMarkus Armbruster assert(!qdict_size(maybe_list)); 350*0bcc8e5bSMarkus Armbruster is_list = 0; 351*0bcc8e5bSMarkus Armbruster } 352*0bcc8e5bSMarkus Armbruster 353*0bcc8e5bSMarkus Armbruster /* NB this isn't a perfect check - e.g. it won't catch 354*0bcc8e5bSMarkus Armbruster * a list containing '1', '+1', '01', '3', but that 355*0bcc8e5bSMarkus Armbruster * does not matter - we've still proved that the 356*0bcc8e5bSMarkus Armbruster * input is a list. It is up the caller to do a 357*0bcc8e5bSMarkus Armbruster * stricter check if desired */ 358*0bcc8e5bSMarkus Armbruster if (len != (max + 1)) { 359*0bcc8e5bSMarkus Armbruster error_setg(errp, "List indices are not contiguous, " 360*0bcc8e5bSMarkus Armbruster "saw %zd elements but %zd largest index", 361*0bcc8e5bSMarkus Armbruster len, max); 362*0bcc8e5bSMarkus Armbruster return -1; 363*0bcc8e5bSMarkus Armbruster } 364*0bcc8e5bSMarkus Armbruster 365*0bcc8e5bSMarkus Armbruster return is_list; 366*0bcc8e5bSMarkus Armbruster } 367*0bcc8e5bSMarkus Armbruster 368*0bcc8e5bSMarkus Armbruster /** 369*0bcc8e5bSMarkus Armbruster * qdict_crumple: 370*0bcc8e5bSMarkus Armbruster * @src: the original flat dictionary (only scalar values) to crumple 371*0bcc8e5bSMarkus Armbruster * 372*0bcc8e5bSMarkus Armbruster * Takes a flat dictionary whose keys use '.' separator to indicate 373*0bcc8e5bSMarkus Armbruster * nesting, and values are scalars, and crumples it into a nested 374*0bcc8e5bSMarkus Armbruster * structure. 375*0bcc8e5bSMarkus Armbruster * 376*0bcc8e5bSMarkus Armbruster * To include a literal '.' in a key name, it must be escaped as '..' 377*0bcc8e5bSMarkus Armbruster * 378*0bcc8e5bSMarkus Armbruster * For example, an input of: 379*0bcc8e5bSMarkus Armbruster * 380*0bcc8e5bSMarkus Armbruster * { 'foo.0.bar': 'one', 'foo.0.wizz': '1', 381*0bcc8e5bSMarkus Armbruster * 'foo.1.bar': 'two', 'foo.1.wizz': '2' } 382*0bcc8e5bSMarkus Armbruster * 383*0bcc8e5bSMarkus Armbruster * will result in an output of: 384*0bcc8e5bSMarkus Armbruster * 385*0bcc8e5bSMarkus Armbruster * { 386*0bcc8e5bSMarkus Armbruster * 'foo': [ 387*0bcc8e5bSMarkus Armbruster * { 'bar': 'one', 'wizz': '1' }, 388*0bcc8e5bSMarkus Armbruster * { 'bar': 'two', 'wizz': '2' } 389*0bcc8e5bSMarkus Armbruster * ], 390*0bcc8e5bSMarkus Armbruster * } 391*0bcc8e5bSMarkus Armbruster * 392*0bcc8e5bSMarkus Armbruster * The following scenarios in the input dict will result in an 393*0bcc8e5bSMarkus Armbruster * error being returned: 394*0bcc8e5bSMarkus Armbruster * 395*0bcc8e5bSMarkus Armbruster * - Any values in @src are non-scalar types 396*0bcc8e5bSMarkus Armbruster * - If keys in @src imply that a particular level is both a 397*0bcc8e5bSMarkus Armbruster * list and a dict. e.g., "foo.0.bar" and "foo.eek.bar". 398*0bcc8e5bSMarkus Armbruster * - If keys in @src imply that a particular level is a list, 399*0bcc8e5bSMarkus Armbruster * but the indices are non-contiguous. e.g. "foo.0.bar" and 400*0bcc8e5bSMarkus Armbruster * "foo.2.bar" without any "foo.1.bar" present. 401*0bcc8e5bSMarkus Armbruster * - If keys in @src represent list indexes, but are not in 402*0bcc8e5bSMarkus Armbruster * the "%zu" format. e.g. "foo.+0.bar" 403*0bcc8e5bSMarkus Armbruster * 404*0bcc8e5bSMarkus Armbruster * Returns: either a QDict or QList for the nested data structure, or NULL 405*0bcc8e5bSMarkus Armbruster * on error 406*0bcc8e5bSMarkus Armbruster */ 407*0bcc8e5bSMarkus Armbruster QObject *qdict_crumple(const QDict *src, Error **errp) 408*0bcc8e5bSMarkus Armbruster { 409*0bcc8e5bSMarkus Armbruster const QDictEntry *ent; 410*0bcc8e5bSMarkus Armbruster QDict *two_level, *multi_level = NULL; 411*0bcc8e5bSMarkus Armbruster QObject *dst = NULL, *child; 412*0bcc8e5bSMarkus Armbruster size_t i; 413*0bcc8e5bSMarkus Armbruster char *prefix = NULL; 414*0bcc8e5bSMarkus Armbruster const char *suffix = NULL; 415*0bcc8e5bSMarkus Armbruster int is_list; 416*0bcc8e5bSMarkus Armbruster 417*0bcc8e5bSMarkus Armbruster two_level = qdict_new(); 418*0bcc8e5bSMarkus Armbruster 419*0bcc8e5bSMarkus Armbruster /* Step 1: split our totally flat dict into a two level dict */ 420*0bcc8e5bSMarkus Armbruster for (ent = qdict_first(src); ent != NULL; ent = qdict_next(src, ent)) { 421*0bcc8e5bSMarkus Armbruster if (qobject_type(ent->value) == QTYPE_QDICT || 422*0bcc8e5bSMarkus Armbruster qobject_type(ent->value) == QTYPE_QLIST) { 423*0bcc8e5bSMarkus Armbruster error_setg(errp, "Value %s is not a scalar", 424*0bcc8e5bSMarkus Armbruster ent->key); 425*0bcc8e5bSMarkus Armbruster goto error; 426*0bcc8e5bSMarkus Armbruster } 427*0bcc8e5bSMarkus Armbruster 428*0bcc8e5bSMarkus Armbruster qdict_split_flat_key(ent->key, &prefix, &suffix); 429*0bcc8e5bSMarkus Armbruster 430*0bcc8e5bSMarkus Armbruster child = qdict_get(two_level, prefix); 431*0bcc8e5bSMarkus Armbruster if (suffix) { 432*0bcc8e5bSMarkus Armbruster QDict *child_dict = qobject_to(QDict, child); 433*0bcc8e5bSMarkus Armbruster if (!child_dict) { 434*0bcc8e5bSMarkus Armbruster if (child) { 435*0bcc8e5bSMarkus Armbruster error_setg(errp, "Key %s prefix is already set as a scalar", 436*0bcc8e5bSMarkus Armbruster prefix); 437*0bcc8e5bSMarkus Armbruster goto error; 438*0bcc8e5bSMarkus Armbruster } 439*0bcc8e5bSMarkus Armbruster 440*0bcc8e5bSMarkus Armbruster child_dict = qdict_new(); 441*0bcc8e5bSMarkus Armbruster qdict_put_obj(two_level, prefix, QOBJECT(child_dict)); 442*0bcc8e5bSMarkus Armbruster } 443*0bcc8e5bSMarkus Armbruster 444*0bcc8e5bSMarkus Armbruster qdict_put_obj(child_dict, suffix, qobject_ref(ent->value)); 445*0bcc8e5bSMarkus Armbruster } else { 446*0bcc8e5bSMarkus Armbruster if (child) { 447*0bcc8e5bSMarkus Armbruster error_setg(errp, "Key %s prefix is already set as a dict", 448*0bcc8e5bSMarkus Armbruster prefix); 449*0bcc8e5bSMarkus Armbruster goto error; 450*0bcc8e5bSMarkus Armbruster } 451*0bcc8e5bSMarkus Armbruster qdict_put_obj(two_level, prefix, qobject_ref(ent->value)); 452*0bcc8e5bSMarkus Armbruster } 453*0bcc8e5bSMarkus Armbruster 454*0bcc8e5bSMarkus Armbruster g_free(prefix); 455*0bcc8e5bSMarkus Armbruster prefix = NULL; 456*0bcc8e5bSMarkus Armbruster } 457*0bcc8e5bSMarkus Armbruster 458*0bcc8e5bSMarkus Armbruster /* Step 2: optionally process the two level dict recursively 459*0bcc8e5bSMarkus Armbruster * into a multi-level dict */ 460*0bcc8e5bSMarkus Armbruster multi_level = qdict_new(); 461*0bcc8e5bSMarkus Armbruster for (ent = qdict_first(two_level); ent != NULL; 462*0bcc8e5bSMarkus Armbruster ent = qdict_next(two_level, ent)) { 463*0bcc8e5bSMarkus Armbruster QDict *dict = qobject_to(QDict, ent->value); 464*0bcc8e5bSMarkus Armbruster if (dict) { 465*0bcc8e5bSMarkus Armbruster child = qdict_crumple(dict, errp); 466*0bcc8e5bSMarkus Armbruster if (!child) { 467*0bcc8e5bSMarkus Armbruster goto error; 468*0bcc8e5bSMarkus Armbruster } 469*0bcc8e5bSMarkus Armbruster 470*0bcc8e5bSMarkus Armbruster qdict_put_obj(multi_level, ent->key, child); 471*0bcc8e5bSMarkus Armbruster } else { 472*0bcc8e5bSMarkus Armbruster qdict_put_obj(multi_level, ent->key, qobject_ref(ent->value)); 473*0bcc8e5bSMarkus Armbruster } 474*0bcc8e5bSMarkus Armbruster } 475*0bcc8e5bSMarkus Armbruster qobject_unref(two_level); 476*0bcc8e5bSMarkus Armbruster two_level = NULL; 477*0bcc8e5bSMarkus Armbruster 478*0bcc8e5bSMarkus Armbruster /* Step 3: detect if we need to turn our dict into list */ 479*0bcc8e5bSMarkus Armbruster is_list = qdict_is_list(multi_level, errp); 480*0bcc8e5bSMarkus Armbruster if (is_list < 0) { 481*0bcc8e5bSMarkus Armbruster goto error; 482*0bcc8e5bSMarkus Armbruster } 483*0bcc8e5bSMarkus Armbruster 484*0bcc8e5bSMarkus Armbruster if (is_list) { 485*0bcc8e5bSMarkus Armbruster dst = QOBJECT(qlist_new()); 486*0bcc8e5bSMarkus Armbruster 487*0bcc8e5bSMarkus Armbruster for (i = 0; i < qdict_size(multi_level); i++) { 488*0bcc8e5bSMarkus Armbruster char *key = g_strdup_printf("%zu", i); 489*0bcc8e5bSMarkus Armbruster 490*0bcc8e5bSMarkus Armbruster child = qdict_get(multi_level, key); 491*0bcc8e5bSMarkus Armbruster g_free(key); 492*0bcc8e5bSMarkus Armbruster 493*0bcc8e5bSMarkus Armbruster if (!child) { 494*0bcc8e5bSMarkus Armbruster error_setg(errp, "Missing list index %zu", i); 495*0bcc8e5bSMarkus Armbruster goto error; 496*0bcc8e5bSMarkus Armbruster } 497*0bcc8e5bSMarkus Armbruster 498*0bcc8e5bSMarkus Armbruster qlist_append_obj(qobject_to(QList, dst), qobject_ref(child)); 499*0bcc8e5bSMarkus Armbruster } 500*0bcc8e5bSMarkus Armbruster qobject_unref(multi_level); 501*0bcc8e5bSMarkus Armbruster multi_level = NULL; 502*0bcc8e5bSMarkus Armbruster } else { 503*0bcc8e5bSMarkus Armbruster dst = QOBJECT(multi_level); 504*0bcc8e5bSMarkus Armbruster } 505*0bcc8e5bSMarkus Armbruster 506*0bcc8e5bSMarkus Armbruster return dst; 507*0bcc8e5bSMarkus Armbruster 508*0bcc8e5bSMarkus Armbruster error: 509*0bcc8e5bSMarkus Armbruster g_free(prefix); 510*0bcc8e5bSMarkus Armbruster qobject_unref(multi_level); 511*0bcc8e5bSMarkus Armbruster qobject_unref(two_level); 512*0bcc8e5bSMarkus Armbruster qobject_unref(dst); 513*0bcc8e5bSMarkus Armbruster return NULL; 514*0bcc8e5bSMarkus Armbruster } 515*0bcc8e5bSMarkus Armbruster 516*0bcc8e5bSMarkus Armbruster /** 517*0bcc8e5bSMarkus Armbruster * qdict_array_entries(): Returns the number of direct array entries if the 518*0bcc8e5bSMarkus Armbruster * sub-QDict of src specified by the prefix in subqdict (or src itself for 519*0bcc8e5bSMarkus Armbruster * prefix == "") is valid as an array, i.e. the length of the created list if 520*0bcc8e5bSMarkus Armbruster * the sub-QDict would become empty after calling qdict_array_split() on it. If 521*0bcc8e5bSMarkus Armbruster * the array is not valid, -EINVAL is returned. 522*0bcc8e5bSMarkus Armbruster */ 523*0bcc8e5bSMarkus Armbruster int qdict_array_entries(QDict *src, const char *subqdict) 524*0bcc8e5bSMarkus Armbruster { 525*0bcc8e5bSMarkus Armbruster const QDictEntry *entry; 526*0bcc8e5bSMarkus Armbruster unsigned i; 527*0bcc8e5bSMarkus Armbruster unsigned entries = 0; 528*0bcc8e5bSMarkus Armbruster size_t subqdict_len = strlen(subqdict); 529*0bcc8e5bSMarkus Armbruster 530*0bcc8e5bSMarkus Armbruster assert(!subqdict_len || subqdict[subqdict_len - 1] == '.'); 531*0bcc8e5bSMarkus Armbruster 532*0bcc8e5bSMarkus Armbruster /* qdict_array_split() loops until UINT_MAX, but as we want to return 533*0bcc8e5bSMarkus Armbruster * negative errors, we only have a signed return value here. Any additional 534*0bcc8e5bSMarkus Armbruster * entries will lead to -EINVAL. */ 535*0bcc8e5bSMarkus Armbruster for (i = 0; i < INT_MAX; i++) { 536*0bcc8e5bSMarkus Armbruster QObject *subqobj; 537*0bcc8e5bSMarkus Armbruster int subqdict_entries; 538*0bcc8e5bSMarkus Armbruster char *prefix = g_strdup_printf("%s%u.", subqdict, i); 539*0bcc8e5bSMarkus Armbruster 540*0bcc8e5bSMarkus Armbruster subqdict_entries = qdict_count_prefixed_entries(src, prefix); 541*0bcc8e5bSMarkus Armbruster 542*0bcc8e5bSMarkus Armbruster /* Remove ending "." */ 543*0bcc8e5bSMarkus Armbruster prefix[strlen(prefix) - 1] = 0; 544*0bcc8e5bSMarkus Armbruster subqobj = qdict_get(src, prefix); 545*0bcc8e5bSMarkus Armbruster 546*0bcc8e5bSMarkus Armbruster g_free(prefix); 547*0bcc8e5bSMarkus Armbruster 548*0bcc8e5bSMarkus Armbruster if (subqdict_entries < 0) { 549*0bcc8e5bSMarkus Armbruster return subqdict_entries; 550*0bcc8e5bSMarkus Armbruster } 551*0bcc8e5bSMarkus Armbruster 552*0bcc8e5bSMarkus Armbruster /* There may be either a single subordinate object (named "%u") or 553*0bcc8e5bSMarkus Armbruster * multiple objects (each with a key prefixed "%u."), but not both. */ 554*0bcc8e5bSMarkus Armbruster if (subqobj && subqdict_entries) { 555*0bcc8e5bSMarkus Armbruster return -EINVAL; 556*0bcc8e5bSMarkus Armbruster } else if (!subqobj && !subqdict_entries) { 557*0bcc8e5bSMarkus Armbruster break; 558*0bcc8e5bSMarkus Armbruster } 559*0bcc8e5bSMarkus Armbruster 560*0bcc8e5bSMarkus Armbruster entries += subqdict_entries ? subqdict_entries : 1; 561*0bcc8e5bSMarkus Armbruster } 562*0bcc8e5bSMarkus Armbruster 563*0bcc8e5bSMarkus Armbruster /* Consider everything handled that isn't part of the given sub-QDict */ 564*0bcc8e5bSMarkus Armbruster for (entry = qdict_first(src); entry; entry = qdict_next(src, entry)) { 565*0bcc8e5bSMarkus Armbruster if (!strstart(qdict_entry_key(entry), subqdict, NULL)) { 566*0bcc8e5bSMarkus Armbruster entries++; 567*0bcc8e5bSMarkus Armbruster } 568*0bcc8e5bSMarkus Armbruster } 569*0bcc8e5bSMarkus Armbruster 570*0bcc8e5bSMarkus Armbruster /* Anything left in the sub-QDict that wasn't handled? */ 571*0bcc8e5bSMarkus Armbruster if (qdict_size(src) != entries) { 572*0bcc8e5bSMarkus Armbruster return -EINVAL; 573*0bcc8e5bSMarkus Armbruster } 574*0bcc8e5bSMarkus Armbruster 575*0bcc8e5bSMarkus Armbruster return i; 576*0bcc8e5bSMarkus Armbruster } 577*0bcc8e5bSMarkus Armbruster 578*0bcc8e5bSMarkus Armbruster /** 579*0bcc8e5bSMarkus Armbruster * qdict_join(): Absorb the src QDict into the dest QDict, that is, move all 580*0bcc8e5bSMarkus Armbruster * elements from src to dest. 581*0bcc8e5bSMarkus Armbruster * 582*0bcc8e5bSMarkus Armbruster * If an element from src has a key already present in dest, it will not be 583*0bcc8e5bSMarkus Armbruster * moved unless overwrite is true. 584*0bcc8e5bSMarkus Armbruster * 585*0bcc8e5bSMarkus Armbruster * If overwrite is true, the conflicting values in dest will be discarded and 586*0bcc8e5bSMarkus Armbruster * replaced by the corresponding values from src. 587*0bcc8e5bSMarkus Armbruster * 588*0bcc8e5bSMarkus Armbruster * Therefore, with overwrite being true, the src QDict will always be empty when 589*0bcc8e5bSMarkus Armbruster * this function returns. If overwrite is false, the src QDict will be empty 590*0bcc8e5bSMarkus Armbruster * iff there were no conflicts. 591*0bcc8e5bSMarkus Armbruster */ 592*0bcc8e5bSMarkus Armbruster void qdict_join(QDict *dest, QDict *src, bool overwrite) 593*0bcc8e5bSMarkus Armbruster { 594*0bcc8e5bSMarkus Armbruster const QDictEntry *entry, *next; 595*0bcc8e5bSMarkus Armbruster 596*0bcc8e5bSMarkus Armbruster entry = qdict_first(src); 597*0bcc8e5bSMarkus Armbruster while (entry) { 598*0bcc8e5bSMarkus Armbruster next = qdict_next(src, entry); 599*0bcc8e5bSMarkus Armbruster 600*0bcc8e5bSMarkus Armbruster if (overwrite || !qdict_haskey(dest, entry->key)) { 601*0bcc8e5bSMarkus Armbruster qdict_put_obj(dest, entry->key, qobject_ref(entry->value)); 602*0bcc8e5bSMarkus Armbruster qdict_del(src, entry->key); 603*0bcc8e5bSMarkus Armbruster } 604*0bcc8e5bSMarkus Armbruster 605*0bcc8e5bSMarkus Armbruster entry = next; 606*0bcc8e5bSMarkus Armbruster } 607*0bcc8e5bSMarkus Armbruster } 608*0bcc8e5bSMarkus Armbruster 609*0bcc8e5bSMarkus Armbruster /** 610*0bcc8e5bSMarkus Armbruster * qdict_rename_keys(): Rename keys in qdict according to the replacements 611*0bcc8e5bSMarkus Armbruster * specified in the array renames. The array must be terminated by an entry 612*0bcc8e5bSMarkus Armbruster * with from = NULL. 613*0bcc8e5bSMarkus Armbruster * 614*0bcc8e5bSMarkus Armbruster * The renames are performed individually in the order of the array, so entries 615*0bcc8e5bSMarkus Armbruster * may be renamed multiple times and may or may not conflict depending on the 616*0bcc8e5bSMarkus Armbruster * order of the renames array. 617*0bcc8e5bSMarkus Armbruster * 618*0bcc8e5bSMarkus Armbruster * Returns true for success, false in error cases. 619*0bcc8e5bSMarkus Armbruster */ 620*0bcc8e5bSMarkus Armbruster bool qdict_rename_keys(QDict *qdict, const QDictRenames *renames, Error **errp) 621*0bcc8e5bSMarkus Armbruster { 622*0bcc8e5bSMarkus Armbruster QObject *qobj; 623*0bcc8e5bSMarkus Armbruster 624*0bcc8e5bSMarkus Armbruster while (renames->from) { 625*0bcc8e5bSMarkus Armbruster if (qdict_haskey(qdict, renames->from)) { 626*0bcc8e5bSMarkus Armbruster if (qdict_haskey(qdict, renames->to)) { 627*0bcc8e5bSMarkus Armbruster error_setg(errp, "'%s' and its alias '%s' can't be used at the " 628*0bcc8e5bSMarkus Armbruster "same time", renames->to, renames->from); 629*0bcc8e5bSMarkus Armbruster return false; 630*0bcc8e5bSMarkus Armbruster } 631*0bcc8e5bSMarkus Armbruster 632*0bcc8e5bSMarkus Armbruster qobj = qdict_get(qdict, renames->from); 633*0bcc8e5bSMarkus Armbruster qdict_put_obj(qdict, renames->to, qobject_ref(qobj)); 634*0bcc8e5bSMarkus Armbruster qdict_del(qdict, renames->from); 635*0bcc8e5bSMarkus Armbruster } 636*0bcc8e5bSMarkus Armbruster 637*0bcc8e5bSMarkus Armbruster renames++; 638*0bcc8e5bSMarkus Armbruster } 639*0bcc8e5bSMarkus Armbruster return true; 640*0bcc8e5bSMarkus Armbruster } 641