Implement POSIX.1-2001 (XSI)'s ulimit(3) library call.
authorHiten Pandya <hmp@dragonflybsd.org>
Sun, 6 Jun 2004 13:32:27 +0000 (13:32 +0000)
committerHiten Pandya <hmp@dragonflybsd.org>
Sun, 6 Jun 2004 13:32:27 +0000 (13:32 +0000)
Obtained-from:   FreeBSD (HEAD)

include/ulimit.h [new file with mode: 0644]
lib/libc/gen/Makefile.inc
lib/libc/gen/ulimit.3 [new file with mode: 0644]
lib/libc/gen/ulimit.c [new file with mode: 0644]

diff --git a/include/ulimit.h b/include/ulimit.h
new file mode 100644 (file)
index 0000000..ee7253b
--- /dev/null
@@ -0,0 +1,42 @@
+/*-
+ * Copyright (c) 2002 Kyle Martin <mkm@ieee.org>
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ *
+ * $FreeBSD: src/lib/libc/gen/ulimit.h, v1.3 2003/01/04 01:11:49 tjr Exp $
+ * $DragonFly: src/include/ulimit.h,v 1.1 2004/06/06 13:32:27 hmp Exp $
+ */
+
+#ifndef _ULIMIT_H_
+#define        _ULIMIT_H_
+
+#include <sys/cdefs.h>
+
+#define        UL_GETFSIZE     1
+#define        UL_SETFSIZE     2
+
+__BEGIN_DECLS
+long   ulimit(int, ...);
+__END_DECLS
+
+#endif /* !_ULIMIT_H_ */
index 496908a..c9ae3d7 100644 (file)
@@ -1,6 +1,6 @@
 #      @(#)Makefile.inc        8.6 (Berkeley) 5/4/95
 # $FreeBSD: src/lib/libc/gen/Makefile.inc,v 1.62.2.19 2003/02/21 13:46:16 phantom Exp $
-# $DragonFly: src/lib/libc/gen/Makefile.inc,v 1.3 2004/01/06 15:38:09 eirikn Exp $
+# $DragonFly: src/lib/libc/gen/Makefile.inc,v 1.4 2004/06/06 13:32:27 hmp Exp $
 
 # machine-independent gen sources
 .PATH: ${.CURDIR}/../libc/${MACHINE_ARCH}/gen ${.CURDIR}/../libc/gen
@@ -29,7 +29,8 @@ SRCS+=  _rand48.c _spinlock_stub.c alarm.c arc4random.c assert.c \
        sigsetops.c sleep.c srand48.c stringlist.c strtofflags.c \
        sysconf.c sysctl.c sysctlbyname.c sysctlnametomib.c \
        syslog.c telldir.c termios.c time.c times.c timezone.c ttyname.c \
-       ttyslot.c ualarm.c uname.c unvis.c usleep.c utime.c valloc.c vis.c \
+       ttyslot.c ualarm.c ulimit.c uname.c unvis.c usleep.c utime.c \
+       valloc.c vis.c \
        wait.c wait3.c waitpid.c
 
 # machine-dependent gen sources
@@ -56,7 +57,7 @@ MAN+= alarm.3 arc4random.3 clock.3 \
        siginterrupt.3 signal.3 sigsetops.3 sleep.3 stringlist.3 \
        strtofflags.3 sysconf.3 sysctl.3 syslog.3 tcgetpgrp.3 \
        tcsendbreak.3 tcsetattr.3 tcsetpgrp.3 time.3 times.3 timezone.3 \
-       ttyname.3 tzset.3 ualarm.3 ucontext.3 uname.3 \
+       ttyname.3 tzset.3 ualarm.3 ucontext.3 ulimit.3 uname.3 \
        unvis.3 usleep.3 utime.3 valloc.3 vis.3
 
 MLINKS+=arc4random.3 arc4random_addrandom.3 arc4random.3 arc4random_stir.3
diff --git a/lib/libc/gen/ulimit.3 b/lib/libc/gen/ulimit.3
new file mode 100644 (file)
index 0000000..a046500
--- /dev/null
@@ -0,0 +1,99 @@
+.\" Copyright (c) 2002 Kyle Martin.  All rights reserved.
+.\"
+.\" Redistribution and use in source and binary forms, with or without
+.\" modification, are permitted provided that the following conditions
+.\" are met:
+.\" 1. Redistributions of source code must retain the above copyright
+.\"    notice, this list of conditions and the following disclaimer.
+.\" 2. Redistributions in binary form must reproduce the above copyright
+.\"    notice, this list of conditions and the following disclaimer in the
+.\"    documentation and/or other materials provided with the distribution.
+.\"
+.\" THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
+.\" ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+.\" IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+.\" ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
+.\" FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+.\" OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+.\" HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+.\" LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+.\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+.\" SUCH DAMAGE.
+.\"
+.\" $FreeBSD: src/lib/libc/gen/ulimit.3,v 1.5 2003/01/04 01:11:49 tjr Exp $
+.\" $DragonFly: src/lib/libc/gen/ulimit.3,v 1.1 2004/06/06 13:32:27 hmp Exp $
+.\"
+.Dd June 06, 2004
+.Dt ULIMIT 3
+.Os
+.Sh NAME
+.Nm ulimit
+.Nd get and set process limits
+.Sh LIBRARY
+.Lb libc
+.Sh SYNOPSIS
+.In ulimit.h
+.Ft long
+.Fn ulimit "int cmd" "..."
+.Sh DESCRIPTION
+The
+.Fn ulimit
+function will get and set process limits.
+Currently this is limited to the maximum file size.
+The
+.Fa cmd
+argument is one of the following:
+.Bl -tag -width ".Dv UL_GETFSIZE"
+.It Dv UL_GETFSIZE
+will return the maximum file size in units of 512 blocks of
+the current process.
+.It Dv UL_SETFSIZE
+will attempt to set the maximum file size of the current
+process and its children with the second argument expressed as a long.
+.El
+.Sh RETURN VALUES
+Upon successful completion,
+.Fn ulimit
+returns the value requested;
+otherwise the value \-1 is returned and the global variable
+.Va errno
+is set to indicate the error.
+.Sh ERRORS
+The
+.Fn ulimit
+function will fail if:
+.Bl -tag -width Er
+.It Bq Er EINVAL
+The command specified was invalid.
+.It Bq Er EPERM
+The limit specified to
+.Fn ulimit
+would have raised the maximum limit value,
+and the caller is not the super-user.
+.El
+.Sh SEE ALSO
+.Xr getrlimit 2
+.Sh STANDARDS
+The
+.Fn ulimit
+function conforms to
+.St -p1003.1-2001 .
+.Sh HISTORY
+The
+.Fn ulimit
+function first appeared in
+.Fx 5.0 .
+.Sh BUGS
+The
+.Fn ulimit
+function provides limited precision for
+setting and retrieving process limits.
+If there is a need for greater precision than the
+type
+.Vt long
+provides, the
+.Xr getrlimit 2
+and
+.Xr setrlimit 2
+functions should be considered.
diff --git a/lib/libc/gen/ulimit.c b/lib/libc/gen/ulimit.c
new file mode 100644 (file)
index 0000000..986e32c
--- /dev/null
@@ -0,0 +1,69 @@
+/*-
+ * Copyright (c) 2002 Kyle Martin <mkm@ieee.org>
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ *
+ * $FreeBSD: src/lib/libc/gen/ulimit.c,v 1.3 2003/01/04 01:11:49 tjr Exp $
+ * $DragonFly: src/lib/libc/gen/ulimit.c,v 1.1 2004/06/06 13:32:27 hmp Exp $
+ */
+
+#include <sys/types.h>
+#include <sys/time.h>
+#include <sys/resource.h>
+
+#include <errno.h>
+#include <limits.h>
+#include <stdarg.h>
+#include <ulimit.h>
+
+long
+ulimit(int cmd, ...)
+{
+       struct rlimit limit;
+       va_list ap;
+       long arg;
+
+       if (cmd == UL_GETFSIZE) {
+               if (getrlimit(RLIMIT_FSIZE, &limit) == -1)
+                       return (-1);
+               limit.rlim_cur /= 512;
+               if (limit.rlim_cur > LONG_MAX)
+                       return (LONG_MAX);
+               return ((long)limit.rlim_cur);
+       } else if (cmd == UL_SETFSIZE) {
+               va_start(ap, cmd);
+               arg = va_arg(ap, long);
+               va_end(ap);
+               limit.rlim_max = limit.rlim_cur = (rlim_t)arg * 512;
+
+               /* The setrlimit() function sets errno to EPERM if needed. */
+               if (setrlimit(RLIMIT_FSIZE, &limit) == -1)
+                       return (-1);
+               if (arg * 512 > LONG_MAX)
+                       return (LONG_MAX);
+               return (arg);
+       } else {
+               errno = EINVAL;
+               return (-1);
+       }
+}