/* get/set resource limits */
/* written by Eric R. Smith and placed in the public domain */

#include <time.h>
#include <types.h>
#include <resource.h>
#include <mintbind.h>
#include <errno.h>

extern int __mint;

int
setrlimit(kind, rl)
	int kind;
	struct rlimit *rl;
{
	unsigned long limit;
	long r;
	int mode;

	if (!__mint) {
		errno = EINVAL;
		return -1;
	}

	limit = rl->rlim_cur;

	if (limit >= RLIM_INFINITY)
		limit = 0;
	else if (limit == 0)
		limit = 1;

	switch(kind) {
	case RLIMIT_CPU:
		mode = 1; break;
	case RLIMIT_RSS:
		mode = 2; break;
	case RLIMIT_DATA:
		mode = 3; break;
	default:
		errno = EINVAL;
		return -1;
	}
	r = Psetlimit(mode, limit);
	if (r < 0) {
		errno = -r;
		return -1;
	}
	return 0;
}

int
getrlimit(kind, rl)
	int kind;
	struct rlimit *rl;
{
	long limit;
	int mode;

	if (!__mint) {
		errno = EINVAL;
		return -1;
	}

	switch(kind) {
	case RLIMIT_CPU:
		mode = 1;
		break;
	case RLIMIT_RSS:
		mode = 2;
		break;
	case RLIMIT_DATA:
		mode = 3;
		break;
	default:
		errno = EINVAL;
		return -1;
	}
	limit = Psetlimit(mode, -1L);
	if (limit < 0) {
		errno = -limit;
		return -1;
	}
	if (limit == 0)
		limit = RLIM_INFINITY;

	rl->rlim_cur = limit;
	rl->rlim_max = RLIM_INFINITY;
	return 0;
}
