comparison src/process.c @ 89909:68c22ea6027c

Sync to HEAD
author Kenichi Handa <handa@m17n.org>
date Fri, 16 Apr 2004 12:51:06 +0000
parents 8c02d5cc8f27
children ab6b6e8cffe6
comparison
equal deleted inserted replaced
89908:ee1402f7b568 89909:68c22ea6027c
1 /* Asynchronous subprocess control for GNU Emacs. 1 /* Asynchronous subprocess control for GNU Emacs.
2 Copyright (C) 1985, 86, 87, 88, 93, 94, 95, 96, 98, 1999, 2 Copyright (C) 1985, 86, 87, 88, 93, 94, 95, 96, 98, 1999,
3 2001, 2002, 2003 Free Software Foundation, Inc. 3 2001, 2002, 2003, 2004 Free Software Foundation, Inc.
4 4
5 This file is part of GNU Emacs. 5 This file is part of GNU Emacs.
6 6
7 GNU Emacs is free software; you can redistribute it and/or modify 7 GNU Emacs is free software; you can redistribute it and/or modify
8 it under the terms of the GNU General Public License as published by 8 it under the terms of the GNU General Public License as published by
94 #undef O_NONBLOCK 94 #undef O_NONBLOCK
95 #endif /* BROKEN_O_NONBLOCK */ 95 #endif /* BROKEN_O_NONBLOCK */
96 96
97 #ifdef NEED_BSDTTY 97 #ifdef NEED_BSDTTY
98 #include <bsdtty.h> 98 #include <bsdtty.h>
99 #endif
100
101 /* Can we use SIOCGIFCONF and/or SIOCGIFADDR */
102 #ifdef HAVE_SOCKETS
103 #if defined(HAVE_SYS_IOCTL_H) && defined(HAVE_NET_IF_H)
104 /* sys/ioctl.h may have been included already */
105 #ifndef SIOCGIFADDR
106 #include <sys/ioctl.h>
107 #endif
108 #include <net/if.h>
109 #endif
99 #endif 110 #endif
100 111
101 #ifdef IRIS 112 #ifdef IRIS
102 #include <sys/sysmacros.h> /* for "minor" */ 113 #include <sys/sysmacros.h> /* for "minor" */
103 #endif /* not IRIS */ 114 #endif /* not IRIS */
245 #endif /* BROKEN_DATAGRAM_SOCKETS */ 256 #endif /* BROKEN_DATAGRAM_SOCKETS */
246 257
247 #ifdef TERM 258 #ifdef TERM
248 #undef NON_BLOCKING_CONNECT 259 #undef NON_BLOCKING_CONNECT
249 #undef DATAGRAM_SOCKETS 260 #undef DATAGRAM_SOCKETS
261 #endif
262
263 #if !defined (ADAPTIVE_READ_BUFFERING) && !defined (NO_ADAPTIVE_READ_BUFFERING)
264 #ifdef EMACS_HAS_USECS
265 #define ADAPTIVE_READ_BUFFERING
266 #endif
267 #endif
268
269 #ifdef ADAPTIVE_READ_BUFFERING
270 #define READ_OUTPUT_DELAY_INCREMENT 10000
271 #define READ_OUTPUT_DELAY_MAX (READ_OUTPUT_DELAY_INCREMENT * 5)
272 #define READ_OUTPUT_DELAY_MAX_MAX (READ_OUTPUT_DELAY_INCREMENT * 7)
273
274 /* Number of processes which might be delayed. */
275
276 static int process_output_delay_count;
277
278 /* Non-zero if any process has non-nil process_output_skip. */
279
280 static int process_output_skip;
281
282 /* Non-nil means to delay reading process output to improve buffering.
283 A value of t means that delay is reset after each send, any other
284 non-nil value does not reset the delay. */
285 static Lisp_Object Vprocess_adaptive_read_buffering;
286 #else
287 #define process_output_delay_count 0
250 #endif 288 #endif
251 289
252 290
253 #include "sysselect.h" 291 #include "sysselect.h"
254 292
560 p->raw_status_low = Qnil; 598 p->raw_status_low = Qnil;
561 p->raw_status_high = Qnil; 599 p->raw_status_high = Qnil;
562 p->status = Qrun; 600 p->status = Qrun;
563 p->mark = Fmake_marker (); 601 p->mark = Fmake_marker ();
564 602
603 #ifdef ADAPTIVE_READ_BUFFERING
604 p->adaptive_read_buffering = Qnil;
605 XSETFASTINT (p->read_output_delay, 0);
606 p->read_output_skip = Qnil;
607 #endif
608
565 /* If name is already in use, modify it until it is unused. */ 609 /* If name is already in use, modify it until it is unused. */
566 610
567 name1 = name; 611 name1 = name;
568 for (i = 1; ; i++) 612 for (i = 1; ; i++)
569 { 613 {
953 The sentinel is called as a function when the process changes state. 997 The sentinel is called as a function when the process changes state.
954 It gets two arguments: the process, and a string describing the change. */) 998 It gets two arguments: the process, and a string describing the change. */)
955 (process, sentinel) 999 (process, sentinel)
956 register Lisp_Object process, sentinel; 1000 register Lisp_Object process, sentinel;
957 { 1001 {
1002 struct Lisp_Process *p;
1003
958 CHECK_PROCESS (process); 1004 CHECK_PROCESS (process);
959 XPROCESS (process)->sentinel = sentinel; 1005 p = XPROCESS (process);
1006
1007 p->sentinel = sentinel;
1008 if (NETCONN1_P (p))
1009 p->childp = Fplist_put (p->childp, QCsentinel, sentinel);
960 return sentinel; 1010 return sentinel;
961 } 1011 }
962 1012
963 DEFUN ("process-sentinel", Fprocess_sentinel, Sprocess_sentinel, 1013 DEFUN ("process-sentinel", Fprocess_sentinel, Sprocess_sentinel,
964 1, 1, 0, 1014 1, 1, 0,
1482 XPROCESS (proc)->sentinel = Qnil; 1532 XPROCESS (proc)->sentinel = Qnil;
1483 XPROCESS (proc)->filter = Qnil; 1533 XPROCESS (proc)->filter = Qnil;
1484 XPROCESS (proc)->filter_multibyte 1534 XPROCESS (proc)->filter_multibyte
1485 = buffer_defaults.enable_multibyte_characters; 1535 = buffer_defaults.enable_multibyte_characters;
1486 XPROCESS (proc)->command = Flist (nargs - 2, args + 2); 1536 XPROCESS (proc)->command = Flist (nargs - 2, args + 2);
1537
1538 #ifdef ADAPTIVE_READ_BUFFERING
1539 XPROCESS (proc)->adaptive_read_buffering = Vprocess_adaptive_read_buffering;
1540 #endif
1487 1541
1488 /* Make the process marker point into the process buffer (if any). */ 1542 /* Make the process marker point into the process buffer (if any). */
1489 if (!NILP (buffer)) 1543 if (!NILP (buffer))
1490 set_marker_both (XPROCESS (proc)->mark, buffer, 1544 set_marker_both (XPROCESS (proc)->mark, buffer,
1491 BUF_ZV (XBUFFER (buffer)), 1545 BUF_ZV (XBUFFER (buffer)),
2296 2350
2297 static struct socket_options { 2351 static struct socket_options {
2298 /* The name of this option. Should be lowercase version of option 2352 /* The name of this option. Should be lowercase version of option
2299 name without SO_ prefix. */ 2353 name without SO_ prefix. */
2300 char *name; 2354 char *name;
2301 /* Length of name. */
2302 int nlen;
2303 /* Option level SOL_... */ 2355 /* Option level SOL_... */
2304 int optlevel; 2356 int optlevel;
2305 /* Option number SO_... */ 2357 /* Option number SO_... */
2306 int optnum; 2358 int optnum;
2307 enum { SOPT_UNKNOWN, SOPT_BOOL, SOPT_INT, SOPT_STR, SOPT_LINGER } opttype; 2359 enum { SOPT_UNKNOWN, SOPT_BOOL, SOPT_INT, SOPT_IFNAME, SOPT_LINGER } opttype;
2360 enum { OPIX_NONE=0, OPIX_MISC=1, OPIX_REUSEADDR=2 } optbit;
2308 } socket_options[] = 2361 } socket_options[] =
2309 { 2362 {
2310 #ifdef SO_BINDTODEVICE 2363 #ifdef SO_BINDTODEVICE
2311 { "bindtodevice", 12, SOL_SOCKET, SO_BINDTODEVICE, SOPT_STR }, 2364 { ":bindtodevice", SOL_SOCKET, SO_BINDTODEVICE, SOPT_IFNAME, OPIX_MISC },
2312 #endif 2365 #endif
2313 #ifdef SO_BROADCAST 2366 #ifdef SO_BROADCAST
2314 { "broadcast", 9, SOL_SOCKET, SO_BROADCAST, SOPT_BOOL }, 2367 { ":broadcast", SOL_SOCKET, SO_BROADCAST, SOPT_BOOL, OPIX_MISC },
2315 #endif 2368 #endif
2316 #ifdef SO_DONTROUTE 2369 #ifdef SO_DONTROUTE
2317 { "dontroute", 9, SOL_SOCKET, SO_DONTROUTE, SOPT_BOOL }, 2370 { ":dontroute", SOL_SOCKET, SO_DONTROUTE, SOPT_BOOL, OPIX_MISC },
2318 #endif 2371 #endif
2319 #ifdef SO_KEEPALIVE 2372 #ifdef SO_KEEPALIVE
2320 { "keepalive", 9, SOL_SOCKET, SO_KEEPALIVE, SOPT_BOOL }, 2373 { ":keepalive", SOL_SOCKET, SO_KEEPALIVE, SOPT_BOOL, OPIX_MISC },
2321 #endif 2374 #endif
2322 #ifdef SO_LINGER 2375 #ifdef SO_LINGER
2323 { "linger", 6, SOL_SOCKET, SO_LINGER, SOPT_LINGER }, 2376 { ":linger", SOL_SOCKET, SO_LINGER, SOPT_LINGER, OPIX_MISC },
2324 #endif 2377 #endif
2325 #ifdef SO_OOBINLINE 2378 #ifdef SO_OOBINLINE
2326 { "oobinline", 9, SOL_SOCKET, SO_OOBINLINE, SOPT_BOOL }, 2379 { ":oobinline", SOL_SOCKET, SO_OOBINLINE, SOPT_BOOL, OPIX_MISC },
2327 #endif 2380 #endif
2328 #ifdef SO_PRIORITY 2381 #ifdef SO_PRIORITY
2329 { "priority", 8, SOL_SOCKET, SO_PRIORITY, SOPT_INT }, 2382 { ":priority", SOL_SOCKET, SO_PRIORITY, SOPT_INT, OPIX_MISC },
2330 #endif 2383 #endif
2331 #ifdef SO_REUSEADDR 2384 #ifdef SO_REUSEADDR
2332 { "reuseaddr", 9, SOL_SOCKET, SO_REUSEADDR, SOPT_BOOL }, 2385 { ":reuseaddr", SOL_SOCKET, SO_REUSEADDR, SOPT_BOOL, OPIX_REUSEADDR },
2333 #endif 2386 #endif
2334 { 0, 0, 0, 0, SOPT_UNKNOWN } 2387 { 0, 0, 0, SOPT_UNKNOWN, OPIX_NONE }
2335 }; 2388 };
2336 2389
2337 /* Process list of socket options OPTS on socket S. 2390 /* Set option OPT to value VAL on socket S.
2338 Only check if options are supported is S < 0. 2391
2339 If NO_ERROR is non-zero, continue silently if an option 2392 Returns (1<<socket_options[OPT].optbit) if option is known, 0 otherwise.
2340 cannot be set. 2393 Signals an error if setting a known option fails.
2341 2394 */
2342 Each element specifies one option. An element is either a string
2343 "OPTION=VALUE" or a cons (OPTION . VALUE) where OPTION is a string
2344 or a symbol. */
2345 2395
2346 static int 2396 static int
2347 set_socket_options (s, opts, no_error) 2397 set_socket_option (s, opt, val)
2348 int s; 2398 int s;
2349 Lisp_Object opts; 2399 Lisp_Object opt, val;
2350 int no_error; 2400 {
2351 { 2401 char *name;
2352 if (!CONSP (opts)) 2402 struct socket_options *sopt;
2353 opts = Fcons (opts, Qnil); 2403 int ret = 0;
2354 2404
2355 while (CONSP (opts)) 2405 CHECK_SYMBOL (opt);
2356 { 2406
2357 Lisp_Object opt; 2407 name = (char *) SDATA (SYMBOL_NAME (opt));
2358 Lisp_Object val; 2408 for (sopt = socket_options; sopt->name; sopt++)
2359 char *name, *arg; 2409 if (strcmp (name, sopt->name) == 0)
2360 struct socket_options *sopt; 2410 break;
2361 int ret = 0; 2411
2362 2412 switch (sopt->opttype)
2363 opt = XCAR (opts); 2413 {
2364 opts = XCDR (opts); 2414 case SOPT_BOOL:
2365 2415 {
2366 name = 0; 2416 int optval;
2367 val = Qt; 2417 optval = NILP (val) ? 0 : 1;
2368 if (CONSP (opt)) 2418 ret = setsockopt (s, sopt->optlevel, sopt->optnum,
2369 { 2419 &optval, sizeof (optval));
2370 val = XCDR (opt); 2420 break;
2371 opt = XCAR (opt);
2372 }
2373 if (STRINGP (opt))
2374 name = (char *) SDATA (opt);
2375 else if (SYMBOLP (opt))
2376 name = (char *) SDATA (SYMBOL_NAME (opt));
2377 else {
2378 error ("Mal-formed option list");
2379 return 0;
2380 } 2421 }
2381 2422
2382 if (strncmp (name, "no", 2) == 0) 2423 case SOPT_INT:
2383 { 2424 {
2384 val = Qnil; 2425 int optval;
2385 name += 2; 2426 if (INTEGERP (val))
2386 } 2427 optval = XINT (val);
2387 2428 else
2388 arg = 0; 2429 error ("Bad option value for %s", name);
2389 for (sopt = socket_options; sopt->name; sopt++) 2430 ret = setsockopt (s, sopt->optlevel, sopt->optnum,
2390 if (strncmp (name, sopt->name, sopt->nlen) == 0) 2431 &optval, sizeof (optval));
2432 break;
2433 }
2434
2435 #ifdef SO_BINDTODEVICE
2436 case SOPT_IFNAME:
2437 {
2438 char devname[IFNAMSIZ+1];
2439
2440 /* This is broken, at least in the Linux 2.4 kernel.
2441 To unbind, the arg must be a zero integer, not the empty string.
2442 This should work on all systems. KFS. 2003-09-23. */
2443 bzero (devname, sizeof devname);
2444 if (STRINGP (val))
2391 { 2445 {
2392 if (name[sopt->nlen] == 0) 2446 char *arg = (char *) SDATA (val);
2393 break; 2447 int len = min (strlen (arg), IFNAMSIZ);
2394 if (name[sopt->nlen] == '=') 2448 bcopy (arg, devname, len);
2395 {
2396 arg = name + sopt->nlen + 1;
2397 break;
2398 }
2399 } 2449 }
2400 2450 else if (!NILP (val))
2401 switch (sopt->opttype) 2451 error ("Bad option value for %s", name);
2402 { 2452 ret = setsockopt (s, sopt->optlevel, sopt->optnum,
2403 case SOPT_BOOL: 2453 devname, IFNAMSIZ);
2404 { 2454 break;
2405 int optval; 2455 }
2406 if (s < 0) 2456 #endif
2407 return 1;
2408 if (arg)
2409 optval = (*arg == '0' || *arg == 'n') ? 0 : 1;
2410 else if (INTEGERP (val))
2411 optval = XINT (val) == 0 ? 0 : 1;
2412 else
2413 optval = NILP (val) ? 0 : 1;
2414 ret = setsockopt (s, sopt->optlevel, sopt->optnum,
2415 &optval, sizeof (optval));
2416 break;
2417 }
2418
2419 case SOPT_INT:
2420 {
2421 int optval;
2422 if (arg)
2423 optval = atoi(arg);
2424 else if (INTEGERP (val))
2425 optval = XINT (val);
2426 else
2427 error ("Bad option argument for %s", name);
2428 if (s < 0)
2429 return 1;
2430 ret = setsockopt (s, sopt->optlevel, sopt->optnum,
2431 &optval, sizeof (optval));
2432 break;
2433 }
2434
2435 case SOPT_STR:
2436 {
2437 if (!arg)
2438 {
2439 if (NILP (val))
2440 arg = "";
2441 else if (STRINGP (val))
2442 arg = (char *) SDATA (val);
2443 else if (XSYMBOL (val))
2444 arg = (char *) SDATA (SYMBOL_NAME (val));
2445 else
2446 error ("Invalid argument to %s option", name);
2447 }
2448 ret = setsockopt (s, sopt->optlevel, sopt->optnum,
2449 arg, strlen (arg));
2450 }
2451 2457
2452 #ifdef SO_LINGER 2458 #ifdef SO_LINGER
2453 case SOPT_LINGER: 2459 case SOPT_LINGER:
2454 { 2460 {
2455 struct linger linger; 2461 struct linger linger;
2456 2462
2457 linger.l_onoff = 1; 2463 linger.l_onoff = 1;
2458 linger.l_linger = 0; 2464 linger.l_linger = 0;
2459 2465 if (INTEGERP (val))
2460 if (s < 0) 2466 linger.l_linger = XINT (val);
2461 return 1; 2467 else
2462 2468 linger.l_onoff = NILP (val) ? 0 : 1;
2463 if (arg) 2469 ret = setsockopt (s, sopt->optlevel, sopt->optnum,
2464 { 2470 &linger, sizeof (linger));
2465 if (*arg == 'n' || *arg == 't' || *arg == 'y') 2471 break;
2466 linger.l_onoff = (*arg == 'n') ? 0 : 1; 2472 }
2467 else 2473 #endif
2468 linger.l_linger = atoi(arg); 2474
2469 } 2475 default:
2470 else if (INTEGERP (val)) 2476 return 0;
2471 linger.l_linger = XINT (val); 2477 }
2472 else 2478
2473 linger.l_onoff = NILP (val) ? 0 : 1; 2479 if (ret < 0)
2474 ret = setsockopt (s, sopt->optlevel, sopt->optnum, 2480 report_file_error ("Cannot set network option",
2475 &linger, sizeof (linger)); 2481 Fcons (opt, Fcons (val, Qnil)));
2476 break; 2482 return (1 << sopt->optbit);
2477 } 2483 }
2478 #endif 2484
2479 default: 2485
2480 if (s < 0) 2486 DEFUN ("set-network-process-option",
2481 return 0; 2487 Fset_network_process_option, Sset_network_process_option,
2482 if (no_error) 2488 3, 4, 0,
2483 continue; 2489 doc: /* For network process PROCESS set option OPTION to value VALUE.
2484 error ("Unsupported option: %s", name); 2490 See `make-network-process' for a list of options and values.
2485 } 2491 If optional fourth arg NO-ERROR is non-nil, don't signal an error if
2486 if (ret < 0 && ! no_error) 2492 OPTION is not a supported option, return nil instead; otherwise return t. */)
2487 report_file_error ("Cannot set network option: %s", opt); 2493 (process, option, value, no_error)
2488 } 2494 Lisp_Object process, option, value;
2489 return 1; 2495 Lisp_Object no_error;
2490 } 2496 {
2491 2497 int s;
2492 DEFUN ("set-network-process-options", 2498 struct Lisp_Process *p;
2493 Fset_network_process_options, Sset_network_process_options, 2499
2494 1, MANY, 0,
2495 doc: /* Set one or more options for network process PROCESS.
2496 Each option is either a string "OPT=VALUE" or a cons (OPT . VALUE).
2497 A boolean value is false if it either zero or nil, true otherwise.
2498
2499 The following options are known. Consult the relevant system manual
2500 pages for more information.
2501
2502 bindtodevice=NAME -- bind to interface NAME, or remove binding if nil.
2503 broadcast=BOOL -- Allow send and receive of datagram broadcasts.
2504 dontroute=BOOL -- Only send to directly connected hosts.
2505 keepalive=BOOL -- Send keep-alive messages on network stream.
2506 linger=BOOL or TIMEOUT -- Send queued messages before closing.
2507 oobinline=BOOL -- Place out-of-band data in receive data stream.
2508 priority=INT -- Set protocol defined priority for sent packets.
2509 reuseaddr=BOOL -- Allow reusing a recently used address.
2510
2511 usage: (set-network-process-options PROCESS &rest OPTIONS) */)
2512 (nargs, args)
2513 int nargs;
2514 Lisp_Object *args;
2515 {
2516 Lisp_Object process;
2517 Lisp_Object opts;
2518
2519 process = args[0];
2520 CHECK_PROCESS (process); 2500 CHECK_PROCESS (process);
2521 if (nargs > 1 && XINT (XPROCESS (process)->infd) >= 0) 2501 p = XPROCESS (process);
2522 { 2502 if (!NETCONN1_P (p))
2523 opts = Flist (nargs, args); 2503 error ("Process is not a network process");
2524 set_socket_options (XINT (XPROCESS (process)->infd), opts, 0); 2504
2525 } 2505 s = XINT (p->infd);
2526 return process; 2506 if (s < 0)
2527 } 2507 error ("Process is not running");
2508
2509 if (set_socket_option (s, option, value))
2510 {
2511 p->childp = Fplist_put (p->childp, option, value);
2512 return Qt;
2513 }
2514
2515 if (NILP (no_error))
2516 error ("Unknown or unsupported option");
2517
2518 return Qnil;
2519 }
2520
2528 2521
2529 /* A version of request_sigio suitable for a record_unwind_protect. */ 2522 /* A version of request_sigio suitable for a record_unwind_protect. */
2530 2523
2531 Lisp_Object 2524 Lisp_Object
2532 unwind_request_sigio (dummy) 2525 unwind_request_sigio (dummy)
2602 where F is the family number and AV is a vector containing the socket 2595 where F is the family number and AV is a vector containing the socket
2603 address data with one element per address data byte. Do not rely on 2596 address data with one element per address data byte. Do not rely on
2604 this format in portable code, as it may depend on implementation 2597 this format in portable code, as it may depend on implementation
2605 defined constants, data sizes, and data structure alignment. 2598 defined constants, data sizes, and data structure alignment.
2606 2599
2607 :coding CODING -- CODING is coding system for this process. 2600 :coding CODING -- If CODING is a symbol, it specifies the coding
2608 2601 system used for both reading and writing for this process. If CODING
2609 :options OPTIONS -- Set the specified options for the network process. 2602 is a cons (DECODING . ENCODING), DECODING is used for reading, and
2610 See `set-network-process-options' for details. 2603 ENCODING is used for writing.
2611 2604
2612 :nowait BOOL -- If BOOL is non-nil for a stream type client process, 2605 :nowait BOOL -- If BOOL is non-nil for a stream type client process,
2613 return without waiting for the connection to complete; instead, the 2606 return without waiting for the connection to complete; instead, the
2614 sentinel function will be called with second arg matching "open" (if 2607 sentinel function will be called with second arg matching "open" (if
2615 successful) or "failed" when the connect completes. Default is to use 2608 successful) or "failed" when the connect completes. Default is to use
2639 is the server process, CLIENT is the new process for the connection, 2632 is the server process, CLIENT is the new process for the connection,
2640 and MESSAGE is a string. 2633 and MESSAGE is a string.
2641 2634
2642 :plist PLIST -- Install PLIST as the new process' initial plist. 2635 :plist PLIST -- Install PLIST as the new process' initial plist.
2643 2636
2644 :server BOOL -- if BOOL is non-nil, create a server process for the 2637 :server QLEN -- if QLEN is non-nil, create a server process for the
2645 specified FAMILY, SERVICE, and connection type (stream or datagram). 2638 specified FAMILY, SERVICE, and connection type (stream or datagram).
2646 Default is a client process. 2639 If QLEN is an integer, it is used as the max. length of the server's
2647 2640 pending connection queue (also known as the backlog); the default
2648 A server process will listen for and accept connections from 2641 queue length is 5. Default is to create a client process.
2649 clients. When a client connection is accepted, a new network process 2642
2650 is created for the connection with the following parameters: 2643 The following network options can be specified for this connection:
2644
2645 :broadcast BOOL -- Allow send and receive of datagram broadcasts.
2646 :dontroute BOOL -- Only send to directly connected hosts.
2647 :keepalive BOOL -- Send keep-alive messages on network stream.
2648 :linger BOOL or TIMEOUT -- Send queued messages before closing.
2649 :oobinline BOOL -- Place out-of-band data in receive data stream.
2650 :priority INT -- Set protocol defined priority for sent packets.
2651 :reuseaddr BOOL -- Allow reusing a recently used local address
2652 (this is allowed by default for a server process).
2653 :bindtodevice NAME -- bind to interface NAME. Using this may require
2654 special privileges on some systems.
2655
2656 Consult the relevant system programmer's manual pages for more
2657 information on using these options.
2658
2659
2660 A server process will listen for and accept connections from clients.
2661 When a client connection is accepted, a new network process is created
2662 for the connection with the following parameters:
2663
2651 - The client's process name is constructed by concatenating the server 2664 - The client's process name is constructed by concatenating the server
2652 process' NAME and a client identification string. 2665 process' NAME and a client identification string.
2653 - If the FILTER argument is non-nil, the client process will not get a 2666 - If the FILTER argument is non-nil, the client process will not get a
2654 separate process buffer; otherwise, the client's process buffer is a newly 2667 separate process buffer; otherwise, the client's process buffer is a newly
2655 created buffer named after the server process' BUFFER name or process 2668 created buffer named after the server process' BUFFER name or process
2706 Lisp_Object QCaddress; /* one of QClocal or QCremote */ 2719 Lisp_Object QCaddress; /* one of QClocal or QCremote */
2707 Lisp_Object tem; 2720 Lisp_Object tem;
2708 Lisp_Object name, buffer, host, service, address; 2721 Lisp_Object name, buffer, host, service, address;
2709 Lisp_Object filter, sentinel; 2722 Lisp_Object filter, sentinel;
2710 int is_non_blocking_client = 0; 2723 int is_non_blocking_client = 0;
2711 int is_server = 0; 2724 int is_server = 0, backlog = 5;
2712 int socktype; 2725 int socktype;
2713 int family = -1; 2726 int family = -1;
2714 2727
2715 if (nargs == 0) 2728 if (nargs == 0)
2716 return Qnil; 2729 return Qnil;
2743 not available, since a blocked Emacs is not useful. */ 2756 not available, since a blocked Emacs is not useful. */
2744 #if defined(TERM) || (!defined(O_NONBLOCK) && !defined(O_NDELAY)) 2757 #if defined(TERM) || (!defined(O_NONBLOCK) && !defined(O_NDELAY))
2745 error ("Network servers not supported"); 2758 error ("Network servers not supported");
2746 #else 2759 #else
2747 is_server = 1; 2760 is_server = 1;
2761 if (INTEGERP (tem))
2762 backlog = XINT (tem);
2748 #endif 2763 #endif
2749 } 2764 }
2750 2765
2751 /* Make QCaddress an alias for :local (server) or :remote (client). */ 2766 /* Make QCaddress an alias for :local (server) or :remote (client). */
2752 QCaddress = is_server ? QClocal : QCremote; 2767 QCaddress = is_server ? QClocal : QCremote;
2995 count1 = SPECPDL_INDEX (); 3010 count1 = SPECPDL_INDEX ();
2996 s = -1; 3011 s = -1;
2997 3012
2998 for (lres = res; lres; lres = lres->ai_next) 3013 for (lres = res; lres; lres = lres->ai_next)
2999 { 3014 {
3015 int optn, optbits;
3016
3000 s = socket (lres->ai_family, lres->ai_socktype, lres->ai_protocol); 3017 s = socket (lres->ai_family, lres->ai_socktype, lres->ai_protocol);
3001 if (s < 0) 3018 if (s < 0)
3002 { 3019 {
3003 xerrno = errno; 3020 xerrno = errno;
3004 continue; 3021 continue;
3028 #endif 3045 #endif
3029 3046
3030 /* Make us close S if quit. */ 3047 /* Make us close S if quit. */
3031 record_unwind_protect (close_file_unwind, make_number (s)); 3048 record_unwind_protect (close_file_unwind, make_number (s));
3032 3049
3050 /* Parse network options in the arg list.
3051 We simply ignore anything which isn't a known option (including other keywords).
3052 An error is signalled if setting a known option fails. */
3053 for (optn = optbits = 0; optn < nargs-1; optn += 2)
3054 optbits |= set_socket_option (s, args[optn], args[optn+1]);
3055
3033 if (is_server) 3056 if (is_server)
3034 { 3057 {
3035 /* Configure as a server socket. */ 3058 /* Configure as a server socket. */
3059
3060 /* SO_REUSEADDR = 1 is default for server sockets; must specify
3061 explicit :reuseaddr key to override this. */
3036 #ifdef HAVE_LOCAL_SOCKETS 3062 #ifdef HAVE_LOCAL_SOCKETS
3037 if (family != AF_LOCAL) 3063 if (family != AF_LOCAL)
3038 #endif 3064 #endif
3039 { 3065 if (!(optbits & (1 << OPIX_REUSEADDR)))
3040 int optval = 1; 3066 {
3041 if (setsockopt (s, SOL_SOCKET, SO_REUSEADDR, &optval, sizeof optval)) 3067 int optval = 1;
3042 report_file_error ("Cannot set reuse option on server socket.", Qnil); 3068 if (setsockopt (s, SOL_SOCKET, SO_REUSEADDR, &optval, sizeof optval))
3043 } 3069 report_file_error ("Cannot set reuse option on server socket", Qnil);
3070 }
3044 3071
3045 if (bind (s, lres->ai_addr, lres->ai_addrlen)) 3072 if (bind (s, lres->ai_addr, lres->ai_addrlen))
3046 report_file_error ("Cannot bind server socket", Qnil); 3073 report_file_error ("Cannot bind server socket", Qnil);
3047 3074
3048 #ifdef HAVE_GETSOCKNAME 3075 #ifdef HAVE_GETSOCKNAME
3057 contact = Fplist_put (contact, QCservice, service); 3084 contact = Fplist_put (contact, QCservice, service);
3058 } 3085 }
3059 } 3086 }
3060 #endif 3087 #endif
3061 3088
3062 if (socktype == SOCK_STREAM && listen (s, 5)) 3089 if (socktype == SOCK_STREAM && listen (s, backlog))
3063 report_file_error ("Cannot listen on server socket", Qnil); 3090 report_file_error ("Cannot listen on server socket", Qnil);
3064 3091
3065 break; 3092 break;
3066 } 3093 }
3067 3094
3193 report_file_error ("make server process failed", contact); 3220 report_file_error ("make server process failed", contact);
3194 else 3221 else
3195 report_file_error ("make client process failed", contact); 3222 report_file_error ("make client process failed", contact);
3196 } 3223 }
3197 3224
3198 tem = Fplist_get (contact, QCoptions);
3199 if (!NILP (tem))
3200 set_socket_options (s, tem, 1);
3201
3202 #endif /* not TERM */ 3225 #endif /* not TERM */
3203 3226
3204 inch = s; 3227 inch = s;
3205 outch = s; 3228 outch = s;
3206 3229
3278 /* Qt denotes we have not yet called Ffind_operation_coding_system. */ 3301 /* Qt denotes we have not yet called Ffind_operation_coding_system. */
3279 Lisp_Object coding_systems = Qt; 3302 Lisp_Object coding_systems = Qt;
3280 Lisp_Object args[5], val; 3303 Lisp_Object args[5], val;
3281 3304
3282 if (!NILP (tem)) 3305 if (!NILP (tem))
3283 val = XCAR (XCDR (tem)); 3306 {
3307 val = XCAR (XCDR (tem));
3308 if (CONSP (val))
3309 val = XCAR (val);
3310 }
3284 else if (!NILP (Vcoding_system_for_read)) 3311 else if (!NILP (Vcoding_system_for_read))
3285 val = Vcoding_system_for_read; 3312 val = Vcoding_system_for_read;
3286 else if ((!NILP (buffer) && NILP (XBUFFER (buffer)->enable_multibyte_characters)) 3313 else if ((!NILP (buffer) && NILP (XBUFFER (buffer)->enable_multibyte_characters))
3287 || (NILP (buffer) && NILP (buffer_defaults.enable_multibyte_characters))) 3314 || (NILP (buffer) && NILP (buffer_defaults.enable_multibyte_characters)))
3288 /* We dare not decode end-of-line format by setting VAL to 3315 /* We dare not decode end-of-line format by setting VAL to
3310 val = Qnil; 3337 val = Qnil;
3311 } 3338 }
3312 p->decode_coding_system = val; 3339 p->decode_coding_system = val;
3313 3340
3314 if (!NILP (tem)) 3341 if (!NILP (tem))
3315 val = XCAR (XCDR (tem)); 3342 {
3343 val = XCAR (XCDR (tem));
3344 if (CONSP (val))
3345 val = XCDR (val);
3346 }
3316 else if (!NILP (Vcoding_system_for_write)) 3347 else if (!NILP (Vcoding_system_for_write))
3317 val = Vcoding_system_for_write; 3348 val = Vcoding_system_for_write;
3318 else if (NILP (current_buffer->enable_multibyte_characters)) 3349 else if (NILP (current_buffer->enable_multibyte_characters))
3319 val = Qnil; 3350 val = Qnil;
3320 else 3351 else
3355 UNGCPRO; 3386 UNGCPRO;
3356 return proc; 3387 return proc;
3357 } 3388 }
3358 #endif /* HAVE_SOCKETS */ 3389 #endif /* HAVE_SOCKETS */
3359 3390
3391
3392 #if defined(HAVE_SOCKETS) && defined(HAVE_NET_IF_H) && defined(HAVE_SYS_IOCTL_H)
3393
3394 #ifdef SIOCGIFCONF
3395 DEFUN ("network-interface-list", Fnetwork_interface_list, Snetwork_interface_list, 0, 0, 0,
3396 doc: /* Return an alist of all network interfaces and their network address.
3397 Each element is a cons, the car of which is a string containing the
3398 interface name, and the cdr is the network address in internal
3399 format; see the description of ADDRESS in `make-network-process'. */)
3400 ()
3401 {
3402 struct ifconf ifconf;
3403 struct ifreq *ifreqs = NULL;
3404 int ifaces = 0;
3405 int buf_size, s;
3406 Lisp_Object res;
3407
3408 s = socket (AF_INET, SOCK_STREAM, 0);
3409 if (s < 0)
3410 return Qnil;
3411
3412 again:
3413 ifaces += 25;
3414 buf_size = ifaces * sizeof(ifreqs[0]);
3415 ifreqs = (struct ifreq *)xrealloc(ifreqs, buf_size);
3416 if (!ifreqs)
3417 {
3418 close (s);
3419 return Qnil;
3420 }
3421
3422 ifconf.ifc_len = buf_size;
3423 ifconf.ifc_req = ifreqs;
3424 if (ioctl (s, SIOCGIFCONF, &ifconf))
3425 {
3426 close (s);
3427 return Qnil;
3428 }
3429
3430 if (ifconf.ifc_len == buf_size)
3431 goto again;
3432
3433 close (s);
3434 ifaces = ifconf.ifc_len / sizeof (ifreqs[0]);
3435
3436 res = Qnil;
3437 while (--ifaces >= 0)
3438 {
3439 struct ifreq *ifq = &ifreqs[ifaces];
3440 char namebuf[sizeof (ifq->ifr_name) + 1];
3441 if (ifq->ifr_addr.sa_family != AF_INET)
3442 continue;
3443 bcopy (ifq->ifr_name, namebuf, sizeof (ifq->ifr_name));
3444 namebuf[sizeof (ifq->ifr_name)] = 0;
3445 res = Fcons (Fcons (build_string (namebuf),
3446 conv_sockaddr_to_lisp (&ifq->ifr_addr,
3447 sizeof (struct sockaddr))),
3448 res);
3449 }
3450
3451 return res;
3452 }
3453 #endif /* SIOCGIFCONF */
3454
3455 #if defined(SIOCGIFADDR) || defined(SIOCGIFHWADDR) || defined(SIOCGIFFLAGS)
3456
3457 struct ifflag_def {
3458 int flag_bit;
3459 char *flag_sym;
3460 };
3461
3462 static struct ifflag_def ifflag_table[] = {
3463 #ifdef IFF_UP
3464 { IFF_UP, "up" },
3465 #endif
3466 #ifdef IFF_BROADCAST
3467 { IFF_BROADCAST, "broadcast" },
3468 #endif
3469 #ifdef IFF_DEBUG
3470 { IFF_DEBUG, "debug" },
3471 #endif
3472 #ifdef IFF_LOOPBACK
3473 { IFF_LOOPBACK, "loopback" },
3474 #endif
3475 #ifdef IFF_POINTOPOINT
3476 { IFF_POINTOPOINT, "pointopoint" },
3477 #endif
3478 #ifdef IFF_RUNNING
3479 { IFF_RUNNING, "running" },
3480 #endif
3481 #ifdef IFF_NOARP
3482 { IFF_NOARP, "noarp" },
3483 #endif
3484 #ifdef IFF_PROMISC
3485 { IFF_PROMISC, "promisc" },
3486 #endif
3487 #ifdef IFF_NOTRAILERS
3488 { IFF_NOTRAILERS, "notrailers" },
3489 #endif
3490 #ifdef IFF_ALLMULTI
3491 { IFF_ALLMULTI, "allmulti" },
3492 #endif
3493 #ifdef IFF_MASTER
3494 { IFF_MASTER, "master" },
3495 #endif
3496 #ifdef IFF_SLAVE
3497 { IFF_SLAVE, "slave" },
3498 #endif
3499 #ifdef IFF_MULTICAST
3500 { IFF_MULTICAST, "multicast" },
3501 #endif
3502 #ifdef IFF_PORTSEL
3503 { IFF_PORTSEL, "portsel" },
3504 #endif
3505 #ifdef IFF_AUTOMEDIA
3506 { IFF_AUTOMEDIA, "automedia" },
3507 #endif
3508 #ifdef IFF_DYNAMIC
3509 { IFF_DYNAMIC, "dynamic" },
3510 #endif
3511 { 0, 0 }
3512 };
3513
3514 DEFUN ("network-interface-info", Fnetwork_interface_info, Snetwork_interface_info, 1, 1, 0,
3515 doc: /* Return information about network interface named IFNAME.
3516 The return value is a list (ADDR BCAST NETMASK HWADDR FLAGS),
3517 where ADDR is the layer 3 address, BCAST is the layer 3 broadcast address,
3518 NETMASK is the layer 3 network mask, HWADDR is the layer 2 addres, and
3519 FLAGS is the current flags of the interface. */)
3520 (ifname)
3521 Lisp_Object ifname;
3522 {
3523 struct ifreq rq;
3524 Lisp_Object res = Qnil;
3525 Lisp_Object elt;
3526 int s;
3527 int any = 0;
3528
3529 CHECK_STRING (ifname);
3530
3531 bzero (rq.ifr_name, sizeof rq.ifr_name);
3532 strncpy (rq.ifr_name, SDATA (ifname), sizeof (rq.ifr_name));
3533
3534 s = socket (AF_INET, SOCK_STREAM, 0);
3535 if (s < 0)
3536 return Qnil;
3537
3538 elt = Qnil;
3539 #if defined(SIOCGIFFLAGS) && defined(HAVE_STRUCT_IFREQ_IFR_FLAGS)
3540 if (ioctl (s, SIOCGIFFLAGS, &rq) == 0)
3541 {
3542 int flags = rq.ifr_flags;
3543 struct ifflag_def *fp;
3544 int fnum;
3545
3546 any++;
3547 for (fp = ifflag_table; flags != 0 && fp; fp++)
3548 {
3549 if (flags & fp->flag_bit)
3550 {
3551 elt = Fcons (intern (fp->flag_sym), elt);
3552 flags -= fp->flag_bit;
3553 }
3554 }
3555 for (fnum = 0; flags && fnum < 32; fnum++)
3556 {
3557 if (flags & (1 << fnum))
3558 {
3559 elt = Fcons (make_number (fnum), elt);
3560 }
3561 }
3562 }
3563 #endif
3564 res = Fcons (elt, res);
3565
3566 elt = Qnil;
3567 #if defined(SIOCGIFHWADDR) && defined(HAVE_STRUCT_IFREQ_IFR_HWADDR)
3568 if (ioctl (s, SIOCGIFHWADDR, &rq) == 0)
3569 {
3570 Lisp_Object hwaddr = Fmake_vector (make_number (6), Qnil);
3571 register struct Lisp_Vector *p = XVECTOR (hwaddr);
3572 int n;
3573
3574 any++;
3575 for (n = 0; n < 6; n++)
3576 p->contents[n] = make_number (((unsigned char *)&rq.ifr_hwaddr.sa_data[0])[n]);
3577 elt = Fcons (make_number (rq.ifr_hwaddr.sa_family), hwaddr);
3578 }
3579 #endif
3580 res = Fcons (elt, res);
3581
3582 elt = Qnil;
3583 #if defined(SIOCGIFNETMASK) && defined(ifr_netmask)
3584 if (ioctl (s, SIOCGIFNETMASK, &rq) == 0)
3585 {
3586 any++;
3587 elt = conv_sockaddr_to_lisp (&rq.ifr_netmask, sizeof (rq.ifr_netmask));
3588 }
3589 #endif
3590 res = Fcons (elt, res);
3591
3592 elt = Qnil;
3593 #if defined(SIOCGIFBRDADDR) && defined(HAVE_STRUCT_IFREQ_IFR_BROADADDR)
3594 if (ioctl (s, SIOCGIFBRDADDR, &rq) == 0)
3595 {
3596 any++;
3597 elt = conv_sockaddr_to_lisp (&rq.ifr_broadaddr, sizeof (rq.ifr_broadaddr));
3598 }
3599 #endif
3600 res = Fcons (elt, res);
3601
3602 elt = Qnil;
3603 #if defined(SIOCGIFADDR) && defined(HAVE_STRUCT_IFREQ_IFR_ADDR)
3604 if (ioctl (s, SIOCGIFADDR, &rq) == 0)
3605 {
3606 any++;
3607 elt = conv_sockaddr_to_lisp (&rq.ifr_addr, sizeof (rq.ifr_addr));
3608 }
3609 #endif
3610 res = Fcons (elt, res);
3611
3612 close (s);
3613
3614 return any ? res : Qnil;
3615 }
3616 #endif
3617 #endif /* HAVE_SOCKETS */
3618
3360 void 3619 void
3361 deactivate_process (proc) 3620 deactivate_process (proc)
3362 Lisp_Object proc; 3621 Lisp_Object proc;
3363 { 3622 {
3364 register int inchannel, outchannel; 3623 register int inchannel, outchannel;
3365 register struct Lisp_Process *p = XPROCESS (proc); 3624 register struct Lisp_Process *p = XPROCESS (proc);
3366 3625
3367 inchannel = XINT (p->infd); 3626 inchannel = XINT (p->infd);
3368 outchannel = XINT (p->outfd); 3627 outchannel = XINT (p->outfd);
3369 3628
3629 #ifdef ADAPTIVE_READ_BUFFERING
3630 if (XINT (p->read_output_delay) > 0)
3631 {
3632 if (--process_output_delay_count < 0)
3633 process_output_delay_count = 0;
3634 XSETINT (p->read_output_delay, 0);
3635 p->read_output_skip = Qnil;
3636 }
3637 #endif
3638
3370 if (inchannel >= 0) 3639 if (inchannel >= 0)
3371 { 3640 {
3372 /* Beware SIGCHLD hereabouts. */ 3641 /* Beware SIGCHLD hereabouts. */
3373 flush_pending_output (inchannel); 3642 flush_pending_output (inchannel);
3374 #ifdef VMS 3643 #ifdef VMS
3750 int do_display; 4019 int do_display;
3751 { 4020 {
3752 register int channel, nfds; 4021 register int channel, nfds;
3753 static SELECT_TYPE Available; 4022 static SELECT_TYPE Available;
3754 static SELECT_TYPE Connecting; 4023 static SELECT_TYPE Connecting;
3755 int check_connect, no_avail; 4024 int check_connect, check_delay, no_avail;
3756 int xerrno; 4025 int xerrno;
3757 Lisp_Object proc; 4026 Lisp_Object proc;
3758 EMACS_TIME timeout, end_time; 4027 EMACS_TIME timeout, end_time;
3759 int wait_channel = -1; 4028 int wait_channel = -1;
3760 struct Lisp_Process *wait_proc = 0; 4029 struct Lisp_Process *wait_proc = 0;
3810 /* If calling from keyboard input, do not quit 4079 /* If calling from keyboard input, do not quit
3811 since we want to return C-g as an input character. 4080 since we want to return C-g as an input character.
3812 Otherwise, do pending quit if requested. */ 4081 Otherwise, do pending quit if requested. */
3813 if (XINT (read_kbd) >= 0) 4082 if (XINT (read_kbd) >= 0)
3814 QUIT; 4083 QUIT;
4084 #ifdef SYNC_INPUT
4085 else if (interrupt_input_pending)
4086 handle_async_input ();
4087 #endif
3815 4088
3816 /* Exit now if the cell we're waiting for became non-nil. */ 4089 /* Exit now if the cell we're waiting for became non-nil. */
3817 if (! NILP (wait_for_cell) && ! NILP (XCAR (wait_for_cell))) 4090 if (! NILP (wait_for_cell) && ! NILP (XCAR (wait_for_cell)))
3818 break; 4091 break;
3819 4092
3979 /* Wait till there is something to do */ 4252 /* Wait till there is something to do */
3980 4253
3981 if (!NILP (wait_for_cell)) 4254 if (!NILP (wait_for_cell))
3982 { 4255 {
3983 Available = non_process_wait_mask; 4256 Available = non_process_wait_mask;
3984 check_connect = 0; 4257 check_connect = check_delay = 0;
3985 } 4258 }
3986 else 4259 else
3987 { 4260 {
3988 if (! XINT (read_kbd)) 4261 if (! XINT (read_kbd))
3989 Available = non_keyboard_wait_mask; 4262 Available = non_keyboard_wait_mask;
3990 else 4263 else
3991 Available = input_wait_mask; 4264 Available = input_wait_mask;
3992 check_connect = (num_pending_connects > 0); 4265 check_connect = (num_pending_connects > 0);
4266 check_delay = wait_channel >= 0 ? 0 : process_output_delay_count;
3993 } 4267 }
3994 4268
3995 /* If frame size has changed or the window is newly mapped, 4269 /* If frame size has changed or the window is newly mapped,
3996 redisplay now, before we start to wait. There is a race 4270 redisplay now, before we start to wait. There is a race
3997 condition here; if a SIGIO arrives between now and the select 4271 condition here; if a SIGIO arrives between now and the select
4013 } 4287 }
4014 else 4288 else
4015 { 4289 {
4016 if (check_connect) 4290 if (check_connect)
4017 Connecting = connect_wait_mask; 4291 Connecting = connect_wait_mask;
4292
4293 #ifdef ADAPTIVE_READ_BUFFERING
4294 if (process_output_skip && check_delay > 0)
4295 {
4296 int usecs = EMACS_USECS (timeout);
4297 if (EMACS_SECS (timeout) > 0 || usecs > READ_OUTPUT_DELAY_MAX)
4298 usecs = READ_OUTPUT_DELAY_MAX;
4299 for (channel = 0; check_delay > 0 && channel <= max_process_desc; channel++)
4300 {
4301 proc = chan_process[channel];
4302 if (NILP (proc))
4303 continue;
4304 if (XINT (XPROCESS (proc)->read_output_delay) > 0)
4305 {
4306 check_delay--;
4307 if (NILP (XPROCESS (proc)->read_output_skip))
4308 continue;
4309 FD_CLR (channel, &Available);
4310 XPROCESS (proc)->read_output_skip = Qnil;
4311 if (XINT (XPROCESS (proc)->read_output_delay) < usecs)
4312 usecs = XINT (XPROCESS (proc)->read_output_delay);
4313 }
4314 }
4315 EMACS_SET_SECS_USECS (timeout, 0, usecs);
4316 process_output_skip = 0;
4317 }
4318 #endif
4319
4018 nfds = select (max (max_process_desc, max_keyboard_desc) + 1, 4320 nfds = select (max (max_process_desc, max_keyboard_desc) + 1,
4019 &Available, 4321 &Available,
4020 (check_connect ? &Connecting : (SELECT_TYPE *)0), 4322 (check_connect ? &Connecting : (SELECT_TYPE *)0),
4021 (SELECT_TYPE *)0, &timeout); 4323 (SELECT_TYPE *)0, &timeout);
4022 } 4324 }
4466 0, datagram_address[channel].sa, &len); 4768 0, datagram_address[channel].sa, &len);
4467 } 4769 }
4468 else 4770 else
4469 #endif 4771 #endif
4470 if (proc_buffered_char[channel] < 0) 4772 if (proc_buffered_char[channel] < 0)
4471 nbytes = emacs_read (channel, chars + carryover, readmax - carryover); 4773 {
4774 nbytes = emacs_read (channel, chars + carryover, readmax - carryover);
4775 #ifdef ADAPTIVE_READ_BUFFERING
4776 if (!NILP (p->adaptive_read_buffering))
4777 {
4778 int delay = XINT (p->read_output_delay);
4779 if (nbytes < 256)
4780 {
4781 if (delay < READ_OUTPUT_DELAY_MAX_MAX)
4782 {
4783 if (delay == 0)
4784 process_output_delay_count++;
4785 delay += READ_OUTPUT_DELAY_INCREMENT * 2;
4786 }
4787 }
4788 else if (delay > 0 && (nbytes == readmax - carryover))
4789 {
4790 delay -= READ_OUTPUT_DELAY_INCREMENT;
4791 if (delay == 0)
4792 process_output_delay_count--;
4793 }
4794 XSETINT (p->read_output_delay, delay);
4795 if (delay)
4796 {
4797 p->read_output_skip = Qt;
4798 process_output_skip = 1;
4799 }
4800 }
4801 #endif
4802 }
4472 else 4803 else
4473 { 4804 {
4474 chars[carryover] = proc_buffered_char[channel]; 4805 chars[carryover] = proc_buffered_char[channel];
4475 proc_buffered_char[channel] = -1; 4806 proc_buffered_char[channel] = -1;
4476 nbytes = emacs_read (channel, chars + carryover + 1, readmax - 1 - carryover); 4807 nbytes = emacs_read (channel, chars + carryover + 1, readmax - 1 - carryover);
4772 unsigned char *volatile buf; 5103 unsigned char *volatile buf;
4773 volatile int len; 5104 volatile int len;
4774 volatile Lisp_Object object; 5105 volatile Lisp_Object object;
4775 { 5106 {
4776 /* Use volatile to protect variables from being clobbered by longjmp. */ 5107 /* Use volatile to protect variables from being clobbered by longjmp. */
5108 struct Lisp_Process *p = XPROCESS (proc);
4777 int rv; 5109 int rv;
4778 struct coding_system *coding; 5110 struct coding_system *coding;
4779 struct gcpro gcpro1; 5111 struct gcpro gcpro1;
4780 5112
4781 GCPRO1 (object); 5113 GCPRO1 (object);
4782 5114
4783 #ifdef VMS 5115 #ifdef VMS
4784 struct Lisp_Process *p = XPROCESS (proc);
4785 VMS_PROC_STUFF *vs, *get_vms_process_pointer(); 5116 VMS_PROC_STUFF *vs, *get_vms_process_pointer();
4786 #endif /* VMS */ 5117 #endif /* VMS */
4787 5118
4788 if (! NILP (XPROCESS (proc)->raw_status_low)) 5119 if (! NILP (p->raw_status_low))
4789 update_status (XPROCESS (proc)); 5120 update_status (p);
4790 if (! EQ (XPROCESS (proc)->status, Qrun)) 5121 if (! EQ (p->status, Qrun))
4791 error ("Process %s not running", 5122 error ("Process %s not running", SDATA (p->name));
4792 SDATA (XPROCESS (proc)->name)); 5123 if (XINT (p->outfd) < 0)
4793 if (XINT (XPROCESS (proc)->outfd) < 0) 5124 error ("Output file descriptor of %s is closed", SDATA (p->name));
4794 error ("Output file descriptor of %s is closed", 5125
4795 SDATA (XPROCESS (proc)->name)); 5126 coding = proc_encode_coding_system[XINT (p->outfd)];
4796
4797 coding = proc_encode_coding_system[XINT (XPROCESS (proc)->outfd)];
4798 Vlast_coding_system_used = CODING_ID_NAME (coding->id); 5127 Vlast_coding_system_used = CODING_ID_NAME (coding->id);
4799 5128
4800 if ((STRINGP (object) && STRING_MULTIBYTE (object)) 5129 if ((STRINGP (object) && STRING_MULTIBYTE (object))
4801 || (BUFFERP (object) 5130 || (BUFFERP (object)
4802 && !NILP (XBUFFER (object)->enable_multibyte_characters)) 5131 && !NILP (XBUFFER (object)->enable_multibyte_characters))
4803 || EQ (object, Qt)) 5132 || EQ (object, Qt))
4804 { 5133 {
4805 if (!EQ (Vlast_coding_system_used, 5134 if (!EQ (Vlast_coding_system_used, p->encode_coding_system))
4806 XPROCESS (proc)->encode_coding_system))
4807 /* The coding system for encoding was changed to raw-text 5135 /* The coding system for encoding was changed to raw-text
4808 because we sent a unibyte text previously. Now we are 5136 because we sent a unibyte text previously. Now we are
4809 sending a multibyte text, thus we must encode it by the 5137 sending a multibyte text, thus we must encode it by the
4810 original coding system specified for the current 5138 original coding system specified for the current process. */
4811 process. */ 5139 setup_coding_system (p->encode_coding_system, coding);
4812 setup_coding_system (XPROCESS (proc)->encode_coding_system, coding);
4813 coding->src_multibyte = 1; 5140 coding->src_multibyte = 1;
4814 } 5141 }
4815 else 5142 else
4816 { 5143 {
4817 /* For sending a unibyte text, character code conversion should 5144 /* For sending a unibyte text, character code conversion should
4878 #else /* not VMS */ 5205 #else /* not VMS */
4879 5206
4880 if (pty_max_bytes == 0) 5207 if (pty_max_bytes == 0)
4881 { 5208 {
4882 #if defined (HAVE_FPATHCONF) && defined (_PC_MAX_CANON) 5209 #if defined (HAVE_FPATHCONF) && defined (_PC_MAX_CANON)
4883 pty_max_bytes = fpathconf (XFASTINT (XPROCESS (proc)->outfd), 5210 pty_max_bytes = fpathconf (XFASTINT (p->outfd), _PC_MAX_CANON);
4884 _PC_MAX_CANON);
4885 if (pty_max_bytes < 0) 5211 if (pty_max_bytes < 0)
4886 pty_max_bytes = 250; 5212 pty_max_bytes = 250;
4887 #else 5213 #else
4888 pty_max_bytes = 250; 5214 pty_max_bytes = 250;
4889 #endif 5215 #endif
4902 int this = len; 5228 int this = len;
4903 SIGTYPE (*old_sigpipe)(); 5229 SIGTYPE (*old_sigpipe)();
4904 5230
4905 /* Decide how much data we can send in one batch. 5231 /* Decide how much data we can send in one batch.
4906 Long lines need to be split into multiple batches. */ 5232 Long lines need to be split into multiple batches. */
4907 if (!NILP (XPROCESS (proc)->pty_flag)) 5233 if (!NILP (p->pty_flag))
4908 { 5234 {
4909 /* Starting this at zero is always correct when not the first 5235 /* Starting this at zero is always correct when not the first
4910 iteration because the previous iteration ended by sending C-d. 5236 iteration because the previous iteration ended by sending C-d.
4911 It may not be correct for the first iteration 5237 It may not be correct for the first iteration
4912 if a partial line was sent in a separate send_process call. 5238 if a partial line was sent in a separate send_process call.
4931 } 5257 }
4932 5258
4933 /* Send this batch, using one or more write calls. */ 5259 /* Send this batch, using one or more write calls. */
4934 while (this > 0) 5260 while (this > 0)
4935 { 5261 {
4936 int outfd = XINT (XPROCESS (proc)->outfd); 5262 int outfd = XINT (p->outfd);
4937 old_sigpipe = (SIGTYPE (*) ()) signal (SIGPIPE, send_process_trap); 5263 old_sigpipe = (SIGTYPE (*) ()) signal (SIGPIPE, send_process_trap);
4938 #ifdef DATAGRAM_SOCKETS 5264 #ifdef DATAGRAM_SOCKETS
4939 if (DATAGRAM_CHAN_P (outfd)) 5265 if (DATAGRAM_CHAN_P (outfd))
4940 { 5266 {
4941 rv = sendto (outfd, (char *) buf, this, 5267 rv = sendto (outfd, (char *) buf, this,
4944 if (rv < 0 && errno == EMSGSIZE) 5270 if (rv < 0 && errno == EMSGSIZE)
4945 report_file_error ("sending datagram", Fcons (proc, Qnil)); 5271 report_file_error ("sending datagram", Fcons (proc, Qnil));
4946 } 5272 }
4947 else 5273 else
4948 #endif 5274 #endif
4949 rv = emacs_write (outfd, (char *) buf, this); 5275 {
5276 rv = emacs_write (outfd, (char *) buf, this);
5277 #ifdef ADAPTIVE_READ_BUFFERING
5278 if (XINT (p->read_output_delay) > 0
5279 && EQ (p->adaptive_read_buffering, Qt))
5280 {
5281 XSETFASTINT (p->read_output_delay, 0);
5282 process_output_delay_count--;
5283 p->read_output_skip = Qnil;
5284 }
5285 #endif
5286 }
4950 signal (SIGPIPE, old_sigpipe); 5287 signal (SIGPIPE, old_sigpipe);
4951 5288
4952 if (rv < 0) 5289 if (rv < 0)
4953 { 5290 {
4954 if (0 5291 if (0
4985 later read(2), without the CRs. */ 5322 later read(2), without the CRs. */
4986 5323
4987 if (errno == EAGAIN) 5324 if (errno == EAGAIN)
4988 { 5325 {
4989 int flags = FWRITE; 5326 int flags = FWRITE;
4990 ioctl (XINT (XPROCESS (proc)->outfd), TIOCFLUSH, 5327 ioctl (XINT (p->outfd), TIOCFLUSH, &flags);
4991 &flags);
4992 } 5328 }
4993 #endif /* BROKEN_PTY_READ_AFTER_EAGAIN */ 5329 #endif /* BROKEN_PTY_READ_AFTER_EAGAIN */
4994 5330
4995 /* Running filters might relocate buffers or strings. 5331 /* Running filters might relocate buffers or strings.
4996 Arrange to relocate BUF. */ 5332 Arrange to relocate BUF. */
5031 #endif /* not VMS */ 5367 #endif /* not VMS */
5032 else 5368 else
5033 { 5369 {
5034 #ifndef VMS 5370 #ifndef VMS
5035 proc = process_sent_to; 5371 proc = process_sent_to;
5036 #endif 5372 p = XPROCESS (proc);
5037 XPROCESS (proc)->raw_status_low = Qnil; 5373 #endif
5038 XPROCESS (proc)->raw_status_high = Qnil; 5374 p->raw_status_low = Qnil;
5039 XPROCESS (proc)->status = Fcons (Qexit, Fcons (make_number (256), Qnil)); 5375 p->raw_status_high = Qnil;
5040 XSETINT (XPROCESS (proc)->tick, ++process_tick); 5376 p->status = Fcons (Qexit, Fcons (make_number (256), Qnil));
5377 XSETINT (p->tick, ++process_tick);
5041 deactivate_process (proc); 5378 deactivate_process (proc);
5042 #ifdef VMS 5379 #ifdef VMS
5043 error ("Error writing to process %s; closed it", 5380 error ("Error writing to process %s; closed it", SDATA (p->name));
5044 SDATA (XPROCESS (proc)->name));
5045 #else 5381 #else
5046 error ("SIGPIPE raised on process %s; closed it", 5382 error ("SIGPIPE raised on process %s; closed it", SDATA (p->name));
5047 SDATA (XPROCESS (proc)->name));
5048 #endif 5383 #endif
5049 } 5384 }
5050 5385
5051 UNGCPRO; 5386 UNGCPRO;
5052 } 5387 }
5756 handler will be called again, resulting in an infinite loop. The 6091 handler will be called again, resulting in an infinite loop. The
5757 relevant portion of the documentation reads "SIGCLD signals will be 6092 relevant portion of the documentation reads "SIGCLD signals will be
5758 queued and the signal-catching function will be continually 6093 queued and the signal-catching function will be continually
5759 reentered until the queue is empty". Invoking signal() causes the 6094 reentered until the queue is empty". Invoking signal() causes the
5760 kernel to reexamine the SIGCLD queue. Fred Fish, UniSoft Systems 6095 kernel to reexamine the SIGCLD queue. Fred Fish, UniSoft Systems
5761 Inc. */ 6096 Inc.
6097
6098 ** Malloc WARNING: This should never call malloc either directly or
6099 indirectly; if it does, that is a bug */
5762 6100
5763 SIGTYPE 6101 SIGTYPE
5764 sigchld_handler (signo) 6102 sigchld_handler (signo)
5765 int signo; 6103 int signo;
5766 { 6104 {
5874 6212
5875 /* Report the status of the synchronous process. */ 6213 /* Report the status of the synchronous process. */
5876 if (WIFEXITED (w)) 6214 if (WIFEXITED (w))
5877 synch_process_retcode = WRETCODE (w); 6215 synch_process_retcode = WRETCODE (w);
5878 else if (WIFSIGNALED (w)) 6216 else if (WIFSIGNALED (w))
5879 { 6217 synch_process_termsig = WTERMSIG (w);
5880 int code = WTERMSIG (w);
5881 char *signame;
5882
5883 synchronize_system_messages_locale ();
5884 signame = strsignal (code);
5885
5886 if (signame == 0)
5887 signame = "unknown";
5888
5889 synch_process_death = signame;
5890 }
5891 6218
5892 /* Tell wait_reading_process_input that it needs to wake up and 6219 /* Tell wait_reading_process_input that it needs to wake up and
5893 look around. */ 6220 look around. */
5894 if (input_available_clear_time) 6221 if (input_available_clear_time)
5895 EMACS_SET_SECS_USECS (*input_available_clear_time, 0, 0); 6222 EMACS_SET_SECS_USECS (*input_available_clear_time, 0, 0);
6279 FD_ZERO (&input_wait_mask); 6606 FD_ZERO (&input_wait_mask);
6280 FD_ZERO (&non_keyboard_wait_mask); 6607 FD_ZERO (&non_keyboard_wait_mask);
6281 FD_ZERO (&non_process_wait_mask); 6608 FD_ZERO (&non_process_wait_mask);
6282 max_process_desc = 0; 6609 max_process_desc = 0;
6283 6610
6611 #ifdef ADAPTIVE_READ_BUFFERING
6612 process_output_delay_count = 0;
6613 process_output_skip = 0;
6614 #endif
6615
6284 FD_SET (0, &input_wait_mask); 6616 FD_SET (0, &input_wait_mask);
6285 6617
6286 Vprocess_alist = Qnil; 6618 Vprocess_alist = Qnil;
6287 for (i = 0; i < MAXDESC; i++) 6619 for (i = 0; i < MAXDESC; i++)
6288 { 6620 {
6296 #endif 6628 #endif
6297 6629
6298 #ifdef HAVE_SOCKETS 6630 #ifdef HAVE_SOCKETS
6299 { 6631 {
6300 Lisp_Object subfeatures = Qnil; 6632 Lisp_Object subfeatures = Qnil;
6633 struct socket_options *sopt;
6634
6301 #define ADD_SUBFEATURE(key, val) \ 6635 #define ADD_SUBFEATURE(key, val) \
6302 subfeatures = Fcons (Fcons (key, Fcons (val, Qnil)), subfeatures) 6636 subfeatures = Fcons (Fcons (key, Fcons (val, Qnil)), subfeatures)
6303 6637
6304 #ifdef NON_BLOCKING_CONNECT 6638 #ifdef NON_BLOCKING_CONNECT
6305 ADD_SUBFEATURE (QCnowait, Qt); 6639 ADD_SUBFEATURE (QCnowait, Qt);
6314 ADD_SUBFEATURE (QCservice, Qt); 6648 ADD_SUBFEATURE (QCservice, Qt);
6315 #endif 6649 #endif
6316 #if !defined(TERM) && (defined(O_NONBLOCK) || defined(O_NDELAY)) 6650 #if !defined(TERM) && (defined(O_NONBLOCK) || defined(O_NDELAY))
6317 ADD_SUBFEATURE (QCserver, Qt); 6651 ADD_SUBFEATURE (QCserver, Qt);
6318 #endif 6652 #endif
6319 #ifdef SO_BINDTODEVICE 6653
6320 ADD_SUBFEATURE (QCoptions, intern ("bindtodevice")); 6654 for (sopt = socket_options; sopt->name; sopt++)
6321 #endif 6655 subfeatures = Fcons (intern (sopt->name), subfeatures);
6322 #ifdef SO_BROADCAST 6656
6323 ADD_SUBFEATURE (QCoptions, intern ("broadcast"));
6324 #endif
6325 #ifdef SO_DONTROUTE
6326 ADD_SUBFEATURE (QCoptions, intern ("dontroute"));
6327 #endif
6328 #ifdef SO_KEEPALIVE
6329 ADD_SUBFEATURE (QCoptions, intern ("keepalive"));
6330 #endif
6331 #ifdef SO_LINGER
6332 ADD_SUBFEATURE (QCoptions, intern ("linger"));
6333 #endif
6334 #ifdef SO_OOBINLINE
6335 ADD_SUBFEATURE (QCoptions, intern ("oobinline"));
6336 #endif
6337 #ifdef SO_PRIORITY
6338 ADD_SUBFEATURE (QCoptions, intern ("priority"));
6339 #endif
6340 #ifdef SO_REUSEADDR
6341 ADD_SUBFEATURE (QCoptions, intern ("reuseaddr"));
6342 #endif
6343 Fprovide (intern ("make-network-process"), subfeatures); 6657 Fprovide (intern ("make-network-process"), subfeatures);
6344 } 6658 }
6345 #endif /* HAVE_SOCKETS */ 6659 #endif /* HAVE_SOCKETS */
6346 } 6660 }
6347 6661
6430 The value has no effect if the system has no ptys or if all ptys are busy: 6744 The value has no effect if the system has no ptys or if all ptys are busy:
6431 then a pipe is used in any case. 6745 then a pipe is used in any case.
6432 The value takes effect when `start-process' is called. */); 6746 The value takes effect when `start-process' is called. */);
6433 Vprocess_connection_type = Qt; 6747 Vprocess_connection_type = Qt;
6434 6748
6749 #ifdef ADAPTIVE_READ_BUFFERING
6750 DEFVAR_LISP ("process-adaptive-read-buffering", &Vprocess_adaptive_read_buffering,
6751 doc: /* If non-nil, improve receive buffering by delaying after short reads.
6752 On some systems, when emacs reads the output from a subprocess, the output data
6753 is read in very small blocks, potentially resulting in very poor performance.
6754 This behaviour can be remedied to some extent by setting this variable to a
6755 non-nil value, as it will automatically delay reading from such processes, to
6756 allowing them to produce more output before emacs tries to read it.
6757 If the value is t, the delay is reset after each write to the process; any other
6758 non-nil value means that the delay is not reset on write.
6759 The variable takes effect when `start-process' is called. */);
6760 Vprocess_adaptive_read_buffering = Qt;
6761 #endif
6762
6435 defsubr (&Sprocessp); 6763 defsubr (&Sprocessp);
6436 defsubr (&Sget_process); 6764 defsubr (&Sget_process);
6437 defsubr (&Sget_buffer_process); 6765 defsubr (&Sget_buffer_process);
6438 defsubr (&Sdelete_process); 6766 defsubr (&Sdelete_process);
6439 defsubr (&Sprocess_status); 6767 defsubr (&Sprocess_status);
6459 defsubr (&Sset_process_plist); 6787 defsubr (&Sset_process_plist);
6460 defsubr (&Slist_processes); 6788 defsubr (&Slist_processes);
6461 defsubr (&Sprocess_list); 6789 defsubr (&Sprocess_list);
6462 defsubr (&Sstart_process); 6790 defsubr (&Sstart_process);
6463 #ifdef HAVE_SOCKETS 6791 #ifdef HAVE_SOCKETS
6464 defsubr (&Sset_network_process_options); 6792 defsubr (&Sset_network_process_option);
6465 defsubr (&Smake_network_process); 6793 defsubr (&Smake_network_process);
6466 defsubr (&Sformat_network_address); 6794 defsubr (&Sformat_network_address);
6467 #endif /* HAVE_SOCKETS */ 6795 #endif /* HAVE_SOCKETS */
6796 #if defined(HAVE_SOCKETS) && defined(HAVE_NET_IF_H) && defined(HAVE_SYS_IOCTL_H)
6797 #ifdef SIOCGIFCONF
6798 defsubr (&Snetwork_interface_list);
6799 #endif
6800 #if defined(SIOCGIFADDR) || defined(SIOCGIFHWADDR) || defined(SIOCGIFFLAGS)
6801 defsubr (&Snetwork_interface_info);
6802 #endif
6803 #endif /* HAVE_SOCKETS ... */
6468 #ifdef DATAGRAM_SOCKETS 6804 #ifdef DATAGRAM_SOCKETS
6469 defsubr (&Sprocess_datagram_address); 6805 defsubr (&Sprocess_datagram_address);
6470 defsubr (&Sset_process_datagram_address); 6806 defsubr (&Sset_process_datagram_address);
6471 #endif 6807 #endif
6472 defsubr (&Saccept_process_output); 6808 defsubr (&Saccept_process_output);
6794 defsubr (&Sprocess_inherit_coding_system_flag); 7130 defsubr (&Sprocess_inherit_coding_system_flag);
6795 } 7131 }
6796 7132
6797 7133
6798 #endif /* not subprocesses */ 7134 #endif /* not subprocesses */
7135
7136 /* arch-tag: 3706c011-7b9a-4117-bd4f-59e7f701a4c4
7137 (do not change this comment) */