diff options
Diffstat (limited to 'src/process.c')
| -rw-r--r-- | src/process.c | 126 |
1 files changed, 66 insertions, 60 deletions
diff --git a/src/process.c b/src/process.c index 0d6994bdab1..06fc918cf54 100644 --- a/src/process.c +++ b/src/process.c | |||
| @@ -173,6 +173,9 @@ close_on_exec (int fd) | |||
| 173 | return fd; | 173 | return fd; |
| 174 | } | 174 | } |
| 175 | 175 | ||
| 176 | # undef accept4 | ||
| 177 | # define accept4(sockfd, addr, addrlen, flags) \ | ||
| 178 | process_accept4 (sockfd, addr, addrlen, flags) | ||
| 176 | static int | 179 | static int |
| 177 | accept4 (int sockfd, struct sockaddr *addr, socklen_t *addrlen, int flags) | 180 | accept4 (int sockfd, struct sockaddr *addr, socklen_t *addrlen, int flags) |
| 178 | { | 181 | { |
| @@ -596,7 +599,7 @@ status_message (struct Lisp_Process *p) | |||
| 596 | Lisp_Object symbol; | 599 | Lisp_Object symbol; |
| 597 | int code; | 600 | int code; |
| 598 | bool coredump; | 601 | bool coredump; |
| 599 | Lisp_Object string, string2; | 602 | Lisp_Object string; |
| 600 | 603 | ||
| 601 | decode_status (status, &symbol, &code, &coredump); | 604 | decode_status (status, &symbol, &code, &coredump); |
| 602 | 605 | ||
| @@ -620,8 +623,8 @@ status_message (struct Lisp_Process *p) | |||
| 620 | if (c1 != c2) | 623 | if (c1 != c2) |
| 621 | Faset (string, make_number (0), make_number (c2)); | 624 | Faset (string, make_number (0), make_number (c2)); |
| 622 | } | 625 | } |
| 623 | string2 = build_string (coredump ? " (core dumped)\n" : "\n"); | 626 | AUTO_STRING (suffix, coredump ? " (core dumped)\n" : "\n"); |
| 624 | return concat2 (string, string2); | 627 | return concat2 (string, suffix); |
| 625 | } | 628 | } |
| 626 | else if (EQ (symbol, Qexit)) | 629 | else if (EQ (symbol, Qexit)) |
| 627 | { | 630 | { |
| @@ -629,17 +632,17 @@ status_message (struct Lisp_Process *p) | |||
| 629 | return build_string (code == 0 ? "deleted\n" : "connection broken by remote peer\n"); | 632 | return build_string (code == 0 ? "deleted\n" : "connection broken by remote peer\n"); |
| 630 | if (code == 0) | 633 | if (code == 0) |
| 631 | return build_string ("finished\n"); | 634 | return build_string ("finished\n"); |
| 635 | AUTO_STRING (prefix, "exited abnormally with code "); | ||
| 632 | string = Fnumber_to_string (make_number (code)); | 636 | string = Fnumber_to_string (make_number (code)); |
| 633 | string2 = build_string (coredump ? " (core dumped)\n" : "\n"); | 637 | AUTO_STRING (suffix, coredump ? " (core dumped)\n" : "\n"); |
| 634 | return concat3 (build_string ("exited abnormally with code "), | 638 | return concat3 (prefix, string, suffix); |
| 635 | string, string2); | ||
| 636 | } | 639 | } |
| 637 | else if (EQ (symbol, Qfailed)) | 640 | else if (EQ (symbol, Qfailed)) |
| 638 | { | 641 | { |
| 642 | AUTO_STRING (prefix, "failed with code "); | ||
| 639 | string = Fnumber_to_string (make_number (code)); | 643 | string = Fnumber_to_string (make_number (code)); |
| 640 | string2 = build_string ("\n"); | 644 | AUTO_STRING (suffix, "\n"); |
| 641 | return concat3 (build_string ("failed with code "), | 645 | return concat3 (prefix, string, suffix); |
| 642 | string, string2); | ||
| 643 | } | 646 | } |
| 644 | else | 647 | else |
| 645 | return Fcopy_sequence (Fsymbol_name (symbol)); | 648 | return Fcopy_sequence (Fsymbol_name (symbol)); |
| @@ -1302,30 +1305,34 @@ Returns nil if format of ADDRESS is invalid. */) | |||
| 1302 | ptrdiff_t size = p->header.size; | 1305 | ptrdiff_t size = p->header.size; |
| 1303 | Lisp_Object args[10]; | 1306 | Lisp_Object args[10]; |
| 1304 | int nargs, i; | 1307 | int nargs, i; |
| 1308 | char const *format; | ||
| 1305 | 1309 | ||
| 1306 | if (size == 4 || (size == 5 && !NILP (omit_port))) | 1310 | if (size == 4 || (size == 5 && !NILP (omit_port))) |
| 1307 | { | 1311 | { |
| 1308 | args[0] = build_string ("%d.%d.%d.%d"); | 1312 | format = "%d.%d.%d.%d"; |
| 1309 | nargs = 4; | 1313 | nargs = 4; |
| 1310 | } | 1314 | } |
| 1311 | else if (size == 5) | 1315 | else if (size == 5) |
| 1312 | { | 1316 | { |
| 1313 | args[0] = build_string ("%d.%d.%d.%d:%d"); | 1317 | format = "%d.%d.%d.%d:%d"; |
| 1314 | nargs = 5; | 1318 | nargs = 5; |
| 1315 | } | 1319 | } |
| 1316 | else if (size == 8 || (size == 9 && !NILP (omit_port))) | 1320 | else if (size == 8 || (size == 9 && !NILP (omit_port))) |
| 1317 | { | 1321 | { |
| 1318 | args[0] = build_string ("%x:%x:%x:%x:%x:%x:%x:%x"); | 1322 | format = "%x:%x:%x:%x:%x:%x:%x:%x"; |
| 1319 | nargs = 8; | 1323 | nargs = 8; |
| 1320 | } | 1324 | } |
| 1321 | else if (size == 9) | 1325 | else if (size == 9) |
| 1322 | { | 1326 | { |
| 1323 | args[0] = build_string ("[%x:%x:%x:%x:%x:%x:%x:%x]:%d"); | 1327 | format = "[%x:%x:%x:%x:%x:%x:%x:%x]:%d"; |
| 1324 | nargs = 9; | 1328 | nargs = 9; |
| 1325 | } | 1329 | } |
| 1326 | else | 1330 | else |
| 1327 | return Qnil; | 1331 | return Qnil; |
| 1328 | 1332 | ||
| 1333 | AUTO_STRING (format_obj, format); | ||
| 1334 | args[0] = format_obj; | ||
| 1335 | |||
| 1329 | for (i = 0; i < nargs; i++) | 1336 | for (i = 0; i < nargs; i++) |
| 1330 | { | 1337 | { |
| 1331 | if (! RANGED_INTEGERP (0, p->contents[i], 65535)) | 1338 | if (! RANGED_INTEGERP (0, p->contents[i], 65535)) |
| @@ -1339,15 +1346,13 @@ Returns nil if format of ADDRESS is invalid. */) | |||
| 1339 | args[i+1] = p->contents[i]; | 1346 | args[i+1] = p->contents[i]; |
| 1340 | } | 1347 | } |
| 1341 | 1348 | ||
| 1342 | return Fformat (nargs+1, args); | 1349 | return Fformat (nargs + 1, args); |
| 1343 | } | 1350 | } |
| 1344 | 1351 | ||
| 1345 | if (CONSP (address)) | 1352 | if (CONSP (address)) |
| 1346 | { | 1353 | { |
| 1347 | Lisp_Object args[2]; | 1354 | AUTO_STRING (format, "<Family %d>"); |
| 1348 | args[0] = build_string ("<Family %d>"); | 1355 | return Fformat (2, (Lisp_Object []) {format, Fcar (address)}); |
| 1349 | args[1] = Fcar (address); | ||
| 1350 | return Fformat (2, args); | ||
| 1351 | } | 1356 | } |
| 1352 | 1357 | ||
| 1353 | return Qnil; | 1358 | return Qnil; |
| @@ -1386,9 +1391,10 @@ usage: (start-process NAME BUFFER PROGRAM &rest PROGRAM-ARGS) */) | |||
| 1386 | (ptrdiff_t nargs, Lisp_Object *args) | 1391 | (ptrdiff_t nargs, Lisp_Object *args) |
| 1387 | { | 1392 | { |
| 1388 | Lisp_Object buffer, name, program, proc, current_dir, tem; | 1393 | Lisp_Object buffer, name, program, proc, current_dir, tem; |
| 1389 | register unsigned char **new_argv; | 1394 | unsigned char **new_argv; |
| 1390 | ptrdiff_t i; | 1395 | ptrdiff_t i; |
| 1391 | ptrdiff_t count = SPECPDL_INDEX (); | 1396 | ptrdiff_t count = SPECPDL_INDEX (); |
| 1397 | USE_SAFE_ALLOCA; | ||
| 1392 | 1398 | ||
| 1393 | buffer = args[1]; | 1399 | buffer = args[1]; |
| 1394 | if (!NILP (buffer)) | 1400 | if (!NILP (buffer)) |
| @@ -1464,7 +1470,7 @@ usage: (start-process NAME BUFFER PROGRAM &rest PROGRAM-ARGS) */) | |||
| 1464 | val = Vcoding_system_for_read; | 1470 | val = Vcoding_system_for_read; |
| 1465 | if (NILP (val)) | 1471 | if (NILP (val)) |
| 1466 | { | 1472 | { |
| 1467 | args2 = alloca ((nargs + 1) * sizeof *args2); | 1473 | SAFE_ALLOCA_LISP (args2, nargs + 1); |
| 1468 | args2[0] = Qstart_process; | 1474 | args2[0] = Qstart_process; |
| 1469 | for (i = 0; i < nargs; i++) args2[i + 1] = args[i]; | 1475 | for (i = 0; i < nargs; i++) args2[i + 1] = args[i]; |
| 1470 | GCPRO2 (proc, current_dir); | 1476 | GCPRO2 (proc, current_dir); |
| @@ -1483,7 +1489,7 @@ usage: (start-process NAME BUFFER PROGRAM &rest PROGRAM-ARGS) */) | |||
| 1483 | { | 1489 | { |
| 1484 | if (EQ (coding_systems, Qt)) | 1490 | if (EQ (coding_systems, Qt)) |
| 1485 | { | 1491 | { |
| 1486 | args2 = alloca ((nargs + 1) * sizeof *args2); | 1492 | SAFE_ALLOCA_LISP (args2, nargs + 1); |
| 1487 | args2[0] = Qstart_process; | 1493 | args2[0] = Qstart_process; |
| 1488 | for (i = 0; i < nargs; i++) args2[i + 1] = args[i]; | 1494 | for (i = 0; i < nargs; i++) args2[i + 1] = args[i]; |
| 1489 | GCPRO2 (proc, current_dir); | 1495 | GCPRO2 (proc, current_dir); |
| @@ -1578,7 +1584,7 @@ usage: (start-process NAME BUFFER PROGRAM &rest PROGRAM-ARGS) */) | |||
| 1578 | 1584 | ||
| 1579 | /* Now that everything is encoded we can collect the strings into | 1585 | /* Now that everything is encoded we can collect the strings into |
| 1580 | NEW_ARGV. */ | 1586 | NEW_ARGV. */ |
| 1581 | new_argv = alloca ((nargs - 1) * sizeof *new_argv); | 1587 | SAFE_NALLOCA (new_argv, 1, nargs - 1); |
| 1582 | new_argv[nargs - 2] = 0; | 1588 | new_argv[nargs - 2] = 0; |
| 1583 | 1589 | ||
| 1584 | for (i = nargs - 2; i-- != 0; ) | 1590 | for (i = nargs - 2; i-- != 0; ) |
| @@ -1592,6 +1598,7 @@ usage: (start-process NAME BUFFER PROGRAM &rest PROGRAM-ARGS) */) | |||
| 1592 | else | 1598 | else |
| 1593 | create_pty (proc); | 1599 | create_pty (proc); |
| 1594 | 1600 | ||
| 1601 | SAFE_FREE (); | ||
| 1595 | return unbind_to (count, proc); | 1602 | return unbind_to (count, proc); |
| 1596 | } | 1603 | } |
| 1597 | 1604 | ||
| @@ -2071,8 +2078,10 @@ get_lisp_to_sockaddr_size (Lisp_Object address, int *familyp) | |||
| 2071 | && VECTORP (XCDR (address))) | 2078 | && VECTORP (XCDR (address))) |
| 2072 | { | 2079 | { |
| 2073 | struct sockaddr *sa; | 2080 | struct sockaddr *sa; |
| 2074 | *familyp = XINT (XCAR (address)); | ||
| 2075 | p = XVECTOR (XCDR (address)); | 2081 | p = XVECTOR (XCDR (address)); |
| 2082 | if (MAX_ALLOCA - sizeof sa->sa_family < p->header.size) | ||
| 2083 | return 0; | ||
| 2084 | *familyp = XINT (XCAR (address)); | ||
| 2076 | return p->header.size + sizeof (sa->sa_family); | 2085 | return p->header.size + sizeof (sa->sa_family); |
| 2077 | } | 2086 | } |
| 2078 | return 0; | 2087 | return 0; |
| @@ -2989,7 +2998,7 @@ usage: (make-network-process &rest ARGS) */) | |||
| 2989 | address_un.sun_family = AF_LOCAL; | 2998 | address_un.sun_family = AF_LOCAL; |
| 2990 | if (sizeof address_un.sun_path <= SBYTES (service)) | 2999 | if (sizeof address_un.sun_path <= SBYTES (service)) |
| 2991 | error ("Service name too long"); | 3000 | error ("Service name too long"); |
| 2992 | strcpy (address_un.sun_path, SSDATA (service)); | 3001 | lispstpcpy (address_un.sun_path, service); |
| 2993 | ai.ai_addr = (struct sockaddr *) &address_un; | 3002 | ai.ai_addr = (struct sockaddr *) &address_un; |
| 2994 | ai.ai_addrlen = sizeof address_un; | 3003 | ai.ai_addrlen = sizeof address_un; |
| 2995 | goto open_socket; | 3004 | goto open_socket; |
| @@ -3680,7 +3689,7 @@ network_interface_info (Lisp_Object ifname) | |||
| 3680 | 3689 | ||
| 3681 | if (sizeof rq.ifr_name <= SBYTES (ifname)) | 3690 | if (sizeof rq.ifr_name <= SBYTES (ifname)) |
| 3682 | error ("interface name too long"); | 3691 | error ("interface name too long"); |
| 3683 | strcpy (rq.ifr_name, SSDATA (ifname)); | 3692 | lispstpcpy (rq.ifr_name, ifname); |
| 3684 | 3693 | ||
| 3685 | s = socket (AF_INET, SOCK_STREAM | SOCK_CLOEXEC, 0); | 3694 | s = socket (AF_INET, SOCK_STREAM | SOCK_CLOEXEC, 0); |
| 3686 | if (s < 0) | 3695 | if (s < 0) |
| @@ -4057,20 +4066,15 @@ server_accept_connection (Lisp_Object server, int channel) | |||
| 4057 | { | 4066 | { |
| 4058 | case AF_INET: | 4067 | case AF_INET: |
| 4059 | { | 4068 | { |
| 4060 | Lisp_Object args[5]; | ||
| 4061 | unsigned char *ip = (unsigned char *)&saddr.in.sin_addr.s_addr; | 4069 | unsigned char *ip = (unsigned char *)&saddr.in.sin_addr.s_addr; |
| 4062 | args[0] = build_string ("%d.%d.%d.%d"); | ||
| 4063 | args[1] = make_number (*ip++); | ||
| 4064 | args[2] = make_number (*ip++); | ||
| 4065 | args[3] = make_number (*ip++); | ||
| 4066 | args[4] = make_number (*ip++); | ||
| 4067 | host = Fformat (5, args); | ||
| 4068 | service = make_number (ntohs (saddr.in.sin_port)); | ||
| 4069 | 4070 | ||
| 4070 | args[0] = build_string (" <%s:%d>"); | 4071 | AUTO_STRING (ipv4_format, "%d.%d.%d.%d"); |
| 4071 | args[1] = host; | 4072 | host = Fformat (5, ((Lisp_Object []) |
| 4072 | args[2] = service; | 4073 | { ipv4_format, make_number (ip[0]), |
| 4073 | caller = Fformat (3, args); | 4074 | make_number (ip[1]), make_number (ip[2]), make_number (ip[3]) })); |
| 4075 | service = make_number (ntohs (saddr.in.sin_port)); | ||
| 4076 | AUTO_STRING (caller_format, " <%s:%d>"); | ||
| 4077 | caller = Fformat (3, (Lisp_Object []) {caller_format, host, service}); | ||
| 4074 | } | 4078 | } |
| 4075 | break; | 4079 | break; |
| 4076 | 4080 | ||
| @@ -4080,16 +4084,15 @@ server_accept_connection (Lisp_Object server, int channel) | |||
| 4080 | Lisp_Object args[9]; | 4084 | Lisp_Object args[9]; |
| 4081 | uint16_t *ip6 = (uint16_t *)&saddr.in6.sin6_addr; | 4085 | uint16_t *ip6 = (uint16_t *)&saddr.in6.sin6_addr; |
| 4082 | int i; | 4086 | int i; |
| 4083 | args[0] = build_string ("%x:%x:%x:%x:%x:%x:%x:%x"); | 4087 | |
| 4088 | AUTO_STRING (ipv6_format, "%x:%x:%x:%x:%x:%x:%x:%x"); | ||
| 4089 | args[0] = ipv6_format; | ||
| 4084 | for (i = 0; i < 8; i++) | 4090 | for (i = 0; i < 8; i++) |
| 4085 | args[i+1] = make_number (ntohs (ip6[i])); | 4091 | args[i + 1] = make_number (ntohs (ip6[i])); |
| 4086 | host = Fformat (9, args); | 4092 | host = Fformat (9, args); |
| 4087 | service = make_number (ntohs (saddr.in.sin_port)); | 4093 | service = make_number (ntohs (saddr.in.sin_port)); |
| 4088 | 4094 | AUTO_STRING (caller_format, " <[%s]:%d>"); | |
| 4089 | args[0] = build_string (" <[%s]:%d>"); | 4095 | caller = Fformat (3, (Lisp_Object []) {caller_format, host, service}); |
| 4090 | args[1] = host; | ||
| 4091 | args[2] = service; | ||
| 4092 | caller = Fformat (3, args); | ||
| 4093 | } | 4096 | } |
| 4094 | break; | 4097 | break; |
| 4095 | #endif | 4098 | #endif |
| @@ -4099,7 +4102,9 @@ server_accept_connection (Lisp_Object server, int channel) | |||
| 4099 | #endif | 4102 | #endif |
| 4100 | default: | 4103 | default: |
| 4101 | caller = Fnumber_to_string (make_number (connect_counter)); | 4104 | caller = Fnumber_to_string (make_number (connect_counter)); |
| 4102 | caller = concat3 (build_string (" <"), caller, build_string (">")); | 4105 | AUTO_STRING (space_less_than, " <"); |
| 4106 | AUTO_STRING (greater_than, ">"); | ||
| 4107 | caller = concat3 (space_less_than, caller, greater_than); | ||
| 4103 | break; | 4108 | break; |
| 4104 | } | 4109 | } |
| 4105 | 4110 | ||
| @@ -4196,16 +4201,18 @@ server_accept_connection (Lisp_Object server, int channel) | |||
| 4196 | p->inherit_coding_system_flag | 4201 | p->inherit_coding_system_flag |
| 4197 | = (NILP (buffer) ? 0 : ps->inherit_coding_system_flag); | 4202 | = (NILP (buffer) ? 0 : ps->inherit_coding_system_flag); |
| 4198 | 4203 | ||
| 4204 | AUTO_STRING (dash, "-"); | ||
| 4205 | AUTO_STRING (nl, "\n"); | ||
| 4206 | Lisp_Object host_string = STRINGP (host) ? host : dash; | ||
| 4207 | |||
| 4199 | if (!NILP (ps->log)) | 4208 | if (!NILP (ps->log)) |
| 4200 | call3 (ps->log, server, proc, | 4209 | { |
| 4201 | concat3 (build_string ("accept from "), | 4210 | AUTO_STRING (accept_from, "accept from "); |
| 4202 | (STRINGP (host) ? host : build_string ("-")), | 4211 | call3 (ps->log, server, proc, concat3 (accept_from, host_string, nl)); |
| 4203 | build_string ("\n"))); | 4212 | } |
| 4204 | 4213 | ||
| 4205 | exec_sentinel (proc, | 4214 | AUTO_STRING (open_from, "open from "); |
| 4206 | concat3 (build_string ("open from "), | 4215 | exec_sentinel (proc, concat3 (open_from, host_string, nl)); |
| 4207 | (STRINGP (host) ? host : build_string ("-")), | ||
| 4208 | build_string ("\n"))); | ||
| 4209 | } | 4216 | } |
| 4210 | 4217 | ||
| 4211 | /* This variable is different from waiting_for_input in keyboard.c. | 4218 | /* This variable is different from waiting_for_input in keyboard.c. |
| @@ -4973,18 +4980,17 @@ read_and_dispose_of_process_output (struct Lisp_Process *p, char *chars, | |||
| 4973 | for decoding. */ | 4980 | for decoding. */ |
| 4974 | 4981 | ||
| 4975 | static int | 4982 | static int |
| 4976 | read_process_output (Lisp_Object proc, register int channel) | 4983 | read_process_output (Lisp_Object proc, int channel) |
| 4977 | { | 4984 | { |
| 4978 | register ssize_t nbytes; | 4985 | ssize_t nbytes; |
| 4979 | char *chars; | 4986 | struct Lisp_Process *p = XPROCESS (proc); |
| 4980 | register struct Lisp_Process *p = XPROCESS (proc); | ||
| 4981 | struct coding_system *coding = proc_decode_coding_system[channel]; | 4987 | struct coding_system *coding = proc_decode_coding_system[channel]; |
| 4982 | int carryover = p->decoding_carryover; | 4988 | int carryover = p->decoding_carryover; |
| 4983 | int readmax = 4096; | 4989 | enum { readmax = 4096 }; |
| 4984 | ptrdiff_t count = SPECPDL_INDEX (); | 4990 | ptrdiff_t count = SPECPDL_INDEX (); |
| 4985 | Lisp_Object odeactivate; | 4991 | Lisp_Object odeactivate; |
| 4992 | char chars[sizeof coding->carryover + readmax]; | ||
| 4986 | 4993 | ||
| 4987 | chars = alloca (carryover + readmax); | ||
| 4988 | if (carryover) | 4994 | if (carryover) |
| 4989 | /* See the comment above. */ | 4995 | /* See the comment above. */ |
| 4990 | memcpy (chars, SDATA (p->decoding_buf), carryover); | 4996 | memcpy (chars, SDATA (p->decoding_buf), carryover); |
| @@ -6837,7 +6843,7 @@ add_timer_wait_descriptor (int fd) | |||
| 6837 | { | 6843 | { |
| 6838 | FD_SET (fd, &input_wait_mask); | 6844 | FD_SET (fd, &input_wait_mask); |
| 6839 | FD_SET (fd, &non_keyboard_wait_mask); | 6845 | FD_SET (fd, &non_keyboard_wait_mask); |
| 6840 | FD_SET (fd, &non_process_wait_mask); | 6846 | FD_SET (fd, &non_process_wait_mask); |
| 6841 | fd_callback_info[fd].func = timerfd_callback; | 6847 | fd_callback_info[fd].func = timerfd_callback; |
| 6842 | fd_callback_info[fd].data = NULL; | 6848 | fd_callback_info[fd].data = NULL; |
| 6843 | fd_callback_info[fd].condition |= FOR_READ; | 6849 | fd_callback_info[fd].condition |= FOR_READ; |