diff options
| author | Karoly Lorentey | 2007-04-22 12:42:47 +0000 |
|---|---|---|
| committer | Karoly Lorentey | 2007-04-22 12:42:47 +0000 |
| commit | 9d0799072a0d09bc14a99eaf372b262d1ba61399 (patch) | |
| tree | 76acd4ae0559776a5ec27fbd5c25598285ec71d1 /src/process.c | |
| parent | e18c709364b095ea0be8ecabe458ac9a642a252f (diff) | |
| parent | a20becf321f023c6dc1831595712576d64e2ef4b (diff) | |
| download | emacs-9d0799072a0d09bc14a99eaf372b262d1ba61399.tar.gz emacs-9d0799072a0d09bc14a99eaf372b262d1ba61399.zip | |
Merged from emacs@sv.gnu.org
Patches applied:
* emacs@sv.gnu.org/emacs--devo--0--patch-674
Merge from gnus--rel--5.10
* emacs@sv.gnu.org/emacs--devo--0--patch-675
Update from CVS
* emacs@sv.gnu.org/emacs--devo--0--patch-676
Update from CVS
* emacs@sv.gnu.org/emacs--devo--0--patch-677
Update from CVS
* emacs@sv.gnu.org/emacs--devo--0--patch-678
Update from CVS
* emacs@sv.gnu.org/emacs--devo--0--patch-679
Update from CVS
* emacs@sv.gnu.org/emacs--devo--0--patch-680
Update from CVS
* emacs@sv.gnu.org/emacs--devo--0--patch-681
Update from CVS
* emacs@sv.gnu.org/emacs--devo--0--patch-682
Update from CVS
* emacs@sv.gnu.org/emacs--devo--0--patch-683
Update from CVS
* emacs@sv.gnu.org/emacs--devo--0--patch-684
Update from CVS
* emacs@sv.gnu.org/emacs--devo--0--patch-685
Merge from gnus--rel--5.10
* emacs@sv.gnu.org/emacs--devo--0--patch-686
Update from CVS
* emacs@sv.gnu.org/emacs--devo--0--patch-687
Release ERC 5.2.
* emacs@sv.gnu.org/emacs--devo--0--patch-688
Update from CVS
* emacs@sv.gnu.org/emacs--devo--0--patch-689
Update from CVS
* emacs@sv.gnu.org/emacs--devo--0--patch-690
Update from CVS
* emacs@sv.gnu.org/emacs--devo--0--patch-691
Update from CVS
* emacs@sv.gnu.org/emacs--devo--0--patch-692
Update from CVS
* emacs@sv.gnu.org/emacs--devo--0--patch-693
Update from CVS
* emacs@sv.gnu.org/emacs--devo--0--patch-694
Update from CVS
* emacs@sv.gnu.org/emacs--devo--0--patch-695
Merge from gnus--rel--5.10
* emacs@sv.gnu.org/emacs--devo--0--patch-696
Update from CVS
* emacs@sv.gnu.org/emacs--devo--0--patch-697
Merge from gnus--rel--5.10
* emacs@sv.gnu.org/emacs--devo--0--patch-698
Update from CVS
* emacs@sv.gnu.org/emacs--devo--0--patch-699
Update from CVS
* emacs@sv.gnu.org/emacs--devo--0--patch-700
Update from CVS
* emacs@sv.gnu.org/emacs--devo--0--patch-701
Update from CVS
* emacs@sv.gnu.org/gnus--rel--5.10--patch-209
Merge from emacs--devo--0
* emacs@sv.gnu.org/gnus--rel--5.10--patch-210
Update from CVS
* emacs@sv.gnu.org/gnus--rel--5.10--patch-211
Update from CVS
* emacs@sv.gnu.org/gnus--rel--5.10--patch-212
Merge from emacs--devo--0
* emacs@sv.gnu.org/gnus--rel--5.10--patch-213
Update from CVS
* emacs@sv.gnu.org/gnus--rel--5.10--patch-214
Merge from emacs--devo--0
* emacs@sv.gnu.org/gnus--rel--5.10--patch-215
Update from CVS
git-archimport-id: lorentey@elte.hu--2004/emacs--multi-tty--0--patch-601
Diffstat (limited to 'src/process.c')
| -rw-r--r-- | src/process.c | 46 |
1 files changed, 29 insertions, 17 deletions
diff --git a/src/process.c b/src/process.c index 6d84d4c4a87..56e4335ca2c 100644 --- a/src/process.c +++ b/src/process.c | |||
| @@ -1268,7 +1268,7 @@ Returns nil if format of ADDRESS is invalid. */) | |||
| 1268 | if (VECTORP (address)) /* AF_INET or AF_INET6 */ | 1268 | if (VECTORP (address)) /* AF_INET or AF_INET6 */ |
| 1269 | { | 1269 | { |
| 1270 | register struct Lisp_Vector *p = XVECTOR (address); | 1270 | register struct Lisp_Vector *p = XVECTOR (address); |
| 1271 | Lisp_Object args[6]; | 1271 | Lisp_Object args[10]; |
| 1272 | int nargs, i; | 1272 | int nargs, i; |
| 1273 | 1273 | ||
| 1274 | if (p->size == 4 || (p->size == 5 && !NILP (omit_port))) | 1274 | if (p->size == 4 || (p->size == 5 && !NILP (omit_port))) |
| @@ -1295,7 +1295,20 @@ Returns nil if format of ADDRESS is invalid. */) | |||
| 1295 | return Qnil; | 1295 | return Qnil; |
| 1296 | 1296 | ||
| 1297 | for (i = 0; i < nargs; i++) | 1297 | for (i = 0; i < nargs; i++) |
| 1298 | args[i+1] = p->contents[i]; | 1298 | { |
| 1299 | EMACS_INT element = XINT (p->contents[i]); | ||
| 1300 | |||
| 1301 | if (element < 0 || element > 65535) | ||
| 1302 | return Qnil; | ||
| 1303 | |||
| 1304 | if (nargs <= 5 /* IPv4 */ | ||
| 1305 | && i < 4 /* host, not port */ | ||
| 1306 | && element > 255) | ||
| 1307 | return Qnil; | ||
| 1308 | |||
| 1309 | args[i+1] = p->contents[i]; | ||
| 1310 | } | ||
| 1311 | |||
| 1299 | return Fformat (nargs+1, args); | 1312 | return Fformat (nargs+1, args); |
| 1300 | } | 1313 | } |
| 1301 | 1314 | ||
| @@ -1305,7 +1318,6 @@ Returns nil if format of ADDRESS is invalid. */) | |||
| 1305 | args[0] = build_string ("<Family %d>"); | 1318 | args[0] = build_string ("<Family %d>"); |
| 1306 | args[1] = Fcar (address); | 1319 | args[1] = Fcar (address); |
| 1307 | return Fformat (2, args); | 1320 | return Fformat (2, args); |
| 1308 | |||
| 1309 | } | 1321 | } |
| 1310 | 1322 | ||
| 1311 | return Qnil; | 1323 | return Qnil; |
| @@ -1411,7 +1423,6 @@ list_processes_1 (query_only) | |||
| 1411 | if (CONSP (p->status)) | 1423 | if (CONSP (p->status)) |
| 1412 | symbol = XCAR (p->status); | 1424 | symbol = XCAR (p->status); |
| 1413 | 1425 | ||
| 1414 | |||
| 1415 | if (EQ (symbol, Qsignal)) | 1426 | if (EQ (symbol, Qsignal)) |
| 1416 | { | 1427 | { |
| 1417 | Lisp_Object tem; | 1428 | Lisp_Object tem; |
| @@ -4811,8 +4822,8 @@ wait_reading_process_output (time_limit, microsecs, read_kbd, do_display, | |||
| 4811 | subprocess termination and SIGCHLD. */ | 4822 | subprocess termination and SIGCHLD. */ |
| 4812 | else if (nread == 0 && !NETCONN_P (proc)) | 4823 | else if (nread == 0 && !NETCONN_P (proc)) |
| 4813 | ; | 4824 | ; |
| 4814 | #endif /* O_NDELAY */ | 4825 | #endif /* O_NDELAY */ |
| 4815 | #endif /* O_NONBLOCK */ | 4826 | #endif /* O_NONBLOCK */ |
| 4816 | #ifdef HAVE_PTYS | 4827 | #ifdef HAVE_PTYS |
| 4817 | /* On some OSs with ptys, when the process on one end of | 4828 | /* On some OSs with ptys, when the process on one end of |
| 4818 | a pty exits, the other end gets an error reading with | 4829 | a pty exits, the other end gets an error reading with |
| @@ -4823,11 +4834,17 @@ wait_reading_process_output (time_limit, microsecs, read_kbd, do_display, | |||
| 4823 | get a SIGCHLD). | 4834 | get a SIGCHLD). |
| 4824 | 4835 | ||
| 4825 | However, it has been known to happen that the SIGCHLD | 4836 | However, it has been known to happen that the SIGCHLD |
| 4826 | got lost. So raise the signl again just in case. | 4837 | got lost. So raise the signal again just in case. |
| 4827 | It can't hurt. */ | 4838 | It can't hurt. */ |
| 4828 | else if (nread == -1 && errno == EIO) | 4839 | else if (nread == -1 && errno == EIO) |
| 4829 | kill (getpid (), SIGCHLD); | 4840 | { |
| 4830 | #endif /* HAVE_PTYS */ | 4841 | /* Clear the descriptor now, so we only raise the signal once. */ |
| 4842 | FD_CLR (channel, &input_wait_mask); | ||
| 4843 | FD_CLR (channel, &non_keyboard_wait_mask); | ||
| 4844 | |||
| 4845 | kill (getpid (), SIGCHLD); | ||
| 4846 | } | ||
| 4847 | #endif /* HAVE_PTYS */ | ||
| 4831 | /* If we can detect process termination, don't consider the process | 4848 | /* If we can detect process termination, don't consider the process |
| 4832 | gone just because its pipe is closed. */ | 4849 | gone just because its pipe is closed. */ |
| 4833 | #ifdef SIGCHLD | 4850 | #ifdef SIGCHLD |
| @@ -6506,17 +6523,12 @@ sigchld_handler (signo) | |||
| 6506 | #define WUNTRACED 0 | 6523 | #define WUNTRACED 0 |
| 6507 | #endif /* no WUNTRACED */ | 6524 | #endif /* no WUNTRACED */ |
| 6508 | /* Keep trying to get a status until we get a definitive result. */ | 6525 | /* Keep trying to get a status until we get a definitive result. */ |
| 6509 | while (1) | 6526 | do |
| 6510 | { | 6527 | { |
| 6511 | errno = 0; | 6528 | errno = 0; |
| 6512 | pid = wait3 (&w, WNOHANG | WUNTRACED, 0); | 6529 | pid = wait3 (&w, WNOHANG | WUNTRACED, 0); |
| 6513 | if (! (pid < 0 && errno == EINTR)) | ||
| 6514 | break; | ||
| 6515 | /* Avoid a busyloop: wait3 is a system call, so we do not want | ||
| 6516 | to prevent the kernel from actually sending SIGCHLD to emacs | ||
| 6517 | by asking for it all the time. */ | ||
| 6518 | sleep (1); | ||
| 6519 | } | 6530 | } |
| 6531 | while (pid < 0 && errno == EINTR); | ||
| 6520 | 6532 | ||
| 6521 | if (pid <= 0) | 6533 | if (pid <= 0) |
| 6522 | { | 6534 | { |