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