1 /*	$NetBSD: file_limit.c,v 1.1.1.1 2009/06/23 10:08:59 tron Exp $	*/
2 
3 /*++
4 /* NAME
5 /*	file_limit 3
6 /* SUMMARY
7 /*	limit the file size
8 /* SYNOPSIS
9 /*	#include <iostuff.h>
10 /*
11 /*	off_t	get_file_limit()
12 /*
13 /*	void	set_file_limit(limit)
14 /*	off_t	limit;
15 /* DESCRIPTION
16 /*	This module manipulates the process-wide file size limit.
17 /*	The limit is specified in bytes.
18 /*
19 /*	get_file_limit() looks up the process-wide file size limit.
20 /*
21 /*	set_file_limit() sets the process-wide file size limit to
22 /*	\fIlimit\fR.
23 /* DIAGNOSTICS
24 /*	All errors are fatal.
25 /* SEE ALSO
26 /*	setrlimit(2)
27 /*	ulimit(2)
28 /* LICENSE
29 /* .ad
30 /* .fi
31 /*	The Secure Mailer license must be distributed with this software.
32 /* AUTHOR(S)
33 /*	Wietse Venema
34 /*	IBM T.J. Watson Research
35 /*	P.O. Box 704
36 /*	Yorktown Heights, NY 10598, USA
37 /*--*/
38 
39 /* System library. */
40 
41 #include <sys_defs.h>
42 #ifdef USE_ULIMIT
43 #include <ulimit.h>
44 #else
45 #include <sys/time.h>
46 #include <sys/resource.h>
47 #include <signal.h>
48 #endif
49 #include <limits.h>
50 
51 /* Utility library. */
52 
53 #include <msg.h>
54 #include <iostuff.h>
55 
56 #define ULIMIT_BLOCK_SIZE	512
57 
58 /* get_file_limit - get process-wide file size limit */
59 
60 off_t   get_file_limit(void)
61 {
62     off_t   limit;
63 
64 #ifdef USE_ULIMIT
65     if ((limit = ulimit(UL_GETFSIZE, 0)) < 0)
66 	msg_fatal("ulimit: %m");
67     if (limit > OFF_T_MAX / ULIMIT_BLOCK_SIZE)
68 	limit = OFF_T_MAX / ULIMIT_BLOCK_SIZE;
69     return (limit * ULIMIT_BLOCK_SIZE);
70 #else
71     struct rlimit rlim;
72 
73     if (getrlimit(RLIMIT_FSIZE, &rlim) < 0)
74 	msg_fatal("getrlimit: %m");
75     limit = rlim.rlim_cur;
76     return (limit < 0 ? OFF_T_MAX : rlim.rlim_cur);
77 #endif						/* USE_ULIMIT */
78 }
79 
80 /* set_file_limit - process-wide file size limit */
81 
82 void    set_file_limit(off_t limit)
83 {
84 #ifdef USE_ULIMIT
85     if (ulimit(UL_SETFSIZE, limit / ULIMIT_BLOCK_SIZE) < 0)
86 	msg_fatal("ulimit: %m");
87 #else
88     struct rlimit rlim;
89 
90     rlim.rlim_cur = rlim.rlim_max = limit;
91     if (setrlimit(RLIMIT_FSIZE, &rlim) < 0)
92 	msg_fatal("setrlimit: %m");
93 #ifdef SIGXFSZ
94     if (signal(SIGXFSZ, SIG_IGN) == SIG_ERR)
95 	msg_fatal("signal(SIGXFSZ,SIG_IGN): %m");
96 #endif
97 #endif						/* USE_ULIMIT */
98 }
99