On Wed, Aug 21, 2019 at 08:19:31AM +0000, Pawel Wieczorkiewicz wrote: > Extend the XC python bindings library to support also all common > livepatch operations and actions. > > Add the python bindings for the following operations: > - status (pyxc_livepatch_status): > Requires a payload name as an input. > Returns a status dict containing a state string and a return code > integer. > - action (pyxc_livepatch_action): > Requires a payload name and an action id as an input. Timeout and > flags are optional parameters. > Returns a return code integer. > - upload (pyxc_livepatch_upload): > Requires a payload name and a module's filename as an input. > Returns a return code integer. > - list (pyxc_livepatch_list): > Takes no parameters. > Returns a list of dicts containing each payload's: > * name as a string > * state as a string > * return code as an integer > * list of metadata key=value strings > > Each functions throws an exception error based on the errno value > received from its corresponding libxc function call. > > Signed-off-by: Pawel Wieczorkiewicz > Reviewed-by: Martin Mazein > Reviewed-by: Andra-Irina Paraschiv > Reviewed-by: Leonard Foerster > Reviewed-by: Norbert Manthey > --- > tools/python/xen/lowlevel/xc/xc.c | 273 ++++++++++++++++++++++++++++++++++++++ > 1 file changed, 273 insertions(+) > > diff --git a/tools/python/xen/lowlevel/xc/xc.c b/tools/python/xen/lowlevel/xc/xc.c > index 7f0358ba9c..368739b996 100644 > --- a/tools/python/xen/lowlevel/xc/xc.c > +++ b/tools/python/xen/lowlevel/xc/xc.c (...) > +static PyObject *pyxc_livepatch_list(XcObject *self) > +{ > + PyObject *list; > + unsigned int nr, done, left, i; > + xen_livepatch_status_t *info = NULL; > + char *name = NULL; > + char *metadata = NULL; > + uint32_t *len = NULL; > + uint32_t *metadata_len = NULL; > + uint64_t name_total_size, metadata_total_size; > + off_t name_off, metadata_off; > + int rc; > + > + rc = xc_livepatch_list_get_sizes(self->xc_handle, &nr, > + &name_total_size, &metadata_total_size); > + if ( rc ) > + goto error; > + > + if ( nr == 0 ) > + return PyList_New(0); > + > + rc = ENOMEM; > + info = malloc(nr * sizeof(*info)); > + if ( !info ) > + goto error; > + > + name = malloc(name_total_size * sizeof(*name)); > + if ( !name ) > + goto error; > + > + len = malloc(nr * sizeof(*len)); > + if ( !len ) > + goto error; > + > + metadata = malloc(metadata_total_size * sizeof(*metadata)); > + if ( !metadata ) > + goto error; > + > + metadata_len = malloc(nr * sizeof(*metadata_len)); > + if ( !metadata_len ) > + goto error; > + > + rc = xc_livepatch_list(self->xc_handle, nr, 0, info, > + name, len, name_total_size, > + metadata, metadata_len, metadata_total_size, > + &done, &left); > + if ( rc ) > + goto error; > + > + list = PyList_New(0); Previous remark stays: Better use PyList_New(done) and later PyList_SetItem() instead of PyList_Append(). > + name_off = metadata_off = 0; > + for ( i = 0; i < done; i++ ) > + { > + PyObject *info_dict, *metadata_list; > + char *name_str, *metadata_str; > + > + name_str = name + name_off; > + metadata_str = metadata + metadata_off; > + > + metadata_list = PyList_New(0); > + for ( char *s = metadata_str; s < metadata_str + metadata_len[i]; s += strlen(s) + 1 ) > + { > + PyObject *field = Py_BuildValue("s", s); > + if ( field == NULL ) > + { > + Py_DECREF(list); > + Py_DECREF(metadata_list); > + rc = EFAULT; > + goto error; > + } > + > + PyList_Append(metadata_list, field); > + Py_DECREF(field); > + } > + > + info_dict = Py_BuildValue( > + "{s:s,s:i,s:i,s:N}", > + "name", name_str, > + "state", info[i].state, > + "rc", info[i].rc, > + "metadata", metadata_list); > + > + if ( info_dict == NULL ) > + { > + Py_DECREF(list); > + Py_DECREF(metadata_list); > + rc = EFAULT; > + goto error; > + } > + PyList_Append(list, info_dict); > + Py_DECREF(info_dict); > + > + name_off += len[i]; > + metadata_off += metadata_len[i]; > + } > + > +error: > + free(info); > + free(name); > + free(len); > + free(metadata); > + free(metadata_len); > + return rc ? pyxc_error_to_exception(self->xc_handle) : list; > +} > + > static PyMethodDef pyxc_methods[] = { > { "domain_create", > (PyCFunction)pyxc_domain_create, -- Best Regards, Marek Marczykowski-Górecki Invisible Things Lab A: Because it messes up the order in which people normally read text. Q: Why is top-posting such a bad thing?