Mercurial > emacs
comparison src/process.c @ 7220:a33eb16cab9d
(Fopen_network_stream): Retry the connect if EADDRINUSE. Ignore EISCONN.
| author | Richard M. Stallman <rms@gnu.org> |
|---|---|
| date | Sat, 30 Apr 1994 06:05:51 +0000 |
| parents | 3f4fc9d682b4 |
| children | c9598edda1a2 |
comparison
equal
deleted
inserted
replaced
| 7219:61202823bbb9 | 7220:a33eb16cab9d |
|---|---|
| 1480 int s, outch, inch; | 1480 int s, outch, inch; |
| 1481 char errstring[80]; | 1481 char errstring[80]; |
| 1482 int port; | 1482 int port; |
| 1483 struct hostent host_info_fixed; | 1483 struct hostent host_info_fixed; |
| 1484 struct gcpro gcpro1, gcpro2, gcpro3, gcpro4; | 1484 struct gcpro gcpro1, gcpro2, gcpro3, gcpro4; |
| 1485 int retry = 0; | |
| 1485 | 1486 |
| 1486 GCPRO4 (name, buffer, host, service); | 1487 GCPRO4 (name, buffer, host, service); |
| 1487 CHECK_STRING (name, 0); | 1488 CHECK_STRING (name, 0); |
| 1488 CHECK_STRING (host, 0); | 1489 CHECK_STRING (host, 0); |
| 1489 if (XTYPE(service) == Lisp_Int) | 1490 if (XTYPE(service) == Lisp_Int) |
| 1539 to quit if polling is turned off. */ | 1540 to quit if polling is turned off. */ |
| 1540 if (interrupt_input) | 1541 if (interrupt_input) |
| 1541 unrequest_sigio (); | 1542 unrequest_sigio (); |
| 1542 | 1543 |
| 1543 loop: | 1544 loop: |
| 1544 if (connect (s, (struct sockaddr *) &address, sizeof address) == -1) | 1545 if (connect (s, (struct sockaddr *) &address, sizeof address) == -1 |
| 1546 && errno != EISCONN) | |
| 1545 { | 1547 { |
| 1546 int xerrno = errno; | 1548 int xerrno = errno; |
| 1549 | |
| 1547 if (errno == EINTR) | 1550 if (errno == EINTR) |
| 1548 goto loop; | 1551 goto loop; |
| 1552 if (errno == EADDRINUSE && retry < 20) | |
| 1553 { | |
| 1554 retry++; | |
| 1555 goto loop; | |
| 1556 } | |
| 1557 | |
| 1549 close (s); | 1558 close (s); |
| 1550 | 1559 |
| 1551 if (interrupt_input) | 1560 if (interrupt_input) |
| 1552 request_sigio (); | 1561 request_sigio (); |
| 1553 | 1562 |
| 2460 This is used for various commands in shell mode. | 2469 This is used for various commands in shell mode. |
| 2461 If NOMSG is zero, insert signal-announcements into process's buffers | 2470 If NOMSG is zero, insert signal-announcements into process's buffers |
| 2462 right away. | 2471 right away. |
| 2463 | 2472 |
| 2464 If we can, we try to signal PROCESS by sending control characters | 2473 If we can, we try to signal PROCESS by sending control characters |
| 2465 down the pipe. This allows us to signal inferiors who have changed | 2474 down the pty. This allows us to signal inferiors who have changed |
| 2466 their uid, for which killpg would return an EPERM error. */ | 2475 their uid, for which killpg would return an EPERM error. */ |
| 2467 | 2476 |
| 2468 static void | 2477 static void |
| 2469 process_send_signal (process, signo, current_group, nomsg) | 2478 process_send_signal (process, signo, current_group, nomsg) |
| 2470 Lisp_Object process; | 2479 Lisp_Object process; |
| 2672 } | 2681 } |
| 2673 | 2682 |
| 2674 DEFUN ("interrupt-process", Finterrupt_process, Sinterrupt_process, 0, 2, 0, | 2683 DEFUN ("interrupt-process", Finterrupt_process, Sinterrupt_process, 0, 2, 0, |
| 2675 "Interrupt process PROCESS. May be process or name of one.\n\ | 2684 "Interrupt process PROCESS. May be process or name of one.\n\ |
| 2676 PROCESS may be a process, a buffer, or the name of a process or buffer.\n\ | 2685 PROCESS may be a process, a buffer, or the name of a process or buffer.\n\ |
| 2677 Nil or no arg means current buffer's process.\n\ | 2686 nil or no arg means current buffer's process.\n\ |
| 2678 Second arg CURRENT-GROUP non-nil means send signal to\n\ | 2687 Second arg CURRENT-GROUP non-nil means send signal to\n\ |
| 2679 the current process-group of the process's controlling terminal\n\ | 2688 the current process-group of the process's controlling terminal\n\ |
| 2680 rather than to the process's own process group.\n\ | 2689 rather than to the process's own process group.\n\ |
| 2681 If the process is a shell, this means interrupt current subjob\n\ | 2690 If the process is a shell, this means interrupt current subjob\n\ |
| 2682 rather than the shell.") | 2691 rather than the shell.") |
| 3186 | 3195 |
| 3187 delete_exited_processes = 1; | 3196 delete_exited_processes = 1; |
| 3188 | 3197 |
| 3189 DEFVAR_LISP ("process-connection-type", &Vprocess_connection_type, | 3198 DEFVAR_LISP ("process-connection-type", &Vprocess_connection_type, |
| 3190 "Control type of device used to communicate with subprocesses.\n\ | 3199 "Control type of device used to communicate with subprocesses.\n\ |
| 3191 Values are nil to use a pipe, and t or 'pty for a pty. Note that if\n\ | 3200 Values are nil to use a pipe, or t or `pty' to use a pty.\n\ |
| 3192 pty's are not available, this variable will be ignored. The value takes\n\ | 3201 The value has no effect if the system has no ptys or if all ptys are busy:\n\ |
| 3193 effect when `start-process' is called."); | 3202 then a pipe is used in any case.\n\ |
| 3203 The value takes effect when `start-process' is called."); | |
| 3194 Vprocess_connection_type = Qt; | 3204 Vprocess_connection_type = Qt; |
| 3195 | 3205 |
| 3196 defsubr (&Sprocessp); | 3206 defsubr (&Sprocessp); |
| 3197 defsubr (&Sget_process); | 3207 defsubr (&Sget_process); |
| 3198 defsubr (&Sget_buffer_process); | 3208 defsubr (&Sget_buffer_process); |
