aboutsummaryrefslogtreecommitdiffstats
path: root/framework/src/audit/src/ausearch-time.c
diff options
context:
space:
mode:
Diffstat (limited to 'framework/src/audit/src/ausearch-time.c')
-rw-r--r--framework/src/audit/src/ausearch-time.c412
1 files changed, 412 insertions, 0 deletions
diff --git a/framework/src/audit/src/ausearch-time.c b/framework/src/audit/src/ausearch-time.c
new file mode 100644
index 00000000..3cd33c87
--- /dev/null
+++ b/framework/src/audit/src/ausearch-time.c
@@ -0,0 +1,412 @@
+/* ausearch-time.c - time handling utility functions
+ * Copyright 2006-08,2011 Red Hat Inc., Durham, North Carolina.
+ * All Rights Reserved.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ *
+ * Authors:
+ * Steve Grubb <sgrubb@redhat.com>
+ */
+
+#include "config.h"
+#include <stdio.h>
+#include <string.h>
+#include "ausearch-time.h"
+
+
+#define SECONDS_IN_DAY 24*60*60
+static void clear_tm(struct tm *t);
+static void replace_time(struct tm *t1, struct tm *t2);
+static void replace_date(struct tm *t1, struct tm *t2);
+
+
+time_t start_time = 0, end_time = 0;
+
+struct nv_pair {
+ int value;
+ const char *name;
+};
+
+static struct nv_pair timetab[] = {
+ { T_NOW, "now" },
+ { T_RECENT, "recent" },
+ { T_TODAY, "today" },
+ { T_YESTERDAY, "yesterday" },
+ { T_THIS_WEEK, "this-week" },
+ { T_WEEK_AGO, "week-ago" },
+ { T_THIS_MONTH, "this-month" },
+ { T_THIS_YEAR, "this-year" },
+};
+#define TIME_NAMES (sizeof(timetab)/sizeof(timetab[0]))
+
+int lookup_time(const char *name)
+{
+ int i;
+
+ for (i = 0; i < TIME_NAMES; i++) {
+ if (strcmp(timetab[i].name, name) == 0) {
+ return timetab[i].value;
+ }
+ }
+ return -1;
+
+}
+
+static void clear_tm(struct tm *t)
+{
+ t->tm_sec = 0; /* seconds */
+ t->tm_min = 0; /* minutes */
+ t->tm_hour = 0; /* hours */
+ t->tm_mday = 0; /* day of the month */
+ t->tm_mon = 0; /* month */
+ t->tm_year = 0; /* year */
+ t->tm_isdst = 0; /* DST flag */
+}
+
+static void set_tm_now(struct tm *d)
+{
+ time_t t = time(NULL);
+ struct tm *tv = localtime(&t);
+ replace_time(d, tv);
+ replace_date(d, tv);
+}
+
+static void set_tm_today(struct tm *d)
+{
+ time_t t = time(NULL);
+ struct tm *tv = localtime(&t);
+ d->tm_sec = 0; /* seconds */
+ d->tm_min = 0; /* minutes */
+ d->tm_hour = 0; /* hours */
+ replace_date(d, tv);
+}
+
+static void set_tm_yesterday(struct tm *d)
+{
+ time_t t = time(NULL) - (time_t)(SECONDS_IN_DAY);
+ struct tm *tv = localtime(&t);
+ d->tm_sec = 0; /* seconds */
+ d->tm_min = 0; /* minutes */
+ d->tm_hour = 0; /* hours */
+ replace_date(d, tv);
+}
+
+static void set_tm_recent(struct tm *d)
+{
+ time_t t = time(NULL) - (time_t)(10*60); /* 10 minutes ago */
+ struct tm *tv = localtime(&t);
+ replace_time(d, tv);
+ replace_date(d, tv);
+}
+
+static void set_tm_this_week(struct tm *d)
+{
+ time_t t = time(NULL);
+ struct tm *tv = localtime(&t);
+ d->tm_sec = 0; /* seconds */
+ d->tm_min = 0; /* minutes */
+ d->tm_hour = 0; /* hours */
+ t -= (time_t)(tv->tm_wday*SECONDS_IN_DAY);
+ tv = localtime(&t);
+ replace_date(d, tv);
+}
+
+static void set_tm_week_ago(struct tm *d)
+{
+ time_t t = time(NULL);
+ struct tm *tv;
+ d->tm_sec = 0; /* seconds */
+ d->tm_min = 0; /* minutes */
+ d->tm_hour = 0; /* hours */
+ t -= (time_t)(7*SECONDS_IN_DAY);
+ tv = localtime(&t);
+ replace_date(d, tv);
+}
+
+static void set_tm_this_month(struct tm *d)
+{
+ time_t t = time(NULL);
+ struct tm *tv = localtime(&t);
+ d->tm_sec = 0; /* seconds */
+ d->tm_min = 0; /* minutes */
+ d->tm_hour = 0; /* hours */
+ replace_date(d, tv);
+ d->tm_mday = 1; /* override day of month */
+}
+
+static void set_tm_this_year(struct tm *d)
+{
+ time_t t = time(NULL);
+ struct tm *tv = localtime(&t);
+ d->tm_sec = 0; /* seconds */
+ d->tm_min = 0; /* minutes */
+ d->tm_hour = 0; /* hours */
+ replace_date(d, tv);
+ d->tm_mday = 1; /* override day of month */
+ d->tm_mon = 0; /* override month */
+}
+
+/* Combine date & time into 1 struct. Results in date. */
+static void add_tm(struct tm *d, struct tm *t)
+{
+ time_t dst;
+ struct tm *lt;
+
+ replace_time(d, t);
+
+ /* Now we need to figure out if DST is in effect */
+ dst = time(NULL);
+ lt = localtime(&dst);
+ d->tm_isdst = lt->tm_isdst;
+}
+
+/* The time in t1 is replaced by t2 */
+static void replace_time(struct tm *t1, struct tm *t2)
+{
+ t1->tm_sec = t2->tm_sec; /* seconds */
+ t1->tm_min = t2->tm_min; /* minutes */
+ t1->tm_hour = t2->tm_hour; /* hours */
+}
+
+/* The date in t1 is replaced by t2 */
+static void replace_date(struct tm *t1, struct tm *t2)
+{
+ t1->tm_mday = t2->tm_mday; /* day */
+ t1->tm_mon = t2->tm_mon; /* month */
+ t1->tm_year = t2->tm_year; /* year */
+ t1->tm_isdst = t2->tm_isdst; /* daylight savings time */
+}
+
+/* Given 2 char strings, create a time struct *
+void set_time(struct tm *t, int num, const char *t1, const char *t2)
+{
+ switch (num)
+ {
+ case 1:
+ // if keyword, init time
+ // elif time use today and replace time
+ // elif date, set to 00:00:01 and replace date
+ // else error
+ break;
+ case 2:
+ // if keyword
+ // init time with it
+ // get other time str and replace
+ // otherwise, figure out which is time
+ // and set time adding them
+ break;
+ default:
+ break;
+ }
+} */
+
+static int lookup_and_set_time(const char *da, struct tm *d)
+{
+ int retval = lookup_time(da);
+ if (retval >= 0) {
+ switch (retval)
+ {
+ case T_NOW:
+ set_tm_now(d);
+ break;
+ case T_RECENT:
+ set_tm_recent(d);
+ break;
+ case T_TODAY:
+ set_tm_today(d);
+ break;
+ case T_YESTERDAY:
+ set_tm_yesterday(d);
+ break;
+ case T_THIS_WEEK:
+ set_tm_this_week(d);
+ break;
+ case T_WEEK_AGO:
+ set_tm_week_ago(d);
+ break;
+ case T_THIS_MONTH:
+ set_tm_this_month(d);
+ break;
+ case T_THIS_YEAR:
+ set_tm_this_year(d);
+ break;
+ }
+ return 0;
+ } else
+ return -1;
+}
+
+/* static void print_time(struct tm *d)
+{
+ char outstr[200];
+ strftime(outstr, sizeof(outstr), "%c", d);
+ printf("%s\n", outstr);
+} */
+
+int ausearch_time_start(const char *da, const char *ti)
+{
+/* If da == NULL, use current date */
+/* If ti == NULL, then use midnight 00:00:00 */
+ int rc = 0;
+ struct tm d, t;
+ char *ret;
+
+ if (da == NULL)
+ set_tm_now(&d);
+ else {
+ if (lookup_and_set_time(da, &d) < 0) {
+ ret = strptime(da, "%x", &d);
+ if (ret == NULL) {
+ fprintf(stderr,
+ "Invalid start date (%s). Month, Day, and Year are required.\n",
+ da);
+ return 1;
+ }
+ if (*ret != 0) {
+ fprintf(stderr,
+ "Error parsing start date (%s)\n", da);
+ return 1;
+ }
+ } else {
+ int keyword=lookup_time(da);
+ if (keyword == T_RECENT || keyword == T_NOW) {
+ if (ti == NULL || strcmp(ti, "00:00:00") == 0)
+ goto set_it;
+ }
+ }
+ }
+
+ if (ti != NULL) {
+ char tmp_t[36];
+
+ if (strlen(ti) <= 5) {
+ snprintf(tmp_t, sizeof(tmp_t), "%s:00", ti);
+ } else {
+ tmp_t[0]=0;
+ strncat(tmp_t, ti, sizeof(tmp_t)-1);
+ }
+ ret = strptime(tmp_t, "%X", &t);
+ if (ret == NULL) {
+ fprintf(stderr,
+ "Invalid start time (%s). Hour, Minute, and Second are required.\n",
+ ti);
+ return 1;
+ }
+ if (*ret != 0) {
+ fprintf(stderr, "Error parsing start time (%s)\n", ti);
+ return 1;
+ }
+ } else
+ clear_tm(&t);
+
+ add_tm(&d, &t);
+ if (d.tm_year < 104) {
+ fprintf(stderr, "Error - year is %d\n", d.tm_year+1900);
+ return -1;
+ }
+set_it:
+ // printf("start is: %s\n", ctime(&start_time));
+ start_time = mktime(&d);
+ if (start_time == -1) {
+ fprintf(stderr, "Error converting start time\n");
+ rc = -1;
+ }
+ return rc;
+}
+
+int ausearch_time_end(const char *da, const char *ti)
+{
+/* If date == NULL, use current date */
+/* If ti == NULL, use current time */
+ int rc = 0;
+ struct tm d, t;
+ char *ret;
+
+ if (da == NULL)
+ set_tm_now(&d);
+ else {
+ if (lookup_and_set_time(da, &d) < 0) {
+ ret = strptime(da, "%x", &d);
+ if (ret == NULL) {
+ fprintf(stderr,
+ "Invalid end date (%s). Month, Day, and Year are required.\n",
+ da);
+ return 1;
+ }
+ if (*ret != 0) {
+ fprintf(stderr,
+ "Error parsing end date (%s)\n", da);
+ return 1;
+ }
+ } else {
+ int keyword=lookup_time(da);
+ if (keyword == T_RECENT || keyword == T_NOW) {
+ if (ti == NULL || strcmp(ti, "00:00:00") == 0)
+ goto set_it;
+ }
+ // Special case today
+ if (keyword == T_TODAY) {
+ set_tm_now(&d);
+ if (ti == NULL || strcmp(ti, "00:00:00") == 0)
+ goto set_it;
+ }
+ }
+ }
+
+ if (ti != NULL) {
+ char tmp_t[36];
+
+ if (strlen(ti) <= 5) {
+ snprintf(tmp_t, sizeof(tmp_t), "%s:00", ti);
+ } else {
+ tmp_t[0]=0;
+ strncat(tmp_t, ti, sizeof(tmp_t)-1);
+ }
+ ret = strptime(tmp_t, "%X", &t);
+ if (ret == NULL) {
+ fprintf(stderr,
+ "Invalid end time (%s). Hour, Minute, and Second are required.\n",
+ ti);
+ return 1;
+ }
+ if (*ret != 0) {
+ fprintf(stderr, "Error parsing end time (%s)\n", ti);
+ return 1;
+ }
+ } else {
+ time_t tt = time(NULL);
+ struct tm *tv = localtime(&tt);
+ clear_tm(&t);
+ t.tm_hour = tv->tm_hour;
+ t.tm_min = tv->tm_min;
+ t.tm_sec = tv->tm_sec;
+ t.tm_isdst = tv->tm_isdst;
+
+ }
+ add_tm(&d, &t);
+ if (d.tm_year < 104) {
+ fprintf(stderr, "Error - year is %d\n", d.tm_year+1900);
+ return -1;
+ }
+set_it:
+ // printf("end is: %s\n", ctime(&end_time));
+ end_time = mktime(&d);
+ if (end_time == -1) {
+ fprintf(stderr, "Error converting end time\n");
+ rc = -1;
+ }
+ return rc;
+}
+