From 02cf32c7395e267f3ebb95bd1668c346f3826865 Mon Sep 17 00:00:00 2001 From: Dianne Skoll Date: Fri, 3 Apr 2026 10:57:31 -0400 Subject: [PATCH] Permit use of "@ trigger" to specify now. --- src/funcs.c | 6 ++++- src/init.c | 77 +++++++++++++++++++++++++++++++++++++++++++++++++++-- 2 files changed, 80 insertions(+), 3 deletions(-) diff --git a/src/funcs.c b/src/funcs.c index 6a70b24c..9a7042a0 100644 --- a/src/funcs.c +++ b/src/funcs.c @@ -4727,6 +4727,7 @@ FEvalTrig(func_info *info) return r; } if (trig.tz != NULL && tim.ttime == NO_TIME) { + DestroyParser(&p); FreeTrig(&trig); return E_TZ_NO_AT; } @@ -4753,7 +4754,10 @@ FEvalTrig(func_info *info) dse = -1; } DestroyParser(&p); - if (r) return r; + if (r) { + FreeTrig(&trig); + return r; + } if (dse < 0) { RetVal.type = INT_TYPE; RETVAL = dse; diff --git a/src/init.c b/src/init.c index 33036baa..91354112 100644 --- a/src/init.c +++ b/src/init.c @@ -54,6 +54,8 @@ static int tty_init(int fd); static void tty_raw(int fd); static void tty_reset(int fd); +static int GetInitDateFromTrigger(char const *s, int *y, int *m, int *d, int *systime); + static void ProcessLongOption(char const *arg); /*************************************************************** * @@ -183,6 +185,7 @@ void InitRemind(int argc, char const *argv[]) int x; int dse; int ttyfd; + int r; /* Make sure remind is not installed set-uid or set-gid */ if (getgid() != getegid() || @@ -740,10 +743,28 @@ void InitRemind(int argc, char const *argv[]) if (i < argc) { while (i < argc) { arg = argv[i++]; + /* If it begins with '@' then it's a trigger spec */ + if (*arg == '@') { + if (m != NO_MON || d != NO_DAY || y != NO_YR || dse != NO_DATE) { + Usage(); + } + r = GetInitDateFromTrigger(arg+1, &y, &m, &d, &SysTime); + if (r == OK) { + if (SysTime != -1) { + DontQueue = 1; + Daemon = 0; + LocalSysTime = SysTime; + } + } else { + fprintf(stderr, "Could not evaluate command-line trigger: %s\n", GetErr(r)); + Usage(); + } + continue; + } FindToken(arg, &tok); switch (tok.type) { case T_Time: - if (SysTime != -1L) Usage(); + if (SysTime != -1) Usage(); else { SysTime = (long) tok.val * 60L; LocalSysTime = SysTime; @@ -753,7 +774,7 @@ void InitRemind(int argc, char const *argv[]) break; case T_DateTime: - if (SysTime != -1L) Usage(); + if (SysTime != -1) Usage(); if (m != NO_MON || d != NO_DAY || y != NO_YR || dse != NO_DATE) Usage(); SysTime = (tok.val % MINUTES_PER_DAY) * 60; LocalSysTime = SysTime; @@ -1398,3 +1419,55 @@ GetTerminalBackground(void) } return TerminalBackground; } + +static int +GetInitDateFromTrigger(char const *s, int *y, int *m, int *d, int *systime) +{ + Parser p; + Trigger trig; + TimeTrig tim; + int dse; + int r; + + CreateParser(s, &p); + r = ParseRem(&p, &trig, &tim); + if (r) { + DestroyParser(&p); + return r; + } + if (trig.typ != NO_TYPE) { + DestroyParser(&p); + FreeTrig(&trig); + return E_PARSE_ERR; + } + if (trig.tz != NULL && tim.ttime == NO_TIME) { + DestroyParser(&p); + FreeTrig(&trig); + return E_TZ_NO_AT; + } + EnterTimezone(trig.tz); + dse = ComputeTrigger(get_scanfrom(&trig), &trig, &tim, &r, 0); + ExitTimezone(trig.tz); + + DestroyParser(&p); + if (r) { + FreeTrig(&trig); + return r; + } + if (dse < 0) { + FreeTrig(&trig); + return E_CANT_TRIG; + } + if (dse >= 0) { + if (tim.ttime != NO_TIME) { + if (*systime != -1) { + Usage(); + } + dse=AdjustTriggerForTimeZone(&trig, dse, &tim, 1); + *systime = tim.ttime * 60; + } + FromDSE(dse, y, m, d); + } + FreeTrig(&trig); + return OK; +}