diff options
author | Jun-ichiro itojun Hagino <itojun@cvs.openbsd.org> | 2002-09-16 04:34:47 +0000 |
---|---|---|
committer | Jun-ichiro itojun Hagino <itojun@cvs.openbsd.org> | 2002-09-16 04:34:47 +0000 |
commit | 14effbc95a77287bc0a9664d55ba66702da6b02d (patch) | |
tree | 2f9e2014cb557d3d4a04c9ff1c98d135cfc83036 | |
parent | 86a3a5aded910e8d60f3526d5269cb0fd9b02db9 (diff) |
periodically save policies that have been modified. from provos
>here is a diff that will cause systrace to periodically save policies
>that have been modified. Useful if you run systrace on an xterm and
>kill it accidently. Or other applications like opera that are long
>running and can cause weird crashes.
-rw-r--r-- | bin/systrace/policy.c | 4 | ||||
-rw-r--r-- | bin/systrace/systrace.c | 29 |
2 files changed, 29 insertions, 4 deletions
diff --git a/bin/systrace/policy.c b/bin/systrace/policy.c index fbbb1e9e98c..1b846c80d7b 100644 --- a/bin/systrace/policy.c +++ b/bin/systrace/policy.c @@ -1,4 +1,4 @@ -/* $OpenBSD: policy.c,v 1.17 2002/09/06 22:56:21 deraadt Exp $ */ +/* $OpenBSD: policy.c,v 1.18 2002/09/16 04:34:46 itojun Exp $ */ /* * Copyright 2002 Niels Provos <provos@citi.umich.edu> * All rights reserved. @@ -567,6 +567,8 @@ systrace_dumppolicy(void) if (systrace_writepolicy(policy) == -1) fprintf(stderr, "Failed to write policy for %s\n", policy->name); + else + policy->flags &= ~POLICY_CHANGED; } return (0); diff --git a/bin/systrace/systrace.c b/bin/systrace/systrace.c index f7d0155c984..47048410a83 100644 --- a/bin/systrace/systrace.c +++ b/bin/systrace/systrace.c @@ -1,4 +1,4 @@ -/* $OpenBSD: systrace.c,v 1.32 2002/08/05 23:27:53 provos Exp $ */ +/* $OpenBSD: systrace.c,v 1.33 2002/09/16 04:34:46 itojun Exp $ */ /* * Copyright 2002 Niels Provos <provos@citi.umich.edu> * All rights reserved. @@ -419,8 +419,9 @@ main(int argc, char **argv) char *filename = NULL; char *policypath = NULL; char *guipath = _PATH_XSYSTRACE; + struct timeval tv, tv_wait = {60, 0}; pid_t pidattach = 0; - int usex11 = 1; + int usex11 = 1, count; int background; while ((c = getopt(argc, argv, "aAituUd:g:f:p:")) != -1) { @@ -523,9 +524,31 @@ main(int argc, char **argv) if (usex11 && !automatic && !allow) requestor_start(guipath); - while (intercept_read(trfd) != -1) + /* Loop on requests */ + count = 0; + while (intercept_read(trfd) != -1) { if (!intercept_existpids()) break; + if (userpolicy) { + /* Periodically save modified policies */ + if (count == 0) { + /* Set new wait time */ + gettimeofday(&tv, NULL); + timeradd(&tv, &tv_wait, &tv); + } else if (count > 10) { + struct timeval now; + gettimeofday(&now, NULL); + + count = 0; + if (timercmp(&now, &tv, >)) { + /* Dump policy and cause new time */ + systrace_dumppolicy(); + continue; + } + } + count++; + } + } if (userpolicy) systrace_dumppolicy(); |