This seems unnecessary:
typedef quad_t RLIM_TYPE;
when we have rlim_t. Yes, rlim_t is unsigned while RLIM_TYPE is signed,
but it's not doing anything with this that needs a signed type.
While ktracing csh to verify the setrlimit/getrlimit calls, I noticed that
csh calls getrlimit 513(!) times on startup. Thus the diff to misc.c to
pull the sysconf(_SC_OPEN_MAX) out of the loop conditional...
ok?
Philip Guenther
Index: func.c
===================================================================
RCS file: /data/src/openbsd/src/bin/csh/func.c,v
retrieving revision 1.32
diff -u -p -r1.32 func.c
--- func.c 26 Dec 2015 13:48:38 -0000 1.32
+++ func.c 14 Aug 2016 06:26:28 -0000
@@ -1036,8 +1036,6 @@ doumask(Char **v, struct command *t)
(void) umask(i);
}
-typedef quad_t RLIM_TYPE;
-
static struct limits {
int limconst;
char *limname;
@@ -1060,10 +1058,10 @@ static struct limits {
};
static struct limits *findlim(Char *);
-static RLIM_TYPE getval(struct limits *, Char **);
+static rlim_t getval(struct limits *, Char **);
static void limtail(Char *, char *);
static void plim(struct limits *, Char);
-static int setlim(struct limits *, Char, RLIM_TYPE);
+static int setlim(struct limits *, Char, rlim_t);
static struct limits *
findlim(Char *cp)
@@ -1089,7 +1087,7 @@ void
dolimit(Char **v, struct command *t)
{
struct limits *lp;
- RLIM_TYPE limit;
+ rlim_t limit;
char hard = 0;
v++;
@@ -1112,7 +1110,7 @@ dolimit(Char **v, struct command *t)
stderror(ERR_SILENT);
}
-static RLIM_TYPE
+static rlim_t
getval(struct limits *lp, Char **v)
{
float f;
@@ -1124,14 +1122,14 @@ getval(struct limits *lp, Char **v)
cp++;
if (*cp == 0) {
if (*v == 0)
- return ((RLIM_TYPE) ((f + 0.5) * lp->limdiv));
+ return ((rlim_t) ((f + 0.5) * lp->limdiv));
cp = *v;
}
switch (*cp) {
case ':':
if (lp->limconst != RLIMIT_CPU)
goto badscal;
- return ((RLIM_TYPE) (f * 60.0 + atof(short2str(cp + 1))));
+ return ((rlim_t) (f * 60.0 + atof(short2str(cp + 1))));
case 'h':
if (lp->limconst != RLIMIT_CPU)
goto badscal;
@@ -1177,7 +1175,7 @@ badscal:
if (f > (float) RLIM_INFINITY)
return RLIM_INFINITY;
else
- return ((RLIM_TYPE) f);
+ return ((rlim_t) f);
}
static void
@@ -1196,7 +1194,7 @@ static void
plim(struct limits *lp, Char hard)
{
struct rlimit rlim;
- RLIM_TYPE limit;
+ rlim_t limit;
(void) fprintf(cshout, "%s \t", lp->limname);
@@ -1208,8 +1206,8 @@ plim(struct limits *lp, Char hard)
else if (lp->limconst == RLIMIT_CPU)
psecs((long) limit);
else
- (void) fprintf(cshout, "%ld %s", (long) (limit / lp->limdiv),
- lp->limscale);
+ (void) fprintf(cshout, "%llu %s",
+ (unsigned long long) (limit / lp->limdiv), lp->limscale);
(void) fputc('\n', cshout);
}
@@ -1228,7 +1226,7 @@ dounlimit(Char **v, struct command *t)
}
if (*v == 0) {
for (lp = limits; lp->limconst >= 0; lp++)
- if (setlim(lp, hard, (RLIM_TYPE) RLIM_INFINITY) < 0)
+ if (setlim(lp, hard, RLIM_INFINITY) < 0)
lerr++;
if (lerr)
stderror(ERR_SILENT);
@@ -1236,13 +1234,13 @@ dounlimit(Char **v, struct command *t)
}
while (*v) {
lp = findlim(*v++);
- if (setlim(lp, hard, (RLIM_TYPE) RLIM_INFINITY) < 0)
+ if (setlim(lp, hard, RLIM_INFINITY) < 0)
stderror(ERR_SILENT);
}
}
static int
-setlim(struct limits *lp, Char hard, RLIM_TYPE limit)
+setlim(struct limits *lp, Char hard, rlim_t limit)
{
struct rlimit rlim;
Index: misc.c
===================================================================
RCS file: /data/src/openbsd/src/bin/csh/misc.c,v
retrieving revision 1.18
diff -u -p -r1.18 misc.c
--- misc.c 26 Dec 2015 13:48:38 -0000 1.18
+++ misc.c 14 Aug 2016 06:04:53 -0000
@@ -170,8 +170,9 @@ void
closem(void)
{
int f;
+ int max = sysconf(_SC_OPEN_MAX);
- for (f = 0; f < sysconf(_SC_OPEN_MAX); f++)
+ for (f = 0; f < max; f++)
if (f != SHIN && f != SHOUT && f != SHERR && f != OLDSTD &&
f != FSHTTY)
(void) close(f);