/* Interfaces to subprocesses on VMS.
- Copyright (C) 1988 Free Software Foundation, Inc.
+ Copyright (C) 1988, 1994 Free Software Foundation, Inc.
This file is part of GNU Emacs.
GNU Emacs 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 1, or (at your option)
+the Free Software Foundation; either version 2, or (at your option)
any later version.
GNU Emacs is distributed in the hope that it will be useful,
You should have received a copy of the GNU General Public License
along with GNU Emacs; see the file COPYING. If not, write to
-the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. */
+the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+Boston, MA 02111-1307, USA. */
/*
23 is the timer event flag
24-31 are reserved by VMS
*/
+#include <config.h>
#include <ssdef.h>
#include <iodef.h>
#include <dvidef.h>
#include <clidef.h>
#include "vmsproc.h"
+#include "lisp.h"
+#include "buffer.h"
+#include <file.h>
+#include "process.h"
+#include "commands.h"
+#include <errno.h>
+extern Lisp_Object call_process_cleanup ();
+
#define KEYBOARD_EVENT_FLAG 1
#define TIMER_EVENT_FLAG 23
error ("Could not write to subprocess: %x", status);
return (0);
}
- len =- out;
+ len -= out;
}
return (1);
}
close_process_descs ();
#endif
- if (XTYPE (current_buffer->directory) == Lisp_String)
+ if (STRINGP (current_buffer->directory))
chdir (XSTRING (current_buffer->directory)->data);
}
status = get_pty_channel (inDevName, outDevName, &inchannel, &outchannel);
if (!(status & 1))
error ("Error getting PTY channel: %x", status);
- if (XTYPE (buffer) == Lisp_Int)
+ if (INTEGERP (buffer))
{
dout.l = strlen ("NLA0:");
dout.a = "NLA0:";
/*
Start a read on the process channel
*/
- if (XTYPE (buffer) != Lisp_Int)
+ if (!INTEGERP (buffer))
{
start_vms_process_read (vs);
SpawnFlags = CLI$M_NOWAIT;
}
pid = vs->pid;
- if (XTYPE (buffer) == Lisp_Int)
+ if (INTEGERP (buffer))
{
#ifndef subprocesses
wait_without_blocking ();
return Qnil;
}
+ if (!NILP (display) && INTERACTIVE)
+ prepare_menu_bars ();
+
record_unwind_protect (call_process_cleanup,
Fcons (make_number (fd[0]), make_number (pid)));
- if (XTYPE (buffer) == Lisp_Buffer)
+ if (BUFFERP (buffer))
Fset_buffer (buffer);
immediate_quit = 1;
else
break;
}
- sys$dassgn (inchannel);
- sys$dassgn (outchannel);
- give_back_vms_process_stuff (vs);
+
+ sys$dassgn (inchannel);
+ sys$dassgn (outchannel);
+ give_back_vms_process_stuff (vs);
/* Wait for it to terminate, unless it already has. */
wait_for_termination (pid);
Event flags returned start at 1 for the keyboard.
Since Unix expects descriptor 0 for the keyboard,
- we substract one from the event flag.
+ we subtract one from the event flag.
*/
inchannel = vs->eventFlag-1;
/* Record this as an active process, with its channels.
As a result, child_setup will close Emacs's side of the pipes. */
chan_process[inchannel] = process;
- XFASTINT (XPROCESS (process)->infd) = inchannel;
- XFASTINT (XPROCESS (process)->outfd) = outchannel;
- XFASTINT (XPROCESS (process)->flags) = RUNNING;
+ XSETFASTINT (XPROCESS (process)->infd, inchannel);
+ XSETFASTINT (XPROCESS (process)->outfd, outchannel);
+ XPROCESS (process)->status = Qrun
/* Delay interrupts until we have a chance to store
the new fork's pid in its process structure */
*/
write_to_vms_process (vs, NO_ECHO, strlen (NO_ECHO));
- XFASTINT (XPROCESS (process)->pid) = pid;
+ XSETFASTINT (XPROCESS (process)->pid, pid);
sys$setast (1);
}
pid = vs->pid;
sys$setef (vs->eventFlag);
- for (tail = Vprocess_alist; XSYMBOL (tail) != XSYMBOL (Qnil); tail = XCONS (tail)->cdr)
+ for (tail = Vprocess_alist; ! NILP (tail); tail = XCDR (tail))
{
- proc = XCONS (XCONS (tail)->car)->cdr;
+ proc = XCDR (XCAR (tail));
p = XPROCESS (proc);
if (EQ (p->childp, Qt) && XFASTINT (p->pid) == pid)
break;
}
- if (XSYMBOL (tail) == XSYMBOL (Qnil))
+ if (NILP (tail))
return;
- child_changed++;
- XFASTINT (p->flags) = EXITED | CHANGED;
- /* Truncate the exit status to 24 bits so that it fits in a FASTINT */
- XFASTINT (p->reason) = (vs->exitStatus) & 0xffffff;
+ p->status = Fcons (Qexit, Fcons (make_number (vs->exitStatus), Qnil))
}
syms_of_vmsproc ()