da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin/***********************************************************************
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin* *
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin* This software is part of the ast package *
3e14f97f673e8a630f076077de35afdd43dc1587Roger A. Faulkner* Copyright (c) 1982-2010 AT&T Intellectual Property *
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin* and is licensed under the *
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin* Common Public License, Version 1.0 *
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin* by AT&T Intellectual Property *
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin* *
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin* A copy of the License is available at *
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin* http://www.opensource.org/licenses/cpl1.0.txt *
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin* (with md5 checksum 059e8cd6165cb4c31e351f2b69388fd9) *
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin* *
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin* Information and Software Systems Research *
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin* AT&T Research *
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin* Florham Park NJ *
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin* *
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin* David Korn <dgk@research.att.com> *
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin* *
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin***********************************************************************/
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#pragma prototyped
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin/*
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin * ulimit [-HSacdfmnstuv] [limit]
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin *
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin * David Korn
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin * AT&T Labs
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin *
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#include <ast.h>
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#include <sfio.h>
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#include <error.h>
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz#include "defs.h"
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#include "builtins.h"
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#include "name.h"
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#include "ulimit.h"
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#ifndef SH_DICT
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin# define SH_DICT "libshell"
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#endif
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#ifdef _no_ulimit
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin int b_ulimit(int argc,char *argv[],void *extra)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin {
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin NOT_USED(argc);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin NOT_USED(argv);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin NOT_USED(extra);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin errormsg(SH_DICT,ERROR_exit(2),e_nosupport);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin return(0);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin }
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#else
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinstatic int infof(Opt_t* op, Sfio_t* sp, const char* s, Optdisc_t* dp)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin{
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin register const Limit_t* tp;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin for (tp = shtab_limits; tp->option; tp++)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin {
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin sfprintf(sp, "[%c=%d:%s?The %s", tp->option, tp - shtab_limits + 1, tp->name, tp->description);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if(tp->type != LIM_COUNT)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin sfprintf(sp, " in %ss", e_units[tp->type]);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin sfprintf(sp, ".]");
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin }
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin return(1);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin}
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#define HARD 2
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#define SOFT 4
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinint b_ulimit(int argc,char *argv[],void *extra)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin{
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin register char *limit;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin register int mode=0, n;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin register unsigned long hit = 0;
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin Shell_t *shp = ((Shbltin_t*)extra)->shp;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#ifdef _lib_getrlimit
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin struct rlimit rlp;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#endif /* _lib_getrlimit */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin const Limit_t* tp;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin char* conf;
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin int label, unit, nosupport;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin rlim_t i;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin char tmp[32];
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin Optdisc_t disc;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin memset(&disc, 0, sizeof(disc));
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin disc.version = OPT_VERSION;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin disc.infof = infof;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin opt_info.disc = &disc;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin while((n = optget(argv,sh_optulimit))) switch(n)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin {
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin case 'H':
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin mode |= HARD;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin continue;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin case 'S':
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin mode |= SOFT;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin continue;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin case 'a':
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin hit = ~0;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin break;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin default:
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if(n < 0)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin hit |= (1L<<(-(n+1)));
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin else
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin errormsg(SH_DICT,2, e_notimp, opt_info.name);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin break;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin case ':':
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin errormsg(SH_DICT,2, "%s", opt_info.arg);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin break;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin case '?':
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin errormsg(SH_DICT,ERROR_usage(2), "%s", opt_info.arg);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin break;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin }
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin opt_info.disc = 0;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin /* default to -f */
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin limit = argv[opt_info.index];
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin if(hit==0)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin for(n=0; shtab_limits[n].option; n++)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if(shtab_limits[n].index == RLIMIT_FSIZE)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin {
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin hit |= (1L<<n);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin break;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin }
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin /* only one option at a time for setting */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin label = (hit&(hit-1));
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if(error_info.errors || (limit && label) || argc>opt_info.index+1)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin errormsg(SH_DICT,ERROR_usage(2),optusage((char*)0));
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if(mode==0)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin mode = (HARD|SOFT);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin for(tp = shtab_limits; tp->option && hit; tp++,hit>>=1)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin {
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if(!(hit&1))
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin continue;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin nosupport = (n = tp->index) == RLIMIT_UNKNOWN;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin unit = shtab_units[tp->type];
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if(limit)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin {
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz if(shp->subshell && !shp->subshare)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin sh_subfork();
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if(strcmp(limit,e_unlimited)==0)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin i = INFINITY;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin else
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin {
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin char *last;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if((i=sh_strnum(limit,&last,2))==INFINITY || *last)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin errormsg(SH_DICT,ERROR_system(1),e_number,limit);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin i *= unit;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin }
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if(nosupport)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin errormsg(SH_DICT,ERROR_system(1),e_readonly,tp->name);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin else
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin {
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#ifdef _lib_getrlimit
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if(getrlimit(n,&rlp) <0)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin errormsg(SH_DICT,ERROR_system(1),e_number,limit);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if(mode&HARD)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin rlp.rlim_max = i;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if(mode&SOFT)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin rlp.rlim_cur = i;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if(setrlimit(n,&rlp) <0)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin errormsg(SH_DICT,ERROR_system(1),e_overlimit,limit);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#else
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if((i=vlimit(n,i)) < 0)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin errormsg(SH_DICT,ERROR_system(1),e_number,limit);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#endif /* _lib_getrlimit */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin }
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin }
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin else
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin {
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if(!nosupport)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin {
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#ifdef _lib_getrlimit
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if(getrlimit(n,&rlp) <0)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin errormsg(SH_DICT,ERROR_system(1),e_number,limit);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if(mode&HARD)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin i = rlp.rlim_max;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if(mode&SOFT)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin i = rlp.rlim_cur;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#else
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin# ifdef _lib_ulimit
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin n--;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin# endif /* _lib_ulimit */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin i = -1;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if((i=vlimit(n,i)) < 0)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin errormsg(SH_DICT,ERROR_system(1),e_number,limit);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#endif /* _lib_getrlimit */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin }
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if(label)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin {
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if(tp->type != LIM_COUNT)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin sfsprintf(tmp,sizeof(tmp),"%s (%ss)", tp->description, e_units[tp->type]);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin else
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin sfsprintf(tmp,sizeof(tmp),"%s", tp->name);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin sfprintf(sfstdout,"%-30s (-%c) ",tmp,tp->option);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin }
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if(nosupport)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin {
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if(!tp->conf || !*(conf = astconf(tp->conf, NiL, NiL)))
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin conf = (char*)e_nosupport;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin sfputr(sfstdout,conf,'\n');
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin }
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin else if(i!=INFINITY)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin {
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin i += (unit-1);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin sfprintf(sfstdout,"%I*d\n",sizeof(i),i/unit);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin }
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin else
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin sfputr(sfstdout,e_unlimited,'\n');
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin }
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin }
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin return(0);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin}
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#endif /* _no_ulimit */