--- freem/src/cmd_zedit.c 2025/05/19 01:08:12 1.1 +++ freem/src/cmd_zedit.c 2025/05/19 02:03:31 1.2 @@ -1,7 +1,7 @@ /* * - * $Id: cmd_zedit.c,v 1.1 2025/05/19 01:08:12 snw Exp $ + * $Id: cmd_zedit.c,v 1.2 2025/05/19 02:03:31 snw Exp $ * Implementation of the ZEDIT command * * @@ -26,6 +26,9 @@ * along with FreeM. If not, see . * * $Log: cmd_zedit.c,v $ + * Revision 1.2 2025/05/19 02:03:31 snw + * Reverse-engineer and document argumented ZPRINT (thanks to D. Wicksell) + * * Revision 1.1 2025/05/19 01:08:12 snw * Add ZEDIT command (properly this time) * @@ -50,11 +53,13 @@ MRESULT cmd_zedit(MACTION *ra) short free_editor = FALSE; if (restricted_mode) { + /* we never shell out in restricted mode */ retval = NOSTAND; goto done; } if (rou_name[0] == EOL) { + /* there was no current routine */ retval = NOPGM; goto done; } @@ -64,13 +69,18 @@ MRESULT cmd_zedit(MACTION *ra) NULLPTRCHK(tgt_editor,"cmd_zedit"); snprintf (tgt_editor, STRLEN - 1, "/usr/bin/vi"); + + /* had to allocate the editor path on the heap, + so we need to free it later */ free_editor = TRUE; } if (*codptr == SP || *codptr == EOL) { + /* argumentless ZEDIT edits the current routine */ stcpy (tgt_routine, rou_name); } else { + /* argumented ZEDIT edits a specified routine */ expr (NAME); if (varnam[0] == '^') { @@ -94,17 +104,20 @@ MRESULT cmd_zedit(MACTION *ra) stcnv_m2c (tgt_routine); if ((rtn_get_path (tgt_routine, pth)) == FALSE) { + /* the routine could not be found */ retval = NOPGM; goto done; } snprintf (editor_command, sizeof (editor_command) - 1, "%s %s", tgt_editor, pth); - + + /* make the environment friendly to running external programs */ sig_attach (SIGUSR1, SIG_IGN); set_io (UNIX); system (editor_command); + /* back into mumps */ set_io (MUMPS); sig_attach (SIGUSR1, &oncld);