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