On Sat, Aug 13, 2016 at 11:41:26PM -0700, Philip Guenther wrote:
>
> 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?
Reads fine to me. See one comment below.
>
> 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));
Shouldn't 'return (f + 0.5) * lp->limdiv;' be enough here, because
rlim_t is the return type?
> 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))));
ditto
> 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);
ditto
> }
>
> 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);
>