aboutsummaryrefslogtreecommitdiff
path: root/usr.bin/ministat
diff options
context:
space:
mode:
authorConrad Meyer <cem@FreeBSD.org>2016-12-16 01:51:12 +0000
committerConrad Meyer <cem@FreeBSD.org>2016-12-16 01:51:12 +0000
commit20502a13a09f1fe17d9c6bdd039fd34bcaabf55d (patch)
tree8798623ec18bb58eba2d4ffa114479dbc21c6f34 /usr.bin/ministat
parent9716e7d4e4551df05a9418d261b87901cefe4ae8 (diff)
downloadsrc-20502a13a09f1fe17d9c6bdd039fd34bcaabf55d.tar.gz
src-20502a13a09f1fe17d9c6bdd039fd34bcaabf55d.zip
Notes
Diffstat (limited to 'usr.bin/ministat')
-rw-r--r--usr.bin/ministat/ministat.c63
1 files changed, 39 insertions, 24 deletions
diff --git a/usr.bin/ministat/ministat.c b/usr.bin/ministat/ministat.c
index 02b5025a436c..ae4f977a5fb0 100644
--- a/usr.bin/ministat/ministat.c
+++ b/usr.bin/ministat/ministat.c
@@ -11,16 +11,20 @@
#include <sys/cdefs.h>
__FBSDID("$FreeBSD$");
-#include <stdio.h>
-#include <math.h>
+#include <sys/capsicum.h>
+#include <sys/ioctl.h>
+#include <sys/queue.h>
+#include <sys/ttycom.h>
+
+#include <capsicum_helpers.h>
#include <ctype.h>
#include <err.h>
-#include <string.h>
+#include <errno.h>
+#include <math.h>
+#include <stdio.h>
#include <stdlib.h>
+#include <string.h>
#include <unistd.h>
-#include <sys/ioctl.h>
-#include <sys/queue.h>
-#include <sys/ttycom.h>
#define NSTUDENT 100
#define NCONF 6
@@ -455,26 +459,14 @@ dbl_cmp(const void *a, const void *b)
}
static struct dataset *
-ReadSet(const char *n, int column, const char *delim)
+ReadSet(FILE *f, const char *n, int column, const char *delim)
{
- FILE *f;
char buf[BUFSIZ], *p, *t;
struct dataset *s;
double d;
int line;
int i;
- if (n == NULL) {
- f = stdin;
- n = "<stdin>";
- } else if (!strcmp(n, "-")) {
- f = stdin;
- n = "<stdin>";
- } else {
- f = fopen(n, "r");
- }
- if (f == NULL)
- err(1, "Cannot open %s", n);
s = NewSet();
s->name = strdup(n);
line = 0;
@@ -499,7 +491,6 @@ ReadSet(const char *n, int column, const char *delim)
if (*buf != '\0')
AddPoint(s, d);
}
- fclose(f);
if (s->n < 3) {
fprintf(stderr,
"Dataset %s must contain at least 3 data points\n", n);
@@ -536,7 +527,9 @@ usage(char const *whine)
int
main(int argc, char **argv)
{
- struct dataset *ds[7];
+ const char *setfilenames[MAX_DS - 1];
+ struct dataset *ds[MAX_DS - 1];
+ FILE *setfiles[MAX_DS - 1];
int nds;
double a;
const char *delim = " \t";
@@ -609,14 +602,36 @@ main(int argc, char **argv)
argv += optind;
if (argc == 0) {
- ds[0] = ReadSet("-", column, delim);
+ setfilenames[0] = "<stdin>";
+ setfiles[0] = stdin;
nds = 1;
} else {
if (argc > (MAX_DS - 1))
usage("Too many datasets.");
nds = argc;
- for (i = 0; i < nds; i++)
- ds[i] = ReadSet(argv[i], column, delim);
+ for (i = 0; i < nds; i++) {
+ setfilenames[i] = argv[i];
+ setfiles[i] = fopen(argv[i], "r");
+ if (setfiles[i] == NULL)
+ err(2, "Cannot open %s", argv[i]);
+ }
+ }
+
+ if (caph_limit_stdio() < 0)
+ err(2, "capsicum");
+
+ for (i = 0; i < nds; i++)
+ if (caph_limit_stream(fileno(setfiles[i]), CAPH_READ) < 0)
+ err(2, "unable to limit rights for %s",
+ setfilenames[i]);
+
+ /* Enter Capsicum sandbox. */
+ if (cap_enter() < 0 && errno != ENOSYS)
+ err(2, "unable to enter capability mode");
+
+ for (i = 0; i < nds; i++) {
+ ds[i] = ReadSet(setfiles[i], setfilenames[i], column, delim);
+ fclose(setfiles[i]);
}
for (i = 0; i < nds; i++)