1: /* Asynchronous subprocess control for GNU Emacs.
   2:    Copyright (C) 1985 Richard M. Stallman.
   3: 
   4: This file is part of GNU Emacs.
   5: 
   6: GNU Emacs is distributed in the hope that it will be useful,
   7: but WITHOUT ANY WARRANTY.  No author or distributor
   8: accepts responsibility to anyone for the consequences of using it
   9: or for whether it serves any particular purpose or works at all,
  10: unless he says so in writing.  Refer to the GNU Emacs General Public
  11: License for full details.
  12: 
  13: Everyone is granted permission to copy, modify and redistribute
  14: GNU Emacs, but only under the conditions described in the
  15: GNU Emacs General Public License.   A copy of this license is
  16: supposed to have been given to you along with GNU Emacs so you
  17: can know your rights and responsibilities.  It should be in a
  18: file named COPYING.  Among other things, the copyright notice
  19: and this notice must be preserved on all copies.  */
  20: 
  21: 
  22: #include <signal.h>
  23: 
  24: #include "config.h"
  25: 
  26: #ifdef subprocesses
  27: /* The entire file is within this conditional */
  28: 
  29: #include <stdio.h>
  30: #include <errno.h>
  31: #include <setjmp.h>
  32: #include <sys/types.h>      /* some typedefs are used in sys/file.h */
  33: #include <sys/file.h>
  34: #include <sys/stat.h>
  35: #ifdef BSD
  36: #include <sys/ioctl.h>
  37: #endif /* BSD */
  38: #ifdef USG
  39: #include <termio.h>
  40: #include <fcntl.h>
  41: #endif /* USG */
  42: 
  43: #ifdef HAVE_TIMEVAL
  44: #if defined (USG) && !defined (UNIPLUS)
  45: #include <time.h>
  46: #else
  47: #include <sys/time.h>
  48: #endif
  49: #endif /* HAVE_TIMEVAL */
  50: 
  51: #if defined (HPUX) && defined (HAVE_PTYS)
  52: #include <sys/ptyio.h>
  53: #endif
  54: 
  55: #undef NULL
  56: #include "lisp.h"
  57: #include "window.h"
  58: #include "buffer.h"
  59: #include "process.h"
  60: #include "termhooks.h"
  61: 
  62: /* Define SIGCHLD as an alias for SIGCLD.  There are many conditionals
  63:    testing SIGCHLD.  */
  64: 
  65: #if !defined (SIGCHLD) && defined (SIGCLD)
  66: #define SIGCHLD SIGCLD
  67: #endif /* SIGCLD */
  68: 
  69: /* Define the structure that the wait system call stores.
  70:    On many systems, there is a structure defined for this.
  71:    But on vanilla-ish USG systems there is not.  */
  72: 
  73: #if !defined (BSD) && !defined (UNIPLUS) && !defined (STRIDE)
  74: #define WAITTYPE int
  75: #define WIFSTOPPED(w) ((w&0377) == 0177)
  76: #define WIFSIGNALED(w) ((w&0377) != 0177 && (w&~0377) == 0)
  77: #define WIFEXITED(w) ((w&0377) == 0)
  78: #define WRETCODE(w) (w >> 8)
  79: #define WSTOPSIG(w) (w >> 8)
  80: #define WCOREDUMP(w) ((w&0200) != 0)
  81: #define WTERMSIG(w) (w & 0377)
  82: #else
  83: #ifdef BSD4_1
  84: #include <wait.h>
  85: #else
  86: #include <sys/wait.h>
  87: #endif /* not BSD 4.1 */
  88: #define WAITTYPE union wait
  89: #define WRETCODE(w) w.w_retcode
  90: #define WSTOPSIG(w) w.w_stopsig
  91: #define WCOREDUMP(w) w.w_coredump
  92: #define WTERMSIG(w) w.w_termsig
  93: #endif
  94: 
  95: extern errno;
  96: extern sys_nerr;
  97: extern char *sys_errlist[];
  98: 
  99: #ifndef BSD4_1
 100: extern char *sys_siglist[];
 101: #else
 102: char *sys_siglist[] =
 103:   {
 104:     "bum signal!!",
 105:     "hangup",
 106:     "interrupt",
 107:     "quit",
 108:     "illegal instruction",
 109:     "trace trap",
 110:     "iot instruction",
 111:     "emt instruction",
 112:     "floating point exception",
 113:     "kill",
 114:     "bus error",
 115:     "segmentation violation",
 116:     "bad argument to system call",
 117:     "write on a pipe with no one to read it",
 118:     "alarm clock",
 119:     "software termination signal from kill",
 120:     "status signal",
 121:     "sendable stop signal not from tty",
 122:     "stop signal from tty",
 123:     "continue a stopped process",
 124:     "child status has changed",
 125:     "background read attempted from control tty",
 126:     "background write attempted from control tty",
 127:     "input record available at control tty",
 128:     "exceeded CPU time limit",
 129:     "exceeded file size limit"
 130:     };
 131: #endif
 132: 
 133: #ifdef vipc
 134: 
 135: #include "vipc.h"
 136: extern int comm_server;
 137: extern int net_listen_address;
 138: #endif vipc
 139: 
 140: 
 141: #ifdef SKTPAIR
 142: #include <sys/socket.h>
 143: #endif /* SKTPAIR */
 144: 
 145: int  child_changed;     /* Flag when a child process has ceased
 146: 				   to be */
 147: 
 148: /* Mask of bits indicating the descriptors that we wait for input on */
 149: 
 150: int input_wait_mask;
 151: 
 152: int delete_exited_processes;
 153: 
 154: #define MAXDESC 32
 155: 
 156: /* Indexed by descriptor, gives the process (if any) for that descriptor */
 157: Lisp_Object chan_process[MAXDESC];
 158: 
 159: /* Alist of elements (NAME . PROCESS) */
 160: Lisp_Object Vprocess_alist;
 161: 
 162: Lisp_Object Qprocessp;
 163: 
 164: Lisp_Object get_process ();
 165: 
 166: /* Buffered-ahead input char from process, indexed by channel.
 167:    -1 means empty (no char is buffered).
 168:    Used on sys V where the only way to tell if there is any
 169:    output from the process is to read at least one char.
 170:    Always -1 on systems that support FIONREAD.  */
 171: 
 172: int proc_buffered_char[MAXDESC];
 173: 
 174: #ifdef HAVE_PTYS
 175: 
 176: /* Open an available pty, putting descriptor in *ptyv,
 177:   and return the file name of the pty.  Return 0 if none available.  */
 178: 
 179: char ptyname[24];
 180: 
 181: char *
 182: pty (ptyv)
 183:      int *ptyv;
 184: {
 185:   struct stat stb;
 186:   register c, i;
 187: 
 188:   for (c = FIRST_PTY_LETTER; c <= 'z'; c++)
 189:     for (i = 0; i < 16; i++)
 190:       {
 191: #ifdef HPUX
 192:     sprintf (ptyname, "/dev/ptym/pty%c%x", c, i);
 193: #else
 194:     sprintf (ptyname, "/dev/pty%c%x", c, i);
 195: #endif /* not HPUX */
 196:     if (stat (ptyname, &stb) < 0)
 197:       return 0;
 198: 
 199:     *ptyv = open (ptyname, O_RDWR | O_NDELAY, 0);
 200:     if (*ptyv >= 0)
 201:       {
 202:         /* check to make certain that both sides are available
 203: 	       this avoids a nasty yet stupid bug in rlogins */
 204:         int x;
 205: #ifdef HPUX
 206:             sprintf (ptyname, "/dev/pty/tty%c%x", c, i);
 207: #else
 208:             sprintf (ptyname, "/dev/tty%c%x", c, i);
 209: #endif /* not HPUX */
 210: #ifndef UNIPLUS
 211:         x = open (ptyname, O_RDWR | O_NDELAY, 0);
 212:         if (x < 0)
 213:           {
 214:         close (*ptyv);
 215:         continue;
 216:           }
 217:         close(x);
 218: #endif /* not UNIPLUS */
 219:         /*
 220: 		* If the following statement is included,
 221: 		* then a 0 length record is EOT, but no other
 222: 		* control characters can be sent down the pty
 223: 		* (e.g., ^S/^Q, ^O, etc.).  If it is not
 224: 		* included, then sending ^D down the pty-pipe
 225: 		* makes a pretty good EOF.
 226: 		*/
 227: /*	      ioctl( *ptyv, TIOCREMOTE, &on );	/* for EOT */
 228: /* this is said to be unecessary, and to be harmful in 4.3.  */
 229: /*	    ioctl (*ptyv, FIONBIO, &on);  */
 230:         return ptyname;
 231:       }
 232:       }
 233:   return 0;
 234: }
 235: 
 236: #endif /* HAVE_PTYS */
 237: 
 238: Lisp_Object
 239: make_process (name)
 240:      Lisp_Object name;
 241: {
 242:   Lisp_Object val, tem, name1;
 243:   register struct Lisp_Process *p;
 244:   char suffix[10];
 245:   register int i;
 246: 
 247:   val = Fmake_vector (make_number ((sizeof (struct Lisp_Process)
 248:                     - sizeof (int) - sizeof (struct Lisp_Vector *))
 249:                    / sizeof (Lisp_Object)),
 250:               Qnil);
 251:   XSETTYPE (val, Lisp_Process);
 252: 
 253:   p = XPROCESS (val);
 254:   XFASTINT (p->infd) = 0;
 255:   XFASTINT (p->outfd) = 0;
 256:   XFASTINT (p->pid) = 0;
 257:   XFASTINT (p->flags) = 0;
 258:   XFASTINT (p->reason) = 0;
 259:   p->mark = Fmake_marker ();
 260: 
 261:   /* If name is already in use, modify it until it is unused.  */
 262: 
 263:   name1 = name;
 264:   for (i = 1; ; i++)
 265:     {
 266:       tem = Fget_process (name1);
 267:       if (NULL (tem)) break;
 268:       sprintf (suffix, "<%d>", i);
 269:       name1 = concat2 (name, build_string (suffix));
 270:     }
 271:   name = name1;
 272:   p->name = name;
 273:   Vprocess_alist = Fcons (Fcons (name, val), Vprocess_alist);
 274:   return val;
 275: }
 276: 
 277: remove_process (proc)
 278:      Lisp_Object proc;
 279: {
 280:   Lisp_Object pair;
 281: 
 282:   pair = Frassq (proc, Vprocess_alist);
 283:   Vprocess_alist = Fdelq (pair, Vprocess_alist);
 284:   Fset_marker (XPROCESS (proc)->mark, Qnil, Qnil);
 285: 
 286:   deactivate_process (proc);
 287: }
 288: 
 289: DEFUN ("processp", Fprocessp, Sprocessp, 1, 1, 0,
 290:   "Return t if OBJECT is a process.")
 291:   (obj)
 292:      Lisp_Object obj;
 293: {
 294:   return XTYPE (obj) == Lisp_Process ? Qt : Qnil;
 295: }
 296: 
 297: DEFUN ("get-process", Fget_process, Sget_process, 1, 1, 0,
 298:   "Return the process named NAME, or nil if there is none.")
 299:   (name)
 300:      Lisp_Object name;
 301: {
 302:   if (XTYPE (name) == Lisp_Process)
 303:     return name;
 304:   CHECK_STRING (name, 0);
 305:   return Fcdr (Fassoc (name, Vprocess_alist));
 306: }
 307: 
 308: DEFUN ("get-buffer-process", Fget_buffer_process, Sget_buffer_process, 1, 1, 0,
 309:   "Return the (or, a) process associated with BUFFER.\n\
 310: BUFFER may be a buffer or the name of one.")
 311:   (name)
 312:      Lisp_Object name;
 313: {
 314:   Lisp_Object buf, tail, proc;
 315: 
 316:   if (NULL (name)) return Qnil;
 317:   buf = Fget_buffer (name);
 318:   if (NULL (buf)) return Qnil;
 319: 
 320:   for (tail = Vprocess_alist; !NULL (tail); tail = Fcdr (tail))
 321:     {
 322:       proc = Fcdr (Fcar (tail));
 323:       if (XTYPE (proc) == Lisp_Process && EQ (XPROCESS (proc)->buffer, buf))
 324:     return proc;
 325:     }
 326:   return Qnil;
 327: }
 328: 
 329: /* This is how commands for the user decode process arguments */
 330: 
 331: Lisp_Object
 332: get_process (name)
 333:      Lisp_Object name;
 334: {
 335:   Lisp_Object proc;
 336:   if (NULL (name))
 337:     proc = Fget_buffer_process (Fcurrent_buffer ());
 338:   else
 339:     {
 340:       proc = Fget_process (name);
 341:       if (NULL (proc))
 342:     proc = Fget_buffer_process (Fget_buffer (name));
 343:     }
 344: 
 345:   if (!NULL (proc))
 346:     return proc;
 347: 
 348:   if (NULL (name))
 349:     error ("Current buffer has no process");
 350:   else
 351:     error ("Process %s does not exist", XSTRING (name)->data);
 352:   /* NOTREACHED */
 353: }
 354: 
 355: DEFUN ("delete-process", Fdelete_process, Sdelete_process, 1, 1, 0,
 356:   "Delete PROCESS: kill it and forget about it immediately.\n\
 357: PROCESS may be a process or the name of one, or a buffer name.")
 358:   (proc)
 359:      Lisp_Object proc;
 360: {
 361:   proc = get_process (proc);
 362:   if (XFASTINT (XPROCESS (proc)->infd))
 363:     Fkill_process (proc, Qnil);
 364:   remove_process (proc);
 365:   return Qnil;
 366: }
 367: 
 368: DEFUN ("process-status", Fprocess_status, Sprocess_status, 1, 1, 0,
 369:   "Return the status of PROCESS: a symbol, one of these:\n\
 370: run  -- for a process that is running.\n\
 371: stop -- for a process stopped but continuable.\n\
 372: exit -- for a process that has exited.\n\
 373: signal -- for a process that has got a fatal signal.\n\
 374: command -- for a command channel opened to Emacs by another process.\n\
 375: external -- for an i/o channel opened to Emacs by another process.\n\
 376: nil -- if arg is a process name and no such process exists.")
 377:   (proc)
 378:      Lisp_Object proc;
 379: {
 380:   register struct Lisp_Process *p;
 381:   proc = Fget_process (proc);
 382:   if (NULL (proc))
 383:     return proc;
 384:   p = XPROCESS (proc);
 385: 
 386:   switch (XFASTINT (p->flags) & PROC_STATUS)
 387:     {
 388:     case RUNNING:
 389:       if (!NULL (p->childp))
 390:     return intern ("run");
 391:       else if (!NULL (p->command_channel_p))
 392:     return intern ("command");
 393:       return intern ("external");
 394: 
 395:     case EXITED:
 396:       return intern ("exit");
 397: 
 398:     case SIGNALED:
 399:       return intern ("signal");
 400: 
 401:     case STOPPED:
 402:       return intern ("stop");
 403:     }
 404: 
 405:   /* NOTREACHED */
 406: }
 407: 
 408: DEFUN ("process-id", Fprocess_id, Sprocess_id, 1, 1, 0,
 409:   "Return the process id of PROCESS.\n\
 410: This is the pid of the Unix process which PROCESS uses or talks to.")
 411:   (proc)
 412:      Lisp_Object proc;
 413: {
 414:   CHECK_PROCESS (proc, 0);
 415:   return XPROCESS (proc)->pid;
 416: }
 417: 
 418: DEFUN ("process-name", Fprocess_name, Sprocess_name, 1, 1, 0,
 419:   "Return the name of PROCESS, as a string.\n\
 420: This is the name of the program invoked in PROCESS,\n\
 421: possibly modified to make it unique among process names.")
 422:   (proc)
 423:      Lisp_Object proc;
 424: {
 425:   CHECK_PROCESS (proc, 0);
 426:   return XPROCESS (proc)->name;
 427: }
 428: 
 429: DEFUN ("process-command", Fprocess_command, Sprocess_command, 1, 1, 0,
 430:   "Return the command that was executed to start PROCESS.\n\
 431: This is a list of strings, the first string being the program executed\n\
 432: and the rest of the strings being the arguments given to it.\n\
 433: For a non-child channel, this is nil.")
 434:   (proc)
 435:      Lisp_Object proc;
 436: {
 437:   CHECK_PROCESS (proc, 0);
 438:   return XPROCESS (proc)->command;
 439: }
 440: 
 441: DEFUN ("set-process-buffer", Fset_process_buffer, Sset_process_buffer,
 442:   2, 2, 0,
 443:   "Set buffer associated with PROCESS to BUFFER (a buffer, or nil).")
 444:   (proc, buffer)
 445:      Lisp_Object proc, buffer;
 446: {
 447:   CHECK_PROCESS (proc, 0);
 448:   if (!NULL (buffer))
 449:     CHECK_BUFFER (buffer, 1);
 450:   XPROCESS (proc)->buffer = buffer;
 451:   return buffer;
 452: }
 453: 
 454: DEFUN ("process-buffer", Fprocess_buffer, Sprocess_buffer,
 455:   1, 1, 0,
 456:   "Return the buffer PROCESS is associated with.\n\
 457: Output from PROCESS is inserted in this buffer\n\
 458: unless PROCESS has a filter.")
 459:   (proc)
 460:      Lisp_Object proc;
 461: {
 462:   CHECK_PROCESS (proc, 0);
 463:   return XPROCESS (proc)->buffer;
 464: }
 465: 
 466: DEFUN ("process-mark", Fprocess_mark, Sprocess_mark,
 467:   1, 1, 0,
 468:   "Return the marker for the end of the last output from PROCESS.")
 469:   (proc)
 470:      Lisp_Object proc;
 471: {
 472:   CHECK_PROCESS (proc, 0);
 473:   return XPROCESS (proc)->mark;
 474: }
 475: 
 476: DEFUN ("set-process-filter", Fset_process_filter, Sset_process_filter,
 477:   2, 2, 0,
 478:   "Give PROCESS the filter function FILTER; nil means no filter.\n\
 479: When a process has a filter, each time it does output\n\
 480: the entire string of output is passed to the filter.\n\
 481: The filter gets two arguments: the process and the string of output.\n\
 482: If the process has a filter, its buffer is not used for output.")
 483:   (proc, filter)
 484:      Lisp_Object proc, filter;
 485: {
 486:   CHECK_PROCESS (proc, 0);
 487:   XPROCESS (proc)->filter = filter;
 488:   return filter;
 489: }
 490: 
 491: DEFUN ("process-filter", Fprocess_filter, Sprocess_filter,
 492:   1, 1, 0,
 493:   "Returns the filter function of PROCESS; nil if none.\n\
 494: See set-process-filter for more info on filter functions.")
 495:   (proc)
 496:      Lisp_Object proc;
 497: {
 498:   CHECK_PROCESS (proc, 0);
 499:   return XPROCESS (proc)->filter;
 500: }
 501: 
 502: DEFUN ("set-process-sentinel", Fset_process_sentinel, Sset_process_sentinel,
 503:   2, 2, 0,
 504:   "Give PROCESS the sentinel SENTINEL; nil for none.\n\
 505: The sentinel is called as a function when the process changes state.\n\
 506: It gets two arguments: the process, and a string describing the change.")
 507:   (proc, sentinel)
 508:      Lisp_Object proc, sentinel;
 509: {
 510:   CHECK_PROCESS (proc, 0);
 511:   XPROCESS (proc)->sentinel = sentinel;
 512:   return sentinel;
 513: }
 514: 
 515: DEFUN ("process-sentinel", Fprocess_sentinel, Sprocess_sentinel,
 516:   1, 1, 0,
 517:   "Return the sentinel of PROCESS; nil if none.\n\
 518: See set-process-sentinel for more info on sentinels.")
 519:   (proc)
 520:      Lisp_Object proc;
 521: {
 522:   CHECK_PROCESS (proc, 0);
 523:   return XPROCESS (proc)->sentinel;
 524: }
 525: 
 526: DEFUN ("process-kill-without-query", Fprocess_kill_without_query,
 527:   Sprocess_kill_without_query, 1, 1, 0,
 528:   "Say no query needed if this process is running when Emacs is exited.")
 529:   (proc)
 530:      Lisp_Object proc;
 531: {
 532:   CHECK_PROCESS (proc, 0);
 533:   XPROCESS (proc)->kill_without_query = Qt;
 534:   return Qt;
 535: }
 536: 
 537: Lisp_Object
 538: list_processes_1 ()
 539: {
 540:   Lisp_Object tail, proc, minspace, tem, tem1;
 541:   register struct buffer *old = bf_cur;
 542:   register struct Lisp_Process *p;
 543:   register int state;
 544:   char tembuf[10];
 545: 
 546:   XFASTINT (minspace) = 1;
 547: 
 548:   SetBfp (XBUFFER (Vstandard_output));
 549:   Fbuffer_flush_undo (Vstandard_output);
 550: 
 551:   bf_cur->truncate_lines = Qt;
 552: 
 553:   write_string ("\
 554: Proc         Status   Buffer         Command\n\
 555: ----         ------   ------         -------\n", -1);
 556: 
 557:   for (tail = Vprocess_alist; !NULL (tail); tail = Fcdr (tail))
 558:     {
 559:       proc = Fcdr (Fcar (tail));
 560:       p = XPROCESS (proc);
 561:       if (NULL (p->childp))
 562:     continue;
 563: 
 564:       Finsert (1, &p->name);
 565:       Findent_to (make_number (13), minspace);
 566: 
 567:       state = XFASTINT (p->flags) & PROC_STATUS;
 568:       switch (state)
 569:     {
 570:     case RUNNING:
 571:       write_string ("Run", -1);
 572:       break;
 573: 
 574:     case STOPPED:
 575:       write_string ("Stop", -1);
 576:       break;
 577: 
 578:     case EXITED:
 579:       write_string ("Exit", -1);
 580:       if (XFASTINT (p->reason))
 581:         {
 582:           sprintf (tembuf, " %d", XFASTINT (p->reason));
 583:           write_string (tembuf, -1);
 584:         }
 585:       remove_process (proc);
 586:       break;
 587: 
 588:     case SIGNALED:
 589:       if (XFASTINT (p->reason) < NSIG)
 590:         write_string (sys_siglist [XFASTINT (p->reason)], -1);
 591:       else
 592:         write_string ("Signal", -1);
 593:       remove_process (proc);
 594:     }
 595: 
 596:       Findent_to (make_number (22), minspace);
 597:       if (NULL (p->buffer))
 598:     InsStr ("(none)");
 599:       else if (NULL (XBUFFER (p->buffer)->name))
 600:     InsStr ("(Killed)");
 601:       else
 602:     Finsert (1, &XBUFFER (p->buffer)->name);
 603: 
 604:       Findent_to (make_number (37), minspace);
 605: 
 606:       tem = p->command;
 607:       while (1)
 608:     {
 609:       tem1 = Fcar (tem);
 610:       Finsert (1, &tem1);
 611:       tem = Fcdr (tem);
 612:       if (NULL (tem))
 613:         break;
 614:       InsStr (" ");
 615:     }
 616: 
 617:       InsStr ("\n");
 618:     }
 619: 
 620:   SetBfp (old);
 621:   return Qnil;
 622: }
 623: 
 624: DEFUN ("list-processes", Flist_processes, Slist_processes, 0, 0, "",
 625:   "Display a list of all processes.\n\
 626: \(Any processes listed as Exited or Signaled are actually eliminated\n\
 627: after the listing is made.)")
 628:   ()
 629: {
 630:   internal_with_output_to_temp_buffer ("*Process List*",
 631:                        list_processes_1, Qnil);
 632:   return Qnil;
 633: }
 634: 
 635: DEFUN ("start-process", Fstart_process, Sstart_process, 3, MANY, 0,
 636:   "Start a program in a subprocess.  Return the process object for it.\n\
 637: First arg is name for process.  It is modified if nec to make it unique.\n\
 638: Second arg is buffer to associate with the process (or buffer name).\n\
 639:  Process output goes at end of that buffer, unless you specify\n\
 640:  an output stream or filter function to handle the output.\n\
 641: Third arg is program file name.  It is searched for as in the shell.\n\
 642: Remaining arguments are strings to give program as arguments.")
 643:   (nargs, args)
 644:      int nargs;
 645:      Lisp_Object *args;
 646: {
 647:   Lisp_Object buffer, name, program, proc, tem;
 648:   register unsigned char **new_argv;
 649:   register int i;
 650: 
 651:   name = args[0];
 652:   CHECK_STRING (name, 0);
 653: 
 654:   buffer = args[1];
 655:   program = args[2];
 656: 
 657:   CHECK_STRING (program, 2);
 658: 
 659:   new_argv = (unsigned char **) alloca ((nargs - 1) * sizeof (char *));
 660: 
 661:   for (i = 3; i < nargs; i++)
 662:     {
 663:       tem = args[i];
 664:       CHECK_STRING (tem, i);
 665:       new_argv[i - 2] = XSTRING (tem)->data;
 666:     }
 667:   new_argv[i - 2] = 0;
 668:   new_argv[0] = XSTRING (program)->data;
 669: 
 670:   /* If program file name is not absolute, search our path for it */
 671:   if (new_argv[0][0] != '/')
 672:     {
 673:       tem = Qnil;
 674:       openp (Vexec_path, program, "", &tem, 1);
 675:       if (NULL (tem))
 676:     report_file_error ("Searching for program", Fcons (program, Qnil));
 677:       new_argv[0] = XSTRING (tem)->data;
 678:     }
 679: 
 680:   if (!NULL (buffer))
 681:     buffer = Fget_buffer_create (buffer);
 682:   proc = make_process (name);
 683: 
 684:   XPROCESS (proc)->childp = Qt;
 685:   XPROCESS (proc)->command_channel_p = Qnil;
 686:   XPROCESS (proc)->buffer = buffer;
 687:   XPROCESS (proc)->sentinel = Qnil;
 688:   XPROCESS (proc)->filter = Qnil;
 689:   XPROCESS (proc)->command = Flist (nargs - 2, args + 2);
 690: 
 691:   create_process (proc, new_argv);
 692: 
 693:   return proc;
 694: }
 695: 
 696: create_process_1 (signo)
 697:      int signo;
 698: {
 699: #ifdef USG
 700:   /* USG systems forget handlers when they are used;
 701:      must reestablish each time */
 702:   signal (signo, create_process_1);
 703: #endif /* USG */
 704: }
 705: 
 706: create_process (process, new_argv)
 707:      Lisp_Object process;
 708:      char **new_argv;
 709: {
 710:   int pid, inchannel, outchannel, forkin, forkout;
 711:   int sv[2];
 712:   int (*sigchld)();
 713: 
 714: #ifdef HAVE_PTYS
 715:   char  *ptyname;
 716: 
 717:   ptyname = pty (&inchannel);
 718:   outchannel = inchannel;
 719:   if (ptyname)
 720:     {
 721:       forkout = forkin = open (ptyname, O_RDWR, 0);
 722:       if (forkin < 0)
 723:     report_file_error ("Opening pty", Qnil);
 724:     }
 725:   else
 726: #endif /* HAVE_PTYS */
 727: #ifdef SKTPAIR
 728:     {
 729:       if (socketpair (AF_UNIX, SOCK_STREAM, 0, sv) < 0)
 730:     report_file_error ("Opening socketpair", Qnil);
 731:       outchannel = inchannel = sv[0];
 732:       forkout = forkin = sv[1];
 733:     }
 734: #else /* not SKTPAIR */
 735:     {
 736:       pipe (sv);
 737:       inchannel = sv[0];
 738:       forkout = sv[1];
 739:       pipe (sv);
 740:       outchannel = sv[1];
 741:       forkin = sv[0];
 742:     }
 743: #endif /* not SKTPAIR */
 744: 
 745: #ifdef FIOCLEX
 746:   ioctl (inchannel, FIOCLEX, 0);
 747:   ioctl (outchannel, FIOCLEX, 0);
 748: #endif
 749: 
 750: /* Stride people say it's a mystery why this is needed
 751:    as well as the O_NDELAY, but that it fails without this.  */
 752: #ifdef STRIDE
 753:   {
 754:     int one = 1;
 755:     ioctl (inchannel, FIONBIO, &one);
 756:   }
 757: #endif
 758: 
 759: #ifdef O_NDELAY
 760:   fcntl (inchannel, F_SETFL, O_NDELAY);
 761: #endif
 762: 
 763:   chan_process[inchannel] = process;
 764:   XFASTINT (XPROCESS (process)->infd) = inchannel;
 765:   XFASTINT (XPROCESS (process)->outfd) = outchannel;
 766:   XFASTINT (XPROCESS (process)->flags) = RUNNING;
 767: 
 768:   input_wait_mask |= ChannelMask (inchannel);
 769: 
 770:   /* Delay interrupts until we have a chance to store
 771:      the new fork's pid in its process structure */
 772: #ifdef SIGCHLD
 773: #ifdef BSD4_1
 774:   sighold (SIGCHLD);
 775: #else /* not BSD4_1 */
 776: #if defined (BSD) || defined (UNIPLUS)
 777:   sigsetmask (1 << (SIGCHLD - 1));
 778: #else /* ordinary USG */
 779:   sigchld = signal (SIGCHLD, SIG_DFL);
 780: #endif /* ordinary USG */
 781: #endif /* not BSD4_1 */
 782: #endif /* SIGCHLD */
 783: 
 784:   pid = vfork ();
 785:   if (pid == 0)
 786:     {
 787:       int xforkin = forkin;
 788:       int xforkout = forkout;
 789: #ifdef HAVE_PTYS
 790: #ifdef TIOCNOTTY
 791:       /* In 4.3BSD, the TIOCSPGRP bug has been fixed, and now you
 792: 	 can do TIOCSPGRP only to the process's controlling tty.
 793: 	 We must make the pty terminal the controlling tty of the child.  */
 794:       if (ptyname)
 795:     {
 796:       /* I wonder: would just ioctl (0, TIOCNOTTY, 0) work here?
 797: 	     I can't test it since I don't have 4.3.  */
 798:       int j = open ("/dev/tty", O_RDWR, 0);
 799:       ioctl (j, TIOCNOTTY, 0);
 800:           close (j);
 801: 
 802: #ifndef UNIPLUS
 803:       /* I wonder if close (open (ptyname, ...)) would work?  */
 804:       close (xforkin);
 805:           xforkout = xforkin = open (ptyname, O_RDWR, 0);
 806: 
 807:           if (xforkin < 0)
 808:         abort ();
 809: #endif /* not UNIPLUS */
 810:         }
 811: #endif /* TIOCNOTTY */
 812: #endif /* HAVE_PTYS */
 813:       child_setup (xforkin, xforkout, xforkout, new_argv);
 814:     }
 815: 
 816:   /* If the subfork execv fails, and it exits,
 817:      this close hangs.  I don't know why.
 818:      So have an interrupt jar it loose.  */
 819:   signal (SIGALRM, create_process_1);
 820:   alarm (1);
 821:   close (forkin);
 822:   alarm (0);
 823:   if (forkin != forkout)
 824:     close (forkout);
 825: 
 826:   if (pid < 0)
 827:     {
 828:       remove_process (process);
 829:       report_file_error ("Doing vfork", Qnil);
 830:     }
 831: 
 832:   XFASTINT (XPROCESS (process)->pid) = pid;
 833: 
 834: #ifdef SIGCHLD
 835: #ifdef BSD4_1
 836:   sigrelse (SIGCHLD);
 837: #else /* not BSD4_1 */
 838: #if defined (BSD) || defined (UNIPLUS)
 839:   sigsetmask (0);
 840: #else /* ordinary USG */
 841:   signal (SIGCHLD, sigchld);
 842: #endif /* ordinary USG */
 843: #endif /* not BSD4_1 */
 844: #endif /* SIGCHLD */
 845: }
 846: 
 847: deactivate_process (proc)
 848:      Lisp_Object proc;
 849: {
 850:   register int inchannel, outchannel;
 851:   register struct Lisp_Process *p = XPROCESS (proc);
 852: 
 853:   inchannel = XFASTINT (p->infd);
 854:   outchannel = XFASTINT (p->outfd);
 855: 
 856:   if (inchannel)
 857:     {
 858:       /* Beware SIGCHLD hereabouts. */
 859:       flush_pending_output (inchannel);
 860:       close (inchannel);
 861:       if (outchannel  &&  outchannel != inchannel)
 862:     close (outchannel);
 863: 
 864:       XFASTINT (p->infd) = 0;
 865:       XFASTINT (p->outfd) = 0;
 866:       chan_process[inchannel] = Qnil;
 867:       input_wait_mask &= ~ChannelMask (inchannel);
 868:     }
 869: }
 870: 
 871: DEFUN ("accept-process-output", Faccept_process_output, Saccept_process_output,
 872:   0, 1, 0,
 873:   "Allow any pending output from subprocesses to be read by Emacs.\n\
 874: It is read into the processs' buffers or given to their filter functions.\n\
 875: Non-nil arg PROCESS means do not return until some output has been received\n\
 876: from PROCESS.")
 877:   (proc)
 878:      Lisp_Object proc;
 879: {
 880:   if (NULL (proc))
 881:     wait_reading_process_input (-1, 0, 0);
 882:   else
 883:     {
 884:       proc = get_process (proc);
 885:       wait_reading_process_input (0, 10 + XFASTINT (XPROCESS (proc)->infd),
 886:                   0);
 887:     }
 888:   return Qnil;
 889: }
 890: 
 891: /* Read and dispose of subprocess output
 892:  while waiting for timeout to elapse and/or keyboard input to be available.
 893: 
 894:  time_limit is the timeout in seconds, or zero for no limit.
 895:  -1 means gobble data available immediately but don't wait for any.
 896: 
 897:  read_kbd is 1 to return when input is available.
 898:  Negative means caller will actually read the input.
 899:  10 + I means wait until input received from channel I.
 900: 
 901:  do_display means redisplay should be done to show
 902:  subprocess output that arrives.  */
 903: 
 904: wait_reading_process_input (time_limit, read_kbd, do_display)
 905:      int time_limit, read_kbd, do_display;
 906: {
 907:   register int channel, nfds, m;
 908:   int Available = 0;
 909:   int Exception;
 910:   Lisp_Object proc;
 911: #ifdef HAVE_TIMEVAL
 912:   struct timeval timeout, end_time, garbage;
 913: #else
 914:   long timeout, end_time, temp;
 915: #endif /* not HAVE_TIMEVAL */
 916:   int Atemp;
 917:   int wait_channel = 0;
 918:   extern kbd_count;
 919: 
 920:   if (read_kbd > 10)
 921:     {
 922:       wait_channel = read_kbd - 10;
 923:       read_kbd = 0;
 924:     }
 925: 
 926:   /* Since we may need to wait several times,
 927:      compute the absolute time to return at.  */
 928:   if (time_limit)
 929:     {
 930: #ifdef HAVE_TIMEVAL
 931:       gettimeofday (&end_time, &garbage);
 932:       end_time.tv_sec += time_limit;
 933: #else /* not HAVE_TIMEVAL */
 934:       time (&end_time);
 935:       end_time += time_limit;
 936: #endif /* not HAVE_TIMEVAL */
 937:     }
 938: 
 939:   while (1)
 940:     {
 941:       /* If calling from keyboard input, do not quit
 942: 	 since we want to return C-g as an input character.
 943: 	 Otherwise, do pending quit if requested.  */
 944:       if (read_kbd >= 0)
 945:     QUIT;
 946: 
 947:       /* If status of something has changed, and no input is available,
 948: 	 notify the user of the change right away */
 949:       if (child_changed && do_display)
 950:     {
 951:       Atemp = input_wait_mask;
 952: #ifdef HAVE_TIMEVAL
 953:       timeout.tv_sec=0; timeout.tv_usec=0;
 954: #else /* not HAVE_TIMEVAL */
 955:       timeout = 0;
 956: #endif /* not HAVE_TIMEVAL */
 957:       if (select (MAXDESC, &Atemp, 0, 0, &timeout) <= 0)
 958:         change_msgs();
 959:     }
 960: 
 961:       if (fix_screen_hook)
 962:     (*fix_screen_hook) ();
 963: 
 964:       /* Compute time from now till when time limit is up */
 965:       /* Exit if already run out */
 966:       if (time_limit == -1)
 967:     {
 968:       /* -1 specified for timeout means
 969: 	     gobble output available now
 970: 	     but don't wait at all. */
 971:       time_limit = -2;
 972: #ifdef HAVE_TIMEVAL
 973:       timeout.tv_sec = 0;
 974:       timeout.tv_usec = 0;
 975: #else
 976:       timeout = 0;
 977: #endif /* not HAVE_TIMEVAL */
 978:     }
 979:       else if (time_limit)
 980:     {
 981: #ifdef HAVE_TIMEVAL
 982:       gettimeofday (&timeout, &garbage);
 983:       timeout.tv_sec = end_time.tv_sec - timeout.tv_sec;
 984:       timeout.tv_usec = end_time.tv_usec - timeout.tv_usec;
 985:       if (timeout.tv_usec < 0)
 986:         timeout.tv_usec += 1000000,
 987:         timeout.tv_sec--;
 988:       if (timeout.tv_sec < 0)
 989:         break;
 990: #else /* not HAVE_TIMEVAL */
 991:           time (&temp);
 992:       timeout = end_time - temp;
 993:       if (timeout < 0)
 994:         break;
 995: #endif /* not HAVE_TIMEVAL */
 996:     }
 997:       else
 998:     {
 999: #ifdef HAVE_TIMEVAL
1000:       /* If no real timeout, loop sleeping with a big timeout
1001: 	     so that input interrupt can wake us up by zeroing it  */
1002:       timeout.tv_sec = 100;
1003:       timeout.tv_usec = 0;
1004: #else /* not HAVE_TIMEVAL */
1005:           timeout = 100000; /* 100000 recognized by the select emulator */
1006: #endif /* not HAVE_TIMEVAL */
1007:     }
1008: 
1009:       /* Cause C-g and alarm signals to take immediate action,
1010: 	 and cause input available signals to zero out timeout */
1011:       if (read_kbd < 0)
1012:     set_waiting_for_input (&timeout);
1013: 
1014:       /* Wait till there is something to do */
1015: 
1016:       Available = Exception = input_wait_mask;
1017:       if (!read_kbd)
1018:     Available &= ~1;
1019: 
1020:       if (read_kbd && kbd_count)
1021:     nfds = 0;
1022:       else
1023:     nfds = select (MAXDESC, &Available, 0, &Exception, &timeout);
1024: 
1025:       if (fix_screen_hook)
1026:     (*fix_screen_hook) ();
1027: 
1028:       /* Make C-g and alarm signals set flags again */
1029:       clear_waiting_for_input ();
1030: 
1031:       if (time_limit && nfds == 0)  /* timeout elapsed */
1032:     break;
1033:       if (nfds < 0)
1034:     {
1035:       if (errno == EINTR)
1036:         Available = 0;
1037:       else if (errno == EBADF)
1038:         abort ();
1039:       else
1040:         error("select error: %s", sys_errlist[errno]);
1041:     }
1042: 
1043:       /* Check for keyboard input */
1044:       /* If there is any, return immediately
1045: 	 to give it higher priority than subprocesses */
1046: 
1047:       if (read_kbd && (kbd_count || !NULL (Vquit_flag)))
1048:     break;
1049: 
1050:       if (read_kbd && (Available & ChannelMask (0)))
1051:     break;
1052: 
1053: #ifdef vipc
1054:       /* Check for connection from other process */
1055: 
1056:       if (Available & ChannelMask (comm_server))
1057:     {
1058:       Available &= ~(ChannelMask (comm_server));
1059:       create_commchan ();
1060:     }
1061: #endif vipc
1062: 
1063:       /* Check for data from a process or a command channel */
1064: 
1065:       for (channel = 3; Available && channel < MAXDESC; channel++)
1066:     {
1067:       m = ChannelMask (channel);
1068:       if (m & Available)
1069:         {
1070:           Available &= ~m;
1071:           /* If waiting for this channel,
1072: 		 arrange to return as soon as no more input
1073: 		 to be processed.  No more waiting.  */
1074:           if (wait_channel == channel)
1075:         {
1076:           wait_channel = 0;
1077:           time_limit = -1;
1078:         }
1079:           proc = chan_process[channel];
1080:           if (NULL (proc))
1081:         continue;
1082: 
1083: #ifdef vipc
1084:           /* It's a command channel */
1085:           if (!NULL (XPROCESS (proc)->command_channel_p))
1086:         {
1087:           ProcessCommChan (channel, proc);
1088:           if (NULL (XPROCESS (proc)->command_channel_p))
1089:             {
1090:               /* It has ceased to be a command channel! */
1091:               int bytes_available;
1092:               if (ioctl (channel, FIONREAD, &bytes_available) < 0)
1093:             bytes_available = 0;
1094:               if (bytes_available)
1095:             Available |= m;
1096:             }
1097:           continue;
1098:         }
1099: #endif vipc
1100: 
1101:           /* Read data from the process, starting with our
1102: 		 buffered-ahead character if we have one.  */
1103: 
1104:           if (read_process_output (proc, channel) > 0)
1105:         {
1106:           if (do_display)
1107:             DoDsp (1);
1108:         }
1109:           else
1110:         {
1111:           /* Preserve status of processes already terminated.  */
1112:           child_changed++;
1113:           deactivate_process (proc);
1114: 
1115: /*
1116:  * With pty:s, when the parent process of a pty exits we are notified,
1117:  * just as we would be with any of our other children.  After the process
1118:  * exits, select() will indicate that we can read the channel.  When we
1119:  * do this, read() returns 0.  Upon receiving this, we close the channel.
1120:  *
1121:  * For external channels, when the peer closes the connection, select()
1122:  * will indicate that we can read the channel.  When we do this, read()
1123:  * returns -1 with errno = ECONNRESET.  Since we never get notified of
1124:  * this via wait3(), we must explictly mark the process as having exited.
1125:  */
1126:           if ((XFASTINT (XPROCESS (proc)->flags) & PROC_STATUS)
1127:               == RUNNING)
1128:             {
1129:               XFASTINT (XPROCESS (proc)->flags) = EXITED | CHANGED;
1130:               XFASTINT (XPROCESS (proc)->reason) = 0;
1131:             }
1132:         }
1133:         }
1134:     } /* end for */
1135:     } /* end while */
1136: }
1137: 
1138: /* Read pending output from the process channel,
1139:    starting with our buffered-ahead character if we have one.
1140:    Yield number of characters read.  */
1141: 
1142: read_process_output (proc, channel)
1143:      Lisp_Object proc;
1144:      register int channel;
1145: {
1146:   register int count;
1147:   register int total = 0;
1148:   char buf[1024];
1149: 
1150:   while (1)
1151:     {
1152:       if (proc_buffered_char[channel] < 0)
1153:     count = read (channel, buf, sizeof buf);
1154:       else
1155:     {
1156:       buf[0] = proc_buffered_char[channel];
1157:       proc_buffered_char[channel] = -1;
1158:       count = read (channel, buf + 1, sizeof buf - 1) + 1;
1159:     }
1160: 
1161:       if (count <= 0)
1162:     break;
1163: 
1164:       total += count;
1165:       handle_process_output (proc, buf, count);
1166:     }
1167:   return total;
1168: }
1169: 
1170: /*
1171:  * Output has been received from a process on "chan" and should be stuffed in
1172:  * the correct buffer.
1173:  */
1174: handle_process_output (proc, chars, nchars)
1175:      Lisp_Object proc;
1176:      char *chars;
1177:      int nchars;
1178: {
1179:   Lisp_Object outstream;
1180:   register struct buffer *old = bf_cur;
1181:   register struct Lisp_Process *p = XPROCESS (proc);
1182:   register int opoint;
1183: 
1184:   outstream = p->filter;
1185:   if (!NULL (outstream))
1186:     {
1187:       call2 (outstream, proc, make_string (chars, nchars));
1188:       return 1;
1189:     }
1190: 
1191:   /* If no filter, write into buffer if it isn't dead.  */
1192:   if (!NULL (p->buffer) && !NULL (XBUFFER (p->buffer)->name))
1193:     {
1194:       Fset_buffer (p->buffer);
1195:       opoint = point;
1196: 
1197:       /* Insert new output into buffer
1198: 	 at the current end-of-output marker,
1199: 	 thus preserving logical ordering of input and output.  */
1200:       if (XMARKER (p->mark)->buffer)
1201:     SetPoint (marker_position (p->mark));
1202:       else
1203:     SetPoint (NumCharacters + 1);
1204:       if (point <= opoint)
1205:     opoint += nchars;
1206: 
1207:       InsCStr (chars, nchars);
1208:       Fset_marker (p->mark, make_number (point), p->buffer);
1209:       RedoModes++;
1210: 
1211:       SetPoint (opoint);
1212:       SetBfp (old);
1213:     }
1214:   else return 0;
1215: 
1216:   /* Old feature was, delete early chars in chunks if
1217:     buffer gets bigger that ProcessBufferSize.
1218:     This feature is flushed */
1219: 
1220:   return 1;
1221: }
1222: 
1223: /* Sending data to subprocess */
1224: 
1225: jmp_buf send_process_frame;
1226: 
1227: send_process_trap ()
1228: {
1229: #ifdef BSD4_1
1230:   sigrelse (SIGPIPE);
1231:   sigrelse (SIGALRM);
1232: #endif /* BSD4_1 */
1233:   longjmp (send_process_frame, 1);
1234: }
1235: 
1236: send_process_1 (proc, buf, len)
1237:      Lisp_Object proc;
1238:      char *buf;
1239:      int len;
1240: {
1241:   /* Don't use register vars; longjmp can lose them.  */
1242:   int rv;
1243:   unsigned char *procname = XSTRING (XPROCESS (proc)->name)->data;
1244: 
1245:   if ((XFASTINT (XPROCESS (proc)->flags) & PROC_STATUS) != RUNNING)
1246:     error ("Process %s not running", procname);
1247: 
1248:   signal (SIGPIPE, send_process_trap);
1249: 
1250:   if (!setjmp (send_process_frame))
1251:     while (len > 0)
1252:       {
1253:     rv = write (XFASTINT (XPROCESS (proc)->outfd), buf, len);
1254:     if (rv < 0)
1255:       break;
1256:     buf += rv;
1257:     len -= rv;
1258:       }
1259:   else
1260:     {
1261:       signal (SIGPIPE, SIG_DFL);
1262:       XFASTINT (XPROCESS (proc)->flags) =  EXITED | CHANGED;
1263:       deactivate_process (proc);
1264:       error ("SIGPIPE raised on process %s; closed it", procname);
1265:     }
1266: 
1267:   signal (SIGPIPE, SIG_DFL);
1268: 
1269:   if (rv < 0)
1270:     report_file_error ("writing to process", Fcons (proc, Qnil));
1271: }
1272: 
1273: /*** Is it really safe for this to get an error ?  */
1274: 
1275: send_process (proc, buf, count)
1276:      Lisp_Object proc;
1277:      char *buf;
1278:      int count;
1279: {
1280: #ifdef vipc
1281:   struct { int checkword, type, datalen; } header;
1282: 
1283:   if (!NULL (XPROCESS (proc)->command_channel_p))
1284:     {
1285:       checkword = UNIQUE_FROB;
1286:       type = VIPC_MESG;
1287:       datalen = count;
1288:       send_process_1 (proc, &header, sizeof header);
1289:     }
1290: #endif vipc
1291:   send_process_1 (proc, buf, count);
1292: }
1293: 
1294: DEFUN ("send-region", Fsend_region, Ssend_region, 3, 3, 0,
1295:   "Send current contents of region as input to PROCESS.\n\
1296: PROCESS may be a process name.\n\
1297: Called from program, takes three arguments, PROCESS, START and END.")
1298:   (process, start, end)
1299:      Lisp_Object process, start, end;
1300: {
1301:   Lisp_Object proc;
1302:   proc = get_process (process);
1303:   validate_region (&start, &end);
1304: 
1305:   if (XINT (start) < bf_s1 && XINT (end) >= bf_s1)
1306:     GapTo (start);
1307: 
1308:   send_process (proc, &CharAt (XINT (start)), XINT (end) - XINT (start));
1309: 
1310:   return Qnil;
1311: }
1312: 
1313: DEFUN ("send-string", Fsend_string, Ssend_string, 2, 2, 0,
1314:   "Send PROCESS the contents of STRING as input.\n\
1315: PROCESS may be a process name.")
1316:   (process, string)
1317:      Lisp_Object process, string;
1318: {
1319:   Lisp_Object proc;
1320:   CHECK_STRING (string, 1);
1321:   proc = get_process (process);
1322:   send_process (proc, XSTRING (string)->data, XSTRING (string)->size);
1323:   return Qnil;
1324: }
1325: 
1326: /* send a signal number SIGNO to PROCESS.
1327:    CURRENT_GROUP means send to the process group that currently owns
1328:    the terminal being used to communicate with PROCESS.
1329:    This is used for various commands in shell mode.
1330:    If NOMSG is zero, insert signal-announcements into process's buffers
1331:    right away.  */
1332: 
1333: sig_process (process, signo, current_group, nomsg)
1334:      Lisp_Object process;
1335:      int signo;
1336:      Lisp_Object current_group;
1337:      int nomsg;
1338: {
1339:   Lisp_Object proc;
1340:   register struct Lisp_Process *p;
1341:   int gid;
1342: 
1343:   proc = get_process (process);
1344:   p = XPROCESS (proc);
1345: 
1346:   if (NULL (p->childp))
1347:     error ("Process %s is not a subprocess",
1348:        XSTRING (p->name)->data);
1349:   if (!XFASTINT (p->infd))
1350:     error ("Process %s is not active",
1351:        XSTRING (p->name)->data);
1352: 
1353: #ifdef TIOCGPGRP        /* Not sure about this! (fnf) */
1354:   /* If we are using pgrps, get a pgrp number and make it negative.  */
1355:   if (!NULL (current_group))
1356:     {
1357:       ioctl (XFASTINT (p->infd), TIOCGPGRP, &gid);
1358:       gid = - gid;
1359:     }
1360:   else
1361:     gid = - XFASTINT (p->pid);
1362: #else /* not using pgrps */
1363:   /* Can't select pgrps on this system, so we know that
1364:      the child itself heads the pgrp.  */
1365:   gid = - XFASTINT (p->pid);
1366: #endif /* not using pgrps */
1367: 
1368:   switch (signo)
1369:     {
1370: #ifdef SIGCONT
1371:     case SIGCONT:
1372:       XFASTINT (p->flags) = RUNNING | CHANGED;
1373:       child_changed++;
1374:       break;
1375: #endif
1376:     case SIGINT:
1377:     case SIGQUIT:
1378:     case SIGKILL:
1379:       flush_pending_output (XFASTINT (p->infd));
1380:       break;
1381:     }
1382:   /* gid may be a pid, or minus a pgrp's number */
1383: #ifdef BSD
1384:   /* On bsd, [man says] kill does not accept a negative number to kill a pgrp.
1385:      Must do that differently.  */
1386:   killpg (-gid, signo);
1387: #else /* Not BSD.  */
1388:   kill (gid, signo);
1389: #endif /* Not BSD.  */
1390: 
1391:   /* Put notices in buffers now, since it is safe now.
1392:      Because of this, we know that a process we have just killed
1393:      will never need to use its buffer again.  */
1394:   if (!nomsg)
1395:     change_msgs ();
1396: }
1397: 
1398: DEFUN ("interrupt-process", Finterrupt_process, Sinterrupt_process, 0, 2, 0,
1399:   "Interrupt process PROCESS.  May be process or name of one.\n\
1400: Nil or no arg means current buffer's process.\n\
1401: Second arg CURRENT-GROUP non-nil means send signal to\n\
1402: the current process-group of the process's controlling terminal\n\
1403: rather than to the process's own process group.\n\
1404: If the process is a shell, this means interrupt current subjob\n\
1405: rather than the shell.")
1406:   (process, current_group)
1407:      Lisp_Object process, current_group;
1408: {
1409:   sig_process (process, SIGINT, current_group, 0);
1410:   return process;
1411: }
1412: 
1413: DEFUN ("kill-process", Fkill_process, Skill_process, 0, 2, 0,
1414:   "Kill process PROCESS.  May be process or name of one.\n\
1415: See function interrupt-process for more details on usage.")
1416:   (process, current_group)
1417:      Lisp_Object process, current_group;
1418: {
1419:   sig_process (process, SIGKILL, current_group, 0);
1420:   return process;
1421: }
1422: 
1423: DEFUN ("quit-process", Fquit_process, Squit_process, 0, 2, 0,
1424:   "Send QUIT signal to process PROCESS.  May be process or name of one.\n\
1425: See function interrupt-process for more details on usage.")
1426:   (process, current_group)
1427:      Lisp_Object process, current_group;
1428: {
1429:   sig_process (process, SIGQUIT, current_group, 0);
1430:   return process;
1431: }
1432: 
1433: DEFUN ("stop-process", Fstop_process, Sstop_process, 0, 2, 0,
1434:   "Stop process PROCESS.  May be process or name of one.\n\
1435: See function interrupt-process for more details on usage.")
1436:   (process, current_group)
1437:      Lisp_Object process, current_group;
1438: {
1439: #ifndef SIGTSTP
1440:   error ("no SIGTSTP support");
1441: #else
1442:   sig_process (process, SIGTSTP, current_group, 0);
1443: #endif
1444:   return process;
1445: }
1446: 
1447: DEFUN ("continue-process", Fcontinue_process, Scontinue_process, 0, 2, 0,
1448:   "Continue process PROCESS.  May be process or name of one.\n\
1449: See function interrupt-process for more details on usage.")
1450:   (process, current_group)
1451:      Lisp_Object process, current_group;
1452: {
1453: #ifdef SIGCONT
1454:     sig_process (process, SIGCONT, current_group, 0);
1455: #else
1456:     error ("no SIGCONT support");
1457: #endif
1458:   return process;
1459: }
1460: 
1461: DEFUN ("process-send-eof", Fprocess_send_eof, Sprocess_send_eof, 0, 1, 0,
1462:   "Make PROCESS see end-of-file in its input.\n\
1463: Eof comes after any text already sent to it.\n\
1464: Nil or no arg means current buffer's process.")
1465:   (process)
1466:      Lisp_Object process;
1467: {
1468:   Lisp_Object proc;
1469: 
1470:   proc = get_process (process);
1471:   send_process (proc, "\004", 1);
1472:   return process;
1473: }
1474: 
1475: /* Kill all processes associated with `buffer'.
1476:  If `buffer' is nil, kill all processes  */
1477: 
1478: kill_buffer_processes (buffer)
1479:      Lisp_Object buffer;
1480: {
1481:   Lisp_Object tail, proc;
1482: 
1483:   for (tail = Vprocess_alist; XGCTYPE (tail) == Lisp_Cons;
1484:        tail = XCONS (tail)->cdr)
1485:     {
1486:       proc = XCONS (XCONS (tail)->car)->cdr;
1487:       if (XGCTYPE (proc) == Lisp_Process
1488:       && (NULL (buffer) || EQ (XPROCESS (proc)->buffer, buffer)))
1489:     if (XFASTINT (XPROCESS (proc)->infd))
1490:       sig_process (proc, SIGKILL, Qnil, 1);
1491:     }
1492: }
1493: 
1494: count_active_processes ()
1495: {
1496:   register Lisp_Object tail, proc;
1497:   register int count = 0;
1498: 
1499:   for (tail = Vprocess_alist; !NULL (tail); tail = Fcdr (tail))
1500:     {
1501:       proc = Fcdr (Fcar (tail));
1502: 
1503:       if ((1 << (XFASTINT (XPROCESS (proc)->flags) & PROC_STATUS)
1504:        & ((1 << RUNNING) | (1 << STOPPED)))
1505:       && NULL (XPROCESS (proc)->kill_without_query))
1506:     count++;
1507:     }
1508: 
1509:   return count;
1510: }
1511: 
1512: /* On receipt of a signal that a child status has changed,
1513:  loop asking about children with changed statuses until
1514:  the system says there are no more.
1515:    All we do is change the flags components;
1516:  we do not run sentinels or print notifications.
1517:  That is saved for the next time keyboard input is done,
1518:  in order to avoid timing errors.  */
1519: 
1520: /** WARNING: this can be called during garbage collection.
1521:  Therefore, it must not be fooled by the presence of mark bits in
1522:  Lisp objects.  */
1523: 
1524: /** USG WARNING:  Although it is not obvious from the documentation
1525:  in signal(2), on a USG system the SIGCLD handler MUST NOT call
1526:  signal() before executing at least one wait(), otherwise the handler
1527:  will be called again, resulting in an infinite loop.  The relevant
1528:  portion of the documentation reads "SIGCLD signals will be queued
1529:  and the signal-catching function will be continually reentered until
1530:  the queue is empty".  Invoking signal() causes the kernel to reexamine
1531:  the SIGCLD queue.   Fred Fish, UniSoft Systems Inc. */
1532: 
1533: child_sig (signo)
1534:      int signo;
1535: {
1536:   register int pid;
1537:   WAITTYPE w;
1538:   Lisp_Object tail, proc;
1539:   register struct Lisp_Process *p;
1540: 
1541: #ifdef BSD4_1
1542:   extern int synch_process_pid;
1543:   extern int sigheld;
1544:   sigheld |= sigbit (SIGCHLD);
1545: #endif
1546: 
1547: loop:
1548: 
1549: #ifdef WNOHANG
1550: #ifndef WUNTRACED
1551: #define WUNTRACED 0
1552: #endif /* no WUNTRACED */
1553:   pid = wait3 (&w, WNOHANG | WUNTRACED, 0);
1554:   if (pid <= 0)
1555:     {
1556:       if (errno == EINTR)
1557:     {
1558:       errno = 0;
1559:       goto loop;
1560:     }
1561:   /* USG systems forget handlers when they are used;
1562:      must reestablish each time */
1563: #ifdef USG
1564:       signal (signo, child_sig);   /* WARNING - must come after wait3() */
1565: #endif
1566: #ifdef  BSD4_1
1567:       sigheld &= ~sigbit (SIGCHLD);
1568:       sigrelse (SIGCHLD);
1569: #endif
1570:       return;
1571:     }
1572: #else
1573:   pid = wait (&w);
1574: #endif /* no WNOHANG */
1575: 
1576: #ifdef BSD4_1
1577:   if (synch_process_pid == pid)
1578:     synch_process_pid = 0;         /* Zero it to show process has died. */
1579: #endif
1580: 
1581:   for (tail = Vprocess_alist; XSYMBOL (tail) != XSYMBOL (Qnil); tail = XCONS (tail)->cdr)
1582:     {
1583:       proc = XCONS (XCONS (tail)->car)->cdr;
1584:       p = XPROCESS (proc);
1585:       if (!NULL (p->childp) && XFASTINT (p->pid) == pid)
1586:     break;
1587:     }
1588: 
1589:   if (XSYMBOL (tail) == XSYMBOL (Qnil))
1590: #ifdef USG
1591:     goto ignore;
1592: #else
1593:     goto loop;      /* We don't know who this is */
1594: #endif
1595: 
1596:   child_changed++;
1597:   if (WIFSTOPPED (w))
1598:     {
1599:       XFASTINT (p->flags) = STOPPED | CHANGED;
1600:       XFASTINT (p->reason) = WSTOPSIG (w);
1601:     }
1602:   else if (WIFEXITED (w))
1603:     {
1604:       XFASTINT (p->flags) = EXITED | CHANGED;
1605:       if (WCOREDUMP (w))
1606:     XFASTINT (p->flags) |= COREDUMPED;
1607:       XFASTINT (p->reason) = WRETCODE (w);
1608:     }
1609:   else if (WIFSIGNALED (w))
1610:     {
1611:       XFASTINT (p->flags) = SIGNALED | CHANGED;
1612:       if (WCOREDUMP (w))
1613:     XFASTINT (p->flags) |= COREDUMPED;
1614:       XFASTINT (p->reason) = WTERMSIG (w);
1615:     }
1616: #ifndef USG
1617:   goto loop;
1618: #else
1619:  ignore:
1620:   signal (signo, child_sig);
1621: #endif /* not USG */
1622: }
1623: 
1624: /* Find all process marked as "changed"
1625:   and notify the user in a suitable fashion
1626:   (either run the sentinel or output a message).
1627:   This is done while Emacs is waiting for keyboard input */
1628: 
1629: change_msgs()
1630: {
1631:   Lisp_Object tail, proc, buffer;
1632:   register struct Lisp_Process *p;
1633:   register struct buffer *old = bf_cur;
1634:   char line[50];
1635:   int opoint;
1636: 
1637:   child_changed = 0;
1638: 
1639:   for (tail = Vprocess_alist; !NULL (tail); tail = Fcdr (tail))
1640:     {
1641:       proc = Fcdr (Fcar (tail));
1642:       p = XPROCESS (proc);
1643: 
1644:       if (!(XFASTINT (p->flags) & CHANGED))
1645:     continue;
1646: 
1647:       /* If process is still active, read any output that remains.  */
1648:       if (XFASTINT (p->infd))
1649:     read_process_output (proc, XFASTINT (p->infd));
1650: 
1651:       XFASTINT (p->flags) &= ~CHANGED;
1652: 
1653:       line[0] = 0;
1654:       buffer = p->buffer;
1655: 
1656:       if ((XFASTINT (p->flags) & PROC_STATUS) == SIGNALED
1657:       || (XFASTINT (p->flags) & PROC_STATUS) == STOPPED)
1658:     {
1659:       sprintf (line, "%s%s\n",
1660:            XFASTINT (p->reason) < NSIG
1661:              ? sys_siglist[XFASTINT (p->reason)] : "unknown",
1662:            XFASTINT (p->flags) & COREDUMPED ? " (core dumped)" : "");
1663:       if (line[0] >= 'A' && line[0] <= 'Z')
1664:         line[0] += 040;
1665: 
1666:       if ((XFASTINT (p->flags) & PROC_STATUS) == SIGNALED)
1667:         if (delete_exited_processes)
1668:           remove_process (proc);
1669:         else
1670:           deactivate_process (proc);
1671:     }
1672:       else if ((XFASTINT (p->flags) & PROC_STATUS) == EXITED)
1673:     {
1674:       if (XFASTINT (p->reason))
1675:         sprintf (line, "exited abnormally with code %d\n",
1676:              XFASTINT (p->reason));
1677:       else
1678:         sprintf (line, "finished\n");
1679: 
1680:       if (delete_exited_processes)
1681:         remove_process (proc);
1682:       else
1683:         deactivate_process (proc);
1684:     }
1685: 
1686:       if (!NULL (p->sentinel))
1687:     exec_sentinel (proc, build_string (line));
1688:       else if (line[0] && !NULL (buffer))
1689:     {
1690:       /* Avoid error if buffer is deleted
1691: 	     (probably that's why the process is dead, too) */
1692:       if (NULL (XBUFFER (buffer)->name))
1693:         continue;
1694:       Fset_buffer (buffer);
1695:       opoint = point;
1696:       SetPoint (NumCharacters + 1);
1697:       if (point == opoint)
1698:         opoint = -1;
1699:       InsStr ("\nProcess ");
1700:       Finsert (1, &p->name);
1701:       InsStr (" ");
1702:       InsStr (line);
1703:       if (opoint > 0)
1704:         SetPoint (opoint);
1705:     }
1706:     } /* end for */
1707: 
1708:   SetBfp (old);
1709: 
1710:   RedoModes++;  /* in case buffers use %s in mode-line-format */
1711:   DoDsp (1);
1712: }
1713: 
1714: exec_sentinel (proc, reason)
1715:      Lisp_Object proc, reason;
1716: {
1717:   Lisp_Object sentinel;
1718:   register struct Lisp_Process *p = XPROCESS (proc);
1719: 
1720:   sentinel = p->sentinel;
1721:   if (NULL (sentinel))
1722:     return;
1723: 
1724:   p->sentinel = Qnil;
1725:   call2 (sentinel, proc, reason);
1726:   p->sentinel = sentinel;
1727: }
1728: 
1729: init_process ()
1730: {
1731:   register int i;
1732: 
1733: #ifdef SIGCHLD
1734:   signal (SIGCHLD, child_sig);
1735: #endif
1736: 
1737:   input_wait_mask = ChannelMask(0);
1738:   Vprocess_alist = Qnil;
1739:   for (i = 0; i < MAXDESC; i++)
1740:     {
1741:       chan_process[i] = Qnil;
1742:       proc_buffered_char[i] = -1;
1743:     }
1744: }
1745: 
1746: syms_of_process ()
1747: {
1748:   Qprocessp = intern ("processp");
1749:   staticpro (&Qprocessp);
1750: 
1751:   staticpro (&Vprocess_alist);
1752: 
1753:   DefBoolVar ("delete-exited-processes", &delete_exited_processes,
1754:     "*Non-nil means delete processes immediately when they exit.\n\
1755: nil means don't delete them until list-processes is done.");
1756: 
1757:   delete_exited_processes = 1;
1758: 
1759:   defsubr (&Sprocessp);
1760:   defsubr (&Sget_process);
1761:   defsubr (&Sget_buffer_process);
1762:   defsubr (&Sdelete_process);
1763:   defsubr (&Sprocess_status);
1764:   defsubr (&Sprocess_id);
1765:   defsubr (&Sprocess_name);
1766:   defsubr (&Sprocess_command);
1767:   defsubr (&Sset_process_buffer);
1768:   defsubr (&Sprocess_buffer);
1769:   defsubr (&Sprocess_mark);
1770:   defsubr (&Sset_process_filter);
1771:   defsubr (&Sprocess_filter);
1772:   defsubr (&Sset_process_sentinel);
1773:   defsubr (&Sprocess_sentinel);
1774:   defsubr (&Sprocess_kill_without_query);
1775:   defsubr (&Slist_processes);
1776:   defsubr (&Sstart_process);
1777:   defsubr (&Saccept_process_output);
1778:   defsubr (&Ssend_region);
1779:   defsubr (&Ssend_string);
1780:   defsubr (&Sinterrupt_process);
1781:   defsubr (&Skill_process);
1782:   defsubr (&Squit_process);
1783:   defsubr (&Sstop_process);
1784:   defsubr (&Scontinue_process);
1785:   defsubr (&Sprocess_send_eof);
1786: }
1787: 
1788: #endif subprocesses

Defined functions

DEFUN defined in line 1461; never used
change_msgs defined in line 1629; used 2 times
child_sig defined in line 1533; used 3 times
count_active_processes defined in line 1494; used 1 times
create_process defined in line 706; used 1 times
create_process_1 defined in line 696; used 2 times
deactivate_process defined in line 847; used 5 times
exec_sentinel defined in line 1714; used 1 times
get_process defined in line 331; used 7 times
handle_process_output defined in line 1174; used 1 times
init_process defined in line 1729; used 1 times
list_processes_1 defined in line 537; used 1 times
make_process defined in line 238; used 1 times
pty defined in line 181; used 1 times
read_process_output defined in line 1142; used 2 times
remove_process defined in line 277; used 6 times
send_process defined in line 1275; used 3 times
send_process_1 defined in line 1236; used 2 times
send_process_trap defined in line 1227; used 1 times
sig_process defined in line 1333; used 6 times
syms_of_process defined in line 1746; used 1 times

Defined variables

Qprocessp defined in line 162; used 2 times
Vprocess_alist defined in line 160; used 14 times
chan_process defined in line 157; used 4 times
child_changed defined in line 145; used 5 times
delete_exited_processes defined in line 152; used 4 times
input_wait_mask defined in line 150; used 5 times
proc_buffered_char defined in line 172; used 4 times
ptyname defined in line 179; used 14 times
send_process_frame defined in line 1225; used 2 times
sys_siglist declared in line 100; defined in line 102; used 4 times

Defined macros

MAXDESC defined in line 154; used 6 times
SIGCHLD defined in line 66; used 13 times
WAITTYPE defined in line 88; used 1 times
WCOREDUMP defined in line 91; used 2 times
WIFEXITED defined in line 77; used 1 times
WIFSIGNALED defined in line 76; used 1 times
WIFSTOPPED defined in line 75; used 1 times
WRETCODE defined in line 89; used 1 times
WSTOPSIG defined in line 90; used 1 times
WTERMSIG defined in line 92; used 1 times
WUNTRACED defined in line 1551; used 2 times
Last modified: 1986-03-19
Generated: 2016-12-26
Generated by src2html V0.67
page hit count: 4958
Valid CSS Valid XHTML 1.0 Strict