static PyObject *
vserver_net_add(PyObject *self, PyObject *args)
{
- struct vc_net_addr addr;
+ struct vc_net_addr addr = { .vna_type = 0 };
nid_t nid;
const char *ip;
if (!PyArg_ParseTuple(args, "Is", &nid, &ip))
return NULL;
- if (convert_address(ip, &addr) == -1)
- return PyErr_Format(PyExc_ValueError, "%s is not a valid IP address", ip);
+ /* Optimize standard case, which also needs to be handled differently */
+ if (strcmp(ip, "0.0.0.0") == 0) {
+ addr.vna_type = VC_NXA_TYPE_MASK | VC_NXA_TYPE_IPV4;
+ addr.vna_flags = 0;
+ addr.vna_prefix = 0;
+ addr.vna_parent = 0;
+ addr.vna_v4_mask.s_addr = 0;
+ addr.vna_v4_ip.s_addr = 0;
+ }
+ else {
+ if (convert_address(ip, &addr) == -1)
+ return PyErr_Format(PyExc_ValueError, "%s is not a valid IP address", ip);
- switch (get_mask(&addr)) {
- case -1:
- return PyErr_SetFromErrno(PyExc_OSError);
- case 0:
- /* XXX error here? */
- break;
+ switch (get_mask(&addr)) {
+ case -1:
+ return PyErr_SetFromErrno(PyExc_OSError);
+ case 0:
+ /* XXX error here? */
+ break;
+ }
+ addr.vna_type |= VC_NXA_TYPE_ADDR;
}
- addr.vna_type |= VC_NXA_TYPE_ADDR;
if (vc_net_add(nid, &addr) == -1 && errno != ESRCH)
return PyErr_SetFromErrno(PyExc_OSError);