#define NONE inc_and_ret_none()
+#define PL_INSECURE_BCAPS (vc_get_insecurebcaps() | (1 << VC_CAP_NET_BIND_SERVICE))
+
/*
* context create
*/
if (!PyArg_ParseTuple(args, "I|K", &ctx, &bcaps))
return NULL;
- bcaps |= ~(vc_get_insecurebcaps() | (1 << VC_CAP_NET_BIND_SERVICE));
+ bcaps |= ~PL_INSECURE_BCAPS;
if ((ctx_is_new = pl_chcontext(ctx, bcaps, 0)) < 0)
return PyErr_SetFromErrno(PyExc_OSError);
if (!PyArg_ParseTuple(args, "IK", &ctx, &caps.bcaps))
return NULL;
- caps.bmask = vc_get_insecurebcaps();
+ caps.bmask = PL_INSECURE_BCAPS;
caps.cmask = caps.ccaps = 0;
if (vc_set_ccaps(ctx, &caps) == -1 && errno != ESRCH)
return PyErr_SetFromErrno(PyExc_OSError);
caps.bcaps = 0;
}
- return Py_BuildValue("K", caps.bcaps & vc_get_insecurebcaps());
+ return Py_BuildValue("K", caps.bcaps & PL_INSECURE_BCAPS);
}
static PyObject *
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);
if (secure_chdir(&dirs, guest, target) == -1)
goto out;
- if (mount(source, ".", type, flags, data) == -1)
+ if (mount(source, ".", type, flags, data) == -1 && errno != EBUSY)
goto out;
restore_dirs(&dirs);