static PyObject *
vserver_set_rlimit(PyObject *self, PyObject *args) {
struct vc_rlimit limits;
- struct rlimit lim;
+ struct vc_rlimit_mask mask;
+ uint32_t bitmask;
xid_t xid;
- int resource, lresource;
+ int resource;
PyObject *ret;
limits.min = VC_LIM_KEEP;
if (!PyArg_ParseTuple(args, "IiLLL", &xid, &resource, &limits.hard, &limits.soft, &limits.min))
return NULL;
- lresource = resource;
- switch (resource) {
- case VC_VLIMIT_NSOCK:
- case VC_VLIMIT_ANON:
- case VC_VLIMIT_SHMEM:
- goto do_vc_set_rlimit;
- case VC_VLIMIT_OPENFD:
- lresource = RLIMIT_NOFILE;
- break;
- default:
- break;
- }
-
- getrlimit(lresource,&lim);
- if (adjust_lim(&limits,&lim)) {
- setrlimit(lresource, &lim);
- }
-
- do_vc_set_rlimit:
errno = 0;
- if (vc_set_rlimit(xid, resource, &limits)==-1)
+
+ if (vc_get_rlimit_mask(xid, &mask)==-1) {
ret = PyErr_SetFromErrno(PyExc_OSError);
- else
- ret = __vserver_get_rlimit(xid, resource);
+ } else {
+ bitmask = (1<<resource);
+ if ((mask.min|mask.soft|mask.hard) & bitmask)
+ if (vc_set_rlimit(xid, resource, &limits)==-1)
+ ret = PyErr_SetFromErrno(PyExc_OSError);
+ else
+ ret = __vserver_get_rlimit(xid, resource);
+ }
return ret;
}