1*5c51f124SMoriah Waterland /* 2*5c51f124SMoriah Waterland * CDDL HEADER START 3*5c51f124SMoriah Waterland * 4*5c51f124SMoriah Waterland * The contents of this file are subject to the terms of the 5*5c51f124SMoriah Waterland * Common Development and Distribution License (the "License"). 6*5c51f124SMoriah Waterland * You may not use this file except in compliance with the License. 7*5c51f124SMoriah Waterland * 8*5c51f124SMoriah Waterland * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE 9*5c51f124SMoriah Waterland * or http://www.opensolaris.org/os/licensing. 10*5c51f124SMoriah Waterland * See the License for the specific language governing permissions 11*5c51f124SMoriah Waterland * and limitations under the License. 12*5c51f124SMoriah Waterland * 13*5c51f124SMoriah Waterland * When distributing Covered Code, include this CDDL HEADER in each 14*5c51f124SMoriah Waterland * file and include the License file at usr/src/OPENSOLARIS.LICENSE. 15*5c51f124SMoriah Waterland * If applicable, add the following below this CDDL HEADER, with the 16*5c51f124SMoriah Waterland * fields enclosed by brackets "[]" replaced with your own identifying 17*5c51f124SMoriah Waterland * information: Portions Copyright [yyyy] [name of copyright owner] 18*5c51f124SMoriah Waterland * 19*5c51f124SMoriah Waterland * CDDL HEADER END 20*5c51f124SMoriah Waterland */ 21*5c51f124SMoriah Waterland 22*5c51f124SMoriah Waterland /* 23*5c51f124SMoriah Waterland * Copyright 2006 Sun Microsystems, Inc. All rights reserved. 24*5c51f124SMoriah Waterland * Use is subject to license terms. 25*5c51f124SMoriah Waterland */ 26*5c51f124SMoriah Waterland 27*5c51f124SMoriah Waterland 28*5c51f124SMoriah Waterland 29*5c51f124SMoriah Waterland #include <stdio.h> 30*5c51f124SMoriah Waterland #include <sys/types.h> 31*5c51f124SMoriah Waterland #include <sys/resource.h> 32*5c51f124SMoriah Waterland #include <string.h> 33*5c51f124SMoriah Waterland #include <signal.h> 34*5c51f124SMoriah Waterland #include <limits.h> 35*5c51f124SMoriah Waterland #include <errno.h> 36*5c51f124SMoriah Waterland #include <fcntl.h> 37*5c51f124SMoriah Waterland #include <stdlib.h> 38*5c51f124SMoriah Waterland #include <unistd.h> 39*5c51f124SMoriah Waterland #include <time.h> 40*5c51f124SMoriah Waterland #include <locale.h> 41*5c51f124SMoriah Waterland #include <libintl.h> 42*5c51f124SMoriah Waterland #include <ctype.h> 43*5c51f124SMoriah Waterland #include <pkglib.h> 44*5c51f124SMoriah Waterland #include <libinst.h> 45*5c51f124SMoriah Waterland 46*5c51f124SMoriah Waterland #define ERR_SET_ULIMIT "unable to set ulimit to <%ld> blocks" 47*5c51f124SMoriah Waterland #define ERR_DO_ULIMIT "An attempt was made to create a file larger than " \ 48*5c51f124SMoriah Waterland "ULIMIT. Source of fault is unknown." 49*5c51f124SMoriah Waterland #define ERR_SCRULIMIT "Script <%s> attempted to create a file exceeding " \ 50*5c51f124SMoriah Waterland "ULIMIT." 51*5c51f124SMoriah Waterland 52*5c51f124SMoriah Waterland static char *script_name = NULL, *scr_error = NULL; 53*5c51f124SMoriah Waterland static struct rlimit ulimit = {RLIM_INFINITY, RLIM_INFINITY}; 54*5c51f124SMoriah Waterland static struct rlimit dblimit = {RLIM_INFINITY, RLIM_INFINITY}; 55*5c51f124SMoriah Waterland static int limit_is_set = 0, fail_return = 0; 56*5c51f124SMoriah Waterland 57*5c51f124SMoriah Waterland void ulimit_quit(); /* XFSZ controlled signal handler. */ 58*5c51f124SMoriah Waterland int clr_ulimit(); /* Clear the user supplied file size limit. */ 59*5c51f124SMoriah Waterland void set_limit(); /* Called from installf to undo ulimit */ 60*5c51f124SMoriah Waterland int set_ulimit(char *script, char *err_msg); 61*5c51f124SMoriah Waterland int assign_ulimit(char *fslimit); 62*5c51f124SMoriah Waterland 63*5c51f124SMoriah Waterland extern int warnflag; 64*5c51f124SMoriah Waterland 65*5c51f124SMoriah Waterland void 66*5c51f124SMoriah Waterland set_limit() 67*5c51f124SMoriah Waterland { 68*5c51f124SMoriah Waterland limit_is_set = 1; 69*5c51f124SMoriah Waterland } 70*5c51f124SMoriah Waterland 71*5c51f124SMoriah Waterland int 72*5c51f124SMoriah Waterland clr_ulimit() 73*5c51f124SMoriah Waterland { 74*5c51f124SMoriah Waterland if (limit_is_set) { 75*5c51f124SMoriah Waterland if (script_name) 76*5c51f124SMoriah Waterland free(script_name); 77*5c51f124SMoriah Waterland script_name = NULL; 78*5c51f124SMoriah Waterland if (scr_error) 79*5c51f124SMoriah Waterland free(scr_error); 80*5c51f124SMoriah Waterland scr_error = NULL; 81*5c51f124SMoriah Waterland fail_return = 99; 82*5c51f124SMoriah Waterland 83*5c51f124SMoriah Waterland /* Clear out the limit to infinity. */ 84*5c51f124SMoriah Waterland return (setrlimit(RLIMIT_FSIZE, &dblimit)); 85*5c51f124SMoriah Waterland } else 86*5c51f124SMoriah Waterland return (0); 87*5c51f124SMoriah Waterland } 88*5c51f124SMoriah Waterland 89*5c51f124SMoriah Waterland /* 90*5c51f124SMoriah Waterland * This sets up the ULIMIT facility for the signal retrieval. This sets up 91*5c51f124SMoriah Waterland * the static pointers to the message constants for indicating where the 92*5c51f124SMoriah Waterland * error occurred. 93*5c51f124SMoriah Waterland */ 94*5c51f124SMoriah Waterland int 95*5c51f124SMoriah Waterland set_ulimit(char *script, char *err_msg) 96*5c51f124SMoriah Waterland { 97*5c51f124SMoriah Waterland int n; 98*5c51f124SMoriah Waterland 99*5c51f124SMoriah Waterland if (limit_is_set) { 100*5c51f124SMoriah Waterland (void) signal(SIGXFSZ, ulimit_quit); 101*5c51f124SMoriah Waterland if (script_name) 102*5c51f124SMoriah Waterland free(script_name); 103*5c51f124SMoriah Waterland script_name = strdup(script); 104*5c51f124SMoriah Waterland if (scr_error) 105*5c51f124SMoriah Waterland free(scr_error); 106*5c51f124SMoriah Waterland scr_error = strdup(err_msg); 107*5c51f124SMoriah Waterland fail_return = 99; 108*5c51f124SMoriah Waterland 109*5c51f124SMoriah Waterland n = setrlimit(RLIMIT_FSIZE, &ulimit); 110*5c51f124SMoriah Waterland 111*5c51f124SMoriah Waterland return (n); 112*5c51f124SMoriah Waterland } else 113*5c51f124SMoriah Waterland return (0); 114*5c51f124SMoriah Waterland 115*5c51f124SMoriah Waterland } 116*5c51f124SMoriah Waterland 117*5c51f124SMoriah Waterland /* Validate ULIMIT and set accordingly. */ 118*5c51f124SMoriah Waterland int 119*5c51f124SMoriah Waterland assign_ulimit(char *fslimit) 120*5c51f124SMoriah Waterland { 121*5c51f124SMoriah Waterland rlim_t limit; 122*5c51f124SMoriah Waterland int cnt = 0; 123*5c51f124SMoriah Waterland 124*5c51f124SMoriah Waterland if (fslimit && *fslimit) { 125*5c51f124SMoriah Waterland /* fslimit must be a simple unsigned integer. */ 126*5c51f124SMoriah Waterland do { 127*5c51f124SMoriah Waterland if (!isdigit(fslimit[cnt])) 128*5c51f124SMoriah Waterland return (-1); 129*5c51f124SMoriah Waterland } while (fslimit[++cnt]); 130*5c51f124SMoriah Waterland 131*5c51f124SMoriah Waterland limit = atol(fslimit); 132*5c51f124SMoriah Waterland 133*5c51f124SMoriah Waterland ulimit.rlim_cur = (limit * 512); /* fslimit is in blocks */ 134*5c51f124SMoriah Waterland 135*5c51f124SMoriah Waterland limit_is_set = 1; 136*5c51f124SMoriah Waterland 137*5c51f124SMoriah Waterland return (0); 138*5c51f124SMoriah Waterland } else 139*5c51f124SMoriah Waterland return (-1); 140*5c51f124SMoriah Waterland } 141*5c51f124SMoriah Waterland 142*5c51f124SMoriah Waterland /* 143*5c51f124SMoriah Waterland * This is the signal handler for ULIMIT. 144*5c51f124SMoriah Waterland */ 145*5c51f124SMoriah Waterland void 146*5c51f124SMoriah Waterland ulimit_quit(int n) 147*5c51f124SMoriah Waterland { 148*5c51f124SMoriah Waterland #ifdef lint 149*5c51f124SMoriah Waterland int i = n; 150*5c51f124SMoriah Waterland n = i; 151*5c51f124SMoriah Waterland #endif /* lint */ 152*5c51f124SMoriah Waterland 153*5c51f124SMoriah Waterland setrlimit(RLIMIT_FSIZE, &dblimit); 154*5c51f124SMoriah Waterland signal(SIGXFSZ, SIG_IGN); 155*5c51f124SMoriah Waterland 156*5c51f124SMoriah Waterland if (script_name) { 157*5c51f124SMoriah Waterland progerr(gettext(ERR_SCRULIMIT), script_name); 158*5c51f124SMoriah Waterland if (scr_error) 159*5c51f124SMoriah Waterland progerr("%s", scr_error); 160*5c51f124SMoriah Waterland } else 161*5c51f124SMoriah Waterland progerr(gettext(ERR_DO_ULIMIT)); 162*5c51f124SMoriah Waterland 163*5c51f124SMoriah Waterland quit(fail_return); 164*5c51f124SMoriah Waterland } 165