* Resolved {g,s}etrlimit() TODO's, i.e. moved the implementation into

separate functions and made the set errno correctly.
* Added RLIMIT_CORE case. We don't support core dumps, but setting them
  to disabled shouldn't fail anyway.


git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@25141 a95241bf-73f2-0310-859d-f6bbb57e9c96
This commit is contained in:
Ingo Weinhold
2008-04-25 01:08:07 +00:00
parent d11e733fee
commit 210199c5a7
+72 -36
View File
@@ -11,6 +11,7 @@
#include <thread.h>
#include <errno.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
@@ -835,6 +836,65 @@ receive_data_etc(thread_id *_sender, void *buffer, size_t bufferSize,
}
static status_t
common_getrlimit(int resource, struct rlimit * rlp)
{
if (!rlp)
return B_BAD_ADDRESS;
switch (resource) {
case RLIMIT_NOFILE:
case RLIMIT_NOVMON:
return vfs_getrlimit(resource, rlp);
case RLIMIT_CORE:
rlp->rlim_cur = 0;
rlp->rlim_max = 0;
return B_OK;
case RLIMIT_STACK:
{
struct thread *thread = thread_get_current_thread();
if (!thread)
return B_ERROR;
rlp->rlim_cur = thread->user_stack_size;
rlp->rlim_max = thread->user_stack_size;
return B_OK;
}
default:
return EINVAL;
}
return B_OK;
}
static status_t
common_setrlimit(int resource, const struct rlimit * rlp)
{
if (!rlp)
return B_BAD_ADDRESS;
switch (resource) {
case RLIMIT_NOFILE:
case RLIMIT_NOVMON:
return vfs_setrlimit(resource, rlp);
case RLIMIT_CORE:
// We don't support core file, so allow settings to 0/0 only.
if (rlp->rlim_cur != 0 || rlp->rlim_max != 0)
return EINVAL;
return B_OK;
default:
return EINVAL;
}
return B_OK;
}
// #pragma mark - debugger calls
@@ -2483,53 +2543,29 @@ spawn_kernel_thread(thread_func function, const char *name, int32 priority,
}
/* TODO: split this; have kernel version set kerrno */
int
getrlimit(int resource, struct rlimit * rlp)
{
if (!rlp)
return B_BAD_ADDRESS;
switch (resource) {
case RLIMIT_NOFILE:
case RLIMIT_NOVMON:
return vfs_getrlimit(resource, rlp);
case RLIMIT_STACK:
{
struct thread *thread = thread_get_current_thread();
if (!thread)
return B_ERROR;
rlp->rlim_cur = thread->user_stack_size;
rlp->rlim_max = thread->user_stack_size;
return 0;
}
default:
return EINVAL;
status_t error = common_getrlimit(resource, rlp);
if (error != B_OK) {
errno = error;
return -1;
}
return 0;
return 0;
}
/* TODO: split this; have kernel version set kerrno */
int
setrlimit(int resource, const struct rlimit * rlp)
{
if (!rlp)
return B_BAD_ADDRESS;
switch (resource) {
case RLIMIT_NOFILE:
case RLIMIT_NOVMON:
return vfs_setrlimit(resource, rlp);
default:
return EINVAL;
status_t error = common_setrlimit(resource, rlp);
if (error != B_OK) {
errno = error;
return -1;
}
return 0;
return 0;
}
@@ -2760,7 +2796,7 @@ _user_getrlimit(int resource, struct rlimit *urlp)
if (!IS_USER_ADDRESS(urlp))
return B_BAD_ADDRESS;
ret = getrlimit(resource, &rl);
ret = common_getrlimit(resource, &rl);
if (ret == 0) {
ret = user_memcpy(urlp, &rl, sizeof(struct rlimit));
@@ -2787,6 +2823,6 @@ _user_setrlimit(int resource, const struct rlimit *userResourceLimit)
sizeof(struct rlimit)) < B_OK)
return B_BAD_ADDRESS;
return setrlimit(resource, &resourceLimit);
return common_setrlimit(resource, &resourceLimit);
}