enum checkpoint_opcode
{
cop_dot,
+ cop_bell,
cop_echo,
+ cop_ttyout,
cop_sleep,
cop_exec
};
checkpoint_compile_action (const char *str)
{
struct checkpoint_action *act;
-
+
if (strcmp (str, ".") == 0 || strcmp (str, "dot") == 0)
alloc_action (cop_dot);
+ else if (strcmp (str, "bell") == 0)
+ alloc_action (cop_bell);
else if (strcmp (str, "echo") == 0)
alloc_action (cop_echo);
else if (strncmp (str, "echo=", 5) == 0)
act = alloc_action (cop_exec);
act->v.command = copy_string_unquote (str + 5);
}
+ else if (strncmp (str, "ttyout=", 7) == 0)
+ {
+ act = alloc_action (cop_ttyout);
+ act->v.command = copy_string_unquote (str + 7);
+ }
else if (strncmp (str, "sleep=", 6) == 0)
{
char *p;
}
void
-checkpoint_finish_compile ()
+checkpoint_finish_compile (void)
{
if (checkpoint_option)
{
if (!checkpoint_action)
/* Provide a historical default */
- checkpoint_compile_action ("echo");
+ checkpoint_compile_action ("echo");
}
else if (checkpoint_action)
/* Otherwise, set default checkpoint rate */
checkpoint_option = DEFAULT_CHECKPOINT;
}
-char *
+static char *
expand_checkpoint_string (const char *input, bool do_write, unsigned cpn)
{
const char *opstr = do_write ? gettext ("write") : gettext ("read");
case 'u':
outlen += cpslen - 2;
break;
-
+
case 's':
outlen += opstrlen - 2;
}
case 'u':
op = stpcpy (op, cps);
break;
-
+
case 's':
op = stpcpy (op, opstr);
break;
-
+
default:
*op++ = '%';
*op++ = *ip;
run_checkpoint_actions (bool do_write)
{
struct checkpoint_action *p;
+ FILE *tty = NULL;
for (p = checkpoint_action; p; p = p->next)
{
fputc ('.', stdlis);
fflush (stdlis);
break;
-
+
+ case cop_bell:
+ if (!tty)
+ tty = fopen ("/dev/tty", "w");
+ if (tty)
+ {
+ fputc ('\a', tty);
+ fflush (tty);
+ }
+ break;
+
case cop_echo:
{
char *tmp;
if (!str)
{
if (do_write)
- /* TRANSLATORS: This is a ``checkpoint of write operation'',
- *not* ``Writing a checkpoint''.
- E.g. in Spanish ``Punto de comprobaci@'on de escritura'',
- *not* ``Escribiendo un punto de comprobaci@'on'' */
+ /* TRANSLATORS: This is a "checkpoint of write operation",
+ *not* "Writing a checkpoint".
+ E.g. in Spanish "Punto de comprobaci@'on de escritura",
+ *not* "Escribiendo un punto de comprobaci@'on" */
str = gettext ("Write checkpoint %u");
else
- /* TRANSLATORS: This is a ``checkpoint of read operation'',
- *not* ``Reading a checkpoint''.
- E.g. in Spanish ``Punto de comprobaci@'on de lectura'',
- *not* ``Leyendo un punto de comprobaci@'on'' */
+ /* TRANSLATORS: This is a "checkpoint of read operation",
+ *not* "Reading a checkpoint".
+ E.g. in Spanish "Punto de comprobaci@'on de lectura",
+ *not* "Leyendo un punto de comprobaci@'on" */
str = gettext ("Read checkpoint %u");
}
tmp = expand_checkpoint_string (str, do_write, checkpoint);
free (tmp);
}
break;
-
+
+ case cop_ttyout:
+ if (!tty)
+ tty = fopen ("/dev/tty", "w");
+ if (tty)
+ {
+ char *tmp = expand_checkpoint_string (p->v.command, do_write,
+ checkpoint);
+ fprintf (tty, "%s", tmp);
+ fflush (tty);
+ free (tmp);
+ }
+ break;
+
case cop_sleep:
sleep (p->v.time);
break;
-
+
case cop_exec:
sys_exec_checkpoint_script (p->v.command,
archive_name_cursor[0],
break;
}
}
+ if (tty)
+ fclose (tty);
}
void
{
if (checkpoint_option && !(++checkpoint % checkpoint_option))
run_checkpoint_actions (do_write);
-}
-
+}